搭建一个能跑起来的线上商城不难,但要做到界面流畅、后台稳定、功能齐全,就得在技术选型和开发流程上多下功夫。ZKmall 开源商城用 Vue3 做前端、Spring Boot3 做后端,从环境搭建到最终上线,形成了一套完整的解决方案。这套组合拳既能让前端页面响应迅速,又能让后端服务扛住高并发,不管是小店铺还是大平台,都能按需扩展。下面就一步步说说怎么从零开始搭建这样一个商城系统。

技术栈挑拣与环境准备:工欲善其事,必先利其器

选对技术工具,开发效率能翻倍。ZKmall 的技术栈都是经过实际项目验证的,前后端搭配起来既稳定又灵活。

前端技术栈围绕 Vue3 展开。用 Vue3 的 Composition API 写组件逻辑,比 Vue2 的 Options API 更清爽,尤其是复杂页面,代码复用起来特别方便。UI 组件直接用 Element Plus,里面的商品卡片、购物车组件都是现成的,不用重复造轮子。路由用 Vue Router 4 管理页面跳转,全局状态交给 Pinia—— 这东西比 Vuex 简单多了,定义个 store 就能在组件里调用。构建工具选 Vite,热更新速度比 Webpack 快好几倍,改完代码立马能看到效果,开发时少等不少时间。另外还加了 Axios 处理接口请求、ECharts 做销售报表,样式用 Less 预处理,一套下来前端功能就全了。

后端技术栈以 Spring Boot3 为核心。这框架最省心的是自动配置,加个依赖就能用,不用写一堆 XML。持久层用 MyBatis-Plus,基础的增删改查不用写 SQL,复杂查询又能自己写,灵活度刚好。安全方面,Spring Security 配 JWT 做认证授权,用户登录、权限控制都搞定。API 文档用 SpringDoc-OpenAPI,接口写完自动生成文档,前后端对接不用再对着 Word 扯皮。数据库主用 MySQL 存业务数据,Redis 缓存热门商品和用户会话,Elasticsearch 专门处理商品搜索。服务多了之后,用 Spring Cloud OpenFeign 互相调用,Nacos 做服务注册发现,最后用 Docker 打包,Kubernetes 管部署,扩缩容也方便。

开发环境配置得前后端对齐。前端要装 Node.js 16 以上,用 VS Code 加 Volar 插件写 Vue3 代码,代码提示特别准。后端必须用 JDK 17,因为 Spring Boot3 最低就支持这个版本,IDE 推荐 IntelliJ IDEA,装个 Lombok 插件,实体类不用写 getter、setter 了。数据库、Redis 这些中间件,直接用 Docker Compose 一键启动,省得在本地装一堆东西。版本控制用 Git,分支就按 master(主分支)、develop(开发分支)、feature(功能分支)来分,谁改了什么一目了然,合并代码也不容易冲突。

前端模块开发:把界面做得好用又好看

前端开发就是跟用户打交道,每个模块都得想清楚用户会怎么用。ZKmall 把前端拆成几个核心模块,每个模块专注一块业务,用 Vue3 的组件化特性串起来。

用户模块管登录注册和个人信息。登录页面用 Element Plus 的 Form 组件,用户名、密码框都带校验,输错了立马提示。点登录按钮,Axios 把数据发到后端,成功后把 JWT 令牌存到 localStorage,用户信息存到 Pinia 的 userStore 里。注册页面多了个手机号验证码,用个倒计时组件控制 60 秒才能再发,避免用户乱点。个人中心用 Tabs 分着显示基本信息、订单、地址,改信息的时候弹个表单框,改完实时同步到后端,Pinia 里的状态也跟着更,页面不用刷新就更新了。没登录的用户想进个人中心?路由守卫直接把他弹到登录页,权限控制得死死的。

商品模块是商城的脸面。列表页用 Grid 布局摆商品卡片,顶上放个下拉框选分类,输入框搜关键词,选完条件 URL 里会带上参数,刷新页面也不会丢。分页用 Element Plus 的 Pagination,翻页的时候加个防抖,别一点就连着发请求。详情页用 Tabs 展示基本信息、规格、评价,选颜色尺寸用 RadioGroup,选完立马算价格、看库存。加购物车按钮一点,先在 Pinia 的 cartStore 里存一下,同时调用接口同步到后端,成功了还会弹个小动画提示。为了加载快,商品图片用懒加载,详情页用 keep-alive 缓存,用户来回跳也不重新请求数据。

购物车模块得方便用户临时存东西。页面上每个商品前面都有复选框,支持全选,改数量用 Stepper 组件,改完小计和总计立马就算出来。底部结算栏固定着,显示选中多少件、一共多少钱。点结算的时候先查库存,不够的话就提示,自动把能买的勾上。没登录的时候购物车存在 localStorage 里,登录后自动合并到后端,两边数据一致。怕数据丢了?改完东西就同步到后端,页面关之前还会强制同步一次。确认没问题就带着商品 ID 跳去下单。

订单模块处理下单到支付的全流程。确认页展示收货地址、商品清单、价格明细,点提交订单按钮就禁用掉,显示加载中,免得用户多点。创建成功后,按选的支付方式跳去微信或支付宝,付完钱后端会通知前端改状态。订单列表用 Tabs 按状态分类,待支付、待发货清清楚楚,每个订单能看详情、取消、确认收货。详情页用 Timeline 组件展示物流进度,一目了然。待支付订单还会倒计时,超时自动取消,免得占库存。支付结果通过 WebSocket 实时推过来,不用用户自己刷页面。

支付模块得安全又顺畅。页面上列着各种支付方式,选完了调用后端接口拿参数,然后调起微信或支付宝的支付界面。支付的时候显示倒计时,想取消就回订单页。结果页用大图标显示成功还是失败,给两个按钮让用户选是看订单还是继续逛。怕支付结果通知不到?前端会定期查一下订单状态,变了就更新页面,还会叮咚响一声提示。支付信息全走 HTTPS,前端不存敏感数据,安全第一。

后端服务开发:把数据和逻辑管好

后端是商城的骨架,得稳。ZKmall 按业务拆成多个微服务,每个服务管一摊事,接口标准化,跟前端配合默契。

用户服务管用户数据。注册接口收用户名、密码、手机号,用 Spring Validation 校验格式对不对,密码用 BCrypt 加密了再存库,明文绝对不能碰。登录接口验证完用户名密码,就生成个 JWT 令牌,包含用户 ID 和角色,2 小时过期。拿当前用户信息?接口先解析令牌里的 ID,再去库里查。更新个人信息只改传过来的字段,别动不动就全量覆盖。安全方面,登录接口谁都能访问,其他接口得带令牌,密码要求 8 位以上、字母数字都有,自定义 Validator 盯着呢。

商品服务是数据中枢。列表接口收分类 ID、价格范围这些参数,用 MyBatis-Plus 的 QueryWrapper 拼 SQL,分页查数据。详情接口查基本信息、规格、库存,热门商品还会存 Redis 里,30 分钟过期,少跑数据库。管理员加商品得验证权限,添加完同步到 Elasticsearch,方便搜索。更新库存用乐观锁,多个人同时买也不会超卖,返回到底改成功没。列表查询加了索引,查起来飞快,大促也扛得住。

订单服务是核心中的核心。创建订单接口开启事务,先扣库存,再算金额,然后插订单表和订单项表,一步出错全回滚。列表接口按用户 ID 和状态查,支持分页排序。改订单状态得先看这订单是不是当前用户的,别让人瞎改,改完还会发事件通知其他服务,比如取消订单了就把库存加回去。超时未支付的订单?定时任务每分钟查一次,超了就改成取消状态,库存也还回去。跨服务操作用水 Seata 分布式事务,保证数据一致。

支付服务对接各种支付渠道。创建支付单接口先查订单金额和状态,没问题就调微信或支付宝的接口,拿回来支付参数给前端。支付结果回调接口专门给支付平台用,验证签名没问题就改订单状态。前端还能查支付状态,轮询着要结果。支付密钥这些敏感信息都加密存,回调接口加了 timestamp 和 nonce 防重放问题,安全得很。

搜索服务让用户快速找到东西。基于 Elasticsearch 做全文检索,收关键词、分类这些参数,拼 BoolQuery 查询,能按相关度、销量、价格排序。商品增改的时候,会触发事件同步到 Elasticsearch 索引,保证搜索结果新。还支持关键词补全、拼写纠错,输错个字也能搜到东西。热门搜索结果存 Redis 里,减轻 Elasticsearch 的压力。

联调测试:让前后端好好配合

前后端各干各的不行,得联调测试,确保接口对得上、功能没问题、性能扛得住。

接口联调得把数据格式对齐。先用 Postman 把后端接口挨个测一遍,看参数、响应、状态码对不对,符合 API 文档才行。前端用 Axios 拦截器统一加令牌、解析响应,开发环境配个代理解决跨域问题,不用后端改 CORS。重点测登录后令牌传没传、筛选条件生效没、下单时库存够不够扣、支付流程走得通不。发现字段名对不上?要么后端改 DTO,要么前端适配,改完记得更文档。

功能测试得模拟用户操作。普通用户流程:注册→登录→逛商品→加购物车→下单→支付→看订单。管理员流程:登录→加商品→设促销→处理订单→看报表。前端用 Cypress 录测试用例,模拟点按钮、输文字,看页面对不对、接口调了没。后端用 JUnit 5 测服务层,Controller 层用 MockMvc 发请求,重点测边界情况:库存 0 的时候下单、重复支付会怎么样。测试没过的功能,修复了再测一遍,直到全过。

性能测试得看看高并发顶不顶得住。用 JMeter 模拟 1000 人同时刷商品列表,500 人同时下单,300 人同时支付,盯着响应时间、错误率、服务器 CPU 内存。前端用 Lighthouse 测加载速度,图片压缩一下,懒加载开起来,JS/CSS 合并减少请求。后端把热门数据放 Redis,SQL 加索引,线程池参数调合适。目标是 90% 的请求半秒内响应,错误率低于 0.1%,5000 人同时在线也不卡。

安全测试不能马虎。用 OWASP ZAP 扫前端页面,看有没有 XSS、CSRF 问题。后端查 Spring Security 配置,密码策略严不严,会话管理安全不。重点测 —— 用参数化查询防住;JWT 令牌能不能破开 —— 用强密钥、短有效期;有没有越权访问 —— 查订单是不是自己的;敏感数据漏没漏 —— 支付信息加密传。高危问题马上修,低危的也得排期改。

部署上线与运维:让系统稳定跑起来

开发测试完了,就得部署到生产环境,还得有运维保障,出问题能及时处理。

环境准备得靠谱。服务器用云主机,4 核 8G 起步,不够再扩。数据库用云服务商的 RDS,主从架构,数据丢不了。Redis 用集群版,缓存和分布式锁都靠它。Elasticsearch 搞 3 个节点,搜索稳当。所有服务都用 Docker 打包,Docker Compose 管小部署,Kubernetes 管大规模。前端静态文件放 CDN,访问快;后端服务藏在 VPC 里,通过负载均衡对外,全用 HTTPS,证书从云服务商那申请。

自动化部署省人力。代码提交到 GitLab,合并到 master 分支就触发 CI/CD 流水线:前端打包上传 CDN,后端打包成 Docker 镜像推到仓库,然后远程登录服务器拉镜像、重启容器。数据库表结构变更用 Flyway 自动执行脚本,不用手动跑。部署用蓝绿模式,先把新版本放备用环境测,没问题再切流量,旧版本留半小时,有问题就回滚。

监控告警得实时盯着。前端用 Sentry 抓 JS 错误,百度统计看用户行为;后端用 Prometheus 收指标,Grafana 画图,响应时间超 1 秒、错误率超 1% 就告警。服务器 CPU、内存、磁盘,数据库连接数、慢查询也得监控。告警发邮件、钉钉,严重的直接打电话。出问题了用 SkyWalking 查链路,看是 SQL 慢还是缓存没命中。

运维流程得规范。故障分等级:P0 是系统挂了,P1 是核心功能坏了,P2 是非核心功能有问题,P3 是小毛病,等级不同处理速度不一样。处理流程:发现问题→找原因→临时解决→彻底修复→总结经验。定期备份数据库,每周全量加增量,丢了能恢复。日志用 ELK 收集,存 30 天,方便查问题。安全补丁每月更,压力测试每季度做,系统一直保持健康。

不止于当下,更着眼未来

ZKmall 用 Vue3 和 Spring Boot3 搭的商城,模块清晰,扩展方便,核心功能都齐了。搭建的时候得注意前后端数据格式对齐,订单和库存的事务要保证一致,用户体验要流畅。

以后还能加不少功能:用 AI 根据用户行为推荐商品,开发 Flutter 跨平台 APP,接更多支付和物流渠道,用 Istio 管好微服务。慢慢从基础商城变成全渠道零售系统,适应更多业务场景。

对开发者来说,这套技术栈能学到不少:Vue3 的 Composition API 和 Pinia,Spring Boot3 的自动配置和微服务设计,前后端联调和性能优化的技巧。不管是自己搭商城还是做企业项目,都能参考这套方案,少走弯路,快速做出稳定好用的系统。