ARTICLE DETAIL

资讯详情

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

Vue餐厅收银系统实战:从环境搭建到部署上线全流程解析

Vue餐厅收银系统实战:从环境搭建到部署上线全流程解析 1. 项目概述1.1 项目定位与适用范围“基于Vue的餐厅收银系统”这类项目几乎已经是Vue学习者绕不开的实战练手目标。它不像电商系统那样庞大复杂也不像后台管理模板那样平铺直叙它恰好卡在一个非常合适的复杂度上前端有交互、有状态、有路由跳转后端有增删改查、有身份认证、有数据关联。一套完整的收银系统基本覆盖了业务系统开发的大部分核心场景。这套系统最典型的应用场景是中小型餐厅的前台收银环节。你把它放在一台触摸屏一体机上服务员点击屏幕就能完成开台、点菜、下单、结账、打印小票这些操作。从业务流程来看它涉及菜品管理、桌台管理、订单管理、支付结算、员工登录等模块每一个模块都能拆出不少细活儿。适合谁来参考如果你是正在做课程设计的学生或者刚学完Vue基础想找一个完整项目练手的前端新人又或者是需要一套快速上手的内部管理系统的创业团队这个项目都能提供很好的参考价值。它不是那种看完教程就忘的简单Demo而是可以真正落地部署运行的完整系统。我拿到这套项目资料的时候第一反应是去看看它到底有多少干货。整套东西包含源码、数据库脚本、开发环境配置说明、调试部署文档还有一篇字数过万的配套论文。算下来这是一个非常完整的毕设级别的项目包各个部分都给你配齐了省去了到处找资料拼凑的麻烦。1.2 技术栈选型的价值分析为什么选Vue而不是React或者Angular来做收银系统这是有实际考量在里面的。收银系统属于典型的表单密集型业务需要处理大量的数据绑定、条件渲染和组件复用。Vue的双向数据绑定机制在处理订单菜品这类数据时非常顺手写起来直观不容易出错。再往下看Vue生态里的Vue Router负责页面跳转Vuex或Pinia负责全局状态管理比如当前登录用户、购物车数据Element UI或Vant提供现成的UI组件整个技术栈拼起来非常顺滑。对于一个多人协作或者单人独立完成的项目来说这套组合的学习成本和开发效率都比较均衡。数据库和调试部署的部分通常对应MySQL加Node.js或者Spring Boot。具体搭配方式很多时候取决于项目环境但核心原理是相通的前端通过HTTP请求调用后端接口后端操作数据库完成数据持久化再返回JSON数据给前端渲染。2. 开发环境准备与搭建2.1 Vue开发环境的完整配置流程环境配置这块我见过太多人卡在第一步就放弃了其实没有那么难。无论你用Windows还是macOS只要按步骤来就不会出大问题。第一步安装Node.js。这是Vue项目运行的基础环境相当于Vue的房子地基。去Node.js官网下载LTS版本长期支持版安装过程一路下一步就行。安装完成后打开终端Windows下可以用PowerShell或CMD输入node -v和npm -v验证是否安装成功。如果能看到版本号输出说明Node.js安装没有问题。第二步配置npm镜像源。国内直接使用npm官方源下载依赖包经常慢得让人抓狂甚至直接超时失败。我习惯用淘宝镜像npmmirror.com命令很简单npm config set registry https://registry.npmmirror.com配置完成后可以用npm config get registry验证是否切换成功。第三步安装Vue CLI脚手架工具。虽然现在Vite已经是官方推荐的新一代构建工具但很多课程设计和老项目仍然用到Vue CLI。两个都掌握比较好因为它们解决的是同一个问题快速搭建项目骨架。npm install -g vue/cli如果你用的是Vite命令是这样的npm create vitelatest project-name -- --template vue第四步创建项目并安装基础依赖。项目创建完成后进入项目目录运行npm install安装依赖包。这个过程第一次会比较慢耐心等就行。安装完成后运行npm run serveVue CLI或npm run devVite浏览器访问localhost:8080或localhost:5173能看到Vue的欢迎界面就说明环境搭建成功了。2.2 后端与数据库环境配置如果后端选择的是Java Spring Boot那还需要配置JDK和Maven。JDK建议安装1.8或11版本这两个版本在企业项目里的普及率最高遇到问题也最容易在网上找到解决方案。安装完成后配置JAVA_HOME环境变量然后在终端输入java -version验证。Maven是Java项目的依赖管理工具它的作用和npm类似。下载解压后同样需要配置MAVEN_HOME环境变量。然后修改Maven的settings.xml文件将镜像源改成阿里云的不然下载依赖包会等到怀疑人生mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror数据库端主要就是安装MySQL。安装过程要注意记住root账号的密码后面项目连接数据库的时候需要用到。另一个容易踩的坑是MySQL 8.0以上版本的认证方式有时候程序连接会报错需要执行一下这条SQLALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;数据库安装好之后把项目提供的SQL文件导入进去。一般用Navicat或者MySQL Workbench直接执行SQL脚本就行。导入后确认各个表的数据是否完整特别是用户表、菜品表、订单表这些核心表有没有初始数据。这个细节很重要因为很多功能调试需要已有数据做支撑。3. 系统功能拆解与数据库设计3.1 收银系统的核心业务逻辑一个合格的点餐收银系统业务流程跑通是第一位的。整套流程大概是这样的服务员在收银端选择桌台给顾客开台然后浏览菜单点菜菜品可以加辣减辣、加备注点好的菜先进入购物车确认无误后下单后厨出菜顾客用餐结束后收银台结账支持现金、微信、支付宝等方式最后打印小票。这套流程里还隐藏着几个容易被忽略的细节菜品分类应该是二级结构比如热菜下面还有川菜、粤菜等子分类桌台要有空台、占用、待清洁三种状态订单要区分进行中、已完成、已取消等状态。这些状态之间的流转逻辑决定了系统写得好不好用。权限方面至少要区分管理员和普通收银员。管理员可以查看营业额报表、管理菜品上下架收银员只能操作点餐结账这些日常功能。这种角色的区分在Vue前端可以通过路由守卫做限制后端通过Token或Session做验证两侧配合才能实现真正的权限控制。3.2 数据库表结构设计与关联关系这套系统的数据库一般是这么几张核心表用户表users、菜品分类表categories、菜品表dishes、桌台表tables、订单表orders、订单明细表order_items。用户表比较简单主要存用户名、密码、角色、手机号。菜品分类表和菜品表是一对多的关系——一个分类下面挂多个菜品菜品表里通过分类ID把两者关联起来。桌台表存桌号、座位数和当前状态。订单表和订单明细表是比较关键的两张表。订单表存的是整单信息包括桌台ID、收银员ID、订单编号、总金额、支付方式、状态、下单时间订单明细表存的是订单里每一项菜品的详细信息包括菜品ID、单价、数量、小计、备注。两份表通过订单ID关联起来。为什么要拆成两张表而不是把所有信息塞到一张表里因为一张订单可能点了十几道菜如果把每道菜的信息都冗余在主表里数据会有大量重复维护起来非常痛苦。拆成主表和明细表的设计既避免了数据冗余也方便后期做销售统计和数据报表。数据库设计的时候还需要注意几个容易忽略的东西所有表加上创建时间字段和更新时间字段这对后期排查问题非常关键金额字段建议用DECIMAL(10,2)而不是浮点数因为浮点数计算会产生精度误差付款对账的时候差一毛钱都是大事订单编号建议用时间戳或者日期加随机数的方式生成保证全局唯一方便后期对账。4. 接口设计与前后端联调4.1 核心接口的业务规则在这个项目里后端接口的设计直接影响前端开发的效率。接口设计得好前端拿数据省心省力接口设计得混乱前端联调的时候就是地狱难度。核心接口大概有这么几块登录和权限管理接口包括登录接口和获取用户信息接口菜品管理接口包括获取菜品列表、添加菜品和修改菜品状态的接口订单管理接口包括创建订单、获取订单列表、完成订单和取消订单的接口桌台管理接口包括获取桌台列表和更新桌台状态的接口数据统计接口用于查询销售额、菜品销量排名等数据。以创建订单接口为例前端提交的数据结构大概是这样的{ tableId: 3, cashierId: 1, items: [ { dishId: 12, quantity: 2, remark: 不加辣 }, { dishId: 23, quantity: 1, remark: } ], totalAmount: 85.00 }后端拿到请求后要做三件事校验桌台是否空闲、计算订单总金额这里的金额不能直接信任前端传过来的值必须后端重新计算防止前端篡改价格、创建订单主记录和订单明细记录。这样一套完整的校验逻辑走下来数据的安全性才有基本保障。4.2 前端请求封装与拦截器Vue项目里axios请求需要封装成统一的工具模块。为什么不直接在每个组件里调用axios因为后期如果接口地址变了或者需要在每个请求里添加身份认证Token你不可能去改几十上百个文件一个封装好的请求模块就能解决问题。我习惯这样封装axiosimport axios from axios import { Message } from element-ui import router from ../router const service axios.create({ baseURL: process.env.VUE_APP_BASE_URL, timeout: 10000 }) // 请求拦截器统一添加Token service.interceptors.request.use( config { const token localStorage.getItem(token) if (token) { config.headers[Authorization] token } return config }, error Promise.reject(error) ) // 响应拦截器统一处理错误码 service.interceptors.response.use( response { const res response.data if (res.code ! 200) { Message.error(res.message || 请求失败) return Promise.reject(new Error(res.message || 请求失败)) } return res.data }, error { if (error.response error.response.status 401) { Message.error(登录已过期请重新登录) router.push(/login) } else { Message.error(网络请求异常) } return Promise.reject(error) } ) export default service拦截器这个东西是前后端联调的大杀器。Token失效自动跳转登录页这个功能如果没有拦截器你得在每个请求的处理逻辑里写一遍错误判断有了拦截器一处封装全局生效。4.3 前后端联调方法与调试技巧联调阶段看到最多的报错就是跨域问题。浏览器控制台提示 “Access-Control-Allow-Origin”很多第一次接触前后端分离的人会被吓到。其实解决跨域问题有几种方式最简单的是在后端添加CORS配置。如果后端是Spring Boot添加一个配置类就行Configuration public class CorsConfig { Bean public CorsFilter corsFilter() { CorsConfiguration config new CorsConfiguration(); config.addAllowedOrigin(*); config.addAllowedMethod(*); config.addAllowedHeader(*); UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration(/**, config); return new CorsFilter(source); } }如果是开发调试阶段还可以用Vue CLI的代理功能更优雅地解决// vue.config.js module.exports { devServer: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true, pathRewrite: { ^/api: } } } } }这种方式的好处是前端代码里不用写完整的后端地址请求直接写/api/login这种相对路径就行正式部署的时候再通过Nginx来做反向代理灵活度很高。5. 核心功能实现详解5.1 登录模块与Token认证实现登录模块是整个系统的门禁实现得好不好直接关系到系统安全。流程上前端把用户名和密码发送给后端后端拿到数据后去数据库做校验校验通过后生成Token返回给前端前端把Token存到localStorage里。Token机制现在主流的是JWTJSON Web Token。JWT的好处是服务端不需要存session完全无状态。用户登录成功后后端生成一个包含用户信息和过期时间的加密字符串返回给前端。前端每次请求时在请求头里带上这个Token后端解析Token就能确认用户身份。前端路由守卫的配置也很有讲究这是控制页面访问权限的关键一步router.beforeEach((to, from, next) { const token localStorage.getItem(token) if (to.path /login) { next() } else { if (!token) { next(/login) } else { next() } } })这段代码的含义是访问登录页放行访问其他页面必须先有Token没有Token强制跳回登录页。5.2 菜品管理页面的增删改查菜品管理是收银系统的基础功能模块实现的技术难度不高但涉及的操作比较多。列表页展示菜品信息支持按名称搜索、按分类筛选、分页展示新增和编辑用同一个表单弹窗通过一个editing参数区分当前是新增还是编辑删除操作在正式系统里建议使用软删除给菜品添加一个status字段下架而不是真正删掉这样历史订单的数据不会丢。这里有一个我在实操中碰到的实际问题。菜品图片上传功能如果图片格式是base64直接存数据库数据库表会很快膨胀查询速度明显下降。更好的方案是把图片文件上传到服务器指定目录数据库里只存图片路径。这个方案更合理展示的时候直接用路径加载性能高很多。编辑菜品时还有个交互细节表单里如果有分类下拉选择框编辑时要回显原有的分类。做法是先请求菜品详情拿到数据后回填表单下拉框的默认值要保证正确显示。这个功能看着小但漏掉的话用户编辑一次菜单发现分类变了非常影响体验。5.3 点餐与购物车业务点餐模块是整个系统交互最复杂的部分。用户从菜单面板上点击菜品菜品就加到购物车里点击加号数量加一点击减号数量减一数量减到零就自动从购物车里移除。这种交互写起来不复杂但状态的管理需要考虑清楚。购物车数据格式大概是这样cart: [ { dishId: 12, name: 宫保鸡丁, price: 32, quantity: 2, remark: }, { dishId: 23, name: 酸辣土豆丝, price: 16, quantity: 1, remark: 微辣 } ]计算总金额的时候用Vue的计算属性就行computed: { totalPrice() { return this.cart.reduce((sum, item) { return sum item.price * item.quantity }, 0) } }提交订单时把购物车数据按照后端接口要求的格式组装好调用创建订单接口成功后清空购物车并自动跳转到结算页面。后厨出票接口通常用的是WebSocket后厨端实时收到新订单消息并自动打印小票这也是一个可以写进论文里的亮点功能。不过要说明的是这部分并非所有毕设版本都包含看项目具体实现深度。5.4 支付结算与订单状态流转支付这块正规的对接链路是接入微信支付或支付宝支付的开放API走统一的流程前端点击付款向后端请求创建支付预订单后端调用微信或支付宝的统一下单接口拿到支付二维码链接前端把二维码展示给顾客扫码顾客支付成功后微信或支付宝服务器向后端发异步通知后端收到通知后更新订单状态为已支付。不过很多课程设计项目为了演示方便会使用模拟支付——界面上放一个“确认收款”按钮直接调用后端完成订单的接口。这种模拟方式功能上说得过去但在论文里可以老实说明这是模拟实现实际部署时替换为真实支付接口即可。订单状态流转是整个系统的核心状态机。我的项目里用数字表示订单状态比如0表示进行中1表示已支付完成2表示已取消。每次状态变更前端要刷新当前订单列表页面显示才会同步。6. 数据库部署与数据安全6.1 数据库脚本导入实操注意事项导入数据库看起来是个简单的步骤但细节问题很多。项目提供的SQL脚本我建议先打开看一下内容。第一件要确认的事是SQL的版本兼容性。如果是MySQL 5.7版本写的脚本导入到MySQL 8.0有时候会因为认证方式或者SQL语法级别的问题导致部分语句报错。遇到这种情况直接在Navicat里执行哪里报错就改哪里一般不会太复杂。第二件要确认的是字符集和排序规则。如果表和字段使用的是utf8mb4字符集导入时连接也要指定这个字符集否则中文会变成乱码。Navicat导入的时候可以编辑连接的高级选项在编码那里选择自动或者utf8mb4。第三件要确认的是导入顺序。如果SQL脚本里有外键约束导入的时候要求父表先导入、子表后导入。项目文档里提供的单个SQL文件通常已经规范了顺序如果是多个SQL文件就要按依赖关系手动排序先从用户表开始。6.2 常见数据库连接问题排查数据库连接不上这是调试部署阶段出现频率最高的报错。总结下来主要有几种第一种服务没启动在Windows服务列表里检查MySQL服务是否处于运行状态第二种端口被占用MySQL默认3306端口如果被其他程序占用了连接一样报错命令行执行netstat -ano | findstr 3306看谁占了端口第三种密码错误注意安装时设置的root密码有没有记错第四种连接配置中的URL写错比如IP、端口、数据库名拼写错误。还有一类隐蔽的问题值得注意。后端代码里的数据库连接池配置如果写的useSSLtrue在高版本MySQL连接的时候可能会报SSL证书错误。稳妥做法是连接字符串里加上useSSLfalseserverTimezoneAsia/Shanghai这样既解决了SSL问题也避免了时区错误导致的datetime字段插入数据不准的问题。6.3 数据库优化与安全加固建议写完功能不代表万事大吉数据库的性能和安全性是更值得花时间打磨的环节。性能优化方面给高频查询字段加索引是最直接的优化手段比如用户表的用户名、订单表的桌台ID和订单状态、订单明细表的订单ID这些字段经常在查询条件里出现没索引会走全表扫描数据量上来之后慢得难以接受。CREATE INDEX idx_orders_table_id ON orders(table_id); CREATE INDEX idx_order_items_order_id ON order_items(order_id);安全性方面数据库连接信息绝对不能硬编码在前端代码里必须写在后端的配置文件中。部署上线后MySQL的端口尽量不暴露到公网同时避免root账户远程连接新建一个专门的应用账号并只授权本应用所需的库权限思路就是用最小权限原则来降低数据库被入侵的风险。另外要定期备份数据尤其是订单数据备份策略上数据量不大时可以每天凌晨全量备份数据量大时采用全量加增量结合的方式多一份备份就多一分安心。7. 系统调试与部署7.1 前端构建打包配置开发完成之后要部署上线前端代码需要打包成静态资源文件。运行npm run buildVue项目会生成一个dist目录里面包含了压缩混淆之后的HTML、CSS和JavaScript文件。这些文件才是正式线上运行的产物。打包的时候有几个配置需要提前确认。第一个是publicPath的配置如果部署在服务器根路径下就用默认的/如果部署在子目录下比如http://example.com/pos/就需要设置module.exports { publicPath: process.env.NODE_ENV production ? /pos/ : / }第二个是环境变量的问题。开发环境的接口地址和生产环境的接口地址通常不一样Vue项目在src目录下放.env.development和.env.production两个文件来区分。比如.env.production里写VUE_APP_BASE_URL http://api.example.com这样代码里用process.env.VUE_APP_BASE_URL读取的地址在构建时会被替换成对应环境的配置。7.2 后端打包与本地运行以Spring Boot项目为例打包命令是mvn clean package执行完成后target目录下会生成一个jar包。运行方式很简单java -jar restaurant-pos-system.jar正式部署更推荐用nohup方式这样ssh断开后进程不会被杀掉nohup java -jar restaurant-pos-system.jar logs/run.log 21 7.3 Nginx反向代理与完整部署流程这里强烈建议用Nginx做反向代理部署。前端静态文件、后端API接口、数据库服务之间怎么联动部署之前要先在脑子里画一遍流程。实际部署的时候Nginx配置大概是这样的server { listen 80; server_name your-domain.com; # 前端页面 location / { root /var/www/restaurant-pos/dist; index index.html; try_files $uri $uri/ /index.html; } # 后端API接口 location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }注意try_files $uri $uri/ /index.html;这行它的作用是让前端路由在刷新页面时不至于404。Vue是单页应用路由跳转由前端控制但直接访问某个路由路径时Nginx找不到对应的真实文件就需要始终指向index.html由前端路由接管。漏掉这一行你会发现系统首页能打开一刷新子页面就是404这个问题非常常见。部署完成之后的测试顺序我一般是这样的先访问域名地址确认页面能加载再试登录功能确认后端接口能通然后跑一遍添菜、下单、结账的完整流程最后检查数据库里的订单数据是否正常落位。全流程跑通系统正式可用。8. 万字论文的撰写思路与重点章节拆解8.1 论文结构设计与选题方向这套项目的配套论文要达到万字以上文章结构通常是标准的信息管理与信息系统类论文框架绪论、相关技术介绍、系统需求分析、系统设计、系统实现、系统测试、总结与展望。选题方向上可以拆成几个细分维度智能点餐系统的设计与实现、基于Vue的餐厅收银系统设计与实现、前后端分离架构在餐饮管理中的应用。不管题目怎么取核心内容都是一套东西只是侧重点不同。8.2 各章节核心内容与写作要点绪论部分大致写清三个问题研究背景餐饮行业信息化趋势、研究意义提高收银效率、减少人为差错、数据化运营、国内外研究现状国外有哪些系统、国内有哪些系统、差距在哪里、我们这项目怎么优化。相关技术介绍章节重点介绍Vue框架的特点、Vue Router和Vuex的作用、axios请求机制、Element UI组件库以及后端框架特点和MySQL数据库的优势。这一章不需要讲太深写清楚“你用了什么”“它有什么特点”“为什么选它”三个问题就好。需求分析章节是论文的价值所在很多学生在这里草草了事其实系统性梳理清楚整个需求分析过程对指导论文编写意义很大。功能性需求上可以描述登录、菜品管理、桌台管理、订单管理、支付结算这几个用例的完整业务流程非功能性需求要涵盖系统性能页面响应时间上限、安全性密码加密存储、权限控制、易用性界面简洁、操作流畅等维度。系统设计章节内容包括架构设计前后端分离架构图、功能模块设计各模块的职责和交互关系、数据库设计E-R图、核心表结构、字段说明以及接口设计核心API的路径、请求参数、响应格式。系统实现章节按照模块维度拆分先描述总体页面布局左侧导航、顶部用户信息、内容区域的框架再分模块写具体实现逻辑配合关键代码片段、页面截图和功能效果说明。注意代码只需要贴核心的业务逻辑部分没必要把整个文件都贴进去论文重点在于说明“怎么实现”和“为什么这么实现”。系统测试章节需要写清楚函数测试用例的设计正常输入、边界值、异常输入的预期结果以及最终测试结论。不只是把它们简单汇总而是要看测试结果如何验证系统达到了需求分析中设定的目标。8.3 如何将开发过程转化为论文素材写论文最怕的是空谈理论没有实际内容。我的建议是开发过程中每完成一个模块立刻截图并记录实现思路这样最后写论文的时候有充足的素材不用临时回忆或者瞎编。开发日志不需要多详细每个模块两三句话就行比如“菜品管理模块做了分类筛选和分页展示搜索接口支持模糊匹配”。真正写论文时把这些记录扩展成段落效率会高很多素材也都是真实的。忘记截图的页面可以在系统跑通后重新打开开发环境补截图。论文里的截图要注意清晰度和逻辑性同一类功能的截图风格尽量统一必要的时候加红色框线标注重点区域。数据库设计的部分用Navicat把表结构截图保存下来配合字段注释论文中用起来很方便。9. 常见问题与调试技巧速查9.1 前后端联调高频问题与解决方案运行环境方面的报错和依赖问题是整个项目过程中最容易把人挡住的地方。下面按出现频率排一个序直接对着问题查就行npm install失败——大概率是网络问题。切换到淘宝镜像源再执行一次如果报权限错误macOS/Linux下加sudoWindows下用管理员身份运行CMD。端口被占用——8080被占就用netstat -ano | findstr 8080查到占用进程的PID再到任务管理器里结束对应进程或者干脆换成别的端口。Maven依赖下载失败——检查settings.xml里的阿里云镜像配置是否生效Maven仓库路径是否有中文空格字符。后端启动报错Failed to configure a DataSource——检查application.yml里的数据库连接配置确认URL、用户名、密码和数据库名都正确MySQL服务是否已启动。前端请求接口报404——大概率是后端接口路径和前端请求路径对不上仔细核对Controller层的RequestMapping注解和前端封装的请求地址。上传文件大小超限——Nginx默认上传大小限制是1MB接收图片文件时需要配置client_max_body_size 10m;加在server配置块里。还有一个开发时的小技巧值得单独说。修改前端代码后浏览器里没看到变化先确认是浏览器缓存还是代码问题——打开开发者工具勾选Disable cache强制禁用缓存刷新一次如果还是不行把npm run serve的服务停掉重新跑一次。很多时候问题不是代码的问题而是缓存的问题。9.2 数据库相关的典型故障排查Public Key Retrieval is not allowed这个报错用Navicat连接MySQL 8.0的时候比较常见。在连接配置里找到“驱动属性”添加allowPublicKeyRetrievaltrue参数就能解决。Unknown database xxx——先确认数据库到底创建了没有。有时候SQL脚本文件里第一行就是CREATE DATABASE xxx;但执行的时候没有选中这个脚本导致后续的建表语句都报错。最好的方式是手动先创建数据库设置好字符集然后在连接时选中这个库再执行SQL。Table xxx doesnt exist——确认当前连的是不是正确的数据库。有时候Navicat里打开了多个连接执行SQL时用的连接和数据导入时用的连接不是同一个。一条SQL就能查清楚SELECT DATABASE();这条SQL会返回当前所在的数据库名称看到不对直接用USE xxx;切换。9.3 部署上线后排查问题技巧生产环境出了问题第一件事是去看日志。Spring Boot的日志默认输出在控制台如果用nohup启动的就在nohup.out文件里。排查思路先后端再前端先看后端日志里有没有请求进来确认接口有没有报错再看数据库里有没有数据落库最后才看前端页面的表现。Nginx常见的坑是修改配置后没有reload。改了nginx.conf之后必须执行nginx -s reload否则虽然文件改了但运行中的Nginx用的还是旧配置导致一种“我明明改了为什么没生效”的困惑。10. 实操心得与进阶扩展建议做这个项目下来我最大的体会是课程设计和面试项目最大的差距不在功能多少而在细节是否考虑到位。同样是登录功能简单做就是表单加验证认真做就是Token过期自动刷新、记住密码、账号锁定、操作日志全都安排上。同样是订单列表简单做就是表格加搜索认真做就是状态筛选、时间范围查询、金额汇总、Excel导出全都配齐。这些细节上的东西才是“认真做过项目”和“跟着教程跑了一遍”的本质区别。对于想把这个项目继续深挖的朋友我给出几个扩展建议。第一个方向是增加数据可视化大屏。用一个页面展示餐厅今日营业额、订单量、热门菜品Top5、桌台利用率等指标用 ECharts 这个可视化库画图表。这个功能放在论文里非常出彩因为上级一眼就能看到“这个人会做数据展示”。第二个方向是接入真实支付和打印功能。微信支付和支付宝支付都有沙箱环境可以调试打印小票可以用热敏打印机配合escpos这个npm包来实现。这两个功能都是真正企业级应用必不可少的核心能力做完之后整个系统的完整度会上一个台阶。第三个方向是引入Redis做缓存。把菜品列表、桌台状态这些查询频率高但变化不频繁的数据缓存到Redis里页面加载速度提升非常明显。在论文里写一句“引入Redis缓存机制菜品列表查询性能提升了80%”这个亮点表现在论文或答辩里都很加分。最后一个建议不管做什么方向上的扩展都要在真机或者服务器上完整跑一遍模拟真实使用场景测试这比在本地开着开发服务器点两下更能发现问题。尤其是订单并发、重复点击、断网恢复这些边界场景只有在接近真实的环境下测试才能暴露问题。我实际跑下来发现过重复提交导致生成了两笔订单的问题处理方式是给订单编号加唯一索引后来再遇到同类场景就完全稳了。这套餐厅收银系统从开发到部署走过的每一步都是非常标准的前后端分离项目实战路径。我也希望这篇分享能帮你把每个环节都串起来少走一些弯路。
返回列表