尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

基于SpringBoot的美发商城系统:从表结构设计到部署实战

发布时间:2026/9/24 21:30:03

资讯中心
01
ARTICLE

基于SpringBoot的美发商城系统:从表结构设计到部署实战

基于SpringBoot的美发商城系统:从表结构设计到部署实战
做毕设或者练手项目springboot相关的商城系统可以说是最经典的选题之一。但真正动手做起来很多人会发现商城系统三个字背后牵扯的东西远比想象中多。今天我想借这个基于springboot的美发商城系统项目把从项目设计、核心功能实现到部署上线的完整思路捋一遍。这个项目属于典型的行业垂直类电商系统相比通用的电商demo它多了美发行业的业务特征比如发型师预约、服务项目管理、卡项售卖等非常适合作为Java课程设计或毕业设计的选题同时对刚入行想积累项目经验的开发者来说也是很好的练手素材。我拿到这套项目的时候第一反应是看看它到底美发在哪里。如果只是把商品名称从手机换成洗发水那本质上还是通用电商没有行业深度。实际拆解下来这个项目在业务建模上确实做了行业化的设计下面我会从几个层面展开包括整体架构怎么搭、核心表结构怎么设计、预约和订单这类关键流程怎么落地、以及部署文档里那些容易踩坑的细节。1. 项目整体设计与技术选型逻辑1.1 为什么选springboot而不是其他框架先说选型。这个项目用的是springboot而不是传统的SSMSpringSpringMVCMyBatis手工整合也不是更重型的Spring Cloud微服务架构。这一点比较符合实际项目场景原因有三个。第一springboot解决了SSM时代最头疼的配置问题。早期用SSM做一个项目光spring-context.xml、spring-mvc.xml、mybatis-config.xml这几份配置文件的互相引用就够折腾一阵子更不用说处理各种jar包版本冲突。springboot用自动配置和约定优于配置的思想把大部分样板配置都收编了开发者只需要关注业务代码本身。对于美发商城这种单体应用来说这种轻量、快速启动的特性非常合适。第二springboot的生态足够完善。这个项目涉及到MyBatis持久层、Spring Security做登录鉴权、Thymeleaf或Vue做前端渲染、Maven做依赖管理这些在springboot生态里都有非常成熟的整合方案。哪怕是遇到问题社区里的解决方案也一抓一大把——这点在做项目的时候非常重要毕竟课程设计是有时间节点的没人想卡在一个冷门问题上好几天。第三招聘市场上springboot是绝对的主流。对于学生来说用springboot做项目写在简历上不管是找实习还是找工作认可度都比自研框架或者过于老旧的SSHStrutsHibernateSpring高很多。从实用主义的角度出发这个选型既考虑了项目可行性也考虑了技术投资的回报率。1.2 系统模块划分不止是卖洗发水的电商再来说模块设计。这个美发商城系统如果按照功能划分可以分成三个端前台用户端、后台管理端、以及支撑业务的基础服务层。前台用户端负责的是C端体验包括用户注册登录、美发服务项目浏览、商品购买、发型师预约、订单管理、个人中心、收藏夹、评价晒单这些功能。这里有一个值得注意的设计——普通的电商系统不需要处理预约这个动作但美发行业不一样用户去店里做头发很多时候不是即买即用的而是需要先选定发型师、预约一个时间、再到店消费。所以服务商品预约的组合是这个项目业务建模的重点。后台管理端则是运营人员使用的包括商品管理、服务项目管理、发型师管理、预约排班管理、订单处理、会员管理、轮播图管理、公告管理等。这一端考验的是对业务流转的理解比如发型师被预约之后他的空档时间如何更新订单完成后库存如何扣减用户取消订单后预约名额如何释放。基础服务层主要是一些通用能力的封装比如统一返回结果、全局异常处理、文件上传下载、JWT或Session的登录校验、参数校验等。这些代码虽然不直接产生业务价值但决定了整个项目的代码质量和可维护性。我在看到这个项目的源码时特别看了下它是否有做统一的响应体封装——这个是很多毕设项目容易忽略的。如果没有统一封装前端调用接口时每个接口都要单独处理返回结构后期联调会非常痛苦。1.3 前端方案服务端渲染还是前后端分离前端这块需要单独说一下。现在做springboot项目前端方案大致有两条路线一是用Thymeleaf模板引擎做服务端渲染页面由后端直接拼好返回浏览器二是前后端分离后端只提供RESTful API前端用Vue或React单独开发构建后再部署到Nginx。这个美发商城系统从部署文档来看采用的是前后端分离的方案前端基于Vue Element UI后端纯接口服务。这个方案的好处是分工明确后端只需要关注接口逻辑有现成的Swagger或Postman文档就能自己调试前端交互体验也比传统模板引擎做得更好毕竟Element UI这类组件库已经帮我们封装好了表格、弹窗、分页这些常用组件。但前后端分离也意味着部署会稍微复杂一点——前端要执行npm install和npm run build构建产物要用Nginx托管同时Nginx还要配置反向代理把/api开头的请求转发给后端服务。这部分在部署文档里写得比较清楚下面我会专门讲。提示如果你的项目时间比较紧而且不想处理跨域和Nginx代理这些前后端联调问题选Thymeleaf模板方案会更快一些。但如果你想在简历上写前后端分离这四个字还是推荐Vue API的模式。2. 核心功能拆解与表结构设计2.1 商品与服务两种不同的业务实体美发商城和3C数码商城最大的区别在于它同时存在实物商品和虚拟服务两种业务形态。实物商品就是洗发水、护发素、造型工具这些下单后走物流发货虚拟服务则是剪发、染发、烫发、头皮护理这些到店消费的项目。这两者在数据库表设计上天然不同。实物商品需要有SKU库存量单位、库存数量、重量用于计算运费服务项目不需要管库存但要关联到具体的发型师、需要预估服务时长、要能配置工作日和可预约时间段。在这个项目里设计者用了两张表来分别存储product表存实物商品service_item表存服务项目。两表之间不强行耦合但都通过category_id关联分类表。这样设计的好处是后续如果有新的业务形态加入比如卖会员卡、卖优惠券都可以沿用同样的模式扩展不会破坏现有的结构。我最初想过另一种方案用一张商品表加一个type字段来区分实物和服务但仔细想想还是算了。因为实际操作中实物商品要关联物流信息、售后服务服务项目要关联发型师排班如果混在一张表里会有大量字段是为某种类型准备的另一种类型插入时全是NULL不仅浪费存储而且查询时还要不断判断类型代码写起来很别扭。所以拆表看起来违反直觉实际反而是更干净的设计。2.2 预约系统美发行业的核心业务逻辑预约功能是整个系统里最有行业特色的模块也是技术上最需要仔细设计的地方。我先说需求用户选择一位发型师指定一个服务项目然后选择一个期望的时间段提交预约发型师和管理员能看到所有预约记录用户可以取消未开始的预约。这个需求拆解下来核心是两点一是发型师的时间段怎么管理二是预约冲突怎么避免。时间段的管理常见有两种做法。做法一是用排班表管理员提前给发型师配置未来几天的班次比如每个时间段是几点到几点用户只能在已排班的空档里选。做法二是用时间片系统根据固定规则自动切分时间段比如每天早10点到晚8点每30分钟一个时间片发型师未预约的时间片都是可选的。这个项目采用的是类似做法二的思路appointment表里存储了appointment_date、start_time、end_time三个字段用户提交预约时后端校验该发型师在所选时间段内是否已有冲突预约——如果存在时间段重叠的预约则拒绝创建。冲突校验的SQL大概是这样的SELECT COUNT(*) FROM appointment WHERE hairdresser_id #{hairdresserId} AND appointment_date #{date} AND status IN (1, 2) -- 1:待确认 2:已确认 AND ( (#{startTime} end_time AND #{endTime} start_time) )核心就是区间重叠判断新预约的开始时间早于已有预约的结束时间且新预约的结束时间晚于已有预约的开始时间说明两个时间段有交集存在冲突不允许预约。注意判断时间重叠我刚开始以为是判断包含关系其实不是只要两个区间有交集就算冲突。还包括新预约完全落在已有预约时间内、已有预约完全落在新预约时间内这种情况都要覆盖到。上面的SQL用两个条件就解决了比较简洁。另一个容易忽略的点是状态机设计。预约的状态我见过很多项目定义得很随意但这个项目里定义得比较合理待确认、已确认、已完成、已取消、已爽约。用户提交预约后是待确认管理员或发型师可以确认或取消到了预约时间用户到店消费后管理员可以将状态改为已完成如果用户没来则标记为爽约。这个状态流转逻辑虽然简单但在代码里一定要用常量或枚举去约束不能散落写魔法数字否则后期改状态逻辑会疯掉。2.3 购物车与订单从下单到扣减的链路购物车和订单这部分是所有电商系统共通的基础能力但这个项目的实现里有一些细节值得说说。购物车表cart_item比较简单关联用户ID、商品ID或服务ID、数量、选中状态。这里有一个设计取舍购物车里的条目同时支持商品和服务。通用做法是加一个item_type字段区分0表示实物商品1表示服务项目。这样做的好处是前端购物车页面能统一展示不管你是加了瓶洗发水还是加了个染发套餐都在同一个列表里坏处是后端的订单创建逻辑要根据类型分支处理。订单表orders和订单明细表order_item是标准的一对多关系。每个订单有一个总金额字段明细表里记录每一项的快照信息——名称、单价、数量、小计。为什么订单明细里要冗余一份商品名称和单价而不是通过product_id实时去查商品表因为商品信息是可变的今天这个洗发水卖88明天可能做活动卖68但用户昨天下的单里这一项的金额就该是88。所以订单明细必须做快照这个理解很重要也是面试里常问的一个点。下单事务的控制是这个项目的另一个亮点。创建订单时同时要扣减商品库存、增加订单记录、清空对应的购物车条目。这三个操作必须在一个事务里完成否则会出现库存扣了但订单没有生成、或者订单生成了但购物车没清空这种脏数据。项目里用Transactional注解解决了这个问题但我在实操时还发现一个坑——如果是并发场景下扣库存光用Transactional是不够的还需要用UPDATE product SET stock stock - 1 WHERE id ? AND stock ?这种原子性SQL来防止超卖。不建议先查库存再判断再更新因为并发时第一次查到的库存可能是脏数据。2.4 用户与权限普通用户和管理员的分权用户权限这块项目使用了Spring Security JWT的方案这也是目前比较主流的做法。普通用户注册后默认是ROLE_USER角色可以浏览商品、下单、预约、管理个人信息。管理员是ROLE_ADMIN角色登录后进入后台管理界面。接口层面通过Spring Security的注解做控制PreAuthorize(hasRole(ADMIN)) GetMapping(/admin/orders) public ResultListOrderVO listAllOrders() { // 管理员才能调用的接口 }JWTJSON Web Token在这里的作用是解决无状态登录问题用户登录成功后后端签发一个带过期时间的token返回给前端前端每次请求在Header里带上Authorization: Bearer token后端过滤器会校验token的合法性并解析出当前用户信息。我在部署文档里看到项目配置了JWT的过期时间为2小时同时支持刷新机制。这个配置对毕设来说够用了。这里提醒一句JWT的密钥不要写在代码里硬编码要放到application.yml里部署时再通过环境变量覆盖。我看到有些同学的源码里把密钥写死了上线的时候也没改这是安全隐患。3. 实操过程从数据库初始化到项目启动3.1 环境准备JDK、Maven、MySQL动手部署之前先把环境准备好。这个项目的环境要求如下软件版本要求说明JDK1.8 或 11推荐1.8兼容性最好Maven3.6依赖管理工具MySQL5.7 或 8.0数据库Node.js14前端构建用前后端分离方案Nginx1.18前端静态资源托管和反向代理这里有个比较容易踩坑的点JDK版本和springboot版本的适配关系。如果你用的是springboot 2.7.xJDK 8到JDK 11都没问题但如果你建项目时选的是springboot 3.x那JDK 8就用不了了必须JDK 17以上。我遇到过不少同学把springboot版本拉到了3.x然后本地JDK还是1.8启动直接报错。排查了半天才发现是版本兼容性问题。所以如果你还在用JDK 8就老老实实选springboot 2.7.x别追新。3.2 数据库初始化sql脚本怎么执行项目源码里一般会带一个sql目录里面是数据库初始化脚本可能是mall.sql或beauty_hair.sql把这个脚本导入到MySQL里就能建库建表。导入之前先确认编码在MySQL命令行执行source命令或者用Navicat的运行SQL文件功能。执行完之后检查一下表的数量和名称确认是否包含我上面提到的核心表。如果发现有些表数据量特别大比如产品表里塞了几百条演示数据那大概率是项目自带的种子数据目的就是为了让你启动后页面不是空的方便演示。有一个细节我提醒一下如果你的MySQL是8.0版本而项目用的驱动是com.mysql.jdbc.Driver旧驱动启动时会报驱动类不存在的错误。8.0以上的驱动类名是com.mysql.cj.jdbc.Driver。如果遇到这个问题在pom.xml里把mysql-connector的版本升到8.x同时改一下数据库连接配置。3.3 后端启动修改配置文件和端口后端配置文件application.yml里最关键的几项是数据源配置spring: datasource: url: jdbc:mysql://localhost:3306/beauty_hair?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: 你的数据库密码 driver-class-name: com.mysql.cj.jdbc.Driver这里有个高频问题项目部署时数据库密码跟本地不一样但忘了改配置文件启动报Access denied for user rootlocalhost。解决办法很简单改成自己本地的密码就行。但要注意如果项目的application.yml里配置了多环境的文件比如application-dev.yml和application-prod.yml就要确认当前激活的是哪个环境spring: profiles: active: dev如果不指定默认加载的是application.yml主配置。部署文档里一般会明确说明改哪个文件照着改就行。启动方式也非常简单在项目根目录执行mvn spring-boot:run或者先打包再启动mvn clean package -DskipTests java -jar target/beauty-hair-xxx.jar启动成功后控制台会打印Started BeautyHairApplication in x.xxx seconds。如果你是前后端分离的项目此时后端接口服务已经在8080端口跑起来了可以先访问http://localhost:8080/swagger-ui.html如果配置了Swagger确认接口文档能打开。3.4 前端启动npm install到页面访问前端项目一般放在独立的目录比如frontend/或beauty-web/。切换到前端目录先安装依赖npm install安装过程可能会很慢依赖包太多时甚至要几分钟。如果你在公司或学校网络环境下安装失败可以切换npm镜像源npm config set registry https://registry.npmmirror.com依赖装好之后启动开发服务器npm run dev默认情况下Vue项目的开发服务器跑在http://localhost:8081或http://localhost:5173Vite。此时打开浏览器访问前端地址页面能出来但如果后端接口没配置好代理所有数据请求都会404。前后端联调时最常见的做法是在Vue项目的配置里设置devServer.proxy把/api路径代理到后端的http://localhost:8080上。这个配置在vue.config.jsVue CLI或vite.config.jsVite里。// vite.config.js 示例 server: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } }配置完成后重启前端dev服务再刷新页面数据就通了。3.5 生产部署JAR包加Nginx的经典组合如果只是本地演示dev模式跑起来就够了。但要交付项目或者把系统部署到服务器上就得走生产部署的流程。这套项目的部署方式很经典后端打JAR包运行前端构建后的静态文件由Nginx托管Nginx再反向代理API请求到后端。后端打包mvn clean package -DskipTests打包成功后在target目录下生成一个beauty-hair-1.0.0.jar具体名称取决于pom.xml里配置的finalName。把这个JAR包传到服务器上执行nohup java -jar beauty-hair-1.0.0.jar --server.port8080 app.log 21 nohup加的意思是让程序在后台运行日志输出到app.log文件里。这个命令非常常用建议背下来。前端构建npm run build构建完成后dist目录就是静态文件。把dist下的所有文件拷到Nginx的HTML目录比如/usr/share/nginx/html/beauty然后在Nginx配置里加一个server块server { listen 80; server_name your-domain.com; # 前端静态资源 location / { root /usr/share/nginx/html/beauty; index index.html; try_files $uri $uri/ /index.html; # 解决Vue路由刷新404 } # 后端API反向代理 location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }配置好之后重载Nginxnginx -s reload。启动后端、启动Nginx访问服务器IP或域名整个系统就跑起来了。注意try_files $uri $uri/ /index.html;这一行是为了解决Vue Router的history模式下刷新二级页面时出现404的问题。如果你部署的是hash模式的路由URL里有#符号不配这行也能跑但配置了更保险。4. 关键配置与常见坑排查4.1 端口被占用后端启动时报Port 8080 was already in use大概率是之前启动过项目但没关干净或者有其他程序占用了8080端口。排查方式在Windows下netstat -ano | findstr 8080命令行会输出占用端口的进程PID然后在任务管理器里找到对应PID的进程结束它。或者更简单粗暴一点改后端端口在启动时加参数java -jar app.jar --server.port8081改端口之后记得前端的代理配置和后端接口地址里的端口也要同步改。4.2 数据库连接不上这个问题的报错有好几种常见的包括Communications link failure、Access denied for user、Unknown database。Communications link failure通常是MySQL服务没启动或者端口不对默认3306。确认MySQL是否在运行。Access denied for user用户名或密码不对改配置文件里的username和password。Unknown database beauty_hair数据库还没创建回到SQL脚本那步先导入脚本。另外有一个隐藏坑如果你的MySQL是8.0版本连接配置里要加一个时区参数serverTimezoneAsia/Shanghai不然会报时区错误。项目自带的配置文件里一般已经处理好了这个问题怕就怕有人为了简化配置把这一行删掉了然后又踩坑。4.3 MyBatis的Mapper接口扫描不到项目里如果用的是MyBatis启动时报Invalid bound statement (not found)基本上是Mapper接口和Mapper XML文件没有正确对应。常见原因有两个。一是XML文件没放在正确位置。约定是Mapper接口在com.example.mapper包下XML文件放在resources/mapper目录下并且文件名要与接口名一致。检查一下application.yml里的MyBatis配置mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.entity二是Mapper接口没加Mapper注解或者启动类没加MapperScan(com.example.mapper)。Spring扫描不到Mapper接口自然就找不到对应的SQL语句。这个排查不难照着报错信息逐层往上找即可。4.4 前端跨域问题浏览器控制台出现Access to XMLHttpRequest at http://localhost:8080/api/xxx from origin http://localhost:8081 has been blocked by CORS policy这是典型的跨域报错。开发环境下的解决方式就是我在3.4里说的proxy配置。生产环境下因为请求经历了Nginx后端不需要关心从哪里来的请求只需要统一允许跨域即可。如果项目在后端做了跨域处理配置一个WebMvcConfigurer的跨域映射Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*); } }但注意如果走了Nginx反向代理且前后端同域名不需要在后端开跨域Nginx已经帮你解决了同源的问题。两个方案选一个用就好别重复配置有时候反而会出奇怪的问题。4.5 登录状态失效与token过期前端页面操作到一半突然弹出未登录或页面跳回登录页通常是token过期了。JWT的默认过期时间如果只有2小时项目演示时开了很久确实会遇到这个问题。调试时可以通过修改application.yml里的token过期时间配置把它调长一点。如果项目没有导出这个配置就得去代码里找token工具类看过期时间是不是写死的// 典型的JWT工具类配置 private static final long EXPIRE_TIME 2 * 60 * 60 * 1000; // 2小时有一种方式可以让演示过程更顺畅部署时把过期时间改成8小时或24小时反正毕设演示也就一两个小时不至于中途掉线。但如果是真正上线还是要用小过期时间加refresh token的机制。4.6 上传图片失败美发商城里商品图片、发型师头像、评价晒单都涉及文件上传。如果上传图片时报错首先要确认上传目录是否存在。很多项目会把文件保存路径配置在一个绝对路径下比如file: upload-path: /data/upload/这个目录在本地Windows下可能不存在需要手动创建或者改成一个已有的目录比如D:/upload/。另外还要注意Nginx配置里的静态资源映射——如果你上传了图片但页面上图片裂开大概率是Nginx没有把上传目录映射出来。可以在Nginx配置中加一段location /upload/ { alias /data/upload/; }这样前端访问http://your-domain.com/upload/xxx.jpg时就能正确读取到服务器上的图片文件。5. 项目讲解与二次开发建议5.1 答辩或演示时重点讲什么如果你是拿这个项目做毕设答辩我给你梳理一下讲解的主线思路。不要一上来就抠细节而是按业务背景 → 系统模块 → 核心流程 → 技术亮点这条线讲。业务背景一句话带过就行美发行业在O2O线上到线下模式下需要一个集服务展示、在线预约、商品购买于一体的平台。然后画功能结构图这个可以用PPT画说明系统分前台和后台前台面向用户后台面向运营。核心流程建议挑两个最出彩的讲。第一个是预约流程用户选择发型师 → 选择服务项目 → 选择时间段 → 后端校验冲突 → 生成预约 → 发型师确认 → 到店核销。这个过程体现了你对行业业务的理解也涉及并发和事务处理。第二个是下单流程加入购物车 → 确认订单 → 支付模拟 → 扣减库存 → 更新订单状态。这个过程可以展开讲事务、讲数据一致性。技术亮点方面可以突出这几个关键词springboot自动配置、Spring Security安全控制、MyBatis的SQL优化、JWT无状态认证、前后端分离架构、Nginx部署方案。每一个都可以展开两三分钟但注意控制时间不要超时。5.2 如何在这个基础上做功能扩展做完基础功能之后如果你想在项目中加入一些差异化能力给简历加分我建议在下面几个方向里选一个一是引入Redis做缓存和分布式会话。比如把首页轮播图、热销商品这些不常更新的数据缓存到Redis里减轻数据库压力或者把登录token存储到Redis里实现主动注销。这个方向能体现你对性能的思考。二是引入消息队列。比如下单后发送短信通知、预约成功后推送提醒可以用Spring Boot整合ActiveMQ或RabbitMQ。这个方向能体现你对系统解耦合的理解。三是数据分析可视化。比如统计各个发型师的预约量、每个服务项目的销量排行、用户消费金额分布用ECharts画出图表展示在后台控制台上。这个方向视觉效果好演示时非常加分。四是接入微信支付或支付宝沙箱环境。虽然只是沙箱开发测试环境但能真实跑通支付回调的整个流程在简历上写对接过第三方支付是一个实打实的亮点。5.3 我踩过的一些坑实操记录最后分享几个我在实际调试这套系统时遇到的比较隐蔽的问题都属于不遇到想不到遇到了查半天的类型。第一个是时间格式的坑。预约时间如果前端传的是字符串2025-07-18 14:30:00后端用LocalDateTime接收默认是可以自动转换的。但如果前端把时间和日期分成了两个字段后端解析就会出问题。我当时查了好久最后发现是前端传参的字段名和后端实体的JsonFormat注解没对上。建议在传输层统一约定好日期格式使用JsonFormat(pattern yyyy-MM-dd HH:mm:ss)规范接收。第二个是MyBatis-Plus的自动填充。如果项目里引入了MyBatis-Plus并且用了TableField(fill FieldFill.INSERT)来自动填充创建时间、更新时间需要注意自己在数据库中直接插入数据或者用批量导入工具导数据时不会触发自动填充那些字段会是NULL。我当时是从SQL脚本导了一批测试数据进去列表页时间列全空一度以为是SQL脚本的问题。第三个是前端依赖版本混乱的问题。前后端分离项目前端用什么版本决定了构建时会不会报错。比如Node.js 17以上版本跑旧版Vue CLI项目经常会报Error: error:0308010C:digital envelope routines::unsupported这个错。解决办法是在package.json里把构建命令改成{ scripts: { dev: set NODE_OPTIONS--openssl-legacy-provider vue-cli-service serve, build: set NODE_OPTIONS--openssl-legacy-provider vue-cli-service build } }或者降级Node.js到16版本。这个问题不是项目本身的bug是环境兼容的问题但在谁机器上跑就卡在谁那里非常浪费时间。第四个是日志中莫名其妙出现中文乱码。Windows下部署Java项目控制台或日志文件里中文经常变成???. 这其实是编码问题。启动时指定文件编码java -Dfile.encodingutf-8 -jar app.jar或者在IDE里配置运行时VM参数为-Dfile.encodingutf-8。数据库连接串里也要确保带了characterEncodingutf8不然从前端到数据库任何一环编码不对中文都是乱的。5.4 部署文档的正确打开方式项目配套的部署文档别当成摆设也别等项目跑不起来了才翻它。我建议按这个顺序看先看法环境要求部分确认版本匹配再看数据库初始化这个必须优先做然后是后端启动说明注意有没有特殊参数最后才是前端构建和Nginx配置。整个流程走一遍系统就能跑起来了。如果部署文档里出现了和源码不一致的地方以源码为准。比如文档里写端口是8080但application.yml里配置的是8081那就是文档更新没跟上代码。这种时候多看几个配置文件把环境里的实际值摸清楚再往下走。说实话拿一个springboot项目做课程设计或毕设重要的不是功能堆得有多花哨而是核心功能跑得通、关键的几个原理讲得清、部署步骤能复现。这套美发商城系统的价值就在于它涵盖了电商系统的主线业务又带上了预约这种行业化的特色功能拆解清楚之后你会对这个领域的开发思路有一个比较整体的认识。如果你正在做类似的选题照着这套思路去梳理自己的项目相信会比盲目抄代码强得多。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。