ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Spring Boot宠物领养平台毕设开发与避坑指南

Spring Boot宠物领养平台毕设开发与避坑指南 每年毕业设计选题一到这个时候“宠物领养平台”这几个字就会霸占Java方向的热门榜单。不管题目写成“基于Spring Boot的宠物领养管理系统设计与实现”还是“Spring Boot驱动的宠物领养信息平台开发”本质上都是一件事做一个连接宠物发布者和领养申请者的在线管理系统。这个题目我接触过很多次说句实话它属于那种看起来简单、做起来坑不少、但认真做完收获很大的典型综合型选题。如果你正在纠结这个题目怎么做或者已经开始写代码但心里没底这篇文章应该能帮你省下不少走弯路的时间。我会从需求分析、技术选型、数据库设计、核心功能实现到调试排错把一套能顺利通过答辩、又能真正跑起来的方案完整拆开来讲。内容会比较长建议先收藏再慢慢看。1. 先想清楚这到底是个什么系统1.1 题目背后的三重身份很多同学看到题目里的“平台”“管理系统”“信息平台”几个词就懵了不知道到底要做成什么样。其实这三个叫法说的是同一套系统的不同侧面。“平台”是站在用户视角说的强调这是一个公开的、面向多类人群的信息交互场所。“管理系统”是站在后台视角说的强调数据和流程需要被规范地管控。“信息平台”则是站在业务视角说的说明它的核心载体是信息流的发布、流转和归档。所以这个题目的完整定位是一个包含前端信息展示与操作入口、后端业务逻辑与数据存储、后台管理维护界面三层结构的Web应用。它的基础形态就是典型的B/S架构系统用户通过浏览器访问后端用Spring Boot提供接口服务数据落在MySQL里。理解了这层定位你就知道不能只做一个静态网页展示宠物列表然后交差也不能做一个只有后台增删改查却没有任何业务交互的纯管理工具。你需要把“发布宠物信息 → 用户浏览搜索 → 提交领养申请 → 审核流程跟进 → 领养结果记录”这条完整链路串起来。1.2 这套系统到底在解决什么问题做毕设之前先想清楚业务价值这点特别重要因为答辩老师第一个问题大概率是“你这个系统解决了什么实际问题”答不上来会非常尴尬。线下宠物领养的信息分布非常零散通常散落在朋友圈转发、本地论坛帖子、救助站门口的公告栏里。信息不聚合带来三个直接问题想领养的人找不到靠谱的宠物来源救助站或送养人没办法验证领养人的真实意愿和条件领养完成之后没有记录后续的疫苗、回访等跟踪工作无从谈起。宠物领养平台的核心价值就是把这套线下流程线上化。宠物信息集中展示并且分类可搜领养申请走标准流程而不是靠微信私聊来回拉扯每一次申请和审核都有数据记录形成可追溯的档案。这就是你的系统“存在的理由”也是你整个设计的灵魂。想清楚这一点再去做功能拆解就不会东一榔头西一棒槌。2. 技术选型与版本避坑指南2.1 为什么Spring Boot是毕设的最优解不是唯一解这个题目绑定Spring Boot可以说是Java方向毕业设计的标配。原因很实在Spring Boot把Spring MVC繁琐的XML配置几乎全部干掉通过自动配置和起步依赖让你快速跑起一个可用的Web服务。内置Tomcat意味着你不需要额外部署外部容器打包后一个java -jar就能启动。这些特性都大幅降低了开发门槛。另外Spring Boot的社区活跃度极高意味着你遇到任何报错基本都能在搜索引擎里找到解决方案。对毕设来说这一点比技术本身的新旧更重要。有人会问用Python的FastAPI行不行答案是行但那是另一个选题方向。既然是Spring Boot题目还是老老实实把Java这套玩明白。FastAPI写起来确实简洁但很多学校答辩组对Spring Boot生态更熟悉你用它做出来老师提问的时候你也能顺着生态体系讲出更多内容。2.2 版本选择是第一个大坑我见过太多同学一上来就装了最新的Spring Boot 3.x然后跟着网上的旧教程写代码结果一堆配置不兼容还没开始写功能就先花了两天处理环境问题。版本选择是第一个真正的大坑。Spring Boot目前主流就两个大版本线2.7.x和3.x。核心差异如下对比项Spring Boot 2.7.xSpring Boot 3.x基础JDK版本JDK 8 / 11JDK 17及以上javax包名javax.*jakarta.*兼容教程数量非常多相对较少主流培训机构覆盖丰富正在逐步过渡适合毕设程度高中未来工作方向匹配度一般更高我个人建议做毕设选Spring Boot 2.7.18这个版本搭配JDK 8。理由有三个第一网上能找到的教程、博客、开源项目绝大多数基于这个版本遇到问题容易搜到答案第二很多公司的存量项目还在用这个版本学了不亏第三JDK 8在毕业设计场景下足够稳定不会因为JDK版本问题引发额外报错。如果你坚持用Spring Boot 3.x就要做好几个心理准备数据库驱动、Redis客户端、一些工具包的坐标变化要注意而且引入第三方库时优先找支持jakarta命名空间的版本。2.3 配套技术栈清单一个完整的宠物领养平台光靠Spring Boot本身做不出来。它只是地基你还得选好砖块和水泥。下面是我觉得比较合理的配套清单技术组件用途推荐选择持久层框架操作MySQLMyBatis-Plus 3.5.x数据库数据存储MySQL 5.7或8.0缓存中间件验证码、防重复提交、热点数据Redis安全认证登录态管理JWT 拦截器接口文档生成API文档Knife4jSwagger增强版系统监控监控服务运行状态Spring Boot Admin前端模板渲染页面Thymeleaf 或 Vue Element UI这里提一下为什么我不推荐在毕设里用Spring Security做全套安全控制。Spring Security功能确实强大但它的过滤器链机制、认证管理器配置等内容对初学者来说理解成本很高半个月时间都不一定玩得转。用JWT 自定义拦截器做登录校验既保留了无状态认证的核心思想又能把权限控制逻辑掌握在自己手里答辩的时候你能讲清楚每一步原理这就够了。持久层用MyBatis-Plus而不是原生MyBatis是因为它内置了通用CRUD方法单表操作不需要手写SQL能把主要精力放在业务设计上。而且它的分页插件、逻辑删除、自动填充时间戳这些功能恰好是毕设里经常用到的能力。3. 需求拆解与功能规划3.1 三种用户角色的权限边界宠物领养平台里用户绝对不是只有一类。按照业务流程系统天然存在三类角色领养申请者、宠物发布者、系统管理员。在设计角色权限时很多同学容易犯一个错误把所有功能都放在一张页面上谁登录都能操作一切。这在答辩时是硬伤说明你没理解权限控制的意义。先列出三类角色的核心操作边界领养申请者注册登录、浏览宠物列表、按分类/关键词搜索、查看宠物详情、提交领养申请、查看自己申请的审核进度、对宠物发表留言咨询。宠物发布者注册登录、发布宠物信息含图片、品种、年龄、健康描述、管理自己发布的宠物列表、审核领养申请同意或拒绝、更新宠物状态已被领养/下架、登记领养回访记录。系统管理员对所有用户进行管理启用/禁用、对宠物发布内容进行审核防止违规信息、管理宠物分类和公告内容、查看平台数据统计宠物数量、领养成功率、用户活跃度。角色权限设计的原则是申请者只能操作自己的申请发布者只能操作自己发布的宠物管理员不直接处理领养申请只做平台治理和内容审核。各司其职系统才不会变成一锅粥。3.2 核心功能模块清单基于上面的角色分析把功能拆成模块来看会更清晰。用户模块注册、登录、个人信息维护、密码修改。注册建议同时支持用户名和手机号/邮箱密码必须加密存储不能明文入库。宠物信息模块宠物分类猫、狗、兔子等、发布宠物名称、品种、性别、年龄、毛色、健康状况、性格描述、图片、宠物上下架、宠物搜索与筛选。领养申请模块提交领养申请填写个人情况、居住条件、养宠经验、查看申请进度、发布者审核申请、申请被拒绝时可查看原因。留言咨询模块针对某个宠物进行提问发布者可以进行回复其他用户可以查看问答内容。公告与站内信模块管理员发布平台公告系统在关键节点审核通过、申请结果自动给相关用户发送站内信通知。后台管理模块用户管理、宠物审核、分类管理、数据统计。这些模块加起来就是一个功能完整、流程闭环的宠物领养平台。从答辩的角度看功能数量已经足够支撑选题的工作量证明。4. 数据库设计与实体建模4.1 核心表结构设计数据库设计直接影响后面所有代码的复杂度。表格设计得好业务逻辑既好写又清晰设计得烂后面你会不停地在SQL里做各种变态关联来弥补吃力不讨好。这个项目最核心的表有六张user表用户表。字段包括id、username、password加密后的密文、nickname、phone、email、avatar、role角色标识1申请者/2发布者/3管理员、status是否禁用、create_time。角色字段用int表示即可不需要建单独的权限表毕设级别用字段区分角色完全够用。pet表宠物信息表。字段包括id、publisher_id关联user表、category_id关联分类表、name、breed、gender、age、color、health_desc、character_desc、images图片路径多张用逗号分隔、status状态0待审核/1可领养/2已下架/3已领养、view_count浏览量、create_time。adoption_application表领养申请表。字段包括id、pet_id、applicant_id、reason申请理由、experience养宠经验、address居住地址、status状态0待审核/1已通过/2已拒绝、audit_remark审核意见、create_time、audit_time。一条申请记录对应一只宠物和一个申请者。adoption_record表领养记录表。字段包括id、pet_id、applicant_id、adoption_time、follow_up_record回访记录可多次追加或单独建表、create_time。message表留言表。字段包括id、pet_id、from_user_id、to_user_id、content、create_time。用于宠物详情页下的问答互动。notification表站内信表。字段包括id、from_user_id可空系统通知时为-1、to_user_id、title、content、status是否已读、create_time。分类表如果内容不多也可以不放单独的表直接在pet表里存category_name。但更规范的做法是单独建category表字段就两个id、name、parent_id可选。既然题目叫系统设计与实现能体现出规范的设计能力是加分项建议建表。4.2 状态机设计是关键中的关键很多同学做完系统就陷入一种混乱数据出现脏值比如宠物明明已经被领养了却还能收到新的领养申请。这种问题的根源就是没有设计好状态机。宠物状态建议用四个值0待审核发布者提交后等待管理员审核通过才能公开展示1可领养审核通过后可以展示并接收申请2已下架发布者手动下架或管理员强制下架3已领养有申请通过后宠物被领养走不可再被申请领养申请状态也建议四个值0待审核申请人提交后等待发布者处理1已通过发布者同意随后宠物状态要改为已领养2已拒绝发布者拒绝申请填写拒绝原因3已取消申请人主动取消申请设计状态机时有一个核心原则状态流转只能在临近状态之间进行不能跳变。宠物从“可领养”只能到“已领养”或“已下架”不能直接从“待审核”跳到“已领养”。在代码里更新语句要带上状态条件例如boolean success petService.update( new LambdaUpdateWrapperPet() .eq(Pet::getId, petId) .eq(Pet::getStatus, 1) .set(Pet::getStatus, 3) );等于说“只有当宠物当前处于可领养状态时才允许把它改成已领养”。如果更新影响行数为0说明宠物状态已经被其他人改变了这时候要做并发提示。这个细节非常加好感它体现的不是代码量的问题而是你有没有思考并发冲突的意识。5. 核心功能实现与关键代码思路5.1 登录认证与权限拦截的轻量实现JWT登录在很多项目里是标配毕业设计用它不显得low反而能体现你对无状态认证的理解。简单说用户在登录成功后后端把用户ID和角色信息放进JWT令牌里返回给前端前端每次请求在Header里带上这个令牌后端拦截器解析令牌来识别当前用户。核心步骤就两步第一步登录接口生成TokenString token Jwts.builder() .setSubject(user.getId().toString()) .claim(role, user.getRole()) .claim(username, user.getUsername()) .setExpiration(new Date(System.currentTimeMillis() 24 * 60 * 60 * 1000)) .signWith(SignatureAlgorithm.HS256, secretKey) .compact();第二步配置拦截器校验Tokenpublic class JwtInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token request.getHeader(Authorization); if (token null || token.isEmpty()) { throw new BizException(401, 未登录); } // 解析token验证签名和有效期 // 解析出的用户信息存入ThreadLocal return true; } }我建议你把“哪些接口需要登录、哪些接口需要特定角色”这个判断做成一个白名单机制。比如首页浏览宠物、搜索、查看详情这些接口应该放行不需要登录就能访问而发布宠物、提交领养申请、后台管理接口则需要角色校验。拦截器里维护一个WhiteList的路径集合命中白名单就直接放行。这种设计简单直观也容易讲清楚。有一点要特别提示密码存库千万不能用明文。用BCrypt加密是行业标准做法Spring Security里自带BCryptPasswordEncoder类你就算没引入Spring Security单独把这个类坐标引进来使用也是可以的。密文入库之后登录校验时用matches方法比对明文和密文而不是直接查询用户名密码匹配。5.2 宠物发布与图片上传的实现细节宠物发布功能是整个平台内容建设的入口。图片上传是这里最容易出问题的一环。常见方案有三种上传到本地服务器磁盘、上传到云OSS、上传到FastDFS等分布式存储。对毕设来说本地磁盘存储最合适理由是不依赖第三方外部环境、不需要花钱、代码逻辑好讲。本地存储的经典做法是配置一个上传目录把接收的MultipartFile写到磁盘然后用WebMvcConfigurer把该目录映射成虚拟访问路径。具体配置方式Configuration public class WebConfig implements WebMvcConfigurer { Value(${upload.path}) private String uploadPath; Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/upload/**) .addResourceLocations(file: uploadPath); } }这样前端访问接口返回的图片路径是/upload/xxx.jpg时实际会映射到磁盘上的真实文件。上传目录建议放在用户主目录下不要放进项目源码里否则打包部署后路径会失效。上传校验要重点处理三个点文件类型只允许jpg、png、jpeg、单张图片大小限制建议不超过2MB、文件名重命名使用UUID原始后缀防止重名覆盖和中文文件名乱码。另外还要注意防路径穿越不要直接用用户传的文件名拼接路径用UUID生成新文件名是最保险的做法。multiFile图片数量建议控制在五张以内存的时候用逗号拼成字符串展示时split成数组即可。5.3 领养申请的并发控制与状态一致性领养申请是整个平台业务的核心动作也是这个项目真正的技术难点。难点不在于CRUD而在于一个具有很强现实意义的并发问题同一只宠物被多人同时申请时必须保证最终只有一个人能成功。当你第一次把自己的代码跑起来开了两个浏览器窗口用两个不同账号同时申请同一只宠物时最容易遇到一个情况——两个都提交成功了。原因很好解释你的代码先查询宠物状态判断如果是可领养就插入一条申请记录最后再更新宠物状态。两步之间存在时间差如果两个请求同时通过了第一步查询都会认为宠物是可领养的都会插入申请导致一人一宠的规则被破坏。解决思路就是在数据库层面做原子更新。提交申请前先执行带条件的更新操作来“抢占”宠物状态int rows petMapper.update( new LambdaUpdateWrapperPet() .eq(Pet::getId, pet.getId()) .eq(Pet::getStatus, 1) .set(Pet::getStatus, 2) // 2表示申请处理中 ); if (rows 0) { throw new BizException(该宠物已被申请或已下架); } // 更新成功才允许插入领养申请记录这里把状态从“可领养”改成“申请处理中”的update如果返回0说明宠物状态在刚才那一瞬间已经变了说明有竞争的请求捷足先登。再把status调整时记得确定某个申请通过后宠物状态才改为已领养如果所有申请都未通过则把宠物状态回退到可领养。核心思想就是状态变更一定要放在校验和操作的第一步而不是最后一步。这也是数据库乐观锁思路在业务里的具体应用你把这个逻辑在答辩时讲出来老师能直接看得出你是真理解了这个问题的本质而不是只会背概念。5.4 通知机制与站内信设计一个完整体验好的网站在关键时点必须通知到用户。宠物领养平台里需要通知的场景有这些管理员审核宠物发布通过或不通过时通知发布者用户提交领养申请时通知宠物发布者领养申请审核通过或拒绝时通知申请者管理员发布平台公告时推送给所有用户站内信实现得很简单。一张表一个发送动作一个查询未读列表的接口一个标记已读的接口。难点在于发送时机要嵌入到业务流程中。比如管理员通过宠物审核那一步业务代码应该是更新宠物状态为可领养 → 进入可领养的查询缓存 → 插入一条站内信记录。两个动作要么同时成功要么同时失败这就涉及到事务问题。加Transactional注解是基本操作。在Spring Boot中可以直接在Service层的业务方法上加这个注解由Spring帮你管理事务边界。我建议所有涉及多表写入的方法都加上比如发布宠物时插入pet表 发通知提交申请时更新宠物状态 插入申请记录 发通知一步都别漏。站内信列表查询时要注意查询出的数据要关联出发送人昵称和头像不能只返回一个孤零零的用户ID否则前端没法展示。用MyBatis-Plus写自定义SQL做表关联或者查出站内信后再回表查用户信息两种方式都可以。数据量不大的场景下直接回表查是结构最简单、最不容易写错的方式。5.5 数据统计与系统监控毕设如果想要拿高分不要只看基础功能是否做出来还要关注一个系统作为软件产品的“可维护性”和“可观测性”。这就引出数据统计和监控。后台管理员的首页建议做一个简单的数据仪表盘展示这些指标用户总数、今日新增用户数宠物总数、待审核宠物数、已领养宠物数领养申请总数、申请通过率宠物浏览量Top 10这些统计用MyBatis-Plus的聚合查询就能实现long totalPet petService.count(); long toAuditPet petService.count(new LambdaQueryWrapperPet().eq(Pet::getStatus, 0)); long adoptedPet petService.count(new LambdaQueryWrapperPet().eq(Pet::getStatus, 3));如果觉得每次都实时count比较浪费也可以建一张统计表定时通过Spring Task定时任务去更新统计结果。Spring Boot自带的Scheduled注解就能实现定时调度很简单也能体现你对定时任务的理解。另一个加分项是集成Spring Boot Admin做系统监控。它的原理很简单你的业务系统作为Admin Client把自身运行状态注册到Admin Server上Server端通过HTTP调用收集信息。部署时只需要开两个服务一个admin-server作为监控面板一个业务系统作为被监控方。通过监控面板你能实时看到系统内存、线程、健康检查状态甚至在线修改日志级别。答辩时打开监控面板给老师看观感很好。网上很多教程引入两个依赖、设置一下Server和Client的地址即可跑起来。它本身功能不算复杂属于投入产出比极高的加分项。5.6 接口设计与第三方对接的思路热词里有人问“Spring Boot对外提供的接口给第三方应该放在哪里”这个问题在毕设层面其实可以不展开太深但你有必要了解清楚因为答辩老师有可能追问。正规项目里对第三方的开放接口会单独划出一个模块或服务比如一个独立的openapi包或者独立部署一个API网关服务。核心目标是把内部接口和开放接口隔离防止第三方调用影响到内部业务流程。开放接口一般会使用AppId AppSecret生成AccessToken接口请求里带上Token后端校验Token有效性。更高级一点的还会做签名校验防止报文被篡改。在毕业设计系统里你不需要真去建一个第三方接入服务但你可以在项目结构上把代码组织得清晰一点把给前端用的接口都按模块放在controller包里如果有对外提供数据查询的场景比如给合作机构提供宠物数据接口单独建一个OpenController统一放在/third-party/xxx路径下使用独立的鉴权方案。不用多复杂能展现出你有“接口分层隔离、开放接口独立鉴权”的意识就够了。这就是分层架构的意义。6. 常见问题与排查手册6.1 启动类、依赖冲突与版本兼容问题最常见的启动报错是Application类找不到或扫描不到Mapper。大概率原因是你把Application启动类放在了子包里导致默认扫描路径覆盖不到Mapper接口。解决方案Application类放在根包下或者在启动类上显式添加MapperScan(你的mapper包路径)。我习惯直接用MapperScan简单直接不用在接口上一个个加Mapper注解。另一个高发问题是Redis版本兼容。Spring Boot 2.x默认使用Lettuce作为Redis客户端如果你的redis-server版本太老可能会报连接超时或协议错误。建议本地装Redis 6.x配合Spring Boot 2.7完全没压力。不想装Redis也不影响基础登录功能的开发但你用了Redis的缓存、防重复提交效果最好还是把它跑起来。依赖冲突还经常发生在引入knife4jSwagger增强包时。knife4j不同版本对应不同Spring Boot版本如果你用Spring Boot 2.7依赖坐标选knife4j-openapi3-jakarta-spring-boot-starter 4.3.0或knife4j-openapi2-spring-boot-starter 2.0.9。用错版本会直接启动失败报一些莫名其妙的Bean创建错误排查起来特别费时间。6.2 前端页面与数据格式问题前后端交互最常见的坑就是时间格式。MySQL里的datetime类型传到前端后可能变成一串时间戳数字或者变成带T的ISO字符串非常难看。解决方式在application.yml里配置统一的时间格式化spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8加了这层格式之后所有返回的日期字段都会显示成“2025-05-12 14:30:00”符合国内用户的阅读习惯。另外中文乱码问题很多情况下是MySQL连接URL没有指定编码jdbc:mysql://localhost:3306/pet_adoption?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiserverTimezone必须显式设置否则高版本MySQL驱动还会报时间地区的错误。6.3 文件上传失败与404问题图片上传常见三个坑一是控制层接收MultipartFile时接口报错“Current request is not a multipart request”通常是前端没设置Content-Type为multipart/form-data或者参数名不对。二是文件写入磁盘成功但访问404多半是虚拟路径映射没生效检查一下addResourceHandlers里的路径和请求路径是否一致。三是上传大文件时提示超出限制这个需要在配置里显式调整大小spring: servlet: multipart: max-file-size: 5MB max-request-size: 20MB6.4 IDEA社区版怎么用Spring Boot有同学还在纠结IntelliJ IDEA社区版能不能做Spring Boot开发。明确告诉你能而且完全够用。社区版没有Spring Initializr向导但你可以直接在GitHub上拉一个Spring Boot项目骨架或者从Spring官网的Initializr页面生成项目后用IDEA的“Open”导入Maven项目即可。开发体验上社区版的代码提示、调试器、Git支持都很完善唯一的损失就是企业版才有的一些框架专项支持比如Spring相关可视化工具。对于写Java代码本身没有任何实质影响。跑Spring Boot项目也不需要IDE右上角的运行按钮主类上写好SpringBootApplication后主方法右键运行即可。或者直接用命令行mvn spring-boot:run执行效果一模一样。还有一个经常被忽略的问题Maven仓库下载依赖非常慢。最好设置阿里云镜像在.m2目录下的settings.xml里添加mirror idaliyun-public/id mirrorOfcentral/mirrorOf urlhttps://maven.aliyun.com/repository/public/url /mirror这一个小动作能让你的依赖下载速度快十倍以上。6.5 打包部署问题毕设最终要交可运行的程序常见要求是提供部署文档和演示视频。运行时就两个关键点一是打包时用Maven的package命令生成可执行的jar包二是打包这个jar包时要带上配置文件。我经常遇到一种尴尬情况本地跑得好好的打包后运行就报错。原因通常是配置文件中使用了本机绝对路径比如文件上传路径写成了C:/Users/xxx/upload。打完包换一台机器跑就废了。解决思路文件上传路径不要写绝对路径用相对路径并通过Spring的配置文件外部化来指定或者用系统变量拼接String uploadDir System.getProperty(user.home) /pet_adoption_upload/;这样打包后无论在哪台机器上运行文件都会落在当前用户目录下。另外MySQL连接信息、Redis地址等你也可以让它在配置文件中可动态指定不要写死在某台机器的IP上。7. 最后说几句实在话这个题目从选择到落地前前后后大概要花三到六周正常业余时间。如果你想磨一个高分建议在完成基础功能后额外做两件有意义的事情一是把并发控制那部分逻辑做成一个可展示的测试场景比如录个屏两个账号同时申请同一只宠物另一个必然失败答辩时绝对抓住眼球二是把后台的数据统计做到好用且有图表感觉建议集成一个简单的前端图表库比如ECharts能把dashboard变得鲜活直观观感比一堆表格数字好得多。我实际带过的学生里凡是认认真真把上线跑通、把数据库设计讲透、把并发处理说明白的基本都在答辩时得到了不错的评价。相反只追求堆砌功能、每样都浅尝辄止的很容易被老师连续追问到哑口无言。如果你正在做或者准备做这个题目我的建议是不要贪进度先把需求和表结构彻底想清楚再动手。数据库设计好坏决定了你后面所有代码的舒心程度。文章虽然讲了不少坑但实际开发中遇到的坑永远比写的多遇到解决不了的问题记住一条万能解法——看控制台的完整报错栈搜索栈里最后一行Exception信息通常十有八九能救你出坑。祝你的宠物领养平台顺利跑起来也祝答辩轻松过关。
返回列表