泛微OA E10 EB应用数据与附件批量导入实战指南

发布时间:2026/8/24 12:24:01

泛微OA E10 EB应用数据与附件批量导入实战指南
在泛微OA E10的二次开发或日常运维中我们经常会遇到一个高频且棘手的需求如何高效地将大量业务数据及其关联的附件如图片、文档一次性导入到系统中手动逐条录入不仅效率低下而且极易出错。本文将围绕泛微OA E10平台深入解析其EB应用流程应用中实现数据与附件批量导入的完整方案核心对应功能点编号2813。无论你是刚接触泛微开发的工程师还是正在寻找优化业务流程方法的运维人员通过本文的步骤拆解、代码示例和避坑指南你将能掌握一套从模板设计、后端处理到前端集成的可落地实战方法。1. 背景与核心概念为什么需要批量导入在企业信息化管理中数据初始化、历史数据迁移、定期数据同步等场景都离不开批量操作。泛微OA E10作为协同办公平台其核心数据载体是各种“EB应用”流程应用或建模应用每个应用对应一套业务表单和流程。手动操作的瓶颈假设你需要为1000个员工创建个人信息档案每个档案包含基本信息工号、姓名、部门和一张个人照片。如果通过前台表单逐个创建、上传附件其工作量是不可想象的。批量导入的价值效率提升将数小时甚至数天的工作压缩到几分钟内完成。准确性保障通过程序化处理避免人工输入错误。业务连贯性数据与附件作为完整业务实体一次性入库保证关联关系正确。在泛微E10中实现此功能通常涉及两个层面数据层面将Excel、CSV等结构化数据批量写入表单字段。附件层面将文件如图片批量上传并与对应的数据记录关联。本文将重点讲解如何结合E10的后端API与前端接口实现“数据行”与“附件文件”的一对一绑定导入。2. 环境准备与版本说明在开始编码前请确保你的开发环境符合要求。泛微二次开发有其特殊性强依赖于其平台版本和部署环境。基础环境操作系统Windows Server / Linux (取决于泛微OA服务器部署环境)应用服务器泛微E10自带或集成的Weblogic/Tomcat等数据库Oracle / SQL Server / MySQL (依据客户实际部署)泛微E10版本本文基于泛微E10 9.0版本进行讲解核心API接口在较新版本中通常保持兼容但部分细节可能存在差异。请以实际环境为准。开发工具任何文本编辑器或IDE如IDEA、Eclipse用于编写后端Java代码和前端JS脚本。关键目录与文件泛微二次开发代码通常部署在特定的路径下了解这些路径对开发至关重要。后端Java代码路径{WEAVER_HOME}/ecology/WEB-INF/code/或{WEAVER_HOME}/ecology/WEB-INF/src/下的相关模块目录。WEAVER_HOME指泛微安装根目录。前端页面/脚本路径{WEAVER_HOME}/ecology/WEB-INF/web/下的相应页面目录。第三方库泛微平台已封装了大量JAR包如weaver.jar、ecology-*.jar开发时直接引用即可。功能点确认本文所述“功能点_2813”是一个用于标识此批量导入场景的内部参考编号。在实际开发中你需要根据业务需求在EB应用设计器中创建或定位对应的表单和字段。3. 核心原理与流程拆解泛微OA中附件通常以“附件框”字段形式存在于表单上。批量导入附件的本质是为每一条成功创建或更新的主数据记录调用平台的附件上传接口将物理文件存储到服务器并在数据库中建立该文件与主数据记录ID的关联关系。3.1 技术实现路径分析通常有两种主流实现方式后端主导的批量处理流程后端解析上传的Excel数据文件和打包的附件压缩包在事务中循环创建主记录并为每条记录调用附件上传服务。优点逻辑集中事务性好适合数据量极大、处理逻辑复杂的场景。缺点对服务器内存和性能要求较高附件需要先上传到服务器临时目录。前后端协同的逐条处理流程前端分批次读取Excel通过Ajax逐条提交数据并在提交成功后立即上传该条数据对应的附件。优点前后端负载均衡用户体验可感知如进度条避免服务器单次处理压力过大。缺点网络请求次数多需要处理前端并发和错误重试。本文将详细讲解第一种后端主导方案因为它更通用且能完整展示泛微后端API的使用。3.2 关键接口与类weaver.file.FileUpload泛微封装的附件上传处理类。weaver.file.FileUploadUtil附件上传工具类提供更便捷的方法。weaver.formmodel.service.FormService表单数据操作的核心服务类。weaver.conn.RecordSet用于执行SQL查询和更新在需要直接操作关联表时使用。主键字段表单的“ID”字段是关联附件的关键。4. 完整实战案例员工档案批量导入数据图片场景批量导入员工档案Excel中包含工号、姓名、部门字段同时每个员工有一张以工号.jpg命名的个人照片需要作为附件上传。4.1 准备工作设计模板与目录结构1. 数据模板 (employee_import.xlsx)工号 (workcode)姓名 (name)部门 (department)1001张三技术部1002李四市场部1003王五人事部2. 附件准备将所有员工照片放在一个文件夹中并按工号.jpg命名例如1001.jpg,1002.jpg,1003.jpg。然后打包成employee_images.zip。3. 目标EB应用表单假设你已在泛微设计器中创建了一个名为“员工档案”的EB应用包含以下字段单行文本工号、姓名、部门附件框个人照片记下该表单的模型ID (formid)和附件框字段的ID (imagefieldid)。4.2 后端Java核心代码实现我们将创建一个Servlet或Action来处理批量导入请求。以下代码展示了核心逻辑。// 文件路径{WEAVER_HOME}/ecology/WEB-INF/src/com/weaver/demo/action/BatchImportEmployeeAction.java package com.weaver.demo.action; import weaver.general.BaseBean; import weaver.interfaces.workflow.action.Action; import weaver.soa.workflow.request.RequestInfo; import weaver.formmodel.service.FormService; import weaver.file.FileUpload; import weaver.file.FileUploadUtil; import weaver.conn.RecordSet; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; /** * 员工档案批量导入Action * 功能点2813 - EB应用批量导入数据及附件 */ public class BatchImportEmployeeAction extends BaseBean implements Action { // 常量配置请根据实际表单修改 private static final int FORM_ID 123; // 员工档案表单的模型ID private static final int IMAGE_FIELD_ID 456; // “个人照片”附件框字段的ID private static final String UPLOAD_TEMP_DIR /ecology/temp/upload/; // 服务器临时目录 Override public String execute(RequestInfo requestInfo) { HttpServletRequest request requestInfo.getHttpServletRequest(); HttpServletResponse response requestInfo.getHttpServletResponse(); String result failure; String message ; try { // 1. 检查是否为多媒体表单提交 if (!ServletFileUpload.isMultipartContent(request)) { message 请求类型错误必须为multipart/form-data。; writeResponse(response, false, message); return Action.FAILURE; } // 2. 解析请求获取Excel文件和ZIP附件包 DiskFileItemFactory factory new DiskFileItemFactory(); ServletFileUpload upload new ServletFileUpload(factory); ListFileItem items upload.parseRequest(request); File excelFile null; File zipFile null; MapString, String formData new HashMap(); // 其他表单参数如果需要 for (FileItem item : items) { if (!item.isFormField()) { // 处理文件 String fieldName item.getFieldName(); String fileName item.getName(); if (fileName ! null !fileName.isEmpty()) { File tempFile new File(UPLOAD_TEMP_DIR, fileName); item.write(tempFile); if (excelFile.equals(fieldName)) { excelFile tempFile; } else if (attachmentZip.equals(fieldName)) { zipFile tempFile; } } } else { // 处理普通表单字段 formData.put(item.getFieldName(), item.getString(UTF-8)); } } if (excelFile null) { message 未上传Excel数据文件。; writeResponse(response, false, message); return Action.FAILURE; } // 3. 解析Excel数据 (此处使用伪代码实际需引入POI或EasyExcel) ListMapString, String employeeList parseExcelData(excelFile); // 假设parseExcelData返回List每个Map的key为字段名工号、姓名、部门 // 4. 解压附件包建立工号与文件路径的映射 MapString, File imageFileMap new HashMap(); if (zipFile ! null) { imageFileMap extractZipFile(zipFile); } // 5. 循环处理每条员工数据 FormService formService new FormService(); int successCount 0; int failCount 0; ListString failMessages new ArrayList(); for (MapString, String emp : employeeList) { String workCode emp.get(工号); String name emp.get(姓名); String dept emp.get(部门); try { // 5.1 准备表单数据Map MapString, String fieldData new HashMap(); fieldData.put(workcode, workCode); // 字段名需与表单设计器内一致 fieldData.put(name, name); fieldData.put(department, dept); // 5.2 创建主表单数据获取主键ID int mainId formService.saveForm(FORM_ID, 0, fieldData, request); // 参数说明formid, requestid (0表示新建), fieldData, request对象 if (mainId 0) { throw new Exception(创建员工记录失败工号 workCode); } // 5.3 如果该员工有对应图片上传附件 File imageFile imageFileMap.get(workCode .jpg); // 根据命名规则查找 if (imageFile ! null imageFile.exists()) { boolean uploadSuccess uploadAttachmentToForm(mainId, imageFile, request); if (!uploadSuccess) { // 附件上传失败可以记录日志但不一定让整条数据失败 log(工号 workCode 的图片上传失败但主数据已创建。); } } successCount; } catch (Exception e) { failCount; failMessages.add(工号[ workCode ]导入失败: e.getMessage()); log(导入员工失败: workCode, e); } } // 6. 清理临时文件 deleteTempFile(excelFile); deleteTempFile(zipFile); for (File f : imageFileMap.values()) { deleteTempFile(f); } // 7. 返回处理结果 message String.format(导入完成。成功%d 条失败%d 条。失败详情%s, successCount, failCount, String.join(; , failMessages)); writeResponse(response, true, message); result Action.SUCCESS; } catch (Exception e) { message 批量导入过程发生异常 e.getMessage(); log(BatchImportEmployeeAction execute error., e); writeResponse(response, false, message); result Action.FAILURE; } return result; } /** * 解析Excel文件 (需引入Apache POI) */ private ListMapString, String parseExcelData(File excelFile) throws Exception { ListMapString, String list new ArrayList(); // 伪代码实际使用HSSF/XSSF Workbook读取Sheet和Row // 示例结构 // Workbook workbook WorkbookFactory.create(excelFile); // Sheet sheet workbook.getSheetAt(0); // for (Row row : sheet) { // if(row.getRowNum() 0) continue; // 跳过标题行 // MapString, String map new HashMap(); // map.put(工号, getCellStringValue(row.getCell(0))); // map.put(姓名, getCellStringValue(row.getCell(1))); // map.put(部门, getCellStringValue(row.getCell(2))); // list.add(map); // } // workbook.close(); log(解析Excel实际需实现POI逻辑。); // 模拟数据 MapString, String emp1 new HashMap(); emp1.put(工号, 1001); emp1.put(姓名, 张三); emp1.put(部门, 技术部); list.add(emp1); return list; } /** * 解压ZIP文件返回文件名, 临时文件映射 */ private MapString, File extractZipFile(File zipFile) throws IOException { MapString, File fileMap new HashMap(); String destDirPath UPLOAD_TEMP_DIR unzip_ System.currentTimeMillis() /; File destDir new File(destDirPath); if (!destDir.exists()) destDir.mkdirs(); try (ZipInputStream zis new ZipInputStream(new FileInputStream(zipFile))) { ZipEntry entry; while ((entry zis.getNextEntry()) ! null) { String fileName entry.getName(); File newFile new File(destDirPath fileName); // 防止ZIP Slip攻击 if (!newFile.getCanonicalPath().startsWith(destDir.getCanonicalPath())) { throw new IOException(非法文件路径: fileName); } if (entry.isDirectory()) { newFile.mkdirs(); } else { new File(newFile.getParent()).mkdirs(); try (FileOutputStream fos new FileOutputStream(newFile)) { byte[] buffer new byte[1024]; int len; while ((len zis.read(buffer)) 0) { fos.write(buffer, 0, len); } } fileMap.put(fileName, newFile); } zis.closeEntry(); } } return fileMap; } /** * 使用泛微API上传附件到指定表单记录 * param mainId 表单主键ID * param file 要上传的文件 * param request HttpServletRequest * return 上传是否成功 */ private boolean uploadAttachmentToForm(int mainId, File file, HttpServletRequest request) { try { // 方法一使用FileUpload类更底层 FileUpload fileUpload new FileUpload(request); fileUpload.setFileNames(file.getName()); // 设置文件名 fileUpload.setFiles(file); // 设置文件对象 fileUpload.setSize(file.length()); fileUpload.setOperateType(1); // 操作类型1代表上传 fileUpload.setResourceid(String.valueOf(mainId)); // 关联资源ID即表单主键 fileUpload.setTFieldid(String.valueOf(IMAGE_FIELD_ID)); // 附件框字段ID fileUpload.setFiletype(jpg); // 文件类型根据实际修改 // 执行上传 String result fileUpload.upload(); // 上传成功result通常为空或特定成功标识失败会抛出异常或返回错误信息 return result null || !result.contains(error); // 方法二使用FileUploadUtil更简洁推荐 // MapString, String uploadResult FileUploadUtil.uploadFile(request, file, mainId, IMAGE_FIELD_ID); // return success.equals(uploadResult.get(status)); } catch (Exception e) { log(上传附件失败mainId mainId , file file.getName(), e); return false; } } /** * 向客户端输出JSON响应 */ private void writeResponse(HttpServletResponse response, boolean success, String message) throws IOException { response.setContentType(application/json;charsetUTF-8); PrintWriter out response.getWriter(); String json String.format({\success\:%b,\message\:\%s\}, success, message.replace(\, \\\)); out.print(json); out.flush(); } /** * 删除临时文件 */ private void deleteTempFile(File file) { if (file ! null file.exists()) { if (!file.delete()) { file.deleteOnExit(); } } } }4.3 前端HTML/JS页面示例需要一个简单的页面供用户选择Excel文件和附件压缩包并触发导入操作。!-- 文件路径{WEAVER_HOME}/ecology/WEB-INF/web/demo/batchImportEmployee.html -- !DOCTYPE html html langzh-CN head meta charsetUTF-8 title员工档案批量导入/title script src/js/jquery-1.12.4.min.js/script !-- 泛微通常内置jQuery -- style .container { width: 80%; margin: 30px auto; padding: 20px; border: 1px solid #ddd; border-radius: 5px; } .form-group { margin-bottom: 15px; } label { display: inline-block; width: 150px; font-weight: bold; } input[typefile] { padding: 5px; } .btn { padding: 8px 20px; background-color: #5cb85c; color: white; border: none; border-radius: 4px; cursor: pointer; } .btn:hover { background-color: #4cae4c; } #progress, #result { margin-top: 20px; padding: 10px; border-radius: 4px; display: none; } #progress { background-color: #d9edf7; border: 1px solid #bce8f1; } #result { background-color: #fcf8e3; border: 1px solid #faebcc; } /style /head body div classcontainer h2员工档案批量导入 (功能点: 2813)/h2 p请按以下步骤操作/p ol li下载并填写a href/demo/template/employee_template.xlsx download数据模板/a。/li li将员工照片按“工号.jpg”命名并打包成ZIP文件。/li li选择文件并提交。/li /ol form idimportForm enctypemultipart/form-data div classform-group label forexcelFile数据文件 (Excel):/label input typefile idexcelFile nameexcelFile accept.xlsx,.xls required /div div classform-group label forattachmentZip附件包 (ZIP):/label input typefile idattachmentZip nameattachmentZip accept.zip small可选包含以“工号.jpg”命名的图片文件/small /div div classform-group button typebutton classbtn onclickdoImport()开始导入/button /div /form div idprogress p正在处理中请稍候.../p /div div idresult h4导入结果/h4 pre idresultText/pre /div /div script function doImport() { var excelFile $(#excelFile)[0].files[0]; if (!excelFile) { alert(请选择数据文件); return; } var formData new FormData(); formData.append(excelFile, excelFile); var zipFile $(#attachmentZip)[0].files[0]; if (zipFile) { formData.append(attachmentZip, zipFile); } // 显示进度隐藏结果 $(#progress).show(); $(#result).hide(); $.ajax({ url: /api/demo/batchImportEmployee, // 对应后端Action的访问地址需在泛微中配置 type: POST, data: formData, processData: false, // 必须 contentType: false, // 必须 dataType: json, success: function(resp) { $(#progress).hide(); $(#result).show(); if (resp.success) { $(#resultText).css(color, green).text(resp.message); } else { $(#resultText).css(color, red).text(导入失败 resp.message); } }, error: function(xhr, status, error) { $(#progress).hide(); $(#result).show(); $(#resultText).css(color, red).text(请求异常 error); } }); } /script /body /html4.4 部署与配置步骤编译与部署后端代码将BatchImportEmployeeAction.java编译成class文件或打包成JAR放置到{WEAVER_HOME}/ecology/WEB-INF/code/目录下对应的包路径中。确保引入了必要的库如weaver.jar、commons-fileupload.jar等。泛微环境通常已具备。配置泛微访问入口在泛微的ecology/WEB-INF/web.xml或相应的模块配置文件中为你写的Action配置Servlet映射。例如配置URL/api/demo/batchImportEmployee映射到com.weaver.demo.action.BatchImportEmployeeAction。更常见的做法是在泛微的“流程中心”或“门户管理”中创建一个前端页面通过“自定义链接”或“脚本调用”的方式触发这个后端接口。这需要根据泛微的具体版本和模块进行配置。放置前端页面将batchImportEmployee.html上传到服务器{WEAVER_HOME}/ecology/WEB-INF/web/demo/目录下。通过泛微门户菜单或直接URL访问该页面。权限设置确保执行导入操作的用户账号具有目标EB应用表单的“新建”或“管理”权限。4.5 运行与验证使用具有权限的账号登录泛微OA。访问部署好的前端页面如http://your-server:port/ecology/demo/batchImportEmployee.html。下载模板填写Excel数据。准备员工图片按规则命名并打包成ZIP。在页面分别选择Excel文件和ZIP包点击“开始导入”。观察页面提示等待处理完成。进入“员工档案”EB应用列表检查数据是否成功创建并点击记录查看“个人照片”附件框是否已正确关联图片。5. 常见问题与排查思路在实现和运行批量导入功能时你可能会遇到以下典型问题问题现象可能原因排查思路与解决方案导入后数据成功但附件全部丢失1. 附件上传接口调用失败。2.resourceid主键ID或tfieldid字段ID传错。3. 文件路径错误或临时文件被提前删除。1. 在后端代码中增加详细的附件上传日志打印mainId、filePath和上传结果。2. 确认IMAGE_FIELD_ID常量值是否正确需从表单设计器中查看附件框字段的真实ID。3. 检查文件上传的临时目录权限确保进程有读写权限。部分数据导入失败1. Excel数据格式错误如工号重复、必填项为空。2. 数据库约束冲突唯一键重复。3. 单条数据业务校验不通过。1. 在parseExcelData方法中增加数据有效性校验非空、格式、唯一性。2. 在saveForm前后捕获更具体的异常并将失败原因记录到failMessages中返回给前端。3. 考虑使用数据库事务但需注意泛微saveForm方法内部可能已包含事务。导入速度非常慢1. 循环中频繁进行数据库连接或I/O操作。2. 附件文件过大。3. 未使用批量处理思想。1. 对于超大数据量如上万条考虑分批次处理每100或500条提交一次。2. 优化附件上传如果图片尺寸过大可在上传前进行压缩。3. 评估是否可以直接操作数据库表进行数据初始化但此方式不经过业务逻辑校验风险高仅适用于特定迁移场景。报错无法找到Action类1. Class文件未正确部署到/WEB-INF/code/目录。2. 类路径Package错误。3. web.xml或泛微模块配置未正确映射。1. 检查编译后的class文件是否在正确的子目录下。2. 检查泛微日志文件如ecology/log/下的日志查看具体的ClassNotFound错误信息。3. 确认访问URL与配置的Servlet路径完全匹配。ZIP包解压后文件名乱码压缩包编码与服务器编码不一致。在extractZipFile方法中使用new ZipInputStream(new FileInputStream(zipFile), Charset.forName(GBK))指定编码尝试。通常中文Windows压缩的ZIP包是GBK编码。前端提示“请求异常”或4041. 后端接口URL错误。2. 未处理跨域问题如果前端页面独立部署。3. 泛微权限拦截。1. 使用浏览器开发者工具的“网络(Network)”面板查看请求的URL、状态码和响应体。2. 泛微内部页面调用API通常不存在跨域问题。如果是独立系统调用需在后端Action中配置CORS响应头。3. 确认当前登录会话有效且用户有权限访问该Action。6. 最佳实践与工程建议将功能实现只是第一步要保证其在生产环境中稳定、高效、可维护还需要遵循以下最佳实践输入验证与清洗前端验证在JS中对文件类型、大小进行初步校验如限制Excel为10MB以内ZIP为50MB以内。后端强校验在后端parseExcelData方法中对每个字段进行严格的格式、长度、业务规则校验。例如工号是否符合公司编码规则部门名称是否存在于系统字典中。防注入处理所有从Excel中读取的字符串数据在拼接SQL或用于显示前都应进行转义或使用预编译语句虽然formService.saveForm已做处理但直接操作RecordSet时需特别注意。事务与数据一致性本文示例中每条记录的创建和附件上传是独立的。如果要求“数据与附件必须同时成功”可以考虑将多条记录的操作放在一个更大的事务中但会降低性能并增加锁竞争。更务实的做法是记录失败详情提供“重新导入失败项”的功能。可以生成一个包含失败记录的Excel供用户修正后再次导入。性能优化分页/分批导入在前端或后端实现分批次处理例如每次只处理100条通过进度条告知用户。附件处理异步化对于附件数量多、体积大的场景可以将附件上传任务放入消息队列异步执行先快速完成数据入库再异步处理附件关联。但这需要更复杂的架构支持。资源释放确保在finally块中关闭文件流、数据库连接删除临时文件避免内存泄漏和磁盘空间耗尽。日志与监控使用泛微的BaseBean的log方法或SLF4J等日志框架详细记录导入操作的开始、结束、成功条数、失败条数及具体原因。关键操作如调用saveForm、uploadFile的成功与否必须记录。可以记录操作人、操作时间、导入文件哈希值便于审计和问题追溯。用户体验提供模板前端提供下载标准模板的功能模板中最好包含数据校验规则如下拉列表。进度反馈对于大批量导入后端可以计算总条数和当前处理进度通过WebSocket或前端轮询的方式实时更新前端进度条。结果报告导入完成后不仅提示成功失败数量最好能提供一个可下载的详细错误报告文件列出每一行失败的具体原因。安全边界文件类型白名单在解压和上传附件时严格校验文件后缀和MIME类型防止上传可执行脚本等危险文件。ZIP Slip防护如示例代码所示在解压时必须校验解压出的文件路径是否在目标目录内防止目录遍历攻击。权限控制该导入功能应作为高权限操作只能授权给特定角色或管理员。在Action执行前可再次校验当前用户的会话和权限。通过以上方案你不仅能够实现泛微OA E10中EB应用的数据与附件批量导入更能构建出一个健壮、高效、易于维护的数据初始化工具。这套方法同样可以适配到其他类似的表单批量导入场景中只需替换表单ID、字段映射和解析逻辑即可。在实际项目中建议先从少量数据测试开始逐步完善校验和异常处理逻辑最终再部署到生产环境执行大规模导入任务。

相关新闻

UniHacker 使用指南:三步为 Unity 国际版解锁专业功能

UniHacker 使用指南:三步为 Unity 国际版解锁专业功能

2026/8/24 12:14:01

UniHacker 使用指南:三步为 Unity 国际版解锁专业功能 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker 学生做课程作业、独立开发者做原型验证&am…

金融数据科学实战:从Python基础到股票预测AI模型构建

金融数据科学实战:从Python基础到股票预测AI模型构建

2026/8/24 12:14:01

在金融科技浪潮席卷全球的今天,无论是量化交易、智能投顾还是风险控制,数据科学与人工智能(AI)已成为驱动行业创新的核心引擎。对于金融专业的学生而言,理解如何将数据转化为洞察,并利用AI模型解决实际问题…

LibreHardwareMonitor:实时读取 CPU 温度与风扇转速的开源硬件监控工具——新手快速上手指南

LibreHardwareMonitor:实时读取 CPU 温度与风扇转速的开源硬件监控工具——新手快速上手指南

2026/8/24 12:14:01

LibreHardwareMonitor:实时读取 CPU 温度与风扇转速的开源硬件监控工具——新手快速上手指南 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock sp…

2026年7月濮阳市新房价格深度分析报告

2026年7月濮阳市新房价格深度分析报告

2026/8/24 13:34:10

一、报告背景与数据说明本报告基于2026年7月濮阳市新房市场实际成交案例,结合成交价格、成交面积、成交区位等维度,对当前濮阳新房价格水平、价格结构及未来走势进行深度分析。报告数据来源于濮阳市房地产管理部门备案信息、主要楼盘案场成交记录及第三方…

AI Agent 最大的安全风险:拿着权限做错事

AI Agent 最大的安全风险:拿着权限做错事

2026/8/24 13:34:10

文章目录1 -> 引言2 -> 建立 Agent 威胁模型资产输入来源危险出口安全不变量3 -> 提示注入为什么难以彻底识别4 -> 最小权限必须细到任务5 -> 把数据与指令分开6 -> 外送控制比“是否读到”更重要7 -> 工具调用需要确定性边界8 -> 多 Agent 会引入“借…

Gemini 生成的表格怎么导出,这几乎是每个在安卓手机上用 Gemini 的职场人都会遇到的灵魂拷问。

Gemini 生成的表格怎么导出,这几乎是每个在安卓手机上用 Gemini 的职场人都会遇到的灵魂拷问。

2026/8/24 13:34:10

Gemini 生成的表格怎么导出,这几乎是每个在安卓手机上用 Gemini 的职场人都会遇到的灵魂拷问。 作为一个从 Gemini 诞生第一天起就在安卓端高频使用它的深度用户,我太清楚那种抓狂感了:Gemini 给你生成了一份结构完美的表格,你却在…

【多智能体】AI领域深度研究智能体案例讲解

【多智能体】AI领域深度研究智能体案例讲解

2026/8/24 13:34:10

目录 一、案例目标 核心功能 学习目标 二、技术栈与核心依赖 编程语言与框架 核心依赖库 外部服务 三、项目结构 关键文件说明 四、核心代码实现 1. 环境初始化 2. 智能体初始化 3. 问题生成智能体 4. 研究问题函数 5. 报告编译函数 五、运行与测试 1. 环境准备…

猫抓 Cat-Catch 浏览器资源嗅探扩展:点一下列出页面媒体,粘贴链接自动合并分片

猫抓 Cat-Catch 浏览器资源嗅探扩展:点一下列出页面媒体,粘贴链接自动合并分片

2026/8/24 13:34:10

猫抓 Cat-Catch 浏览器资源嗅探扩展:点一下列出页面媒体,粘贴链接自动合并分片 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch …

Path of Building:流放之路Build规划与数值试算,从安装到导出配置

Path of Building:流放之路Build规划与数值试算,从安装到导出配置

2026/8/24 13:24:10

Path of Building:流放之路Build规划与数值试算,从安装到导出配置 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding Path of Building(P…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/23 0:02:09

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/23 0:02:09

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/23 0:02:09

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

OpenModScan:免费跨平台 Modbus 主站调试工具,让现场通讯验证一键搞定

OpenModScan:免费跨平台 Modbus 主站调试工具,让现场通讯验证一键搞定

2026/8/24 0:03:28

OpenModScan:免费跨平台 Modbus 主站调试工具,让现场通讯验证一键搞定 【免费下载链接】OpenModScan Open ModScan is a Free Modbus Master (Client) Utility 项目地址: https://gitcode.com/gh_mirrors/op/OpenModScan OpenModScan 是一款开源免…

WechatHook 终极指南:5大核心能力详解,3分钟看懂微信自动化

WechatHook 终极指南:5大核心能力详解,3分钟看懂微信自动化

2026/8/24 0:03:28

WechatHook 终极指南:5大核心能力详解,3分钟看懂微信自动化 【免费下载链接】WechatHook Enjoy hooking wechat by Xposed....Accessibility...and so on... 项目地址: https://gitcode.com/gh_mirrors/we/WechatHook WechatHook 是一个基于 Xpos…

如何在ThinkPad X390上安装macOS:OpenCore EFI完整指南

如何在ThinkPad X390上安装macOS:OpenCore EFI完整指南

2026/8/24 0:03:28

如何在ThinkPad X390上安装macOS:OpenCore EFI完整指南 【免费下载链接】ThinkpadX390-Opencore-EFI macOS Catalina & Big Sur & Monterey on ThinkPad X390 (Hackintosh) 项目地址: https://gitcode.com/gh_mirrors/th/ThinkpadX390-Opencore-EFI …

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…