SpringBoot+Vue健身房管理系统实战:从零搭建前后端分离项目

发布时间:2026/7/4 16:34:47

SpringBoot+Vue健身房管理系统实战:从零搭建前后端分离项目 30款热门AI模型一站整合DeepSeek/GLM/Claude 随心用限时 5 折。 点击领海量免费额度很多刚学完 Vue 和 SpringBoot 基础的同学都会面临一个尴尬的“项目真空期”教程里的 TodoList 和 CRUD 都做完了但简历上依然空空如也面试官一问项目经验就卡壳。自己从零设计一个完整项目又不知道如何划分模块、设计数据库、处理前后端交互感觉无从下手。如果你正处在这个阶段那么一个结构清晰、功能完整、技术栈主流的健身房管理系统源码可能就是你现在最需要的东西。它不是一个简单的增删改查 Demo而是一个包含了会员管理、课程预约、器材管理、数据统计等真实业务场景的综合性项目。更重要的是它采用了目前企业开发中最主流的SpringBoot Vue 前后端分离架构这意味着你学到的不仅是功能实现更是符合现代开发规范的工程实践。本文将带你从零开始深度解析这个健身房管理系统的完整搭建过程、核心代码逻辑、以及那些教程里不会告诉你的“坑”。我会把项目拆解得足够细确保即使你是刚接触前后端分离的“小白”也能跟着步骤成功运行并理解每一行代码背后的设计意图。我们不止步于“跑起来”更要搞清楚“为什么这么设计”以及“在实际工作中怎么用”。1. 这个项目能帮你解决什么实际问题在开始敲代码之前我们必须先明确这个项目的价值。它绝不仅仅是一个“作业”或“毕设模板”。对于不同阶段的开发者它的意义完全不同对于初学者学生/转行者跨越“知道”到“做到”的鸿沟你学完了 Vue 的指令、组件、路由也学完了 SpringBoot 的注解、MyBatis但如何将它们组织成一个能协同工作的系统这个项目提供了一个标准的“参考答案”。建立真实的业务逻辑思维不再是简单的用户表增删改查。你需要思考会员办卡有哪些状态体验、有效、过期预约课程如何防止冲突如何计算教练的课时费这些业务逻辑的编码实现是面试中区分“背题者”和“实践者”的关键。完善你的技术简历一个功能完整、技术栈匹配VueSpringBoot的项目是简历上最具说服力的部分。你可以清晰地讲述项目中负责的模块、遇到的技术难点和解决方案。对于有一定经验的开发者学习前后端分离的工程化实践如何设计 RESTful API 接口规范如何统一处理响应格式和异常前端如何管理跨域、路由守卫和状态虽然本项目可能未使用 Vuex/Pinia但你可以思考如何引入后端如何进行分层设计Controller, Service, Mapper借鉴通用的解决方案比如权限验证基于角色的访问控制RBAC、数据导出Excel、文件上传等这些功能在这个管理系统中都有典型实现你可以提炼出通用代码块用于自己的其他项目。代码结构与设计模式参考看看别人是如何组织包结构、进行依赖注入、处理事务的。虽然项目可能不复杂但良好的结构是迈向大型应用的第一步。这个项目的核心价值在于它用一个贴近真实的业务场景健身房管理串联起了 Vue 和 SpringBoot 这一对“黄金组合”在实战中所需的大部分核心技能点。接下来我们就深入其内部看看它是如何构建的。2. 技术栈与架构全景为什么是 SpringBoot Vue在深入细节前我们先俯瞰整个项目的技术选型和架构设计。理解“为什么用这些技术”比“怎么用”更重要。后端技术栈 (SpringBoot)核心框架SpringBoot 2.x。它提供了自动配置、内嵌服务器等特性让我们能快速搭建一个可独立运行的、生产级别的后端应用无需繁琐的 XML 配置。数据持久层MyBatis-Plus。这是 MyBatis 的增强工具在 MyBatis 的基础上只做增强不做改变。它提供了强大的 CRUD 通用接口、条件构造器、分页插件等能极大减少编写 SQL 的工作量。这是本项目后端开发效率的关键。数据库MySQL 5.7/8.0。关系型数据库用于存储会员、课程、订单等结构化数据。项目管理与构建Maven。用于管理项目依赖Jar包、构建和打包。其他可能组件Spring Security 或 Shiro/JWT用于用户认证和授权。这是管理系统的安全基石。Lombok通过注解自动生成 Getter/Setter、构造方法等让代码更简洁。Hutool国产工具类库可能用于处理日期、加密、HTTP 请求等工具操作。前端技术栈 (Vue)核心框架Vue 2.x / 3.x。本项目大概率基于 Vue 2生态更成熟使用选项式 API。Vue 的响应式和组件化是构建复杂单页面应用SPA的基础。构建工具Vue CLI。提供了标准化的项目脚手架、开发服务器和打包配置。UI 组件库Element UI(对应 Vue 2) 或Element Plus(对应 Vue 3)。这是本项目前端界面如此规整、美观的核心。它提供了表格、表单、对话框、导航菜单等丰富的现成组件让我们能专注于业务逻辑而非样式。路由Vue Router。管理前端页面路由实现无刷新跳转。HTTP 客户端Axios。用于向后端 RESTful API 发起 HTTP 请求是前后端通信的桥梁。状态管理可能未使用对于本项目规模可能未引入 Vuex/Pinia。简单的状态可以通过组件间通信或事件总线解决。架构模式前后端分离 (Frontend-Backend Separation)这是现代 Web 开发的绝对主流。其核心思想是后端SpringBoot只负责提供数据接口API返回 JSON/XML 格式的数据不关心数据如何展示。它就像一个纯粹的数据和服务提供方。前端Vue负责所有用户交互和界面渲染。它通过调用后端 API 获取数据然后利用 Vue 的响应式系统更新 DOM呈现给用户。两者通过 HTTP/HTTPS 协议通信通常遵循 RESTful 设计风格。这种架构的优势非常明显职责清晰后端专注业务逻辑和数据安全前端专注用户体验和交互逻辑。并行开发前后端开发者可以基于 API 文档同时开工提高效率。技术栈灵活后端可以替换为 Go、Python前端可以替换为 React、Angular只要 API 约定不变。易于扩展和部署前端可以部署在 Nginx 或 CDN 上后端可以集群化部署。理解了这些我们就知道接下来要搭建的是两个独立的工程一个 SpringBoot 后端工程一个 Vue 前端工程。3. 环境准备搭建你的开发战场工欲善其事必先利其器。请确保你的开发环境已安装以下软件这是项目能够成功运行的前提。3.1 后端开发环境JDK版本 1.8 或 11推荐 1.8兼容性最好。安装后配置JAVA_HOME环境变量。# 检查安装 java -versionMaven版本 3.6。用于管理依赖和构建。安装后配置MAVEN_HOME并将bin目录加入PATH。# 检查安装 mvn -vIDEIntelliJ IDEA(社区版或旗舰版) 或 Eclipse (STS)。IDEA 对 SpringBoot 的支持更友好强烈推荐。数据库MySQL 5.7 或 8.0。安装并启动 MySQL 服务。你需要一个数据库管理工具如Navicat、MySQL Workbench或 IDEA 自带的数据库工具。3.2 前端开发环境Node.js版本 14.x 或 16.xLTS 版本。它自带了 npm 包管理器。安装后检查# 检查安装 node -v npm -vVue CLIVue 的官方脚手架工具。通过 npm 全局安装npm install -g vue/cli # 检查安装 vue --versionIDEVisual Studio Code(VSCode) 是前端开发的首选轻量且插件生态丰富。当然你也可以使用 WebStorm 或 IDEA。3.3 获取项目源码你可以从 GitHub、Gitee 或课程资源平台获取到完整的项目源码。通常包含两个文件夹gym-management-backendSpringBoot 后端项目。gym-management-frontendVue 前端项目。请将这两个文件夹放在你方便管理的目录下。接下来我们分别对它们进行配置和启动。4. 后端项目启动与核心配置详解我们先让后端服务跑起来因为前端需要调用后端的 API。4.1 导入与依赖检查使用 IDEA 打开gym-management-backend文件夹。等待 IDEA 自动识别为 Maven 项目并下载依赖观察底部进度条。这个过程取决于网络可能需要几分钟。打开pom.xml文件这是 Maven 的核心配置文件。你会看到类似以下的依赖dependencies !-- SpringBoot Web 启动器提供Web MVC能力 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MyBatis-Plus 启动器 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.x/version /dependency !-- MySQL 驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency !-- Lombok -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- 可能还有 SpringBoot Test, Hutool等 -- /dependencies如果依赖下载失败可以检查 Maven 仓库配置settings.xml或尝试使用阿里云镜像。4.2 数据库配置与初始化这是启动后端最关键的一步。找到配置文件通常是src/main/resources/application.yml或application.properties。# application.yml 示例 server: port: 8080 # 后端服务启动端口 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/gym_db?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai username: root # 你的数据库用户名 password: 123456 # 你的数据库密码 # JPA 配置如果用了JPA否则可能是MyBatis配置 jpa: hibernate: ddl-auto: update # 谨慎使用create-drop, update, validate, none show-sql: true # 控制台打印SQL调试时有用 # MyBatis-Plus 配置 mybatis-plus: mapper-locations: classpath:mapper/*.xml # XML映射文件位置 type-aliases-package: com.example.gym.entity # 实体类包名 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志你需要做的是根据配置文件中的数据库名如gym_db在你的 MySQL 中创建一个空数据库。CREATE DATABASE IF NOT EXISTS gym_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;将application.yml中的username和password修改为你本地 MySQL 的账号密码。项目通常会提供一个数据库初始化脚本sql/gym_db.sql。在 Navicat 或命令行中连接到你刚创建的数据库然后运行这个 SQL 文件。这会创建所有数据表并插入一些初始测试数据。重要务必先运行 SQL 脚本否则启动时会因表不存在而报错。4.3 启动后端服务找到主启动类通常命名为XxxApplication.java例如GymManagementApplication.java。它上面会有SpringBootApplication注解。右键点击这个类选择Run ‘GymManagementApplication‘。观察控制台日志。如果看到类似以下的输出说明启动成功Started GymManagementApplication in 5.632 seconds (JVM running for 6.215) Tomcat started on port(s): 8080 (http)你可以在浏览器中访问http://localhost:8080如果配置了简单的欢迎页或者访问一个具体的 API 如http://localhost:8080/api/member/list来测试后端可能会返回 JSON 数据或错误信息因为没带token等。只要能正常响应即使是401/404也说明服务起来了。5. 前端项目启动与跨域处理后端服务在 8080 端口运行后我们启动前端它默认会运行在另一个端口如 8081。5.1 安装依赖与启动使用 VSCode 打开gym-management-frontend文件夹。打开终端Terminal确保路径在前端项目根目录下。运行以下命令安装项目所需的 npm 包依赖项npm install # 或使用淘宝镜像加速 # npm install --registryhttps://registry.npmmirror.com这个过程会下载node_modules文件夹包含 Vue、Element UI、Axios 等所有依赖。依赖安装完成后启动开发服务器npm run serve成功后会显示App running at: - Local: http://localhost:8081/ - Network: http://192.168.x.x:8081/5.2 解决核心难题跨域 (CORS)此时前端运行在http://localhost:8081后端运行在http://localhost:8080端口不同浏览器出于安全考虑会阻止前端 JavaScript 直接请求后端 API这就是跨域问题。解决方案有两种本项目通常已配置其一方案A后端配置 CORS推荐在后端的 SpringBoot 项目中添加一个全局 CORS 配置类。// 文件路径src/main/java/com/example/gym/config/CorsConfig.java package com.example.gym.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource(); CorsConfiguration config new CorsConfiguration(); config.setAllowCredentials(true); // 允许携带cookie config.addAllowedOriginPattern(*); // 允许所有源生产环境应指定具体前端地址 config.addAllowedHeader(*); // 允许所有请求头 config.addAllowedMethod(*); // 允许所有方法 (GET, POST, PUT, DELETE等) source.registerCorsConfiguration(/**, config); // 对所有路径生效 return new CorsFilter(source); } }重启后端服务此配置生效后前端就可以自由调用后端 API 了。方案B前端代理 (Vue CLI Dev Server)在 Vue 项目的根目录下创建或修改vue.config.js文件。// vue.config.js module.exports { devServer: { port: 8081, // 前端端口 proxy: { /api: { // 代理所有以 /api 开头的请求 target: http://localhost:8080, // 后端地址 changeOrigin: true, // 改变请求头中的host为目标地址的host pathRewrite: { ^/api: // 重写路径去掉 /api 前缀如果后端接口本身没有/api前缀 // 如果后端接口有 /api 前缀则不需要重写或者改为 ‘^/api‘: ‘/api‘ } } } } }修改后重启前端服务 (npm run serve)。这样前端代码中请求/api/member/list开发服务器会将其代理到http://localhost:8080/member/list从而绕过浏览器的跨域限制。注意此配置仅用于开发环境生产环境需要部署在同一域名下或由 Nginx 代理。5.3 登录系统前端启动后打开浏览器访问http://localhost:8081。你应该能看到登录界面。使用 SQL 脚本中初始化的账号如admin/admin123进行登录。如果登录成功并跳转到管理后台主页恭喜你前后端联调成功6. 核心功能模块与代码解析登录成功后你会看到一个典型的管理系统界面侧边栏有菜单。我们来剖析几个核心模块的代码实现。6.1 会员管理模块这是系统的核心。我们从前端到后端走一遍“查看会员列表”的流程。前端 (Vue Element UI)路由在src/router/index.js中找到会员管理页面对应的路由配置。{ path: /member, component: Layout, // 主布局组件 children: [ { path: list, name: MemberList, component: () import(/views/member/list), // 懒加载 meta: { title: 会员列表, icon: user } } ] }页面组件打开src/views/member/list.vue。这是一个单文件组件包含template,script,style。template使用 Element UI 的el-table来渲染表格el-form和el-input用于查询条件。template div classapp-container el-form :inlinetrue :modelqueryParams submit.native.preventhandleQuery el-form-item label会员姓名 el-input v-modelqueryParams.name placeholder请输入会员姓名 clearable / /el-form-item el-form-item el-button typeprimary iconel-icon-search clickhandleQuery搜索/el-button el-button iconel-icon-refresh clickresetQuery重置/el-button /el-form-item /el-form el-table v-loadingloading :datamemberList border el-table-column labelID propid width80 / el-table-column label姓名 propname / el-table-column label电话 propphone / el-table-column label会员卡类型 propcardType / el-table-column label到期时间 propexpireDate template slot-scopescope {{ parseTime(scope.row.expireDate, ‘{y}-{m}-{d}‘) }} /template /el-table-column el-table-column label操作 width200 template slot-scopescope el-button sizemini typetext clickhandleUpdate(scope.row)编辑/el-button el-button sizemini typetext clickhandleDelete(scope.row)删除/el-button /template /el-table-column /el-table !-- 分页组件 -- pagination v-showtotal0 :totaltotal :page.syncqueryParams.pageNum :limit.syncqueryParams.pageSize paginationgetList / /div /templatescript包含数据、方法和生命周期钩子。核心是getList()方法它使用 Axios 调用后端 API。import { listMember, delMember } from ‘/api/member‘ // 导入API函数 export default { name: ‘MemberList‘, data() { return { loading: false, memberList: [], total: 0, queryParams: { pageNum: 1, pageSize: 10, name: undefined, phone: undefined } } }, created() { this.getList() // 页面创建时自动加载数据 }, methods: { getList() { this.loading true listMember(this.queryParams).then(response { this.memberList response.rows this.total response.total this.loading false }).catch(() { this.loading false }) }, handleQuery() { this.queryParams.pageNum 1 this.getList() }, // ... 其他方法 } }API 层在src/api/member.js中定义了与后端交互的具体请求。import request from ‘/utils/request‘ // 导入封装好的axios实例 export function listMember(query) { return request({ url: ‘/member/list‘, method: ‘get‘, params: query // query参数会自动拼接到URL后 ?pageNum1pageSize10namexxx }) }后端 (SpringBoot MyBatis-Plus)实体类 (Entity)src/main/java/com/example/gym/entity/Member.java。对应数据库的member表。package com.example.gym.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.util.Date; Data TableName(member) // 指定表名 public class Member { TableId(type IdType.AUTO) // 主键自增 private Long id; private String name; private String phone; private String cardType; // e.g., 月卡季卡年卡 private Date expireDate; TableField(fill FieldFill.INSERT) // 插入时自动填充 private Date createTime; TableField(fill FieldFill.INSERT_UPDATE) // 插入和更新时自动填充 private Date updateTime; }Mapper 接口src/main/java/com/example/gym/mapper/MemberMapper.java。继承 MyBatis-Plus 的BaseMapper即可获得基础的 CRUD 方法。package com.example.gym.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.gym.entity.Member; public interface MemberMapper extends BaseMapperMember { // 如果需要复杂的自定义SQL可以在这里定义方法并在对应的XML中实现 // ListMember selectComplexQuery(PageMember page, Param(query) MemberQuery query); }Service 层src/main/java/com/example/gym/service/MemberService.java和其实现类。封装业务逻辑。public interface MemberService extends IServiceMember { // 自定义业务方法 PageMember pageQuery(MemberQuery query); } Service public class MemberServiceImpl extends ServiceImplMemberMapper, Member implements MemberService { Override public PageMember pageQuery(MemberQuery query) { PageMember page new Page(query.getPageNum(), query.getPageSize()); LambdaQueryWrapperMember wrapper new LambdaQueryWrapper(); wrapper.like(StringUtils.isNotBlank(query.getName()), Member::getName, query.getName()); wrapper.like(StringUtils.isNotBlank(query.getPhone()), Member::getPhone, query.getPhone()); // 更多条件... return this.page(page, wrapper); } }Controller 层src/main/java/com/example/gym/controller/MemberController.java。接收前端请求调用 Service返回结果。RestController RequestMapping(/member) public class MemberController { Autowired private MemberService memberService; GetMapping(/list) public Result list(MemberQuery query) { PageMember page memberService.pageQuery(query); return Result.success(page); } // 其他接口增删改查... }统一返回结果通常会有一个Result类来封装统一的 API 响应格式。Data public class ResultT { private Integer code; private String msg; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMsg(成功); result.setData(data); return result; } // 失败、异常等方法... }6.2 课程预约模块这个模块涉及更复杂的业务逻辑库存/名额扣减和时间冲突校验。后端逻辑在CourseOrderService中createOrder方法需要在一个事务(Transactional) 内完成检查课程course在指定时间段的剩余名额是否大于0。检查该会员member在同一时间段是否已预约其他课程避免冲突。扣减课程名额。生成预约订单记录。 如果任何一步失败事务回滚数据保持一致。前端实现使用 Element UI 的日期时间选择器el-date-picker和对话框el-dialog来创建预约表单。6.3 数据统计模块通常使用 ECharts 进行可视化。前端通过 API 获取统计好的数据如{‘month‘: ‘2024-01‘, ‘newMembers‘: 45}然后调用 ECharts 的setOption()方法渲染成柱状图、折线图等。后端则通过编写复杂的 SQL 查询或使用 MyBatis-Plus 的聚合查询来完成数据统计。7. 项目打包与部署生产环境准备开发完成后我们需要将项目部署到服务器上。7.1 后端打包 (SpringBoot)SpringBoot 项目可以打包成一个可执行的 Jar 文件内嵌了 Tomcat 服务器。在 IDEA 右侧 Maven 工具栏找到项目 - Lifecycle - 双击package。或者在项目根目录下命令行执行mvn clean package -DskipTests打包成功后在target目录下会生成gym-management-backend-0.0.1-SNAPSHOT.jar。部署时只需在服务器上安装好 Java 环境然后运行nohup java -jar gym-management-backend-0.0.1-SNAPSHOT.jar --spring.profiles.activeprod app.log 21 --spring.profiles.activeprod会激活application-prod.yml配置文件用于配置生产环境的数据库、端口等。7.2 前端打包 (Vue)Vue 项目需要打包成静态文件HTML, CSS, JS。在前端项目根目录下执行npm run build打包完成后会生成一个dist文件夹里面就是所有的静态资源。部署时可以将dist文件夹内的所有文件放到 Nginx 或 Apache 的网站根目录下。同时需要配置 Nginx 将 API 请求反向代理到后端服务。# nginx.conf 示例片段 server { listen 80; server_name your-domain.com; # 你的域名或IP # 前端静态资源 location / { root /path/to/your/dist; index index.html index.htm; try_files $uri $uri/ /index.html; # 支持Vue Router的history模式 } # 后端API代理 location /api/ { proxy_pass http://localhost:8080/; # 后端服务地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }这样用户访问your-domain.com看到的是前端页面前端发起的/api/xxx请求会被 Nginx 转发到后端的8080端口从而解决跨域问题。8. 常见问题与排查思路避坑指南在运行和开发过程中你几乎一定会遇到以下问题。别慌按顺序排查。问题现象可能原因排查方式解决方案后端启动失败端口被占用8080 端口已被其他程序如另一个SpringBoot应用、Tomcat使用。查看启动日志中的错误信息。在命令行执行netstat -ano | findstr :8080(Windows) 或lsof -i:8080(Mac/Linux)。1. 杀死占用端口的进程。2. 修改application.yml中的server.port为其他端口如8082。后端启动失败数据库连接错误1. 数据库地址/端口/库名错误。2. 数据库用户名密码错误。3. MySQL服务未启动。4. 数据库驱动版本不匹配。1. 检查application.yml中的spring.datasource.url。2. 用工具如Navicat测试连接。3. 检查MySQL服务状态。4. 查看pom.xml中 MySQL 驱动版本。1. 修正配置。2. 启动MySQL服务。3. 调整驱动版本MySQL 8.0 通常使用com.mysql.cj.jdbc.Driver和8.x.x版本的驱动。前端npm install失败1. 网络问题无法连接到 npm 仓库。2. Node.js 版本过高或过低。3. 项目依赖存在冲突。1. 检查网络使用npm config get registry查看镜像源。2. 使用node -v检查版本。3. 查看错误日志通常是某个包安装失败。1. 切换为淘宝镜像npm config set registry https://registry.npmmirror.com。2. 使用 nvm 管理 Node.js 版本切换到项目要求的版本如 14.x 或 16.x。3. 删除node_modules和package-lock.json重新npm install。前端npm run serve成功但页面空白或报错1. 控制台有 JS 错误如组件未找到。2. 路由配置错误。3. 代理配置错误API 请求失败。1. 打开浏览器开发者工具 (F12)查看 Console 和 Network 标签页。2. 检查 Network 中 API 请求的响应状态码和返回数据。1. 根据 Console 错误修改代码。2. 检查vue.config.js中的代理配置确保目标地址正确。3. 检查后端服务是否已启动且端口匹配。登录后页面刷新登录状态丢失前端使用 localStorage 或 sessionStorage 存储 token但未在路由守卫或请求拦截器中做持久化处理。检查src/utils/request.js中的 Axios 拦截器是否在每次请求时自动携带 token。检查src/permission.js或路由守卫逻辑。确保请求拦截器正确设置headers.Authorization。在main.js或入口文件应用初始化时从 storage 读取 token 并存入 Vuex 或全局状态。Element UI 组件样式丢失1. 未正确引入 Element UI 的样式文件。2. 自定义样式覆盖了组件样式。1. 检查main.js或插件文件中是否import ‘element-ui/lib/theme-chalk/index.css‘。2. 使用浏览器检查元素查看样式是否被覆盖。1. 确保样式文件被引入。2. 调整自定义样式选择器的优先级或使用scoped属性。MyBatis-Plus 查询不到数据或报错1. 实体类字段名与数据库列名不一致未使用TableField注解映射。2. 数据库表名与TableName注解指定不符。3. 查询条件构造错误。1. 查看 MyBatis-Plus 打印的 SQL 日志核对生成的 SQL 语句。2. 检查实体类注解。1. 使用TableField(value “db_column_name“)进行映射。2. 使用TableName(“table_name”)指定表名。3. 学习 LambdaQueryWrapper 的正确用法。9. 从“运行”到“掌握”最佳实践与学习建议成功运行项目只是第一步。要真正把这个项目变成你自己的经验你需要做以下几件事代码重构与理解不要只满足于运行。尝试去修改它。添加一个新功能比如“会员签到”功能记录签到时间并积分。修改现有逻辑将课程预约的“先到先得”改为“抽签”模式思考后端逻辑如何改动。优化代码发现重复的代码如日期格式化将其抽取成公共工具函数或过滤器。数据库设计分析打开数据库仔细查看每张表的结构字段、类型、索引、外键。思考为什么member表和course_order表要分开order表里哪些字段是冗余的为了查询性能如何为经常查询的字段如phone,create_time添加索引API 设计规范研究后端的 Controller学习 RESTful 风格。GET /members获取列表POST /members新增会员PUT /members/{id}更新会员DELETE /members/{id}删除会员思考为什么接口路径用复数形式状态码200, 400, 401, 500应该如何正确返回引入更高级的技术选做状态管理在 Vue 项目中引入 PiniaVue 3或 VuexVue 2将用户信息、权限等状态集中管理。权限控制实现更细粒度的按钮级权限而不仅仅是菜单级。可以研究v-permission自定义指令。接口文档使用 Swagger 或 Knife4j 为后端 API 自动生成在线文档。单元测试为后端的 Service 层编写 JUnit 单元测试为前端的工具函数编写 Vitest 或 Jest 测试。部署到云服务器购买一台最基础的云服务器如腾讯云/阿里云的轻量应用服务器尝试将前后端部署上去并绑定域名。这个过程会让你真正理解 Nginx 配置、域名解析、防火墙、进程守护如使用 systemd 或 pm2等运维知识。这个健身房管理系统项目就像一本优秀的“实战教科书”。它为你展示了一个完整应用应有的模样。你的任务不是背诵它而是拆解它、修改它、扩展它最终把其中的设计思想和代码技巧内化成你自己解决问题的能力。当你能够独立回答“如果我要加一个XX功能应该在哪里改代码”时你就已经跨越了从学习者到实践者的关键一步。 30款热门AI模型一站整合DeepSeek/GLM/Claude 随心用限时 5 折。 点击领海量免费额度

相关新闻