尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SSM + Vue灯饰商城毕设全解析:从数据库设计到前后端部署

SSM + Vue灯饰商城毕设全解析:从数据库设计到前后端部署 1. 项目概述与技术选型思路1.1 为什么是SSM Vue而不是Spring Boot Vue先交代背景。这个项目是2026届毕业设计选题题目叫“力高灯饰线上交易平台”技术栈限定为SSM Vue。很多同学看到SSM会觉得这是“老古董”毕竟现在企业里Spring Boot已经一统天下。但毕设选题用SSM恰恰是一个稳妥的选择SSMSpring SpringMVC MyBatis依然是高校软件工程、计算机科学专业教学体系中的核心框架组合导师熟悉、评分标准明确、参考资料多而且它的分层思想比Spring Boot更“裸”反而能体现你对框架本质的理解。我在带毕设的过程中反复跟学生说一句话Spring Boot是封装好的自动挡SSM是手动挡手动挡开明白了自动挡上手就是半天的事。再说为什么是灯饰交易平台。电商类系统是毕设的万年青选题但单纯做“通用商城”太容易撞车。加上“灯饰”这个垂直品类业务上就有了差异化灯具的SKU规格、款式、光源类型、功率、色温、多图展示灯光效果图、实景图、价格区间跨度大几十块的台灯到几千块的吊灯、可能涉及定制需求。这些都给数据库设计和前端交互提供了足够的发挥空间既不会简单到没东西可写也不会复杂到超出毕设工作量。力高灯饰作为虚拟品牌可以围绕它做品牌化的视觉设计论文里也有话可讲。1.2 系统的功能边界与核心模块划分先别急着写代码拿到题目第一步是圈定功能边界。毕设不是商业项目不需要做全链路电商但必须形成闭环用户能注册登录、能看商品、能加购物车、能下单、能支付模拟、能查订单管理员能管理商品、处理订单、看统计报表。我最终规划了六个核心模块用户模块、商品模块、购物车模块、订单模块、支付模块模拟接口、后台管理模块。这里有一个很重要的取舍经验不要贪功能。有的同学喜欢加秒杀、优惠券、积分系统、消息推送结果代码没写完论文先崩了。毕设的核心是“完整性 逻辑自洽”把基础闭环做到位比堆砌十个半成品功能强得多。我给你算一笔账一个秒杀功能至少涉及库存扣减策略、并发控制、限流、活动配置管理这些足够写一篇独立论文了塞进电商项目里只会让答辩时被问得满头包。所以我把购物车设计成基于后端Session的存储方案订单状态机严格定义为“待支付→已支付→已发货→已完成/已取消”支付环节对接支付宝沙箱环境或者干脆做一个模拟支付页面业务逻辑清楚代码量适中论文也好写。1.3 为什么这个项目值得复现如果你现在正在纠结毕设选题或者已经选了类似方向但不知道怎么下手这篇文章会把从零搭建到答辩的全过程拆开讲。里面涉及的不只是SSM和Vue的增删改查还包括数据库表设计时的字段反范式取舍、MyBatis动态SQL在复杂查询中的实战用法、Vue路由和组件的工程化组织方式、前后端联调时异步接口的约定与排错方法、以及写论文时怎么把项目过程转化成图文并茂的文字。这些内容在课堂上学得散网上搜得杂我把它们按项目推进的顺序重新串了一遍。即使你不做灯饰换成图书、二手闲置、生鲜任何垂直品类思路完全通用。2. 项目整体设计与核心架构拆解2.1 数据库设计的四个关键决策先亮相整个系统的心脏——数据库。灯饰交易平台的数据库我设计了八张核心表用户表t_user、分类表t_category、商品表t_product、商品图片表t_product_image、购物车表t_cart_item、订单表t_order、订单明细表t_order_item、地址表t_address。这套结构是电商系统的标准范式但它落地时有几个决策点特别值得说道说道。第一个决策是商品表和图片表分开设计。为什么不分在一张表里用逗号存多个图片URL因为灯具必须多图展示少则三张多则八张主图、细节图、效果图、规格图如果都塞进商品表字段冗余严重而且后面如果要做图片的增删改查会非常痛苦。拆成独立表之后每次查询商品列表只需要LEFT JOIN一次或者单独查一次图片表再按商品ID分组组装性能反而更好。这个设计在论文里也要重点写——一对多的关联关系评阅老师看到这种正规的建模思维会加分。第二个决策是订单表和订单明细表的主从结构。一个订单对应多个商品所以订单表只存订单号、用户ID、总金额、状态、收货信息快照、创建时间真正买的东西全在订单明细表里每条明细关联订单ID和商品ID同时冗余记录商品名称、单价、数量、小图。这里有个电商设计的经典原则要记住商品信息是易变的下架、改价、改名所以下单时必须把当时的商品信息快照进订单明细否则将来商家改了价格订单历史里的价格也会跟着变这在电商业务里是大忌。很多新手会直接关联商品表查明细我见过不止一个同学因为这个在评审时被问住。第三个决策是购物车表要不要单独建。如果购物车只是临时存储放Session或Redis都行但毕设为了展示完整的数据库设计能力我还是建了表同时给了一个关键字段加购时间。后面做统计和清理过期购物车数据都用得上这些细节是加分项。第四个决策是地址表独立建表而不是塞字符串。灯具这种大件商品涉及运费计算收货地址的结构化存储便于后面做运费模板和区域配送配置同时也展示了你对数据库第三范式的理解。2.2 后端三层架构Controller、Service、Mapper的分工与协作SSM项目最标准的架构是Controller表现层→ Service业务层→ Mapper数据访问层实体类Entity贯穿三层DTO/VO在需要时用于数据封装。这套分层在毕设里既要做出来更要说清楚“为什么”。Controller层的职责只有一个接收请求、解析参数、调用Service、封装响应。我习惯的做法是统一返回一个自定义的Result对象格式长这样public class Result { private Integer code; // 200成功500失败 private String msg; // 提示信息 private Object data; // 业务数据 }所有接口都返回这个结构前端axios就能统一拦截处理登录过期和业务错误不用每个页面单独写异常逻辑。这里注意一个反模式有些同学喜欢让Controller直接调用Mapper图省事结果Service层形同虚设。答辩时导师问“你这个订单创建的事务在哪里控制的”你只能说“没有事务控制”这就尴尬了。Service层是整个系统的业务核心也最能体现你的代码水平。比如创建订单这个方法内部至少要做四件事校验购物车数据和库存、生成订单号我采用的是时间戳加用户ID加随机数避免并发冲突、批量插入订单明细、扣减库存并清空购物车。这四步必须放在同一个事务里用Spring的Transactional注解声明式管理事务。这类关键业务方法就是论文里的核心亮点写清楚“为什么事务要加在这一层”比堆一百行代码都管用。Mapper层是数据持久化的桥头堡。MyBatis的Mapper接口和XML文件要严格对应我习惯把复杂的多条件查询写XML动态SQL单表的简单增删改查就用注解避免XML文件过长难维护。举一个典型的例子后台商品列表要支持按名称模糊查、按分类筛选、按状态筛选、按价格区间筛选还要分页这样SQL写起来很啰嗦用MyBatis的动态SQL就清爽很多。2.3 前端工程化的组织方式Vue项目的目录与状态管理Vue端我用的是Vue 2.6加Element UI的经典组合。为什么不直接上Vue 3加Vite加TypeScript两个原因SSM项目的前端包进去要跟后端保持兼容性Element UI在Vue 2生态里最稳而且网上大量SSM Vue的踩坑记录都是基于Vue 2的遇到问题能查到答案比什么都重要。如果导师允许你也可以直接上Vue 3Element Plus但需要明确一个区别Element Plus是Element UI的Vue 3版本组件用法大体一致但Babel和打包工具的配置方式完全不同。既然毕设求稳第一我这篇文章基于Vue 2来展开。前端目录我这样组织src/ ├── api/ # 所有请求接口定义按模块拆文件 ├── assets/ # 静态资源 ├── components/ # 公共组件 ├── router/ # 路由配置文件 ├── store/ # Vuex状态管理 ├── utils/ # 工具函数如axios封装、日期格式化 ├── views/ # 页面组件 │ ├── admin/ # 后台管理页面 │ └── front/ # 商城前台页面这个组织方式的意义在于逻辑内聚。api目录把每一个后端接口对应一个JavaScript函数比如getProductList(params)就是调用后端商品列表接口页面组件只需要import这个函数不需要关心接口URL和参数拼装细节。store里我管理的是一个关键状态用户登录信息以及购物车商品数量。这两个数据在多个页面都会用导航栏要显示用户名、购物车图标要显示数量用Vuex集中管理就不需要每次跳转路由时重新请求。3. 后端SSM核心实现与实操要点3.1 Maven工程结构与配置文件的三层分离创建一个SSM项目我推荐直接用Maven的webapp骨架然后手动补齐目录。工程结构如下src/main/java/com/ligao/ ├── controller/ # 控制器 ├── service/ # 业务接口 ├── service/impl/ # 业务实现 ├── mapper/ # MyBatis的Mapper接口 ├── entity/ # 实体类 ├── dto/ # 数据传输对象 └── common/ # 通用类Result、常量、异常处理 src/main/resources/ ├── spring/ # Spring核心配置 │ ├── spring-dao.xml # 数据源、MyBatis配置一个典型的扫库连接池配置就在这 │ ├── spring-service.xml # Service层配置 │ └── spring-mvc.xml # SpringMVC配置 ├── mappers/ # MyBatis的XML映射文件 ├── mybatis-config.xml # MyBatis全局配置 └── jdbc.properties # 数据库连接信息配置文件拆三个xml是SSM经典做法分别对应DAO层、Service层、表现层它体现的是Spring按层管理Bean的思想论文截图时也更清晰。三个配置文件的核心要素分别是spring-dao.xml要配数据源我用的是Druid连接池可以监控SQL执行情况、SqlSessionFactoryBean绑定mybatis-config和mapper扫描路径、MapperScannerConfigurer自动扫描Mapper接口。spring-service.xml要开启注解扫描扫到Service实现类、配置事务管理器并开启注解事务。spring-mvc.xml要开启注解驱动、扫描Controller、配置视图解析器、放行静态资源重点是把前端打包后的静态资源和上传的图片放行不然会被拦截器截掉返回404这一步容易踩坑。3.2 业务接口的规范设计与关键代码实现这部分是核心代码我挑三个最有代表性的接口来解构。第一个是用户登录接口。登录校验逻辑不复杂但有几个要处理的细节密码不能明文存储用MD5加盐的方式加密自定义盐值拼接密码后MD5避免撞库风险用户状态要校验账号被管理员禁用后登录时直接返回错误提示登录成功后把用户对象存入Session后端通过Session判断登录状态。实际代码在Controller里大约长这样PostMapping(/login) public Result login(String username, String password, HttpSession session) { String md5Pwd MD5Util.md5(password salt); User user userService.login(username, md5Pwd); if (user null) { return Result.error(用户名或密码错误); } if (user.getStatus() 0) { return Result.error(该账号已被禁用请联系管理员); } session.setAttribute(currentUser, user); return Result.success(user); }这里还有个容易被忽略的细节前端传递参数之前也要先做一次非空校验同时后端要做重复校验一个参数校验加一个状态校验加一次密码加密。这种前置校验逻辑是后面答辩爱问的点安全性检查的层级。第二个是商品列表的分页查询接口。这是整个项目里被访问最多的接口也是动态SQL的最佳展示场合。前端传入current页码、pageSize每页条数、keyword名称关键字、categoryId分类、minPrice和maxPrice价格区间六个参数后端用PageHelper插件或者手写LIMIT分页。我在Mapper XML里写的动态SQL是select idselectByCondition resultTypecom.ligao.entity.Product parameterTypemap SELECT * FROM t_product where if testkeyword ! null and keyword ! AND product_name LIKE CONCAT(%, #{keyword}, %) /if if testcategoryId ! null AND category_id #{categoryId} /if if testminPrice ! null AND price gt; #{minPrice} /if if testmaxPrice ! null AND price lt; #{maxPrice} /if AND status 1 /where ORDER BY create_time DESC LIMIT #{offset}, #{pageSize} /select注意两点 里判空的逻辑要写得严谨 标签会自动去掉第一个多余的AND价格字段用的是转义后的和XML文件里直接写大于号小于号会报错这种小坑我见过不止一个人踩。第三个是创建订单接口。我前面说了它是事务的典型场景这里把完整的伪代码流程写出来你在论文里可以照这个思路画时序图Override Transactional(rollbackFor Exception.class) public Long createOrder(OrderDTO orderDTO) { // 1. 查询购物车选中项从Redis或数据库校验是否为空 // 2. 计算订单总额遍历明细逐个检查库存是否充足 // 如果库存不足直接抛异常事务回滚购物车数据不被动 // 3. 生成订单号yyyyMMddHHmmss 4位随机数 // 4. 插入订单主表状态设为待支付同时保存收货地址快照 // 5. 循环插入订单明细表每条带上商品名、单价、数量、小图URL // 6. 批量扣减商品库存使用乐观锁 UPDATE ... WHERE stock #{qty} // 7. 清空购物车对应商品 return orderId; }我特别想强调一下库存扣减的写法。用UPDATE t_product SET stock stock - #{qty} WHERE id #{productId} AND stock #{qty}这种条件更新数据库本身会锁行如果库存不足这条SQL影响行数为0业务层判断影响行数就知道失败了。这是最简单可靠的不超卖实现方式比先查库存再更新的方式安全得多那个方案连你自己写单元测试时都能测出并发问题在论文里写一句“基于乐观锁的库存扣减方案”也会显得你懂并发控制。3.3 权限拦截与后台管理的实现方案电商系统天然分两种角色普通用户和管理员。我在设计时用了一个固定的字段role来区分比如用户表里role字段1是普通用户2是管理员然后在登录时把角色信息也放进Session。权限控制的核心是一个SpringMVC拦截器HandlerInterceptor。这个拦截器做两件事第一校验登录状态如果Session里没有用户直接重定向到登录页并返回错误提示第二校验角色后台相关请求url前缀为/admin必须要求role等于管理员角色。拦截器配置的时候要用excludePathPatterns放行登录页、注册接口、商品浏览等公开接口避免用户没登录连商品都看不了。后台管理的核心功能是商品管理和订单管理其实质是一组CRUD。商品管理需要做到增删改查加图片上传、上下架切换订单管理需要做到列表查询、按状态筛选、点击发货更新订单状态。这些功能在技术上难度不大真正的分水岭在细节修改商品时图片怎么处理删除旧图上传新图、分类变化时商品数据要不要级联更新、订单查询的多条件组合。把这些记进你的开发日志里写论文时每个都是一个能写三四百字的小节点。4. 前端Vue实现与前后端接口联调4.1 Vue Router的路由组织与导航守卫前端第一个要搭起来的是路由。Vue Router在商城项目里的用法分两块前台页面用清晰的路由层级后台管理用嵌套路由配合侧边栏菜单。前台的路径设计我按照语义化命名const routes [ { path: /, component: Home, meta: { title: 首页 } }, { path: /product/list, component: ProductList, meta: { title: 商品列表 } }, { path: /product/detail/:id, component: ProductDetail, meta: { title: 商品详情 } }, { path: /cart, component: Cart, meta: { title: 购物车, requiresAuth: true } }, { path: /order/confirm, component: OrderConfirm, meta: { title: 确认订单, requiresAuth: true } }, { path: /order/list, component: OrderList, meta: { title: 我的订单, requiresAuth: true } }, { path: /login, component: Login, meta: { title: 登录 } }, { path: /register, component: Register, meta: { title: 注册 } }, ]这里有几个使用心得。路由的meta字段里放页面的title结合全局路由守卫一次性把页面标题全部管理起来比每个页面mounted里单独写document.title优雅得多。requiresAuth这个标记配合全局前置守卫实现登录校验如果用户未登录就不允许进入购物车和订单相关页面直接重定向到登录页并且带上当前路由地址作为回跳参数登录成功后原路返回。这个小交互非常提升体验答辩演示时也是一个亮点。后台管理页面用的是路由嵌套的思路AdminLayout是一个包含侧边栏和顶栏的布局组件子路由渲染在它的内容区域里。这样每个管理功能只需要写自己的页面组件不用重复画布局。4.2 Axios统一封装与接口联调的细节前后端交互是毕设项目里坑最多的环节之一绝大部分问题出在接口约定不统一。我开发的时候定义了一个接口规范文档核心内容就三条所有接口返回统一的Result结构所有参数用JSON格式传递所有分页接口统一传current和pageSize返回{ total, records }结构。前端axios的封装我做了两层。第一层是创建实例并设置baseURL为/api这样开发和打包部署到Tomcat时不需要改前端代码在生产环境用Nginx做反向代理就能解决跨域。第二层是拦截器请求拦截器在每次请求时从Vuex取到token或确认Session携带再附加到请求头响应拦截器统一处理业务异常比如返回code为500时用Element UI的Message组件弹出后台的提示信息。service.interceptors.request.use(config { const user store.state.user.userInfo if (user) { config.headers[Authorization] user.token } return config }) service.interceptors.response.use(res { if (res.data.code 200) { return res.data } else { Message.error(res.data.msg) return Promise.reject(new Error(res.data.msg)) } })联调时最容易出的问题是接口URL对不上我推荐一个规矩后端Controller类上统一写RequestMapping(/api/product)这种前缀前端api/product.js里全部的路径都以这个前缀开头两边对着接口文档逐条核对。另外Vue 2项目里所有的跨域配置在开发环境下用vue.config.js的proxy选项生产环境用Nginx的location /api { proxy_pass ... }这个配好之后前后端接口路径就完全一致不用再写localhost:8080的绝对地址。4.3 核心交互组件的实现与性能优化商城前端有几个核心交互组件值得展开讲讲因为它们对用户体验的影响最大同时也是答辩演示时的视觉亮点。第一个是商品搜索筛选区。商品列表页左上有分类树上有价格区间滑块我用Element UI的Slider组件、搜索框以及排序方式综合、销量、价格升序降序。当用户切换任何一个筛选条件页面都会重新请求接口。这里的关键是防抖处理关键字输入用lodash的debounce延迟300毫秒避免每敲一个字就发一次请求把服务器打爆URL参数同步给路由query这样用户点击浏览器后退/前进也能还原筛选状态这是很多商城项目没有注意到的细节。第二个是购物车的数量步进器。减少到1以下要禁用减号按钮超过库存要限制到库存上限输入非数字要自动纠错。这里我用了一个watch监听当前条目数量变化同步计算商品小计和购物车总计可以用Vuex的getter来实现计算结果购物车数量在导航栏上的实时更新也能共享同一份状态。第三个是图片的懒加载与放大效果。灯具商品非常吃图一个商品详情页至少五张图片如果用原生img标签一次全加载页面会非常卡。我在图片组件里做了一个基于IntersectionObserver的懒加载进入视口才开始加载真实图片地址同时给图片一个占位高度避免页面跳动。商品详情页的主图我写了一个拖动放大镜效果鼠标移动时在图片右下角显示局部放大区域。这个交互代码不算复杂但展示效果很炫在答辩演示时常常能拿到高评价。第四个是订单流程的可视化。确认订单页用Steps步骤条展示“提交订单→支付→发货→确认收货→完成”的状态流转订单列表页可以根据状态选项卡全部、待付款、待发货、待收货、已完成切换查询。前端这里要做的事情其实只是依据订单状态字段渲染对应的UI和按钮去支付、确认收货但状态机设计对不对直接影响代码量。5. 常用操作与避坑指南开发与部署实战5.1 开发环境搭建与常见启动问题这个项目的开发环境我梳理过好几轮最省心的版本是JDK 1.8、Maven 3.6、Tomcat 8.5/9、MySQL 5.7、Node 14、VS Code或IDEA。为什么强调这个组合SSM项目历史上踩过的坑多半出在版本不兼容上JDK 8配Tomcat 9是稳妥的MySQL 5.7对JSON数据类型的支持也刚好够用。Node版本如果太高比如18以上老项目依赖安装编译时容易报OpenSSL错误这时候装个nvm切换Node版本是最快的解药。启动流程上我习惯这样走先启动MySQL并导入数据库脚本确认jdbc.properties里的用户名密码正确再启动Redis如果购物车用了Redis方案的话然后用Maven的tomcat7-maven-plugin或直接在IDEA里配置Tomcat启动后端最后npm install安装前端依赖npm run serve启动前端开发服务器。后端启动报错最多的三类端口被占用改Tomcat端口或者关掉别的进程、数据库连接失败重查账号密码和库名、MyBatis的mapper绑定异常多半是XML里的命名空间写错或者接口方法名和XML里的id对不上。这些排查经验我会再整理一张对照表放在文末。5.2 图片上传与静态资源处理的完整方案灯饰商城最核心的富文本功能就是图片上传。图片上传这个功能看起来简单实际坑非常多我重点讲一下安全可靠的做法。后端接收文件需要配置SpringMVC的文件上传解析器bean idmultipartResolver classorg.springframework.web.multipart.commons.CommonsMultipartResolver property namedefaultEncoding valueUTF-8/ property namemaxUploadSize value5242880/ /bean然后在Controller里用MultipartFile接收前端上传的FormData。服务端要做的事包括校验文件类型只允许jpg、png、jpeg、gif、webp防止上传脚本文件攻击、校验文件大小限制在5MB内过大图片影响页面加载、生成唯一文件名UUID加时间戳避免中文文件名乱码、保存到磁盘指定目录用相对路径存数据库绝对路径只用于文件写入。存储路径的选择很关键如果后端是Tomcat部署且前后端同一个应用我会把图片存到Tomcat根目录之外的upload文件夹然后在spring-mvc.xml里映射成虚拟路径来访问这样重启应用不会被清掉图片也不容易被误删。前端上传组件我用的是Element UI的Upload关键在于自定义上传方法而不是用它默认的action属性因为默认的action是一串固定URL无法动态添加请求头。我用的是这个思路el-upload :http-requesthandleUpload :show-file-listfalse acceptimage/jpeg,image/png,image/webp /el-uploadhandleUpload里处理FormData的组装再交给axios这样一个组件既可上传商品图片也可上传用户头像复用性很好。5.3 Vue项目打包部署到Spring Boot/Tomcat的完整流程项目开发完了最终要交付一个可以运行的完整系统。前端项目打包部署和源码交付是两个环节打包部署我用的是比较稳妥的方式在前端项目的vue.config.js里把publicPath设为相对路径避免部署到二级路径时资源404然后执行npm run build生成dist目录。这步最容易出错的是绝对路径导致资源加载失败记住publicPath: ./这个配置通常能救你一命。接下来有两个部署方案。方案一是把dist里的静态资源手动放到Tomcat的webapps/ROOT目录下后端接口访问路径保持一致这样访问http://localhost:8080就是商城首页。但这样做有个痛点是前端和后端工程分离也不利于论文里展示“单应用部署”。所以我更推荐方案二把dist目录整体复制到SSM项目的webapp下然后把前端作为欢迎页交给SpringMVC处理。具体做法是把dist里的文件复制到webapp/、改名为index.jsp或者配置一个view-controller让它直接渲染dist下的index.html再在spring-mvc.xml中配置放行静态资源。这样做的一个前提是Vue Router要使用history模式还是hash模式要提前想清楚如果直接用history模式后端必须配置URL重写兜底转发到index.html如果省事就用hash模式URL里带#号样式但部署零配置。打包部署时的资源路径和接口路径我是这样对齐的接口前缀统一是/api静态图片资源统一是/uploadPageController只需要专门处理这两个前缀之外的路径让它转到首页即可。这样前端路由的刷新问题也一并解决了我在论文里专门把这个方案写成一个小节标题就叫“前端构建资源与SpringMVC的集成方案”。6. 常见问题与排错经验速查表开发过程中踩坑是必然的我挑出十个高频问题按照“症状、原因、解决”三段式整理成了速查表。这些问题要么是你在开发时一定会遇到的要么是答辩时导师大概率会问的。症状根本原因解决方案启动报404或访问不了页面Tomcat部署路径不对或静态资源被拦截检查web.xml中servlet-mapping的url-pattern是否是/用spring-mvc.xml放行静态资源中文乱码前后端编码不统一统一UTF-8MySQL连接URL加characterEncodingutf8参数Tomcat server.xml配置URIEncoding登录后刷新页面状态丢失Session信息没有持久化或前端页面刷新重新执行了逻辑确认登录后重定向而不是直接跳转前端从SessionStorage或后端接口恢复登录态图片上传403/404图片目录没有写权限或映射路径没配给上传目录加写入权限在DispatcherServlet中配置静态资源映射分页数据不准PageHelper分页插件使用顺序不对确认启动PageHelper后查询语句紧跟startPage方法且最后一条SQL才是分页SQLMapper方法报绑定错误Mapper接口与XML文件不匹配检查namespace是否等于接口全限定名方法名是否与xml的id一致参数类型是否一致前端接口跨域报错开发环境端口不一致且没有代理在vue.config.js配置devServer.proxy把/api代理到后端地址Element UI样式不生效组件库未正确全局引入或版本冲突在main.js中完整引入Element UI并调用Vue.use(ElementUI)打包后图片路径404publicPath配置错误或图片存的是绝对路径查看打包后的index.html里资源路径调整publicPath为相对路径商品详情页刷新404Vue Router history模式与后端未配合改用hash模式或者后端配置统一转发到index.html这个表里的每一个条目都来自真实开发场景。有几个我想特别展开说说排查思路。第一个是中文乱码。这个问题排查起来最烦因为它的源头可能出现在四层数据库表字段编码、JDBC连接串编码、后端请求响应编码、前端页面编码。我的排查顺序是从底向上先看MySQL客户端里直接查询中文是否正常如果正常说明表和数据库是UTF-8再看后端日志打印的SQL中文是否正常如果正常说明JDBC连接没问题最后只看接口返回的JSON里中文是否正常正常的话就是前端调试工具显示问题或页面编码问题。第二个是Mapper绑定异常。这类报错在IDEA控制台往往显示一个很长的Spring异常栈很多同学一看红字就慌了。我教你一个定位套路报错信息里一般会明确写“Invalid bound statement (not found): com.xxx.mapper.ProductMapper.selectByCondition”这说明要么是这个方法在XML里没写要么是namespace写错了。你只要打开对应XML文件搜一下selectByCondition这个id看它所在的namespace是不是和红色报错里的接口全限定名完全一致就行。如果完全一致还报错再看applicationContext.xml里Mapper XML的扫描路径是否包含了那个XML目录。第三个是前端跨域问题。开发模式下Vue CLI服务器跑在8080端口后端Tomcat跑在8081端口前端发请求直接访问http://localhost:8081是被浏览器同源策略拦住的。你搜”跨域”会搜到大把在后端加CrossOrigin注解的解决办法我不推荐。最稳的做法是在vue.config.js里配置代理devServer: { proxy: { /api: { target: http://localhost:8081, changeOrigin: true } } }配置完成后前端代码里所有请求还是写相对路径比如/api/product/list开发时Vue CLI把请求转发到后端部署后Nginx做同样的事代码一行不用改。生产环境部署我推荐在Nginx里配一个location块做反向代理把/api和/upload都转发到后端服务。这个方案通篇只有一个原则前端永远只发相对路径跨域的事交给代理服务器处理。7. 论文写作与答辩准备的具体建议7.1 论文结构怎么搭才不会被导师打回做完了系统接下来就是让很多同学头疼的论文环节。毕设论文的评阅老师都是行业内比较有经验的人他们看论文的逻辑和代码评审不同最看重的其实是四件事研究背景与意义是否成立、系统设计是否合理、核心算法或关键功能实现是否有技术深度、测试过程是否可信。我把灯饰商城论文的大纲按学校的模板整理成了七章你可以直接对照着调整绪论背景、国内外研究现状、研究内容与目标、相关技术介绍SSM、Vue、MySQL简述、系统需求分析可行性分析、功能需求、非功能需求、用例图、系统设计总体架构图、功能模块设计、数据库设计、系统实现按模块配截图和核心代码片段、系统测试测试用例表、测试结果分析、总结与展望。写论文章节时有个技巧画图比写字更有效。评阅老师三五分钟翻完一篇论文真正能留下印象的就是系统架构图、功能模块图、数据库ER图、核心业务时序图和几个关键界面的截图。我建议你提前用ProcessOn或Visio画好这几张图特别是订单创建的时序图上面在第三章里我贴了流程你把它转成时序图答辩时直接能讲出业务逻辑来。7.2 答辩演示时的演示动线与常见提问答辩演示系统时一定不要只演示操作要在操作中穿插设计思想。我整理了一条演示动线供你参考先从前台首页讲起展示分类浏览灯具商品的效果点进一个商品详情页放大图片展示效果然后演示注册登录注意在演示时说出密码MD5加密存储这个安全点登录后演示加购、结算、下单说道“订单表和明细表的主从设计保证一张订单的完整性”下单后去后台演示发货正好对应上订单状态设计最后打开管理后台展示商品管理和订单统计图表结尾用管理员的身份视角收尾。这条动线把前端交互、后端逻辑、数据库设计全部串起来了全程大概十二分钟比东点一下西点一下要好看得多。答辩环节导师爱问的问题其实集中在几个敏感点上为什么选择SSM而不选Spring Boot、购物车数据存储在Session和数据库的取舍、库存超卖怎么防止、订单状态怎么管理、如何保证系统安全SQL注入、XSS、密码加密。这些问题其实在前面几章的内容里都能找到答案你只要在开发时真的理解了自己代码就行不要背答案。7.3 怎么在答辩中优雅地展示工作量有一个很多同学没意识到的规则答辩分数和工作量不成正比和你能展示出来的工作量成正比。同样是写了两万行代码有人被问几个问题就露馅有人画三张图就让评阅老师觉得项目很有料。这里我分享两个小技巧。第一个是提前做一个“核心功能亮点清单”把七到八个你自己实现得最漂亮的技术细节列出来每个用一两句话说明价值。比如“商品详情页的图片放大镜组件是自己手写的拖拽逻辑没有用组件库现成的插件”这句话比任何修饰词都说明问题。第二个是准备一段“如果时间不够”的精简版演示方案只演示三条核心链路确保每一条都走通把边角功能的时间让出来给问答环节。最后提醒一点代码注释和数据库字段注释一定要写这不仅是维护习惯更是答辩时的底气。你写的每一行注释在紧张忘词的时候都会帮你回忆当时的思路。我在检查学生项目时第一眼看注释第二眼看事务第三眼看SQL这三样东西过关项目基本就稳了。我自己这些年带过的毕设里SSM Vue的电商项目永远是最稳的一种选择。它不依赖稀缺的资源不需要高配的服务器所有代码你都能一行一行写明白所有业务逻辑你都能用自己的话讲清楚。灯饰交易平台这个垂直方向又给了充足的差异化空间不会跟隔壁寝室撞题。做毕设的过程确实会有不少夜晚对着报错日志抓头发但等你把前端打包文件扔进Tomcat、浏览器里刷出完整的商城页面那一刻你会觉得一切都值了。把这款灯饰平台的系统打磨好收获的不只是一个分数更是你完整掌握一套Web全栈开发生态的信心。
返回列表