ARTICLE DETAIL

资讯详情

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

基于SpringBoot+Vue的苗木交易互助网站毕设核心设计

基于SpringBoot+Vue的苗木交易互助网站毕设核心设计 1. 苗木交易互助网站这个毕设选题到底在做什么每年到毕设季Java方向的学生扎堆做电商系统餐厅点餐、二手交易、服装商城这类题已经被做烂了。苗木交易互助网站这个题能拿出来说是因为它把电商交易和社区互助拧在了一起既不是纯粹的商城也不是单纯的论坛而是两条业务线并行——苗农可以开店卖苗木买家可以按品种、规格筛选下单同时网站提供求购信息发布、种植经验交流的互助板块。这个组合在毕业设计里很有优势功能覆盖面够宽涉及的技术点足够撑起一篇完整的论文而且业务逻辑比普通商城多了一层社区属性答辩时不容易被问倒。先把这个系统的核心角色说清楚。整个平台包含三类用户苗木采购商个人买家或工程采购方、苗农/供应商发布商品、处理订单、平台管理员审核商品、管理用户、处理举报。围绕这三类角色系统要解决的核心问题是苗木作为一种非标品同品种不同规格价格差异巨大而且必须看实物图判断品相如何让买卖双方高效撮合同时通过互助社区沉淀种植技术、求购信息降低交易决策成本。实际操作中这个项目的业务功能可以拆成四条线商品交易线苗木商品发布、多规格管理高度、米径、冠幅、购物车、订单生成、订单状态流转、收货评价互助社区线发帖提问、回复交流、求购信息发布、收藏点赞用户与权限线注册登录、个人中心、地址管理、供应商入驻申请、管理员后台运营支撑线商品分类管理、公告发布、数据统计交易量、活跃用户等我见过不少学生做这个题最后都做成了换皮商城——把商品图换成树苗其他逻辑和普通电商一模一样互助模块就是一个没人看的留言板。这种做法答辩时很吃亏因为评委一看就知道你没有真正理解这个业务场景。苗木交易里最核心的痛点是规格沟通成本和信任建立做这个系统时不把这两点落实到功能设计里项目就只是一个CRUD堆砌的壳子。2. 技术选型SpringBoot MyBatis-Plus Vue 3这套组合的底气和陷阱选型是每个做毕设的人第一道坎。Java方向首选SpringBoot是共识但SpringBoot版本太高这个坑几乎每年都有人踩——选了当前最新的3.2.x结果发现很多老教程里的代码跑不通因为Spring Boot 3.0开始强制要求Java 17javax包名全部换成了jakarta一些第三方组件的兼容性也没跟上。我给你的建议是做毕设老老实实选SpringBoot 2.7.x JDK 8/11理由有三点。第一网上能找到的资料和现成代码绝大部分基于这个版本遇到问题搜得到答案第二它和MyBatis-Plus、MySQL 5.7/8.0的配合已经非常稳定第三答辩时老师更关心你的业务逻辑和设计思路而不是你用了多新的框架版本。如果你的学校规定必须用较新的版本那就直接上SpringBoot 3.2.x JDK 17但所有依赖都要选兼容版本比如MyBatis-Plus要用3.5.5以上Knife4j接口文档要用4.x版本。完整的后端技术栈清单大概是这样的技术选型作用核心框架SpringBoot 2.7.14项目骨架与自动装配ORM框架MyBatis-Plus 3.5.3单表CRUD免写SQL分页插件数据库MySQL 8.0数据持久化权限认证Sa-Token 或 JWT 拦截器登录态管理与接口鉴权接口文档Knife4j 4.x生成Swagger文档方便自测文件存储本地磁盘存储或阿里云OSS商品图、帖子图上传前端Vue 3 Element Plus后台管理页面与前端构建构建工具Maven依赖管理与打包这里有一个很重要的思路MyBatis-Plus可以在项目启动时根据Java实体类自动生成建表SQL这是热词列表里提到的根据实体类生成创表SQL。它的底层原理是实体类上的注解TableName、TableId、TableField携带了表名、主键策略、字段映射信息MyBatis-Plus内置的自动建表能力会解析这些元数据拼装出CREATE TABLE语句并在应用启动时执行。常见的做法有两种一是配置文件开启相关能力框架自动检测实体并建表二是在项目里通过自定义初始化逻辑调用相关API生成SQL文件。对毕设来说我更推荐把建表SQL手写保存成sql/init.sql一方面方便答辩时展示数据库设计另一方面也避免自动建表在字段类型映射上某些细节不可控比如decimal精度、text类型长度、索引建立等。前端这块Vue 3生态已经相当成熟Element Plus组件库套一个后台管理界面是效率最高的方式。我建议前端用Vite作为开发构建工具因为它的热更新速度比Webpack快非常多改一行代码浏览器刷新几乎无感对调试体验的提升是巨大的。Vite 4 Vue 3 Element Plus这套组合网上模板很多你不需要从零搭拿一套现成的后台管理模板改就行——但我强调一句不要只拿模板改改就直接用你必须能讲清楚每个页面的数据流走向,这是答辩的加分项。3. 数据库设计苗木SKU和订单状态机是核心中的核心数据库设计是毕设评审的重点也是拉开差距的地方。苗木商品和普通电商商品最大的不同在于同一品种有多套规格维度买一棵桂花树得区分地径、高度、蓬径、土球大小而且不同植物的规格维度还不一样——乔木看胸径/米径灌木看冠幅、高度草坪按平方计价。设计时不能用一个固定的规格字段应付应该专门建一张product_spec规格表。我按实际开发经验给你整理一份核心表清单用户相关member用户表用户ID、手机号、密码、昵称、角色类型、头像、状态supplier_info供应商信息表审核状态、营业执照号、苗圃地址、简介member_address收货地址表收货人、电话、省市区、详细地址、默认标记商品相关product_category苗木分类表乔木、灌木、草本、藤本、盆景等支持多级分类product商品主表SKU公共信息标题、主图、详细描述、上架状态、审核状态product_spec规格表品种规格维度米径、高度、冠幅、土球直径、价格、库存交易相关cart购物车表用户ID、商品ID、规格ID、数量order订单主表订单号、用户ID、供应商ID、总金额、状态、收货信息快照order_item订单明细表商品快照标题、规格、单价、数量、图片refund_record退款记录表原因、金额、处理结果evaluation评价表评分、内容、图片、回复社区相关post帖子表标题、正文、图片、浏览数、点赞数、发布者IDpost_reply回复表楼层、内容、回复对象、点赞数purchase_demand求购信息表求购品种、预算、数量、联系人、截止时间message站内私信表发送者、接收者、内容、已读标记运营相关notice公告表标题、内容、发布时间、状态admin_log操作日志表管理员ID、操作类型、操作详情、IP、时间两张表重点说一下。order订单表里一定要有一个订单状态字段而且状态流转要设计严谨。我推荐用整型状态码0待付款、1待发货、2待收货、3已完成、4已取消、5退款中、6退款完成。每个状态之间的流转必须通过Service层的具体方法控制不能允许前端任意拼请求修改状态——这是答辩时老师最爱问的业务闭环问题。比如只有订单状态为1待发货时才允许供应商发货一旦状态变为2待收货系统需要自动往用户手机号发一条通知哪怕是模拟的。product_spec表则是苗木交易友好性的关键。开发和答辩时怎么体现对业务有思考就是这张表。每次下单时商品详情页会列出该品种所有可选的规格比如桂花米径5cm/8cm/10cm每个规格有独立的库存和价格用户选择规格后加入购物车订单明细记录的是规格快照而不是简单的商品ID。这样设计的好处是订单生成后即使供应商改了价格或删了规格历史订单依然能完整还原。关于自动生成SQL这个话题我再补充一个实际场景。MyBatis-Plus的根据实体类生成建表SQL方案本质上是通过TableInfoHelper读取实体类元数据把Java类型映射为MySQL类型。但这种映射有几个容易出问题的地方Java的String默认映射为VARCHAR(255)存长文本必须显式加TableField(typeHandler ...)或用Longtext类型的字段在实体里标注BigDecimal映射没问题但如果要做decimal(10,2)的精度控制有些版本映射出来是decimal(10,2)精确有些是decimal(19,2)带太多位虽然不影响功能但答辩时抠细节容易露怯。我的建议永远是实体类注解用来配合MyBatis-Plus做ORM而建表SQL手写并放在项目sql目录下给导师看数据库设计文档时也更正规。如果你确实想体验自动建表能力可以做一个初始化模式当配置项custom.init-dbtrue时自动执行sql/schema.sql初始化脚本再配合DataInitializer写入演示数据。这样既保证了可控性又能在答辩时展示项目内置自动初始化能力这个亮点。数据库设计的向下兼容还有个细节所有表都要带create_time、update_time字段MyBatis-Plus的FieldFill.INSERT和FieldFill.INSERT_UPDATE注解可以自动填充这个属于基本功了不赘述。重点提醒一下索引order表的supplier_id、member_id和order_no唯一索引product表的category_id和supplier_idpost表的member_id这五个索引务必加上。数据量小的时候感觉不到差距答辩演示时一旦有人往数据库里灌了几万条测试数据有没有索引的查询性能差异会直观呈现。4. 商城交易链路实现从商品上架到订单确认的完整思路这一段是整个系统的核心我把从供应商上架商品到买家最终收货的完整链路拆开讲每一环都对应明确的数据库操作和状态变更。4.1 商品上架与规格管理供应商登录后台后进入苗木管理点击新增商品需要填写的信息包括商品标题、分类从后台管理配置的多级分类里选、封面图支持本地上传服务器存到指定目录并返回访问URL、详情描述可用富文本编辑、以及一组规格项规格名称如米径、规格值如5cm、单价、库存、是否默认规格。这里有个交互细节前端做规格录入时应该是动态添加行的而不是固定几个输入框。Vue 3里可以用v-for渲染规格列表每次点击添加规格就往数组push一个空对象删除就splice。提交时把规格列表作为JSON数组传给后端后端在createProduct方法里用Transactional同时插入product表和product_spec表——这里一定记得加事务注解否则出现商品主信息有了但规格没插入的数据脏状态排查起来非常闹心。提示图片上传这块建议用本地存储方案在application.yml里配置file.upload-path上传接口接收MultipartFile后生成UUID文件名保存后返回/images/xxx.jpg这样的访问路径。如果你是前后端分离部署记得配一个静态资源映射把/images/**映射到磁盘目录否则图片加载不出来。4.2 购物车与下单操作购物车的标准实现就是一张cart表字段是用户ID、商品ID、规格ID、数量。这里有一个我自己当初踩过的坑同一用户、同一商品、同一规格重复加入购物车应该合并数量而不是新增两行。所以在addCart方法里要先查一下是否已有对应记录存在就执行UPDATE SET quantity quantity #{num}不存在才执行INSERT。从购物车生成订单是整个系统里最容易出并发问题的地方。假设两个买家同时在抢同一个供应商最后一批某种规格的苗木如果不加库存保护两个订单都可能扣减成功结果发货时发现库存不够这就是典型的超卖问题。毕设项目虽然不需要做到秒杀级别的并发处理但思路必须对。最朴素的方案是乐观锁——在product_spec表里加一个version字段扣库存时执行UPDATE product_spec SET stock stock - #{num}, version version 1 WHERE spec_id #{specId} AND stock #{num} AND version #{version}如果这个UPDATE影响行数为0说明库存不足或版本冲突下单失败并提示苗木规格库存已更新请刷新后重试。这种写法在MySQL单机上已经足够应付毕设演示而且答辩时你可以很自信地说考虑了并发安全用乐观锁避免了超卖问题。下单的核心流程我写成伪代码这个逻辑是论文里核心功能设计章节的素材Transactional(rollbackFor Exception.class) public OrderVO createOrder(OrderDTO dto) { // 1. 从dto中获取选中的购物车项列表前端传cartId集合 // 2. 遍历购物车项查询商品与规格校验上下架状态 // 3. 计算总金额注意用规格表中的实时价格不信任前端传入价 // 4. 调用乐观锁扣减库存每个明细项分别扣减 // 5. 生成订单主记录订单号用时间戳用户ID随机数状态0待付款 // 6. 插入订单明细记录冗余商品名称、图片、规格描述、单价快照 // 7. 删除对应购物车记录 // 8. 返回订单VO内含订单号和待支付金额 }4.3 模拟支付与订单状态流转毕设不需要对接真实支付做一个模拟支付页面即可用户在订单详情页点击确认支付弹窗显示支付金额点击确定后后端把订单状态从0改为1待发货。之所以单独做这一步是为了让整个交易链路在答辩演示时看起来更完整也方便你讲状态机设计。供应商端的订单管理页面按状态分Tab展示待发货、待收货、已完成等点击发货时弹窗填写物流公司和运单号后端更新订单状态为2待收货并在order表冗余一个shipping_time字段。买家端看到订单变为待收货后点击确认收货也可以做倒计时自动确认状态变为3已完成此时允许发起评价。整个状态流转里改状态的所有入口都必须校验当前状态是否合法比如状态已经是3已完成的订单就不能再调发货接口否则逻辑上就穿帮了。订单号生成也是一个经常被问到的细节。不要用数据库自增ID当订单号展示给用户会直接暴露平台日单量。我用的方式时间戳14位 用户ID后四位 三位随机数组成类似202503201012345678123的21位订单号代码实现是String orderNo new SimpleDateFormat(yyyyMMddHHmmss).format(new Date()) String.format(%04d, userId % 10000) String.format(%03d, new Random().nextInt(1000));这个方案虽然简单但答辩时有理有据——唯一性通过时间戳随机数保证安全性通过不暴露自增ID实现老师会觉得你想过这个问题。4.4 评价闭环订单完成后买家可以对这个订单里的商品逐项评价评分1-5星可以传图片。评价写入evaluation表同时更新product表里的综合评分avg_score字段和评价次数。商品详情页展示评分星星和评价列表——这个闭环一定要做完整因为它是互助与信任主题的支撑点。苗木交易中最值钱的就是口碑一个供应商评分高、买家秀多其他用户才会信任他的苗圃。做完评价系统后你可以再补一个逻辑评价列表按有图优先、评分从低到高优先排序低分评价置顶展示这种设计在答辩时说出来也是加分项——让差评前置反而能筛选出真正靠谱的供应商。5. 互助社区模块发帖、回复、求购信息的功能落地互助社区是这个项目区别于普通电商的差异化卖点但很多学生做这块时只是机械地做出发帖评论完全没有社区运营的概念。设计和实现上我建议把社区拆成经验交流帖和求购信息两类内容分别处理。5.1 帖子发布与列表发帖的字段很简单标题、正文支持SSE富文本或Markdown、图片最多9张、所属话题分类种植技术、病虫害防治、苗木行情、求购/出售等。为了防止XSS攻击前端提交的富文本内容在后端要过滤一遍script标签——这个安全细节一定要处理否则答辩时评委稍微专业一点就会指出漏洞。帖子列表页的分页查询可以用MyBatis-Plus的Page对象完成PagePostVO page new Page(current, size); LambdaQueryWrapperPost wrapper new LambdaQueryWrapper(); wrapper.eq(StringUtils.hasText(category), Post::getCategory, category); wrapper.orderByDesc(Post::getIsTop).orderByDesc(Post::getCreateTime);列表里需要展示帖子的标题、作者昵称和头像、封面图取第一张、浏览数、点赞数、回复数。browse_count、like_count这些统计字段别用count(*)实时查直接在post表里冗余字段操作时UPDATE post SET like_count like_count 1即可对毕设级别的并发量完全够用而且查询效率高。5.2 帖子详情与回复详情页是互动最密集的页面左侧帖子正文和图片下方是按楼层排列的回复列表。回复表设计时我加了一个parent_id字段支持二级回复回复某楼的评论这样当有人问桂花树冬季落叶正常吗时下面可以形成追问和答主再回复的对话链比只能回一楼要自然得多。另外点赞功能建议做成一人一赞控制。用一个post_like表记录谁给哪个帖子点了赞联合主键member_id,post_id点赞时先尝试插入插入成功则post.like_count like_count 1取消赞则相反。这个方案比用Redis做计数器更适合毕设——虽然Redis方案性能更好但用户维度唯一点赞这个数据要落库写进论文里逻辑更完整。5.3 求购信息苗木交易的另一只手求购信息purchase_demand表是这个项目的点睛之笔。需求很简单买家发布求购米径8cm的紫薇50棵预算3000江西境内可送货填写品种、规格要求、数量、预算、期望的交货时间、联系方式、备注发布后进入求购列表。供应商可以根据求购条件筛选找到匹配的求购单后可以在详情页点击我要应标填写报价和备注这条应标记录自动推送到发布者的站内消息列表里——这就是互助这个词的精髓平台不只是货架还是一个供需撮合的信息中转站。实现时应标表demand_bid记录求购单ID、供应商ID、报价、电话、备注、时间、联系电话、状态状态包括待确认已接受已拒绝。发布者进入我发布的求购页面可以看到每一条求购单下有多少人应标选择接受某一条应标后系统给对应供应商发送一条站内信并把这条求购单的状态改为已完成。这个撮合逻辑写好后是在论文的系统创新点部分非常好写的一笔你说它不是单纯的B2C商城而是一个C2B反向交易社区互助的混合模式这个概念一出来系统立意就提升了。5.4 站内消息通知机制为了配合上面这些业务动作接受应标、订单发货、回复提醒、审核结果还需要一张message站内信表。消息触发的时机包括帖子被别人回复时通知楼主求购单被应标时通知发布者求购单接受应标时通知应标供应商商品被管理员下架时通知供应商订单退款状态更新时通知买家实现上不需要做WebSocket实时推送最简单的方案是用户进入消息中心页时通过接口查询未读消息列表已读状态的只显示数量角标。表设计时加一个is_read字段未读消息数用SELECT COUNT(*) FROM message WHERE receiver_id ? AND is_read 0统计。如果你想让评论区回复的通知实时一点可以前端每30秒轮询一次——撑起演示完全没问题答辩时你可以说考虑了实时性需求用轮询方式实现如果要提升体验可以替换为WebSocket长连接这样既诚实又展示了扩展思路。6. 实战踩坑记录图片上传拦截、SpringBoot版本兼容、MyBatis-Plus字段映射问题做这个项目的过程中下面这几个坑几乎每个复现者都会遇到我挑最有代表性的写出来配套排查思路你在开发时可以少走弯路。6.1 图片上传404/被拦截前端上传图片后后端返回了访问路径但浏览器打开直接404。排查思路分三步走第一步先确认文件是否真的保存到了目标目录看磁盘上有没有文件第二步看返回的路径是否是http://localhost:8080/images/xxx.jpg这种格式第三步如果在SpringBoot里直接对外访问这个路径必须配置WebMvcConfigurer接口的addResourceHandlers方法否则SpringBoot默认不会把/images/**映射到本地磁盘目录。Configuration public class WebConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/images/**) .addResourceHandler(/images/**) .addResourceLocations(file: uploadPath /); } }这个配置漏掉的可能性极高尤其是前后端分离项目里前端项目通过Vite代理访问后端时/images路径可能没被代理到也需要在Vite的server.proxy配置里加上对应路径。很多学生排查半天最后发现是Vite没配代理。6.2 SpringBoot版本升级后的javax/jakarta问题如果你用了SpringBoot 3.xjavax.servlet、javax.annotation这些包已经迁移到jakarta.*命名空间了。网上很多老代码里写的是import javax.servlet.http.HttpServletRequest直接复制过来编译就报错因为JDK 17 Jakarta EE 9里没有这个包了。排查思路就是全局搜索javax替换成jakarta同时确保pom.xml里的依赖版本都是兼容SpringBoot 3.x的新版。这个坑其实很好判断只要你发现编译时报程序包javax.servlet不存在或者NoClassDefFoundError第一反应就查版本兼容。顺带说一个SpringBoot 3的连带问题像springfox-swagger2这样的老的接口文档库在SpringBoot 3下是用不了的必须换knife4j-openapi3-jakarta-spring-boot-starter这个库的OpenAPI 3风格和Swagger 2有差异注解也变了Api换成Tag你在配置接口文档时如果发现页面不显示分组多半就是这个原因。6.3 MyBatis-Plus实体类字段与SQL关键词冲突有一张表叫member字段里有一个order或者desc之类的名字数据库里这些词是SQL保留字执行查询时直接报语法错误。排查时错误信息会指向某条SQL语句提示syntax error at or near order。解决方案有三个一是给保留字字段加反引号不推荐每个查询都要手动注意二是用TableField(value order)注解强制转义三是直接换个字段名比如sort_no、content。对于毕设来说最简单靠谱的是一开始建表时就避开所有SQL保留字建表前花两分钟把字段名过一遍比后面改代码省事多了。6.4 事务不生效自调用导致Transactional失效这是Spring面试里考烂了的经典问题但在毕设里依然普遍存在。比如在一个Service类里createOrder()方法内部直接调用了同一个类的deductStock()方法deductStock()上标了Transactional但实际上这个事务不会生效因为Spring事务是基于AOP代理的类内部自调用绕过了代理对象注解形同虚设。排查办法很直观检查报错或日志里是否有Transaction相关输出如果没有就说明根本没走代理解决方案是事务注解加到createOrder()这个对外方法上或者把deductStock()挪到另一个Service类里用Autowired注入后调用。我在写这个项目时的一个体会是事务粒度宁大勿小。把整个下单流程校验→扣库存→插订单→插明细→删购物车放在一个Transactional方法里任何一个环节出错全部回滚数据就不会出现订单生成了但库存没扣这种状态不一致。毕设阶段不用过度设计把事务用对、用到位已经超过很多人了。6.5 富文本XSS过滤与全局异常处理这是最后补的两个工程化细节。帖子正文如果支持富文本直接入库那script标签就会原样存进数据库前端渲染时如果没有做转义——答案是Vue默认会转义但如果你用了v-html渲染恶意脚本就可以执行理论上。最稳妥的做法是后端加一个简单的过滤public String cleanHtml(String content) { return content.replaceAll(script.*?/script, ) .replaceAll(iframe.*?/iframe, ) // 再保留基本的p、img、strong等安全标签 ; }全局异常处理建议单独写一个RestControllerAdvice统一捕获BusinessException和Exception。这样返回给前端的格式永远是{code, message, data}你可以在code上区分成功200、业务错误400、未登录401、无权限403、服务器异常500。这个设计虽然基础但答辩环节老师很容易被统一异常处理吸引提问你可以顺理成章地展示对工程结构的思考。7. 论文结构、答辩演示与演示数据准备的实用建议大部分学校对毕设论文的结构要求都差不多但苗木交易这个题有它独特的论文展开方式。我建议论文的核心章节这样组织第三章需求分析里重点写苗木交易的实际痛点规格信息不对称、信任建立困难、两类用户角色细分采购商、供应商、功能性需求与非功能性需求并发扣库存、图片上传大小限制、数据安全第四章系统设计里重点写整体架构图前端Vue 3→后端SpringBoot→MySQL、功能模块划分、E-R图设计注意把product_spec和order_item两张表画清楚、数据库表结构说明第五章系统实现里重点写订单状态机的流转过程画状态流转表、商品规格管理的实现思路、社区互助功能的撮合流程、乐观锁防止超卖的代码片段第六章系统测试里重点写功能测试用例表每个模块至少2-3个用例、并发测试用JMeter模拟10个线程同时抢购一件商品、兼容性测试答辩演示之前一个特别容易被忽略的环节是演示数据的准备。很多学生为了演示临时在系统里录入数据效果很差。我的建议是写一个DataInitializer系统启动时自动往数据库插入一批仿真数据5-8个苗木分类乔木类香樟、桂花、银杏灌木类红叶石楠、金森女贞草坪/地被类果树类柑橘、枇杷每个分类下2-3个商品每个商品3-4个规格如香樟 - 米径10cm - ¥180、香樟 - 米径12cm - ¥260每个商品配1-2张真实可访问的图片去图床找真实苗木图别用卡通图2-3个用户一个普通买家、一个苗农供应商、一个管理员密码统一用123456若干条帖子数据里至少包含一条求购信息和一条高热度回复帖为什么强调图片要用真实苗木照片因为苗木交易的核心是看品相真实的图会让评委直观感知到你这个项目是真懂行业场景的。我见过有人用IDEA生成的全是灰色矩形占位图答辩演示时整个页面氛围感全无非常减分。关于SpringBoot和MyBatis-Plus这类技术栈是否写进创新点我的建议是不要。创新点应该围绕业务设计展开面向苗木品类非标品特性的多规格SKU设计C2B反向求购撮合与社区互助的双轮驱动模式基于乐观锁的库存并发控制方案。这三个点无论从业务价值还是技术含量上都站得住脚而且比使用了SpringBoot框架高了好几个档次。另外答辩之前把项目的部署环境准备好。演示用的电脑上启动前先确认端口没有冲突8080后端、5173前端MySQL服务已在运行并执行过初始化脚本。最好准备一个README.md写明项目启动步骤、默认账号密码、技术栈版本号这样不仅演示时方便评委翻阅项目时也觉得规范。如果你愿意把项目打个Docker镜像部署到云服务器上那演示效果会更稳答辩时也不怕现场断网——这一步加分效果非常明显值得提前两天就做。
返回列表