
1. 动手之前先看懂这个系统的真正价值做Java Web毕设选“工厂车间管理系统”这个题目我觉得最聪明的地方在于它不要求你有什么高深算法也不涉及复杂的分布式架构但业务场景足够真实、足够完整。从工单下达到物料领用从设备点检到质量巡检再到看板大屏和报表统计一套系统下来几乎把企业信息化里的常见模块都覆盖了。这也就意味着你的答辩PPT上能写的东西非常多“这个项目为什么值得做”“它解决了什么实际问题”这套说辞天然就能立住。再加上技术栈选了SpringBoot Vue这是目前市面上Java Web岗位招聘描述里出现频率最高的组合。后端SpringBoot负责提供接口前端Vue负责页面交互前后端通过JSON格式的数据完成通信。你把这个项目做完简历里写“独立完成前后端分离的工厂车间管理系统”面试官看到的是你具备完整的全栈开发能力而不是只会在IDE里跑个CRUD demo。从投入产出比来看这类项目的性价比极高。GitHub上能找到不少同类型的开源案例课题需求文档和数据库设计也相对成熟你不需要从零发明业务逻辑接手一套源码、读懂它的设计、再做出自己的扩展就是一个完整的毕业设计周期。这也是我拿到这套“完整项目源码SQL脚本接口文档”之后决定花时间把它吃透、再整理成这套实操经验的原因。如果你是正在选毕设题目的学生这个方向值得放进备选。需要注意一点这类项目通常附带完整的SQL脚本和接口文档确实省事但你要警惕“拿到手就提交”的侥幸心理。导师对毕设的抽查历来不是看你怎么描述而是半句话问到你具体某个接口怎么实现、某些表为什么这么设计。源码是起点不是终点。2. 后端从零搭建SpringBoot骨架和核心模块设计2.1 项目结构与目录设计经验我见过太多毕设代码把所有类都堆在controller包里mapper和service混在一起别说答辩自己回去维护都觉得头疼。正常的SpringBoot工程结构应该清晰分层我这套项目里是这样划分的src/main/java ├── com.plant.manage │ ├── PlantManageApplication.java // 启动类 │ ├── common // 公共类统一返回值、异常处理、工具类 │ │ ├── Result.java // 统一返回包装类 │ │ ├── ResultCode.java // 状态码枚举 │ │ ├── GlobalExceptionHandler.java │ ├── config // 配置类拦截器、CORS、WebSocket │ ├── controller // 对外接口层 │ ├── service // 业务逻辑层 │ ├── mapper // 数据访问层MyBatis-Plus的BaseMapper │ ├── entity // 数据库实体类 │ ├── dto // 前后端交互的数据对象 │ ├── vo // 视图对象组合查询结果 │ └── utils // 工具类JWT工具、时间处理一个容易被忽略的细节在开发初期就把统一返回类Result.java设计好后面会省非常多的事。前后端约好了一个固定格式——code为200代表成功data里放业务数据msg是给前端弹出的提示信息。百分之九十的接口都复用这一个类而不是每个接口自己拼Map代码写起来清爽太多。实际开发中我还会在Result里加一个success()静态工厂方法让controller里那段return Result.success(service.list());看起来一目了然。目录设计里的另一个经验是千万不要把业务逻辑写进controller里。很多同学图省事直接在controller里调mapper看起来代码量少但一旦业务复杂一点比如工单状态流转需要同时更新三张表这段逻辑放在controller里就成了灾难——事务都控制不好。我的原则是controller只做三件事接收参数、调service、返回Result。所有事务注解Transactional一律打在service方法上。2.2 登录认证与权限设计没有它毕设会被打回一半车间管理系统的用户分三类车间主任、班组长、一线操作工。不同角色能看到的页面和能点的按钮不一样这就是最典型的基于角色的权限控制需求。我在项目中选用了JWT 拦截器的方式没有引入Spring Security原因很简单——Spring Security的学习成本高、配置复杂对于毕设来说自己用拦截器实现一套轻量级的认证逻辑反而更容易在答辩时讲清楚原理。JWT的流程是用户登录成功之后后端把用户ID、用户名、角色编码放到一个token里用密钥签名再返回给前端。前端每次请求都把这个token放到请求头Authorization字段里后端拦截器拦截所有除登录接口之外的请求校验token是否合法、是否过期。校验逻辑我写在一个JwtInterceptor中配置到WebMvcConfigurer的addInterceptors里同时用excludePathPatterns把/api/auth/login、swagger文档路径等白名单排除掉。这里有不少实操坑要提醒JWT密钥妥善保存不要随便写在代码里硬编码至少放到application.yml配置里答辩时还能顺便说一句“密钥通过配置文件管理部署环境可替换”。拦截器里如果发现token解析失败要用response.setStatus(401)配合输出JSON直接返回给前端而不是让异常一路抛到全局异常处理器里变成500。最好在拦截器里把解析出的用户ID放回request.getAttribute()后续service从上下文拿当前操作人这样“谁来创建了这张工单”这类字段就有值了。至于权限判断我用了更直白的方式在需要限制角色的接口上打一个自定义注解RequireRole(admin)拦截器解析到注解后拿当前用户的角色编码比对不一致就返回403。这套方案代码量不大但理解起来比Spring Security自带注解容易得多面试也好解释。2.3 工单状态流转毕设项目里的核心业务逻辑工单管理是车间系统的灵魂。我的表设计里有一张work_order表核心字段包括工单编号、产品名称、计划数量、完成数量、优先级、状态、计划开始时间、计划结束时间、创建人、指派人、备注。状态流转是这道业务题的深水区。我定义了一套状态机待派工 → 生产计划中 → 生产中 → 已完工 → 已质检 → 已入库另外还有两个异常状态挂起和已取消。为什么强调状态机因为直接用一个字段去存字符串“待派工”这种写法将来极难维护。更好的做法是在service层提供专门的方法dispatchOrder()、startProduction()、completeProduction()方法内部先校验当前状态是否允许切换到目标状态。比如一张待派工的工单可以直接取消但一张已质检的工单就不能随意回到待派工。这种“状态校验 业务操作 日志记录”的三段式写法不仅代码结构漂亮答辩时也特别有讲头——老师一旦问到“并发情况下怎么防止两张工单被同时指派给同一个操作工”你就能顺势说出在update语句里带上前置状态条件比如UPDATE work_order SET status production_ready WHERE status pending_dispatch AND id ?这种乐观锁式的状态更新在车间系统里的意义非常大——生产环境里两个班长同时操作同一张工单的场景并不罕见。状态一变接下来的计划拆分、排班调整、物料预留逻辑全部跟着变所以这块代码值得你花一整个下午去逐行读懂。2.4 设备管理与预防性维护提醒设备台账是本系统第二个业务支点。我在设备表equipment里设计了设备编号、名称、型号、所在车间、状态运行中/停机/维修中/报废、购入日期、上次保养时间、下次保养时间。预防性维护的提醒逻辑点比较巧妙不是靠人工每天去看哪些设备快到保养日期了而是写了一个定时任务每天凌晨扫描一次next_maintenance_date减去当前日期小于3天的设备生成一条maintenance_reminder记录同时通过WebSocket实时推送到车间看板大屏上。这块逻辑量很小用Spring的Scheduled(cron 0 0 2 * * ?)就能搞定但它是典型的“让系统更智能”的加分设计。不过要注意Scheduled如果写在启动类上会让启动类有点乱我的习惯是单独建一个scheduled包里面放MaintenanceRemindTask类类上标注Component方法上标注Scheduled。另外开发本机调试时定时任务经常被触发得很烦人建议在application.yml里加一个开关task: reminder-enabled: true代码里用Value(${task.reminder-enabled})判断调试时临时关掉部署时再开这个细节在答辩时顺嘴提一句“生产任务开关化配置”效果很好。3. Vue前端从环境到落地开发中的真实步骤与坑3.1 环境准备Vue安装及依赖、路由初始化前端这套用的Vue 2 Element UI稳定兼容性最好不过现在很多新开项目会用Vue 3 Element Plus Vite风格上更符合当下的就业技能点。不管哪种环境准备的第一步都是Node.js和npm。我踩过最典型的坑是版本问题。如果你下载到一套项目源码对方用的是Vue 2.6 依赖锁定版本而你本机新装的是Node 18安装依赖时经常会出现node-sass编译失败——这是经典老问题。我的建议是拿到项目先看package.json里是否用了node-sass如果用了直接换成sassDart Sass新版不用改任何样式代码问题立刻消失。另外npm install如果下载特别卡可以考虑配置国内镜像。安装完依赖之后第一件事是跑起来看路由结构。路由这块的实操细节比较重要车间管理系统的路由要先设计好嵌套关系——一级路由布局组件、二级功能页面。项目里用了vue-router的经典写法const routes [ { path: /login, component: Login }, { path: /, component: Layout, redirect: /dashboard, children: [ { path: dashboard, component: Dashboard, meta: { title: 车间总览, requiresAuth: true } }, { path: workorder/list, component: WorkOrderList, meta: { title: 工单列表, roles: [admin, leader] } } ] } ]这里有个隐藏的加分点动态路由。如果不做权限控制前端路由表可以直接写死。但如果要跟后端角色匹配“班长看不到复核评审菜单操作工看不到设备维护菜单”就需要在用户登录之后根据返回的角色编码在路由里做过滤。我项目里用了一个简单的方案在router.beforeEach全局守卫里判断to.meta.roles是否包含当前用户角色不包含就直接跳转404页。这套方案代码量小而且效果直观。3.2 axios封装和请求拦截日常开发的关键细节前端开发中百分之九十的问题都出在请求没封装好。如果每个页面里都写一坨this.$http.get(...)然后自己处理错误你会被重复代码烦死。我习惯在src/utils/request.js里做一个axios实例统一配置baseURL然后在请求拦截器里把token加进请求头service.interceptors.request.use(config { const token localStorage.getItem(token) if (token) config.headers.Authorization Bearer ${token} return config })响应拦截器里统一处理业务code一旦碰到401就清空本地登录态并跳转登录页。这个设计只写一次但所有页面受益。另一个容易踩坑的边界是跨域。前后端分离架构下前端跑在http://localhost:8080后端通常是http://localhost:8088直接调接口必然触发跨域。我见过不少同学在后端CORS配置上翻车规则写得太开放或太严格都不对。正确做法是在后端WebMvcConfigurer里配置allowedOriginPatterns: http://localhost:9527 allowedMethods: GET, POST, PUT, DELETE allowedHeaders: * allowCredentials: true不要用*通配所有来源面试官可能会追问你的安全考虑一个具体的前端地址加“生产环境替换为正式域名”的说明就是标准回答。还有一种做法是开发时用Vue CLI自带的devServer代理把/api请求代理到后端地址这样前端代码里写的是相对路径生产部署时再统一配nginx反代这个方案我在这套系统的开发联调阶段也用过非常顺手。3.3 核心页面实现从看板到ECharts报表前端页面里最有展示价值的两块一是车间看板大屏二是统计报表。车间看板我用ECharts渲染了几个核心图表设备状态饼图、各产线今日产量柱状图、近七天产量趋势折线图再加上一个自动滚动的当前最新工单列表。这里有个非常实用的细节图表容器必须设置固定高度ECharts初始化时如果容器的高度为0图形会直接渲染不出来另外在mounted里初始化之后别忘了window.onresize里调用chart.resize()不然浏览器窗口大小的变化会让图表变得奇怪。这两个小问题我辅导过的学生几乎都遇到过。实时数据这块我用WebSocket实现前端订阅。后端的SpringBoot配置了WebSocket端点页面连接后接收production_data主题的消息动态更新看板上的数字。created生命周期里建立连接beforeDestroy里断开连接防止页面关闭后残留无效链接——这个细节在答辩演示时很有存在感因为老师会看到屏幕上的数字自主跳动这不是静态写死的死页面是真正的实时系统。ECharts如果想要视觉上更美观可以配置两套主题深色主题配合深色大屏背景报表系统用浅色主题配合白底页面。把这些配置拆到src/utils/echarts-theme.js里页面代码会很干净。统计报表我会单独做一个页面用两个柱状图展示本周与上周各产线的产量对比再用一个表格展示各工单的完成度进度条数据都来自后端汇总接口。4. 数据库设计这套系统的地基4.1 实体关联与核心表结构很多人拿到SQL脚本直接跑完就完了从来不问为什么这张表有两个外键。我建议你反着来先把ER图理清楚再对照SQL脚本看哪些设计是合理的哪些还有改进空间。我的车间系统一共有12张核心表表名作用关键字段sys_user用户表id, username, password, real_name, role_code, enabledsys_role角色表id, role_code, role_namepublic_work_order工单表id, order_no, product_name, plan_num, finish_num, status, assignee_id, plan_start_time, plan_end_timeequipment设备台账id, eq_no, eq_name, model, status, last_maintain_date, next_maintain_dateeq_maintenance保养记录id, eq_id, maintain_date, maintain_content, operator_ideq_repair维修记录id, eq_id, fault_desc, repair_desc, status, report_time, repair_timeproduct_material物料表id, material_code, material_name, stock_num, warn_low_limitwork_order_material工单物料明细id, work_order_id, material_id, require_numproduct_inspect质检记录id, order_id, inspect_batch, qualified_num, unqualified_num, inspector_id, inspect_timework_shift排班表id, shift_date, team_name, leader_name, member_idsproduct_log生产进度日志id, order_id, process_name, operator_id, log_time, log_contentsys_log操作日志id, user_id, action, module, operate_time从字段设计能看出业务关联的脉络工单表通过assignee_id关联用户表物料中间表让工单与物料形成多对多关系质检表通过order_id反查工单完成质量。实用性上最值得称道的是product_log表——它是追溯源头的重要依据一条工单从派给谁、中间经过哪些工序、每道工序谁操作的、花了多长时间全部落在这个表。有一个设计需要留意不建议数据库里设置太多物理外键约束。我见过很多毕设数据库里FOREIGN KEY满天飞看起来关系很严密实际插入数据时除了给自己添乱没有任何意义——订单先插还是用户先插可能要反过来。我在这套系统里用的是逻辑外键只有索引没有物理约束数据一致性的保证放在service层代码里控制。这个设计选择在答辩现场说清楚老师会觉得你是真做过项目的而不是照着教程抄的。4.2 SQL脚本执行与初始化数据执行SQL脚本的常见方式是Navicat、DataGrip或者MySQL命令行。直接source或导入文件前提是安装好数据库连接工具并创建好字符集为utf8mb4的空库。这里特别提醒如果SQL脚本建表时带了ENGINEInnoDB DEFAULT CHARSETutf8mb4那你在建库时也保持一致否则中文乱码问题会让你怀疑人生。拿到这套源码时我发现它的SQL脚本里已经内置了一批演示数据普通操作工账号密码、车间主任账号、若干设备、若干物料。这些数据非常重要答辩现场演示登录千万要用脚本里给好的现成账号不要自己注册新账号然后从空数据开始走流程那样演示效率会低很多。演示过程可以梳理成一条动线用车间主任账号登录 → 新建工单并派工 → 切换到操作工账号开始生产 → 录入完工数量 → 质检员质检 → 完成入库。每一步页面上都有状态变化数据有来有往整场演示能持续15到20分钟而不冷场。4.3 数据库调优与扩展思路毕设阶段谈数据库调优似乎略超前但准备一两个答案点对自己没坏处。最常见的是查询优化——工单列表查询如果关联三张表数据量上来之后明显变慢。在关键表的大字段上建立联合索引比如idx_order_status建在status上在查询频繁的assignee_id上建索引。product_log表按工单ID查询多一个普通B-tree索引能解决90%的问题。另外答辩时老师常问一句“如果表的数据到了百万级别这个系统还能用吗”这是个经典送分题。你可以答——分页加索引能顶住查询压力但报表汇总类统计可能需要定时任务提前把聚合结果放到汇总表里避免每次实时count整表。说出这个思路比说“我不知道”高出好几个档次。5. 接口文档与联调让前后端协作不掉链子5.1 接口协议与路径设计这套系统里所有接口都用RESTful风格资源名统一用名词复数操作方式靠HTTP动词区分。比如/api/work-order配GET是分页查询POST是新建工单/api/work-order/{id}配GET是详情、PUT是更新、DELETE是删除。响应体统一为{ code: 200, message: success, data: {} }如果接口确实有业务错误比如工单状态不能流转、物料库存不足后端返回code: 400message里写清楚原因。前端响应拦截器里如果收到400要弹message而不是简单显示“请求失败”——这个细节直接关系到演示效果很多同学系统做完了页面报错提示还是那五个字“网络异常”这是不合格的。5.2 knife4j自动生成文档与手写文档互补Java Web后端项目如果整合了Knife4jSwagger增强接上SpringBoot后输入http://localhost:8088/doc.html就直接生成了一份可视化接口文档每个controller的注解、参数说明、响应示例都挂在页面上。这个方法几乎零成本就能给毕设系统配一套总览比Word里贴代码要专业得多。但仅靠Swagger生成的文档对答辩不够。真正的接口文档应该包含“使用场景 请求示例 响应示例 字段说明”。比如“派工完成接口”文档里除了参数列表还要写清楚这个接口对工单当前状态有前置要求必须处于待派工或已派工状态要说明操作这个接口的权限车间主任角色。这些业务语义上的信息不可能从代码注释自动生成需要手动补进Word文档或Markdown里。我把这套系统的接口文档整理成了三段式——接口概述、请求参数表、响应字段表再配上一个curl示例这样导师翻起来非常快不会迷失在代码里。5.3 接口联调中高频出现的三个问题联调阶段最容易出问题的绝对是这三点第一时间格式不一致。后端默认返回的时间格式是2025-01-16T10:15:30带T带时区标记前端Element UI日期组件不一定能解析。解决方式是通过spring.jackson.date-format: yyyy-MM-dd HH:mm:ss和time-zone: GMT8全局统一格式前端对接到位。这种问题属于“看起来没什么一跑页面全是NaN”很搞心态。第二参数命名不一致。Java后端驼峰命名planStartTime前端JS也习惯驼峰但SQL查询用别名转换为下划线后映射错位很常见。解决办法是全局一致要么全部驼峰要么全部下划线。在MyBatis-Plus里开启map-underscore-to-camel-case: true保证数据库字段在Java对象里自动映射成驼峰。第三分页参数边界问题。常见的前端页码是1开始、每页10条后端有些分页插件却是0开始。我在这套系统里约定前端传pageNum从1开始和pageSize后端统一减1。写下这个约定后分页接口再也没被问过“为什么你第一页数据没了”。6. 部署上线与答辩避坑记录6.1 本地完整部署流程实测一套源码拿到手正确的打开步骤极其重要。我按这套流程跑通了不下十次每一步都有可能踩雷的地方我都标记出来第一步导入SQL脚本。先创建数据库再导入脚本完成后检查几张核心表的数据量。我通常优先看sys_user表如果账号密码有加密处理就要确认脚本里给的是密文还是明文。如果模板用MD5加密而你拿明文去登录第一步就会卡死。第二步配置后端application.yml。改数据库连接地址、账号、密码改Redis地址如果系统用到启动类运行起来看控制台日志有没有报错。这里有一个毕设经典大坑SpringBoot版本太高。很多同学为了追新选了SpringBoot 3.x结果配合JDK 8项目报错因为3.x最低要求JDK 17。发现是版本问题建议直接用SpringBoot 2.7.x对应JDK 8依赖兼容性好、网上资料多、出问题也好搜。这套问题在毕业设计阶段完全没有必要硬碰硬去解决换版本往往是最实惠的选择。第三步启动前端。npm install装依赖、npm run dev起服务浏览器访问前端地址控制台确认有没有接口报错。能正常登录系统基本就活了。我在实际部署中还遇到过前端起不来、提示这个模块找不到那个包十有八九是node版本太新建议装一个nvm做版本管理切到项目的常用版本例如Node 16或18之间。6.2 打包发布Vue打进SpringBoot里毕设阶段不需要完整的Jenkins和Docker部署但“把前端打包放进后端的jar包里”是必须要会的操作这也是毕设答辩最常被问到的实操题。Vue项目里执行npm run build:prod生成一个dist目录。把dist里的文件复制到SpringBoot的src/main/resources/static目录下重新打包成jar。这样所有的静态资源、接口、数据库都集中在一个进程里访问http://localhost:8088就能直接打开页面不需要再单独启动前端。对于部署到阿里云学生服务器或导师给的Windows服务器上的场景这种单机部署方式最省心。实际操作中会遇到几个麻烦Vue的路由如果是history模式刷新页面会出现404。解决方式一种是把Vue路由改成hash模式URL里带#另一种是后端添加一个控制器把非接口路径forward到index.html。对毕设来说改hash模式最简单。静态资源路径问题。Vue默认打包后资源路径是绝对的/js/app.js形式在jar包里如果部署在根路径没问题但要放在子路径访问就会不对。在vue.config.js里把publicPath设为./相对路径一步解决。Vue的接口请求地址在打包后是相对路径/apijar启动时也要从后端反向代理本身来看如果后端本身已经统一前缀/api两者要能对上。6.3 部署运行常见问题速查表我把这段时间实操中遇到的高频问题整理成一个速查表你可以直接收藏以后排查时按图索骥现象可能原因解决办法npm install 报 node-sass 编译错误Node版本过高或没装构建工具卸载node-sass改用sass并把package.json里的依赖替换前端请求接口跨域报错前后端地址不同端口后端配置CORS或前端配置devServer代理登录提示“未登录或token过期”请求拦截器没带token或者JWT密钥不一致检查localStorage里有没有token、后端密钥是否统一MySQL连接报 caching_sha2_passwordMySQL8默认加密插件改用 mysql-connector-java 8.xURL加上 allowPublicKeyRetrievaltrue中文乱码数据库字符集不一致建库统一utf8mb4连接URL追加 useUnicodetruecharacterEncodingutf8页面刷新404Vue history路由模式改为hash模式或后端配置forward端口被占用上次启动的进程没结束Linux用netstat或lsofWindows用netstat -ano查进程结束接口返回时间带T后端JSON序列化格式配置spring.jackson.date-format关于MySQL8的坑我多说两句这套系统如果用的是MySQL 5.7驱动换成8.x通常没问题但MySQL8默认的caching_sha2_password加密方式会跟一些老版本的驱动冲突报错信息一句话根本看不出所以然。连接URL里加allowPublicKeyRetrievaltrueuseSSLfalse很大概率直接解决。这类问题看着很傻但真的会耗费一下午。6.4 答辩演示时怎么把这个项目讲出花代码跑通了只是毕设的底线答辩汇报才是分出高下的地方。我的经验是演示流程要设计成“一条产线故事线”而不是打开系统随机点按钮。我建议的演示路径是这样的先登录车间主任账号进入车间总览看板展示设备状态和今日产量——这里的氛围感很强大屏上ECharts图表带动画老师第一印象就好。然后点开工单管理现场新建一张生产工单选择产品、填数量、指派给某位操作工。接着退出账号用操作工账号登录看到首页提示“您有1条待处理工单”进入工单列表开始生产点击“开始生产”按钮——这里要提前想好“为什么状态从待派工变成生产中”这个问题怎么回答。生产完成后录入完工数量再切到质检员账号做质检记录合格数。最后回到车间主任账号打开统计报表看到产量和合格率的新增数据已经更新。这条路径的核心逻辑是每个操作步骤都有对应的后端接口、状态变更和数据库记录随时能接住老师追问。汇报时也要有意强调几个技术细节——我是怎么设计状态机的、JWT的token是怎么校验的、WebSocket是怎么推送的、ECharts数据是从哪个接口拿的。这些细节能讲出来比你在PPT首页写“熟悉Java、熟悉Vue”有力一百倍。还有一个很实用的答辩技巧准备一份部署手册把开发环境版本、启动步骤、账号密码写清楚。老师问“这个系统怎么跑起来”的时候你直接递上手册再简单演示一遍环境配置。这在帮老师省时的同时也给自己的专业程度加分。写在最后的一点心里话做毕设这件事本质上不是“完任务”而是“展示你具备独立完成一个真实项目的底线能力”。SpringBoot和Vue这套组合之所以成了主流是因为它的分层清晰、生态成熟、社区资料充足任何一个模块出问题都能在十分钟内找到解决方案。您如果拿到一套源码别急着改代码加功能先把它跑通、读懂、讲清楚再想办法在一到两个模块上做出自己的差异化改动——比如加一个ECharts新报表、加一个Excel导出、加一个消息提醒功能这些改动一天就能完成但在答辩PPT上是实打实的“创新点”。这套车间管理系统的源码加SQL脚本加接口文档与其说是一份交付物不如说是一张入场券。真正需要投入时间的是你能不能在拿到它之后把它融成自己的知识体系。我个人带学生做毕设时总结了一个土办法把所有需要讲解的流程在手机上录一段旁白一遍一遍讲磕巴录到第三遍基本就滚瓜烂熟。答辩现场的表现自然也就出来了。项目本身不难难的是你愿不愿意花这个周末把它真正消化成自己的能力。