
这个项目我拆过很多次每次给学生讲SSM课程设计的时候都会拿它当例子。java_ssm7中医药大学周边房屋出租管理系统光看名字就知道是个典型的JavaWeb课程设计项目技术栈是SSMSpring SpringMVC MyBatis业务场景是大学周边的租房管理。这类项目之所以经典是因为它既有完整的用户交互流程又有清晰的角色权限划分还覆盖了CRUD、搜索、状态流转这些后端开发的核心场景。不管你是刚开始学Java基础还是在准备java面试八股文把这样一个SSM项目从头到尾吃透比单纯刷题有价值得多。这篇文章我会从业务拆解、技术选型、数据库设计、核心功能实现、SSM整合部署、问题排查这几个维度把这个项目讲透。我不仅会告诉你怎么写代码还会解释每一步为什么这么设计以及我在实际调试中踩过的坑。内容面向正在做课程设计的学生、想入门后端开发的Java学习者也适合面试前想找一个完整案例复盘的朋友。1. 项目拆解这个管理系统到底管什么1.1 大学周边租房的业务痛点中医药大学周边这种场景房屋出租的典型特征是什么我总结了一下主要是这么几点房源密集但信息高度分散大量房东是学校附近的居民出租方式以线下贴广告、熟人介绍为主租客以学生为主流动性大每年开学季和毕业季是换租高峰房屋类型多样有整租、合租、短期租住价格差异也很大。这就带来一个很实际的问题学生找房效率低房东管理房源也费劲。传统的线下模式信息不透明看房时间对不上租约到期后的续租、退租全靠电话沟通非常容易出岔子。一个线上管理系统能把房源信息统一展示出来让租客按价格、面积、区域去筛选让房东自己维护房源上下架让管理员做统一的审核和公告发布这三方需求正好对应了系统里的三个角色。1.2 系统的核心角色与业务闭环一个标准的房屋出租管理系统至少要包含三种角色管理员、房东、租客。如果做得再完整一点还可以把管理员拆成超级管理员和普通运营人员但课程设计保持三个角色就够了。租客注册登录、浏览房源、按条件搜索、收藏房源、提交看房预约、下单租房。搜索这个功能对租客来说是最重要的因为找房的核心诉求就是“快速匹配”所以我会在后端实现组合条件查询。房东注册登录后可以发布房源、编辑房源信息、上下架房源、查看租客的预约和订单并处理。这里要注意房东只能管理自己名下的房源不能越权看到别人的数据。管理员登录后台可以管理所有用户禁用/启用、审核房东发布的房源是否合规、发布公告信息、查看全站订单统计。管理员是最高权限的维护者所以他不应该在前台用户页面操作而是走独立的后台管理入口。业务闭环很简单房东发布房源管理员审核通过后房源上架租客浏览搜索后来预约或下单房东确认后成交最后系统里留下订单记录。这个闭环把用户、房屋、订单三个核心对象串联在一起也是整个数据库设计的核心脉络。1.3 这个项目适合谁来做我遇到过很多同学问我课程设计该选什么题目。我觉得“房屋出租管理系统”这个选题最大的好处是业务不复杂但功能链条完整做出来有说服力。你可以在答辩的时候把业务逻辑讲得很顺畅从注册登录一路讲到订单成交评审老师一听就知道你确实理解了整个流程而不是背了个demo。适合的人群正在学JavaWeb想找一个完整SSM项目练手的学习者。这个项目里你能练到MVC分层、ORM映射、事务管理、拦截器、分页查询这些后端核心技能。马上要做课程设计或毕业设计的学生需要一个能落地、能演示、能讲清楚的项目。准备java面试需要一个项目案例来支撑简历上“熟悉SSM框架”这句话的人。面试官问你项目的时候你能把表结构、权限设计、接口流程讲得明明白白比背八股文管用。2. 技术选型思路SSM为什么是这类项目的“标准答案”2.1 SSM三件套各自是什么角色SSM是Spring、SpringMVC、MyBatis三个框架的组合。很多初学者刚接触的时候觉得这三个框架混在一起很乱其实它们的分工非常明确。我用一个生活化的类比来解释如果把一个请求从浏览器发出到页面响应的过程比作一个外卖订单SpringMVC就是前台接电话的人负责接收订单、告诉后厨做什么做完之后再送到顾客手上Spring是后厨的管理者负责管理所有厨师Service层的Bean、食材依赖注入和灶台事务事务管理MyBatis就是仓库管理员厨师告诉他“我要哪些食材”他就去数据库仓库里取把表里的数据变成Java对象递出来。Spring项目的核心容器管理所有业务层的Bean和事务。它让代码之间解耦Service只需要依赖接口具体的实现类由Spring注入。SpringMVC负责控制层处理HTTP请求的分发。前端Controller接收参数、调用Service、把结果返回给JSP页面或JSON接口。MyBatis负责持久层把SQL语句和Java方法关联起来。写SQL的地方就是Mapper.xml文件你可以完全掌控查询逻辑比Hibernate那种“自动生成SQL”的框架更直观也更容易排查问题。2.2 为什么课程设计偏爱这套组合课程设计选SSM一方面是因为教学体系里Spring、SpringMVC、MyBatis是JavaWeb方向的基础三件套另一方面也是因为它比SpringBoot更能让你理解框架设计的原理。SpringBoot现在确实很流行很多企业新项目都在用但它最大的特点是“约定优于配置”很多东西都帮你自动装配好了。对于初学的人来说SpringBoot用起来舒服但出了问题反而不明白底层是怎么工作的。SSM就不一样了每一个配置文件都要你亲手写每一个依赖都要你手动引入。你会在配SpringMVC的时候迷茫过会在MyBatis的mapper扫描上报过错但正是这些“折腾”让你真正理解了JavaWeb的底层逻辑。我个人的经验是如果你简历上写“熟悉SpringBoot”面试官可能默认你只会用框架但如果你说“手写过SSM整合项目理解Spring容器和SpringMVC的加载机制”面试官会觉得你对框架的理解是到位的。学完SSM再去看SpringBoot很多东西一眼就能看到本质。2.3 前台页面方案JSP还是前后端分离这个项目名里没有写前端框架那最经典的做法就是用JSP来做服务端页面渲染。JSP由SpringMVC的视图解析器直接返回给用户Controller返回逻辑视图名比如house/listViewResolver就去/WEB-INF/views/house/list.jsp找对应的页面文件。为什么不用Vue RESTful API的前后端分离原因很简单课程设计阶段前后端分离意味着你还要处理跨域、Token鉴权、前端工程构建这些额外的问题这些东西会分散你对SSM本身的学习精力。而且传统的JSPSSM架构是教科书上的标准做法你拿这个方案去答辩老师挑不出毛病。当然如果你们课程要求必须做前后端分离也可以只把SpringMVC的Controller改成返回ResponseBodyJSON数据前端再用Vue或者纯HTML去请求接口。但我要提醒一句不要为了赶时髦而把项目复杂度拉高先把SSM打通前端能用JSP实现功能再考虑升级分离方案。2.4 JDK与Tomcat版本怎么定java_ssm7这个命名的后缀其实对应的是项目的编码序号不是JDK 7但我确实见到过有人用JDK 8编译的项目去跑JDK 17环境然后报错的。这里必须提醒大家一个非常常见的坑java: 警告: 源发行版 17 需要目标发行版 17这个报错就是本地编译环境JDK版本和项目编译级别不一致导致的。我推荐的环境组合JDK 1.8最稳定SSM项目标配Maven 3.6及以上Tomcat 8.5或9.0支持Servlet 3.1/4.0MySQL 5.7或8.0注意驱动选择不同5.7用com.mysql.jdbc.Driver8.0用com.mysql.cj.jdbc.DriverIDEA 2020以上版本JDK 8到现在仍然是很多企业生产环境的标配用这个组合跑SSM项目基本不会因为版本问题卡壳。3. 数据库设计从业务细节落到每一张表3.1 核心表的信息架构一个租房系统的数据库设计核心就是围绕用户、房屋、订单三个对象来建表。我一般会这么设计一共五张表t_user 用户表包含id、用户名、密码、角色、手机号、注册时间。角色字段用int区分1是管理员2是房东3是租客。角色这里我用数字而不是字符串因为数字在查询和判断时更快而且很直观不会出现Admin和admin拼写不一致的问题。t_house 房屋信息表包含id、房东id、标题、面积、租金、区域、详细地址、房屋描述、封面图片、状态、发布时间。状态是关键字段0是待审核1是上架中2是已下架3是已出租。t_order 订单表包含id、订单编号、房屋id、下单用户id、订单类型、开始日期、结束日期、订单金额、状态、创建时间。订单类型我建议区分一下1是预约看房2是正式租房订单。如果合并到一张表里需要在业务层判断类型再走不同的流程如果拆成两张表逻辑会清晰很多。课程设计我建议合并成一张表用type字段区分因为代码量会更少逻辑也不至于太乱。t_favorite 收藏表包含id、用户id、房屋id、创建时间。收藏是租客的高频操作所以单独建一张收藏表方便做“我收藏的房源”列表也方便统计哪些房源最受欢迎。t_notice 公告表包含id、标题、内容、发布时间。管理员发布的通知比如“开学季租房高峰请同学们警惕租房诈骗”会展示在首页公告栏。3.2 字段设计里容易被忽视的细节如果你认真做过几张表就会意识到字段设计远不只是“想到哪写到哪”。我举几个在这个项目里特别能体现设计水平的例子第一个是密码字段。password字段建议用varchar(128)因为实际项目里密码不能存明文至少要用MD5加盐处理。MD5的密文是32位字符串加盐的话可能更长。如果字段只留varchar(32)以后想换更安全的算法就很麻烦。很多同学在这个项目里直接把明文存到数据库里答辩时如果说出来会很减分既然做管理系统就得有一点安全意识。第二个是金额字段。租金不要用double要用decimal(10,2)。浮点数在计算时存在精度问题比如9.9在double里可能是9.899999…这种情况下累计计算容易出错。用decimal存金额MySQL才能保证精确计算。第三个是房源封面图。图片不要存到数据库的blob字段里而是把图片文件上传到项目指定的upload目录数据库里只存相对路径。这样做的原因是数据库存储二进制文件会拖慢查询性能而且备份数据库的时候会变得很大。只需要在t_house表里存一个cover_img字段值是/upload/xxxx.jpg这样的字符串页面渲染的时候加上图片前路径就能显示。3.3 建表SQL参考我把核心的两张表DDL放在这里你们做表的时候可以参考。注意我用了MySQL 8.0的语法如果你的环境是5.7去掉末尾的ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4 COMMENTxxxx之前的COLLATEutf8mb4_0900_ai_ci就好。CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE COMMENT 登录用户名, password VARCHAR(128) NOT NULL COMMENT MD5加密后的密码, role INT DEFAULT 3 COMMENT 角色 1管理员 2房东 3租客, phone VARCHAR(20) COMMENT 联系电话, real_name VARCHAR(50) COMMENT 真实姓名, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4 COMMENT用户表; CREATE TABLE t_house ( id INT PRIMARY KEY AUTO_INCREMENT, landlord_id INT NOT NULL COMMENT 发房房东ID关联t_user.id, title VARCHAR(100) NOT NULL COMMENT 房源标题, area DOUBLE COMMENT 面积平方米, price DECIMAL(10,2) NOT NULL COMMENT 月租金, region VARCHAR(50) COMMENT 区域如:东校区/西校区, address VARCHAR(200) COMMENT 详细地址, cover_img VARCHAR(255) COMMENT 封面图片路径, detail TEXT COMMENT 房源描述, status INT DEFAULT 0 COMMENT 状态 0待审核 1已上架 2已下架 3已出租, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4 COMMENT房屋信息表;其他表的结构大同小异这里不把每张表都贴出来。建表最重要的是理清主外键关系t_house的landlord_id指向t_user的idt_order的house_id指向t_house的iduser_id指向t_user的id。这些外键关系在MyBatis里面用联表查询就能拿到对方的信息所以业务层不用多次查库。4. 核心功能实现关键流程与代码思路4.1 登录注册与权限控制登录功能本身不复杂就是查表比对用户名密码。但权限控制是这类系统的重点因为不同角色能访问的接口和页面是完全不一样的。比如房东可以访问“发布房源”页面而租客访问这个页面就应该被拦截。我建议用SpringMVC的拦截器Interceptor做权限校验。拦截器比在每个Controller方法里写if判断要优雅得多因为它是一种横切逻辑应该从业务代码里抽离出来。逻辑是这样写一个LoginInterceptor实现HandlerInterceptor接口在preHandle方法里判断当前session里有没有登录用户没有就直接重定向到登录页。再写一个AdminInterceptor判断登录用户角色是不是管理员不是就返回403页面。public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user request.getSession().getAttribute(loginUser); if (user null) { response.sendRedirect(request.getContextPath() /login); return false; } return true; } }然后在SpringMVC配置文件里注册拦截器并指定拦截和放行的路径mvc:interceptors mvc:interceptor mvc:mapping path/**/ mvc:exclude-mapping path/login/ mvc:exclude-mapping path/register/ mvc:exclude-mapping path/css/**/ mvc:exclude-mapping path/js/**/ mvc:exclude-mapping path/images/**/ /mvc:interceptor /mvc:interceptors这里必须注意一个细节静态资源一定要在拦截器里放行否则页面上的CSS和JS全部加载不出来。我见过好几个人遇到“页面HTML出来了但样式全没有”的问题排查半天最后发现就是拦截器把静态资源也拦了。密码存储这块我建议至少用MD5加盐。简单做法是取用户名作为盐值和密码拼在一起做MD5。这样即使两个用户密码相同因为用户名不同加密后的结果也不一样能在一定程度上防止彩虹表破解。4.2 房源发布与审核流程的设计房源发布流程里有一个特别关键的环节房东发布的房源不能立刻展示在租客端必须经过管理员审核。这个流程如果不做那系统就会变成任何房东都可以随意乱发房源质量没法控制。所以t_house表里才设计了status字段。房东提交房源时状态是0待审核管理员后台列表看到待审核的房源点击通过就把状态改成1已上架点击驳回就改成2已下架或者删掉。租客端查询房源时SQL只查status1的数据。这个流程在代码上的实现很简单就是一个update语句更新status字段但它的意义在于体现了“业务流程状态机”的设计思想。课程设计如果只有简单的增删改查很难拿高分但有了状态流转就能讲出业务深度。房东端发布房源时还要处理图片上传。用SpringMVC的MultipartFile接收文件把文件保存到/WEB-INF/upload目录下再把路径存到数据库的cover_img字段。注意上传的图片要做扩展名校验防止用户上传了jsp、php之类的危险文件。防的是安全问题一个管理学院周边出租的系统不能让用户上传可执行脚本。4.3 房源搜索与动态SQL搜索是这类系统里最能体现MyBatis功力的地方。租客搜索房屋时可能按区域搜可能按价格区间搜可能按面积搜也可能什么都不填直接浏览全部房源。这种“条件可选”的查询特别适合用MyBatis的动态SQL标签。我直接贴一段完整的Mapper XML就是按组合条件查房屋列表select idsearchHouse parameterTypemap resultTypecom.example.entity.House SELECT * FROM t_house where if teststatus ! null AND status #{status} /if if testregion ! null and region ! AND region #{region} /if if testminPrice ! null AND price gt; #{minPrice} /if if testmaxPrice ! null AND price lt; #{maxPrice} /if if testkeyword ! null and keyword ! AND (title LIKE CONCAT(%, #{keyword}, %) OR address LIKE CONCAT(%, #{keyword}, %)) /if /where ORDER BY create_time DESC /select这段SQL里用了MyBatis的where标签它会自动处理多个条件拼接时多余的AND问题。比如用户只填了关键词那生成的SQL就是SELECT * FROM t_house WHERE (title LIKE %xxx% OR address LIKE %xxx%) ORDER BY create_time DESC不会出现语法错误。Controller端接收参数时建议直接用RequestParam绑定到Map或者一个HouseQuery对象上传递到Service再传入Mapper。分页的话可以自己用LIMIT offset,pageSize实现也可以引入PageHelper插件课程设计用PageHelper会更省事。4.4 订单状态流转与日期处理订单是整个系统的核心业务对象订单状态我建议这样定义0是待确认用户提交预约或订单后等待房东处理1是已确认房东确认有效2是已取消用户或房东取消了订单3是已完成租期结束或看房完成。状态流转的规则在Service层控制比如用户取消了订单只能是从0变成2不能从3变成2。这里有个非常常见的坑日期参数传参问题。用户在前端选了一个日期比如“2025-06-01”提交到SpringMVC的RequestParam Date startDate结果框架直接给你报400错误原因是字符串没法直接转换成Date对象。解决办法是在Controller的日期参数上加上DateTimeFormat(pattern yyyy-MM-dd)注解或者在实体类的日期字段上加同样注解。DateTimeFormat(pattern yyyy-MM-dd) private Date startDate;订单编号我建议生成一个唯一的业务编号格式类似202506011230001234取当前时间戳加随机数。为什么不用数据库自增主键当订单号因为订单编号在业务上需要唯一可读自增id一眼就能看出订单量属于业务信息的泄露而且也不方便做单据追溯。5. SSM整合与部署把散装代码串起来5.1 三大配置文件的核心职责SSM项目搭建的过程中最大的门槛其实就是写配置文件。很多同学卡在这一步不是代码逻辑不会写而是不清楚这些配置文件分别管什么事。我梳理一下SSM整合一共需要三个核心配置加上web.xml一共四处。第一个是pom.xmlMaven的依赖管理文件。你需要引入spring-webmvc、spring-jdbc、mybatis、mybatis-spring、druid连接池、mysql驱动、jstl、jackson-databind等依赖。这里最容易出问题的就是版本号冲突比如Spring版本和mybatis-spring版本不兼容启动时直接报NoSuchMethodError。我常用的稳定组合是Spring 5.1.8.RELEASE、MyBatis 3.5.3、mybatis-spring 2.0.3。第二个是web.xmlWeb应用部署描述符。它要配置两个核心东西ContextLoaderListener作用是启动Spring容器DispatcherServlet作用是启动SpringMVC容器。很多人不理解为什么Spring的容器和SpringMVC的容器是分开的这其实是SpringMVC的设计机制SpringMVC的子容器负责Controller层父容器负责Service和Mapper层。子容器可以访问父容器的Bean但父容器不能访问子容器的Bean。第三个是spring-mvc.xml只管Controller相关的东西。配置内容有开启mvc:annotation-driven/、扫描controller包、配置视图解析器InternalResourceViewResolver、配置静态资源放行、配置上传解析器CommonsMultipartResolver。第四个是applicationContext.xml负责Service层和持久层。配置内容有扫描service包、配置数据源DruidDataSource、配置SqlSessionFactoryBean、配置Mapper扫描器MapperScannerConfigurer、配置事务管理器并开启注解事务。5.2 一个典型的SpringMVC配置示例我把常用的spring-mvc.xml核心部分贴出来这套配置我无数次用过属于可以直接照抄的水平context:component-scan base-packagecom.example.controller/ mvc:annotation-driven/ bean classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/WEB-INF/views// property namesuffix value.jsp/ /bean mvc:resources mapping/css/** location/static/css// mvc:resources mapping/js/** location/static/js// mvc:resources mapping/images/** location/static/images//注意视图解析器的prefix和suffix含义是Controller返回house/list时实际加载的路径是/WEB-INF/views/house/list.jsp。把JSP放在WEB-INF目录下有一个好处客户端不能直接通过URL访问这个目录下的文件必须经过Controller跳转才能到达这能防止用户绕过登录直接访问某个页面。5.3 部署时最容易翻车的几个点Maven项目部署到Tomcat很多人会在IDEA里点运维能启动就跑起来完全不知道背后发生了什么。真要部署到独立Tomcat时我遇到过的问题基本集中在几个地方IDEA的Artifact配置问题Web项目必须配置Artifact选war exploded模式然后在Deployment里添加Tomcat。如果忘了添加启动Tomcat后访问就是404。数据库连接问题MySQL 8.0的驱动类名和5.7不一样驱动类名是com.mysql.cj.jdbc.Driver而且URL要加时区参数serverTimezoneAsia/Shanghai。如果你用5.7的驱动类名连8.0数据库会直接报ClassNotFoundException或者Public Key Retrieval is not allowed。端口冲突8080端口被占用是家常便饭启动报错Port 8080 was already in use的时候把Tomcat的端口改成8081或者9090或者把占用端口的进程kill掉。部署的时候我建议先在本地的内嵌Tomcat上把项目跑通再打war包放到外部的Tomcat webapps目录里。这样能区分“代码问题”和“部署问题”排查时思路清晰很多。6. 常见问题与排查实录6.1 我踩过的坑希望你绕开SSM项目的报错信息有时候非常劝退新人错误提示不直观网上一搜答案又五花八门。我把自己和学员项目里反复遇到过的几类问题整理成速查表你们如果遇到类似的报错可以直接按这个思路排查。报错现象根本原因解决办法启动Tomcat报ClassNotFoundException: org.springframework.web.context.ContextLoaderListenerpom.xml里没引入spring-web依赖或jar包没部署到WEB-INF/lib检查pom依赖Maven项目重新导入确保相关的spring-web jar存在Invalid bound statement (not found): com.example.mapper.HouseMapper.searchHouseMapper接口方法名和Mapper.xml里id不一致或namespace写错检查namespace必须是接口的全限定名每个select的id必须和接口方法名一模一样登录成功后跳转页面样式全部丢失拦截器把静态资源也拦截了或视图路径不对在spring-mvc.xml的拦截器配置里放行/css/**、/js/**等路径访问页面全部变成404前端控制器DispatcherServlet的映射配置为/拦截了所有请求但SpringMVC没找到对应的Controller检查Controller是否在扫描的包路径下检查类上有没有Controller注解MySQL连接失败Public Key Retrieval is not allowedMySQL 8.0的认证插件要求客户端获取服务端公钥JDBC URL加参数allowPublicKeyRetrievaltrueuseSSLfalse前端显示的日期为Wed Jun 01 00:00:00 CST 2025这种英文格式默认的Date类型转成字符串时调用了toString方法格式不是我们想要的在JSP用JSTL标签fmt:formatDate value${item.startDate} patternyyyy-MM-dd/格式化6.2 一个真实的排查过程我举个具体的例子。有个学员做的也是房屋出租管理系统测试的时候发现房东在后台点击“上架房源”按钮后页面刷新房源还是“待审核”状态。他自己查了一下午没找到原因来问我。我一看他写的代码问题出在SQL上。他写的update语句没有加where id ?导致所有状态是0的房源全被update了不过由于页面查询时按house_id加载所以看起来像是没更新。我把他的Mapper.xml改成了这样update idupdateStatus UPDATE t_house SET status #{status} WHERE id #{id} /update问题立刻解决了。这个case非常典型不是框架问题不是配置问题是SQL语句少写了条件。以后排查问题一定要先看SQL看它是不是有明确的主键条件养成这个习惯能少踩很多坑。6.3 功能测试顺序建议项目做完后不要急着打包交差建议按下面的顺序把核心链路手动走一遍。我自己每个SSM项目验收前基本都会用一个简单的测试清单过一遍防止答辩时当场翻车。注册一个租客账号确认能正常登录密码在数据库里不是明文。用管理员账号登录后台看到一个待审核的房源数据。注意此时租客端前台不应该看到这个房源因为还在待审核状态。管理员通过审核后房东端能看到房源状态变为已上架。换一个租客账号搜索该房源的关键词确认搜索结果包含这条数据。租客提交看房预约房东端能收到预约记录可以进行确认或取消。数据库里确认订单的状态字段确实按操作逻辑发生了对应变化。如果这六步全部走通这个项目的核心功能就算验证完成。剩下的登录权限拦截、管理员禁用用户、公告发布等附加功能只要按同样的思路测试一遍即可。最后再分享一个我自己的体会做这种SSM课程设计项目最大的收获其实不是代码本身而是构建了一套“能看到全貌”的认知。从请求怎么从浏览器跑到Controller到Service怎么处理业务逻辑再到MyBatis怎么去数据库拿数据这条链路你在SpringBoot里很难看得这么清楚。把手写的SSM项目吃透之后再去学SpringBoot那套东西你会觉得一切都是顺理成章的。你准备做这个管理系统的时候别急着写代码先把表结构设计好把业务流程图理清代码反而是最快的那一步。