这次我们来看一个适合做毕业设计的完整项目SpringBoot 电子产品溯源系统项目编号 24714。它的核心价值很清楚——围绕电子产品的生产、入库、销售和查询环节把防伪码、二维码、扫码溯源、防伪查询串成一条完整业务链路。对正在选毕业设计题目的同学来说这个题目的优势在于技术栈成熟、业务逻辑清晰、可演示性强答辩时既能讲数据库设计又能展示接口实现和二维码扫码闭环。这个项目最大的特点不是算法复杂而是功能链路完整。电子产品从出厂到用户手里会经过批次入库、物流出库、门店销售等多个节点每个节点都可以记录溯源信息。用户拿到产品后扫描包装上的二维码就能看到产品的生产批次、出厂时间、质检状态和销售渠道。如果查询接口返回了异常次数或信息不匹配系统会给出防伪预警。这套逻辑做完之后项目的演示效果非常直观——你拿着手机对着二维码扫一下前端页面跳出详细溯源档案整条链路就闭环了。本文会先从项目功能模块和数据库设计讲起再给出基于 SpringBoot 的部署启动步骤然后重点拆解扫码溯源、防伪码校验、查询记录这几个核心功能的代码实现思路最后补充接口调试方法、常见问题排查和答辩加分建议。文章中的配置和代码均为通用实现方式实际操作时按你自己的环境路径和包名调整即可。1. 核心能力速览能力项说明项目类型SpringBoot 电子产品溯源管理系统典型 Java Web 毕业设计项目技术栈Spring Boot、MyBatis-Plus、MySQL、Maven、Lombok可扩展 Redis 缓存主要功能溯源信息管理、防伪码生成、二维码扫码查询、防伪校验、查询记录、用户管理硬件要求普通开发机即可运行4G 内存以上无需 GPU运行环境JDK 1.8 或 JDK 11MySQL 5.7 及以上Maven 3.6 及以上启动方式IDEA 运行主类或 Maven 打包后用java -jar启动是否支持 API支持后端提供 RESTful JSON 接口可被小程序、H5 调用是否支持批量任务支持批次导入、批量生成防伪码、批量溯源记录导入二维码能力集成 ZXing 生成二维码扫码后携带产品唯一溯源码访问查询接口适合场景毕业设计、课程项目、Java 后端入门学习、简单溯源产品原型这个项目不需要 GPU不需要高配置服务器普通笔记本就能跑。真正的工作量集中在后端逻辑和数据库设计上这部分恰好是毕业设计答辩时最容易展开讲的内容。2. 系统功能模块梳理按照通用的课程设计标准这个系统可以拆成六个核心模块。下面的划分方式是大多数同类毕业设计的组织思路你可以根据自己实际建的表和页面调整措辞。2.1 基础数据管理管理电子产品的基础信息包括产品名称、产品型号、品牌、规格、默认质保期、产品图片等。产品信息是整个溯源链的底座后续的批次、防伪码都挂在产品编号下。2.2 批次入库管理每批电子产品入库时生成一个批次号记录生产日期、生产产线、质检结果、入库时间、经办人。批次信息是溯源的核心内容用户扫码后最先看到的就是批次信息。2.3 防伪码管理系统为每件产品生成唯一防伪码并同时生成对应的二维码。防伪码生成需要保证唯一性和不可预测性一般使用 UUID 去横线后拼接随机数落库时加唯一索引。二维码内容通常是系统配置的 H5 溯源页面地址加上防伪码参数例如https://yourdomain.com/product/trace?codeFF8080xxxx2.4 扫码溯源查询用户扫描二维码后进入溯源查询接口。查询接口接收防伪码返回产品档案、批次信息、销售状态、查询次数。如果防伪码不存在返回无效提示如果查询次数超过阈值触发防伪告警。2.5 查询记录与防伪预警系统记录每一次扫码查询的 IP、时间、查询结果。当同一防伪码在短时间内被大量不同 IP 查询时系统判定为疑似仿冒或重复扫码在前端醒目标注“该产品已被查询 N 次请确认正品”。2.6 系统用户与日志管理管理员账号负责登录后台、维护产品数据、查看查询日志。这个模块支撑答辩时“权限控制”和“操作留痕”两个加分点。3. 数据库设计思路数据库设计是答辩中必问的环节。电子产品溯源系统建议设计以下数据表字段可根据实际需要增减这里给出最核心的基础表结构参考。-- 产品信息表 CREATE TABLE product_info ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键, product_code VARCHAR(50) NOT NULL UNIQUE COMMENT 产品编码, product_name VARCHAR(100) NOT NULL COMMENT 产品名称, brand VARCHAR(50) COMMENT 品牌, model VARCHAR(50) COMMENT 型号, spec VARCHAR(100) COMMENT 规格, warranty_months INT DEFAULT 12 COMMENT 质保月数, image_url VARCHAR(255) COMMENT 产品图片, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ) COMMENT 电子产品基础信息表; -- 批次入库表 CREATE TABLE batch_record ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键, batch_no VARCHAR(50) NOT NULL UNIQUE COMMENT 批次号, product_code VARCHAR(50) NOT NULL COMMENT 产品编码, production_date DATE COMMENT 生产日期, production_line VARCHAR(100) COMMENT 生产产线, qc_result VARCHAR(20) DEFAULT PASS COMMENT 质检结果 PASS/FAIL, quantity INT DEFAULT 0 COMMENT 入库数量, operator VARCHAR(50) COMMENT 入库经办人, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 入库时间, KEY idx_product_code (product_code) ) COMMENT 批次入库表; -- 防伪码表 CREATE TABLE security_code ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键, code VARCHAR(64) NOT NULL UNIQUE COMMENT 防伪码, product_code VARCHAR(50) NOT NULL COMMENT 产品编码, batch_no VARCHAR(50) NOT NULL COMMENT 批次号, query_count INT DEFAULT 0 COMMENT 查询次数, first_query_time DATETIME COMMENT 首次查询时间, status TINYINT DEFAULT 0 COMMENT 状态 0-未售出 1-已售出 2-注销, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 生成时间, KEY idx_code (code), KEY idx_batch_no (batch_no) ) COMMENT 防伪码表; -- 扫码查询记录表 CREATE TABLE query_log ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键, code VARCHAR(64) NOT NULL COMMENT 防伪码, query_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 查询时间, ip_address VARCHAR(64) COMMENT 查询IP, query_result VARCHAR(20) COMMENT 查询结果 SUCCESS/FAIL/RISK, user_agent VARCHAR(255) COMMENT 用户浏览器信息, KEY idx_code (code), KEY idx_query_time (query_time) ) COMMENT 扫码查询记录表;这四张表构成了溯源系统的核心。security_code表是整个系统的关键它把产品编码、批次号和外部的防伪码关联起来。答辩时你可以从“一码一物、一物一档”的角度解释表之间的关联关系。另外可以补充一张管理员用户表用于维护后台登录用户字段建议包含用户名、密码BCrypt 加密、角色、状态、最后登录时间。4. 环境准备与前置条件开发前先检查环境。这个项目对开发环境没有特殊要求按以下清单核对即可。项目建议要求说明JDKJDK 1.8 或 JDK 11Spring Boot 2.x 建议 JDK 8 或 11MavenMaven 3.6管理依赖和打包MySQLMySQL 5.7新建数据库trace_systemIDEIntelliJ IDEA推荐也可以用 Eclipse浏览器Chrome / Edge前后端联调使用二维码扫码工具手机微信或任意扫码 App测试扫码溯源流程端口占用检查8080默认服务端口被占用时需改配置环境准备好之后用 IDEA 打开项目等待 Maven 将spring-boot-starter-web、mybatis-plus-boot-starter、mysql-connector-java、zxing、lombok等依赖下载完成。如果网络拉取依赖比较慢可以考虑配置阿里云 Maven 镜像。5. SpringBoot 项目启动与配置5.1 修改 application.yml项目核心配置集中在application.yml中。启动前确认数据库名称、账号密码和端口配置是正确的。这里给出一个通用配置模板。server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/trace_system?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: yourpassword jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true global-config: db-config: id-type: auto如果本地 MySQL 密码是空的就留空如果数据库不在本机url中的localhost要改成对应的服务器地址。这里有一个常见问题MySQL 驱动版本不匹配会导致启动报ClassNotFoundException例如 MySQL 8.x 使用旧版com.mysql.jdbc.Driver会直接报错应该使用com.mysql.cj.jdbc.Driver并配套 8.x 版本的驱动依赖。5.2 启动 SpringBoot 主类在 IDEA 中直接运行TraceSystemApplication主类。正常启动后控制台出现类似下面的日志Started TraceSystemApplication in 3.2 seconds (JVM running for 3.5) Tomcat started on port(s): 8080 (http)看到Started关键字说明服务已经起来了。访问http://localhost:8080/检查后端是否正常。如果 8080 端口被占用可以临时用下面的命令启动指定端口# 覆盖配置中的端口实际命令按你的 jar 包名调整 java -jar trace-system-0.0.1-SNAPSHOT.jar --server.port80815.3 初始化数据库推荐在 SpringBoot 启动前先在 MySQL 中建库建表避免启动后页面报错。也可以将上面的建表 SQL 保存为schema.sql利用 Spring Boot 的初始化脚本机制导入但毕业设计项目更推荐直接在 Navicat 中执行 SQL逻辑更直观答辩时也容易讲。# 登录 MySQL 后执行建库命令 mysql -u root -p CREATE DATABASE trace_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;建好库之后再依次执行product_info、batch_record、security_code、query_log的表结构语句。表结构没有建好时系统第一次查询会直接报Table doesnt exist这个问题在毕业设计演示时很常见优先检查。6. 扫码溯源与防伪查询功能实现这个章节是整个系统的核心。下面给出三个关键能力的实现方式和代码示例。6.1 二维码生成二维码生成集成 ZXing 工具类实现。核心思路是后端根据防伪码拼出溯源查询 URL再调用二维码工具类生成 Base64 图片字符串前端直接用img标签展示。这样省去文件存储和图片访问配置演示更简单。import com.google.zxing.BarcodeFormat; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import org.springframework.stereotype.Component; import java.util.Base64; import java.io.ByteArrayOutputStream; Component public class QrCodeUtil { /** * 根据溯源地址生成二维码Base64字符串 */ public String generateQrCodeBase64(String traceUrl, int width, int height) throws Exception { QRCodeWriter qrCodeWriter new QRCodeWriter(); BitMatrix bitMatrix qrCodeWriter.encode(traceUrl, BarcodeFormat.QR_CODE, width, height); ByteArrayOutputStream outputStream new ByteArrayOutputStream(); MatrixToImageWriter.writeToStream(bitMatrix, PNG, outputStream); return Base64.getEncoder().encodeToString(outputStream.toByteArray()); } }调用时拼出溯源 URL需要按你自己的项目接口路径替换String traceUrl http://localhost:8080/product/trace?code securityCode; String qrBase64 qrCodeUtil.generateQrCodeBase64(traceUrl, 300, 300);实际部署后把域名换成服务器公网地址手机扫码就能访问。6.2 扫码溯源查询接口用户扫码后请求后端接口接口参数是防伪码code。Controller 层返回产品档案、批次信息、查询次数和风险提示。import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; RestController RequestMapping(/product) public class TraceController { Autowired private TraceService traceService; /** * 溯源查询接口 * 请求示例: GET /product/trace?codexxx */ GetMapping(/trace) public MapString, Object trace(RequestParam(code) String code, RequestParam(value ip, required false) String ip) { MapString, Object result new HashMap(); result.put(success, true); result.put(data, traceService.getTraceInfo(code, ip)); return result; } }Service 层负责真正的业务逻辑先根据 code 查security_code再根据product_code和batch_no查产品和批次信息最后更新query_count并写入query_log。返回的数据结构建议包含以下字段{ success: true, data: { code: 8f3a1c2d9e4b, productName: 智能手表 X1, brand: 示例品牌, model: X1, batchNo: PC20250601, productionDate: 2025-06-01, qcResult: PASS, operator: 张工, queryCount: 3, riskTip: 该产品已被查询 3 次请确认产品来源 } }6.3 防伪校验逻辑防伪校验不能只做一个查询。更完整的逻辑包含四种分支防伪码不存在返回该防伪码不存在请核对是否为正品。防伪码存在但状态已注销返回该防伪码已注销。防伪码存在且首次查询返回正品信息更新首次查询时间。防伪码存在且查询次数超过阈值返回正品信息并附带风险提示。下面给出一个防伪校验的伪代码框架public TraceInfoDto getTraceInfo(String code, String ip) { // 1. 查防伪码 SecurityCode securityCode securityCodeMapper.selectByCode(code); if (securityCode null) { throw new BizException(该防伪码不存在); } if (securityCode.getStatus() 2) { throw new BizException(该防伪码已注销); } // 2. 查询产品与批次信息 ProductInfo product productInfoMapper.selectByProductCode(securityCode.getProductCode()); BatchRecord batch batchRecordMapper.selectByBatchNo(securityCode.getBatchNo()); // 3. 更新查询次数并记录日志 int newCount securityCode.getQueryCount() 1; securityCodeMapper.updateQueryCount(code, newCount); QueryLog log new QueryLog(); log.setCode(code); log.setIpAddress(ip); log.setQueryResult(SUCCESS); queryLogMapper.insert(log); // 4. 组装返回结果 TraceInfoDto dto new TraceInfoDto(); dto.setProductName(product.getProductName()); dto.setBatchNo(batch.getBatchNo()); dto.setQueryCount(newCount); dto.setRiskTip(newCount 3 ? 该产品已被查询多次请确认产品来源 : null); return dto; }防伪逻辑的关键在于每次查询都更新次数、写日志。这样管理人员在后台可以看到某个防伪码被查了多少次、从哪里查的答辩时也能讲“系统不是简单查表而是具备链路追踪能力”。7. 接口 API 设计后端接口统一返回 JSON方便小程序、H5 或者后台管理系统调用。这里把核心接口整理成一张表。接口地址方法参数说明/product/traceGETcode扫码溯源查询/product/listGETpage, size, keyword产品分页列表/product/addPOSTproductInfo新增电子产品/batch/listGETpage, size, productCode批次分页列表/batch/importPOSTbatchRecords, productCode批量导入批次/security/generatePOSTproductCode, batchNo, count批量生成防伪码/security/listGETpage, size, code防伪码分页列表/queryLog/listGETpage, size, code扫码记录列表接口路径和参数需要按你自己的项目调整上面的表格是一个相对完整的基础框架。下面给出用 curl 测试接口的示例# 查询溯源信息这里假设防伪码为 8f3a1c2d9e4b curl http://localhost:8080/product/trace?code8f3a1c2d9e4b -H Content-Type: application/json如果需要写脚本批量验证多个防伪码可以用 Python 调接口import requests import time url http://localhost:8080/product/trace codes [8f3a1c2d9e4b, 8f3a1c2d9e4c, 8f3a1c2d9e4d] for code in codes: response requests.get(url, params{code: code, ip: 127.0.0.1}, timeout10) print(code, response.status_code, response.json()) time.sleep(0.5)批量验证时注意加延时避免给本地数据库造成过大压力。接口如果报 500优先看控制台的 SQL 日志MyBatis-Plus 配置了StdOutImpl后会把 SQL 直接打印出来排查非常方便。8. 资源占用与性能观察这个系统是纯 Java Web 应用不需要显卡资源占用主要在内存和数据库连接上。按通用 Spring Boot 应用的经验可以重点观察四项指标。内存方面单体 Spring Boot 应用启动后 JVM 堆内存通常在 256MB 到 512MB 之间加上元空间和其他开销给开发机预留 1G 到 2G 内存比较稳妥。数据库连接池默认配置下MySQL 实例本身也会占用几百 MB 内存。如果是低配服务器部署可以用java -Xms256m -Xmx512m -jar限制 JVM 堆内存大小。观察方法分三步。第一步在 IDEA 控制台右侧找到JConsole或使用VisualVM查看 JVM 内存第二步MySQL 命令行执行SHOW PROCESSLIST;查看数据库连接数第三步使用 Postman 或 JMeter 对/product/trace接口做并发请求观察响应时间和错误率。性能瓶颈通常出现在防伪码表的查询上。因为security_code表数据量会随着产品数量增长建议在code、product_code、batch_no三个字段上建索引。数据量达到百万级以上时可以引入 Redis 缓存防伪码信息和查询计数Redis 的INCR命令可以原子化实现查询次数自增再把风险判断从数据库操作简化成缓存操作。对于毕业设计来说不加 Redis 也能满足演示要求但讲出这个优化方案会是明显的加分项。9. 常见问题与排查方法问题现象可能原因排查方式解决方案启动报Cannot load driver class: com.mysql.cj.jdbc.DriverMySQL 驱动依赖缺失或版本不匹配检查pom.xml中依赖版本引入 8.x 版本 MySQL Connector/J启动报端口占用8080 端口被其他进程占用netstat -ano | findstr 8080修改application.yml端口或java -jar --server.port8081启动查询接口报 500日志提示Table trace_system.security_code doesnt exist未执行建表 SQL登录 MySQL 查SHOW TABLES;执行完整建表脚本扫二维码打不开页面URL 地址写成了localhost手机无法访问本机确认手机与服务器网络连通性将二维码内容地址改成服务器局域网或公网 IP防伪码查询次数不增加未在 Service 层调用updateQueryCount查看控制台 SQL 日志在查询逻辑中加入更新语句返回中文乱码数据库连接未指定characterEncodingutf8检查application.ymlURL 参数修改 JDBC URL增加字符集参数统一 UTF-8依赖下载缓慢未配置 Maven 镜像查看 Mavensettings.xml配置阿里云镜像仓库如果扫码查询一直失败最直接的办法是先用浏览器访问http://localhost:8080/product/trace?code某个真实存在的防伪码排除手机扫码环节的问题。后端能正常返回 JSON 后再回到二维码生成和服务地址配置来解决扫码侧的问题。10. 最佳实践与答辩加分建议10.1 项目落地建议第一先保证核心链路跑通。把“产品入库、生成防伪码、生成二维码、扫码查询、查看日志”这条主路径完整跑通再去扩展页面样式和统计图表。第二数据管理要提上日程。器材类项目很容易出现各表主键对不上、数据对不齐的情况。建议保持防伪码作为唯一键贯穿整个查询链路不随意在中间加拼接逻辑。第三后台管理系统建议采用若依等脚手架生成的方式。从零手写一套后台管理系统会占用大量时间如果项目材料中已经使用了 SpringBoot 和 MyBatis-Plus可以在此基础上先完成核心业务再考虑引入开源的通用后台模板。答辩时讲清楚“复用脚手架还是自己实现”的取舍反而能体现你的工程理解。第四使用流程引擎扩展审批流。如果毕设要求流程管理可以借鉴 Flowable 或 Activiti 工作流引擎在溯源环节增加“生产审批、出库审批、退货审批”等操作。不过这部分内容会显著增加学习成本不是必选只有在题目明确要求流程审批时才建议加入。10.2 答辩加分方向从项目整体来看有四个方向容易在答辩时加分。方向一是防伪码生成算法优化不要用纯 UUID而是设计成“批次前缀 随机数 校验位”的结构能把生成逻辑单独抽成一个策略类体现设计模式的应用。方向二是查询风险预警除了查询次数超过阈值告警外还可以增加同一 IP 高频访问限流、异地短时间多次查询告警等规则。方向三是数据可视化在后端增加一个统计接口返回产品销量、各批次查询热度、风险防伪码数量前端用 ECharts 画图展示。方向四是缓存与性能优化用 Redis 做防伪码短时间缓存降低数据库查询压力这个优化在并发场景下的收益可以用 JMeter 压测数据展示。10.3 合规与安全边界提醒这里要特别提一下合规问题。溯源系统的核心价值是帮用户确认正品但同时会收集扫码用户的行为信息。开发和演示时必须坚持最小化采集原则不采集与溯源无关的隐私信息不把完整的用户身份信息和查询日志绑定保存演示数据使用虚拟数据不对真实企业的产品码进行解析。系统中涉及到用户头像、手机号等敏感信息的需要做脱敏处理或直接省略。如果你在课程项目中使用了真实企业的产品二维码信息务必获得授权后再使用这一点在论文的“法律与伦理”部分写明也是论文审核老师会关注的内容。11. 防伪码批量生成的设计改进防伪码批量生成是很多同类项目容易卡住的地方。如果一次生成一万个防伪码循环插入数据库会非常慢。更合理的方式是先根据产品编码和批次信息生成防伪码列表再使用 MyBatis-Plus 的批量插入能力一次性写入。防伪码本身可以设计为固定长度例如“批次号后四位 yyyyMMddHHmmss 四位随机数 校验位”这样一个防伪码里就能解析出生产日期和批次线索。防伪码设计时需要保证两点唯一性和不可猜测性。唯一性靠数据库唯一索引兜底不可猜测性靠随机数和时间戳混合生成。下面给出一个简单的防伪码生成策略示例可以集成到你的生成 Service 中import java.security.SecureRandom; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class SecurityCodeGenerator { private static final String CHARACTERS ABCDEFGHJKLMNPQRSTUVWXYZ23456789; private static final SecureRandom RANDOM new SecureRandom(); public static String generate(String batchNo, int length) { StringBuilder sb new StringBuilder(); LocalDateTime now LocalDateTime.now(); String timePart now.format(DateTimeFormatter.ofPattern(MMddHHmmssSSS)); sb.append(batchNo.substring(Math.max(0, batchNo.length() - 4))); sb.append(timePart); int randomLength Math.max(4, length - sb.length()); for (int i 0; i randomLength; i) { sb.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length()))); } return sb.toString(); } }这里特意移除了容易混淆的字符0/O/1/I可以避免扫码时因字符相似导致查询失败。这段代码演示的是设计思路实际生成规则需要按你的表结构来调整。注意批量生成接口最好做成异步或分页任务处理。如果一次性生成十万条防伪码直接在前台请求里卡住几十秒前端就会超时。比较稳妥的做法是后台生成任务表记录“生成任务批次、状态、成功数量、失败原因”接口只返回一个“任务已提交”的标识然后前端轮询任务状态。这个设计会让你的项目在技术答辩中明显上一个台阶。12. 总结与下一步这个 SpringBoot 电子产品溯源系统项目最值得做的地方是业务闭环完整从产品入库、防伪码生成、二维码扫码到风险查询整条链路能演示、能讲解、能扩展。部署时需要最先验证的核心功能是“防伪码生成 扫码查询 查询记录”这条主流程只要这三个功能跑通项目的最核心部分就已经完成了。最容易踩的坑集中在数据库初始化、MySQL 驱动版本、二维码 URL 地址不正确这三个地方提前留意可以省下大量调试时间。如果后续要继续扩展建议优先做前端扫码页面的优化把溯源信息展示设计成类似“产品档案卡片”的样式再补上 ECharts 数据统计看板。数据量大了之后引入 Redis 缓存防伪码信息和查询计数系统会更有真实感。整个项目技术栈覆盖了 SpringBoot、MyBatis-Plus、MySQL、Maven、ZXing相对完整对找 Java 后端实习也有帮助。建议把项目跑通后整理一份 README把建库 SQL、启动步骤、测试数据截图放进去作为答辩附件。
