高校物品捐赠管理系统毕设:SpringBoot+Vue+MySQL全流程实战指南

发布时间:2026/9/26 23:00:17
高校物品捐赠管理系统毕设:SpringBoot+Vue+MySQL全流程实战指南 每年计算机专业的毕设季总有同学在选题表前纠结半天既要避开烂大街的图书管理系统又怕选太偏的题目把自己坑进去。如果你想找一条兼顾“业务真实”“技术栈主流”“工作量可控”的路高校物品捐赠管理系统是少数几个值得认真考虑的方向。这个题目核心的技术栈是SpringBoot、Vue、MySQL三件套对应的场景却很有现实温度每年毕业季大量二手教材、小电器、日用品被当成废品处理而低年级学生又存在真实需求。整套系统的价值不只是“做出来答辩”而是把捐赠发布、审核、申请、领取、数据统计这条完整业务链跑通前端用Vue做交互后端用SpringBoot提供接口MySQL负责数据落地。对学生的意义是CRUD之外能接触到权限设计、状态流转、文件上传、分页查询这些企业开发高频知识点。这篇文章我按从0到1的顺序把业务设计、表结构、核心代码思路、部署踩坑、论文写法全部展开属于可以直接抄作业的那种长文。1. 项目定位与功能设计拆解1.1 先用业务视角想清楚系统到底要管什么很多人拿到题目就急着建表写接口这是本末倒置。先回到现实场景里思考一所高校里捐赠这件事涉及哪些角色、哪些动作、哪些规则角色上至少有三类人。管理员是平台运营者负责审核捐赠物品是否合规、管理用户、发布公告、查看统计数据捐赠者是物品的提供方需要能发布物品、查看审核结果、管理自己发布的记录受赠者是物品的需求方需要浏览在架物品、提交领取申请、确认收货。动作上物品从登记到被领走应该是一条完整的链路用户发布物品 - 管理员审核 - 物品上架展示 - 用户申请领取 - 管理员/捐赠者确认 - 物品发放完成。这条链路上每个环节都要有数据记录这是后面设计表结构的核心依据。规则上高校场景有几个特殊点需要提前考虑。比如一本书同时被三个人申请谁来领这就需要一个申请优先级或者先到先得的规则。再比如食品类、药品类物品往往不适合捐赠审核时就要有对应策略。还有捐赠者不想暴露太多个人信息系统要处理匿名展示。这些业务细节虽然不会全部细化成代码功能但是它们决定了你的数据库字段、状态机设计、权限控制也决定了论文里需求分析章节有没有东西可写。1.2 三大角色权限边界与前端页面规划权限这件事我强烈建议你在后端就控制住而不是依赖前端隐藏按钮。前端隐藏只是用户体验层面的美化后端接口要校验每次请求的操作人是谁、有没有权限做这个操作。具体到这个系统权限可以这样划分。管理员端主要包含登录后进入后台管理界面能够查看物品审核列表、通过或驳回捐赠物品、管理所有用户账号禁用/启用、发布系统公告、查看全站数据统计仪表盘。管理员操作的页面一般放在独立的layout里左侧菜单栏布局用Vue Router做路由守卫未登录拦截跳转登录页。捐赠者端包含个人中心资料修改、密码修改、物品发布页上传图片、填写物品信息、我发布的物品列表查看审核状态、下架已发布物品、收到领取申请后确认发放。受赠者端包含物品浏览大厅卡片式列表展示在架物品、物品详情页查看图片、描述、捐赠者备注、领取申请提交填写领取理由、我的申请记录查看申请状态、确认收到。这里有一个容易忽略的设计点同一个用户其实可以既是捐赠者又是受赠者所以数据库里不应该把角色做成用户表里的一个字段去写死而是用独立的角色表加用户角色关联表或者更轻量一点用一个用户表加一个type字段区分。对于毕业设计体量后者的方案完全够用代码写起来也少一张关联表。1.3 核心功能模块划分与工作量评估整个系统我建议拆成六个模块来规划工作量。第一是用户模块包含注册、登录、JWT令牌签发、个人信息维护。这里注意密码不能明文存储用BCrypt加密这是答辩时很加分的点。第二是物品管理模块包含物品发布、图片上传、物品编辑、下架、列表分页查询、详情查询。这是全系统业务量最重的模块。第三是审核模块管理员对待审核物品进行通过或驳回驳回要填原因并通知发布者。第四是申请与领取模块用户提交领取申请、管理员或捐赠者确认、记录发放状态。第五是公告模块管理员发布公告用户端展示公告列表。第六是统计模块核心是展示三类数据总捐赠物品数、总领取数、品类分布。用ECharts画柱状图和折线图会比较好看也是论文系统实现部分的亮点截图素材。我估算过按每天写代码3小时左右计算这个系统从建项目到功能全部跑通普通水平大概需要两周多一点时间非常可控。关键在于不要在一开始就追求完美先跑通主干流程再回头补细节。2. 技术选型与架构说明2.1 为什么这套组合是毕业设计的最优解之一SpringBoot Vue MySQL这个组合能成为Java方向毕业设计的御三家不是没有原因的。SpringBoot解决的问题是Java后端开发的配置地狱。它内置了Tomcat不用再单独部署一个外部容器内置了自动配置机制很多基础组件的配置项都有默认值配合Maven或Gradle做依赖管理拉到什么包就用什么能力。从学习路径来说SpringBoot是直接面向现代Java web开发的主流框架企业里用得非常广泛学完能无缝衔接工作技能。Vue解决的是前端交互复杂度和团队协作问题。它的响应式数据绑定让DOM操作大幅减少组件化开发让同一套页面能复用。配合Element UI组件库不擅长CSS的同学也能在很短时间内做出很像样的后台界面。为什么不用JSP因为JSP时代的前后端是糅在一起的改个按钮都要动后端代码而前后端分离架构更接近当前企业开发主流自己的项目也更好维护。MySQL就不用多说了开源免费、资料多、生态成熟。对于这种体量的管理系统它的性能完全够用。有些人纠结要不要换成PostgreSQL说实话对毕设项目来说没有本质区别换成PostgreSQL反而让自己的排错成本变高因为网上流传的方案大部分还是以MySQL为例的。2.2 前后端分离架构与开发联调流程前后端分离是我强烈推荐的做法不只是因为现在都这么写而是因为它的开发和调试体验确实更好。前端用Vue开发时跑在Node提供的devServer上后端SpringBoot跑在8080端口两边独立开发互不阻塞。联调时通过一个代理配置把前端的请求转发到后端接口非常方便。具体的联调流程是这样的前端在vue.config.js里配置devServer.proxy把以/api开头的请求转发到 http://localhost:8080 这样前端代码里写的请求路径都是相对路径不会出现跨域问题。后端这边虽然也需要加跨域配置兜底但开发阶段主要依赖前端代理就够了。部署阶段前端项目通过npm run build打出一堆静态文件放到Nginx的静态资源目录下Nginx再把/api请求反代到后端服务地址。这里要注意如果只是交毕设课题用Nginx部署前后端是最规范的方案如果只想在答辩现场演示后端直接用IDEA启动、前端用npm run serve启动本机访问也是完全没问题的不影响演示效果。2.3 常见替代方案对比以及为什么我推荐当前选择经常有同学问我要不要用SpringCloud要不要用Redis要不要上RabbitMQ我的态度很明确看工作量。这个系统的体量用不上微服务分布式事务、消息队列这些概念写进论文里反而容易在答辩时被老师追问到露馅。Redis可以加但不是必选。如果你想给项目加分可以在验证码存储或热门物品缓存上引入Redis这是一个低风险的加分项。如果你想稳妥不上Redis完全不影响系统完成度。数据库层面唯一的建议是不要把MySQL安装到Linux服务器上再写教程直接Windows本地安装就好少给自己找麻烦。下表是我对常见技术选型的取舍建议技术点本系统方案可选加分方案不建议的方案后端框架SpringBoot 2.7.xSpring Boot 3.x注意JDK版本SpringCloud全家桶ORM框架MyBatis-PlusJPA看个人习惯JDBC手写全部SQL数据库MySQL 8.0MySQL 5.7兼容性更好PostgreSQL资料少前端脚手架Vue 2 Element UIVue 3 Element Plus纯HTML暴力写页面权限方案JWT 拦截器Spring Security学习成本高Shiro配置繁琐缓存不加Redis存验证码缓存复杂业务数据3. 数据库设计与核心业务实现3.1 核心数据表结构与字段设计思路拿到业务分析结果后数据库设计就有了依据。这里我给出实际可用的核心表结构字段和注释都写清楚。用户表 userid、username唯一、passwordBCrypt密文、nickname、avatar、phone、user_type1管理员/2捐赠者/3受赠者、status1正常/0禁用、create_time、update_time。物品表 itemid、user_id发布者、title、description、category1图书/2电子产品/3生活用品/4其他、images多张图片用逗号分隔的路径、condition_level物品成色1全新/2较新/3有使用痕迹、status0待审核/1上架中/2已领取/3已下架/4已驳回、reject_reason、create_time、update_time。这里的images字段用字符串存储多张图片是反范式设计但胜在简单符合毕设体量正规项目会建一张单独的表。申请表 apply_recordid、item_id、user_id申请人、reason申请理由、status0待确认/1已通过/2已拒绝/3已取消、operate_time管理员或捐赠者处理时间、create_time。公告表 noticeid、title、content、is_top是否置顶、status、create_time。做表结构时有一个教训外键能不用就不用。不是说要完全放弃数据完整性约束而是不要在数据库层大量使用物理外键逻辑外键配合代码控制就好。物理外键会在插入、删除时带来额外的锁开销而且改起来很麻烦。毕业设计论文里画ER图时用逻辑关系表达即可。3.2 物品发布到领取的完整状态流转设计状态机是这套系统最值得讲清楚的设计点。很多同学喜欢把状态搞成一个布尔值比如is_available但是实际业务中一个物品会经历多个状态布尔值根本表达不了。我设计的物品状态流转是五态模型待审核用户刚提交等待管理员审核。这个状态下物品在前台列表不可见。上架中管理员审核通过物品在浏览大厅展示用户可以提交领取申请。这个状态下物品可以被申请的数目是1申请提交后进入待确认状态。已领取管理员或捐赠者确认将物品发放给某个申请人物品生命周期结束。已下架发布者主动下架物品或者物品发布超时自动下架。已驳回管理员审核不通过并附上驳回原因。这个状态机让每个物品在任何时刻都有且只有一个明确的业务状态在代码里用int字段存状态值配合枚举类做常量定义很清晰。对应到代码层面当用户提交申请时要先校验物品状态必须是上架中否则提示物品不可申请。当管理员确认发放时要把物品状态从上架中改为已领取同时把对应的申请表状态改为已通过。这里有一个并发问题如果多个用户同时申请同一个物品最后只能有一个人领到。在毕业设计体量下用MySQL行锁或者唯一索引约束就能解决不需要引入分布式锁。3.3 分页查询与多条件筛选的后端实现物品浏览大厅涉及分页查询和多条件筛选这是系统的高频接口也是最容易写出低级性能问题的地方。分页我用了MyBatis-Plus的Page插件配置很简单在配置类里注入一个MybatisPlusInterceptor并添加PaginationInnerInterceptor即可。使用方式就是new Page(current, size)传给service层的page方法返回结果里自带总记录数和分页数据。多条件筛选的做法是构建LambdaQueryWrapper根据前端传入的查询参数动态拼装条件。比如按分类筛选就是eq(Item::getCategory, category)按状态筛选就是eq(Item::getStatus, 1)关键词搜索就是like(Item::getTitle, keyword)。组合时注意防御式编程category为空字符串或者null时不要把它拼进条件里用StringUtils.hasText做判断。排序是另一个容易被忽略的地方。物品列表默认按创建时间倒序这样最新的物品排前面但也可以提供按热度排序这里的热度可以用浏览数或者申请次数来表示。不管按什么排序这个排序字段要加到SQL的ORDER BY中而不是查出全部数据后在内存里排序——数据量大了之后内存排序是扛不住的。3.4 文件上传与安全校验的实现要点物品图片上传是很多人在毕设答辩时翻车的地方因为会牵扯到文件大小、存储路径、格式校验、访问URL等一连串问题。前端用Element UI的Upload组件把action指向后端接口 /api/upload file-list维护已上传的文件列表。后端接收MultipartFile参数首先要做格式和白名单校验只允许jpg、png、gif后缀和Content-Type做二次校验防止伪装扩展名传入。文件大小用SpringBoot的配置项控制spring.servlet.multipart.max-file-size设置成5MBmax-request-size设置成10MB超出时返回统一提示。存储路径要特别注意不要存绝对路径也不要把文件直接怼到SpringBoot的static目录里因为打包成JAR后这个目录不一定可写。我在实际项目中是这样处理的在配置文件里定义一个自定义的upload.path属性比如D:/upload/后端接收文件后组装日期子目录2024-05/用UUID生成新文件名防止文件名冲突和中文乱码。最后返回给前端的是 /images/2024-05/xxx.jpg 这种相对URL再配一个资源映射WebMvcConfigurer将 /images/** 映射到本地磁盘目录。另外还要注意一个坑浏览器缓存的图片在替换后可能还是显示旧图文件名用UUID生成可以在一定程度上避开这个坑亲测有效。3.5 JWT登录鉴权与全局异常处理用户登录后前端拿到一个JWT令牌存在本地localStorage或cookie中之后每个请求在axios的请求拦截器里把令牌加到Authorization头中。后端写一个拦截器统一校验令牌校验通过后把用户信息放入ThreadLocal或请求参数中供后续Controller使用。JWT的实现建议用jjwt这个库生成token时把userId和userType放进去设置过期时间我设的是7天。每次请求都解析token并取出userId再查到用户信息。需要注意的点是拦截器要放行登录接口、注册接口和获取物品列表接口因为未登录用户也要能浏览物品大厅但申请领取等操作必须拦截否则就会出现安全漏洞答辩时被老师一针见血地指出来。全局异常处理用ControllerAdvice ExceptionHandler实现。自定义一个BusinessException业务代码里主动抛出带提示信息全局异常处理器捕获后返回统一的JSON格式格式是{ code: 500, message: xxxx, data: null }。这样做的好处是前端统一处理错误响应不用每个接口各写各的错误分支。说到这有一个安全层面的补充用户在物品描述这类文本字段中可能输入恶意内容虽然本系统使用的是富文本的可能性不大但建议对用户输入做一层XSS过滤。实现方式可以是写一个拦截器或者过滤器对请求参数的HTML标签进行转义。这个在论文测试章节写出来是很标准的加分项。4. 环境配置与部署实施4.1 开发环境准备从JDK到IDEA再到Maven先说结论JDK建议用JDK8或JDK11不要一上来就上JDK17。虽然SpringBoot 2.7可以跑在JDK11上但很多教程和依赖兼容性测试都是基于JDK8的减少环境层面的心智负担更重要。如果你选了Spring Boot 3.x那必须配JDK17以上版本对应关系要先查清楚。Maven仓库建议第一时间换成阿里云镜像不然从Maven中央仓库拉依赖会浪费大量时间。修改方式是在maven安装目录下的conf/settings.xml里加一个mirror节点。IDEA里还要设置Maven的User settings路径指向这个settings.xml否则改了不生效。开发时建议装几个插件Lombok减少实体类代码量、MyBatisXMapper接口与XML跳转、Vue.js插件前端模板高亮。这些插件装好之后开发效率直接翻倍。4.2 SpringBoot配置文件的坑与常用参数application.yml是整个后端的配置中心我给出一个典型的配置清单。server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/donation_system?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: 123456 servlet: multipart: max-file-size: 5MB max-request-size: 10MB mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0 jwt: secret: your-secret-key-please-change-me expire-days: 7 upload: path: D:/upload/这里有几个坑要单独讲。第一个是数据库连接URL一定要配serverTimezoneAsia/Shanghai否则MySQL 8的驱动会报时区错误。第二个是useSSLfalse要加上不然每次连接在本地都要处理SSL证书验证。第三个是MyBatis-Plus的逻辑删除这个配置是让你在删除用户、删除物品时做的不是物理删除而是逻辑删除数据还在表里只是在查询时自动过滤掉这个机制在毕设答辩时非常加分因为说明你考虑了数据安全。4.3 MySQL安装与初始化数据库的实操记录MySQL安装本身不复杂但有一个版本问题要当心不要装MySQL 8.0以上在Windows老机器上内存占用比5.7高不少。我自己的经验是本地开发用MySQL 8.0没问题但如果你的电脑是8GB内存还要同时跑IDEA、Node、MySQL建议用5.7会明显流畅一些。安装过程中有两个细节容易被忽略一是字符集要选utf8mb4这个比utf8更完整能存emoji字符二是密码不要设得太复杂但也不能不设密码很多后续问题都源于root密码策略。装完后用命令行工具测试一下连接mysql -u root -p初始化数据库的方式有两种都在毕设场景下可行。第一种是用命令行执行SQL脚本mysql -u root -p donation_system.sql第二种是用图形化工具Navicat或者MySQL Workbench导入SQL文件。我推荐你脚本文件和图形化导入两种方式都试一遍因为之后写部署文档时需要把这两种方式都写清楚方便不同基础的评委老师复现。4.4 Vue环境配置与前后端代理联调前端环境方面关键点是Node版本的匹配。Vue 2项目建议用Node 14或16Vue 3项目用Node 16或18。不要用最新的Node 20跑老项目不然node-sass会编译报错这是很多人卡住的经典坑。npm镜像同样建议切换成淘宝镜像命令行执行npm config set registry https://registry.npmmirror.com然后创建项目npm install -g vue/cli vue create donation-web这里我建议选择Vue 2 Element UI的组合原因是资料最多遇到问题搜索vue2 element ui xxx基本都能找到答案。如果你对Vue 3比较熟也可以选Vue 3 Element Plus但组件用法有所差异自行权衡。vue.config.js文件的代理配置写法如下const { defineConfig } require(vue/cli-service) module.exports defineConfig({ transpileDependencies: true, devServer: { port: 3000, proxy: { /api: { target: http://localhost:8080, changeOrigin: true, pathRewrite: { ^/api: } } } } })这里有一个关键约定你在前端发的所有请求都以/api开头后端的Controller的路由地址不要带/api前缀而是通过pathRewrite重写规则去掉/api再转发。这样前后端路由完全解耦以后想接网关或者其他后端服务改动成本很低。4.5 前后端集成部署的前期准备打完代码准备部署之前有几个静态资源问题要提前考虑。第一前端打包后的静态资源路径默认是根路径如果你的部署环境不是部署在域名根路径下需要在vue.config.js里设置publicPath为./。第二Vue Router如果使用了history模式部署到Nginx后刷新页面会报404需要Nginx配置try_files。如果不想处理这个问题直接用hash模式默认刷新不会有问题。为了把这条流程跑顺最稳妥的策略是在你交材料之前用本地IDEA启动后端用npm run build生成dist然后找个任意静态服务器托管或者直接npm run serve把从登录到发布物品到管理员审核的完整流程走一遍录成演示视频。演示视频是个隐藏加分项不是强制要求但好多学校老师喜欢看这个因为现场答辩机器环境不稳定有视频兜底不怕翻车。5. 常见问题与排查技巧实录5.1 开发中最高频的几类报错及根因我自己带过的学生项目里报错类型高度集中。前端集中在axios请求拿不到数据、路由跳转白屏、组件样式错乱后端集中在依赖版本冲突、数据库连接失败、类型转换报错部署集中在端口占用、内存溢出、Nginx配置错误。我按经验概率整理了一个高频问题速查表参赛和答辩前建议逐条对照检查。报错类型典型错误信息根因分析快速解决方案数据库连接失败Access denied for user rootlocalhost账号密码错或未授权核对application.yml配置用命令行测试连接数据库连接失败Public Key Retrieval is not allowedMySQL 8驱动安全策略连接URL加allowPublicKeyRetrievaltrue端口占用Port 8080 was already in use上次启动的进程未结束用netstat -ano查PID结束进程依赖拉取失败Could not transfer artifact xxxMaven仓库连接超时换阿里云镜像删除本地仓库后重拉前端跨域CORS policy后端未配置跨域或代理未生效检查vue.config.js代理路径和后端CORS配置页面刷新404Cannot GET /xxxhistory模式路由部署问题改hash模式或Nginx配try_files中文乱码???或当äº连接URL未指定UTF-8URL加characterEncodingutf8上传文件超限MaxUploadSizeExceededException配置文件限流未放行调大max-file-size和max-request-size5.2 部署文档里必写的三件事这个系统交付物里有部署文档很多人在这一项上吃亏是因为只写了操作步骤没有写故障预案。真正好的部署文档要让人能照着做、失败了会排查所以建议包含三块内容。第一块是前置条件检查清单包括确认JDK版本、Node版本、MySQL服务状态写清楚如果版本不一致应该去哪下载对应版本。这一步很有必要因为评委老师或者下一届学生拿到源码时时间大概率隔了很久环境早就变了。第二块是分步操作记录每一步要带上预期结果。比如执行 mvn spring-boot:run 后控制台出现 Started Application in xxx seconds 表示启动成功。有了预期结果操作者能即时判断自己哪里做错了而不是闷头往下点。第三块是常见故障对照表把上面那个问题速查表的核心摘录进去。这不是充字数是真能救命的内容。6. 论文结构安排与系统测试设计6.1 论文各章节的内容规划与写作顺序很多学校对毕设论文有固定模板但内在结构基本都是摘要、需求分析、系统设计、系统实现、系统测试、总结。我建议写作顺序不要按这个顺序写而是先写系统实现章节因为这一块你需要对着真实代码写是最容易下笔的然后写需求分析和系统设计这两个章节需要回头看设计文档最后写摘要和结论。系统实现章节有一个通用的组织结构按模块分节每个模块包含界面截图、核心代码片段、实现说明三个部分。代码片段一定不要粘贴大段代码只截取核心逻辑十来行配文字解释就够了。截图要截得干净最好是浏览器干净界面截图不要带一堆书签栏和浏览器插件图标。需求分析章节的核心是画好用例图和数据流图。用例图画清楚三个角色的边界和交集数据流图画清楚物品从发布到领取的数据走向。这两张图是论文中最见功夫的地方不要用网上直接下载的图充数用PlantUML或者ProcessOn自己画半小时就能搞定。6.2 功能测试与安全性测试的用例设计测试章节不应该只是写几条系统运行正常。更合理的方式是围绕核心业务设计几组有实际意义的测试用例把预期结果和实际结果写清楚。功能层面必须有的测试用例至少包括管理员登录后审核通过一个物品前端大厅能看到该物品普通用户提交申请后发布者能看到申请记录并确认用户申请一个已经被领取的物品系统提示该物品已被领取被禁用的用户尝试登录前端和后端都给出清晰提示。这几条跑通主流程就站得住了。性能层面可以做一个轻量的并发测试用JMeter或者Postman的Runner模式模拟多个用户同时申请同一个物品观察后端是否出现超发问题。这个测试如果做了并写进论文里和没有做是完全不同的质感说明你考虑到了真实场景。安全性测试至少要有三项一是未登录用户直接访问后端受保护接口应返回401或403二是普通用户尝试调用管理员专用接口应被拦截三是输入包含HTML标签的用户名比如 在后端应该被转义存储或拒绝。这三项能讲清楚答辩的时候安全类问题基本就堵住了。7. 后续还要注意的事技术上的细节啰嗦完了最后聊一点参赛和答辩前后的实际经验。有一个核心认知要先纠正毕设项目不是做给自己玩的是要让评委老师理解的。所以建议在写代码的时候保持克制不要无节制地引入新依赖、新中间件每多一个组件答辩时被追问的风险就多一分。比如引入Redis的人至少要准备好回答缓存一致性问题怎么解决缓存雪崩怎么防护如果答不上来不仅加不了分反而扣分。我的习惯是在答辩前一周把自己做的系统当作一个陌生产品来走一遍全流程从注册到发布物品到切换管理员账号审核到申请领取每一步都记录下来。这个过程逼着你去检查那些平时开发时跳过的边界情况比如没有图片时前端是否报错、空标题能不能提交、申请理由为空会不会出问题。每个修复都是实实在在的稳定性和严谨性提升。如果你拿到这套系统之后不满足于单纯做完想做得更出彩可以考虑两个方向。一个是给用户加一个信用积分体系发布虚假物品扣分、经常取消申请扣分积分高的用户在申请同一件物品时优先级更高。另一个是做一个简单的推荐逻辑根据用户浏览和申请记录在首页推荐同类目物品。这两块功能量不大但能让系统的完整度和创新性上一档。这系统我从前到后顺着做过不少遍每次做都还是会有新发现。先把上面这一路要点吃透你至少已经超过一半只会照着教程敲代码的选手了。