ARTICLE DETAIL

资讯详情

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

芋道商城源码部署与二次开发实战指南:从环境搭建到前后端联调

芋道商城源码部署与二次开发实战指南:从环境搭建到前后端联调 简介这是一套面向中高级前端开发者与电商系统架构师的全功能开源商城解决方案基于Vue 3与UniApp跨端框架构建专为快速搭建高可用、多场景的移动端电商平台提供完整技术底座。资源包共504个文件涵盖221个Vue组件含页面、业务逻辑与DIY模块、104个JavaScript工具与API服务脚本、43个SCSS样式文件支持主题定制与响应式布局、36个Markdown文档含部署指南、功能说明与二次开发规范以及配套图标、字体、环境配置与许可证文件整体压缩包仅3.88MB轻量且结构清晰。已有1512人学习下载适用于需要集成分销、拼团、砍价、秒杀、优惠券、积分体系、会员等级、小程序直播及可视化页面DIY等核心电商能力的实战项目。源码100%开源模块解耦良好目录按功能域划分明确便于按需抽取、调试与深度定制。 上个月我把芋道商城的全功能源码从拉取到上线完整跑了一遍。这套基于 Vue、Uniapp 和 Spring Boot 的商城系统源码完整度比我预想的高很多但真正动手时才发现网上大多数教程只讲了怎么启动没讲清楚里面各模块是怎么协同的。这篇把我在整个部署和二开过程中验证过的细节整理出来尤其是 Vue 管理后台和 Uniapp 买家端之间接口联调的部分给正准备上手这套源码的同学一个可操作的参考。先说结论芋道商城yudao-mall本质上是芋道框架RuoYi-Vue-Pro 的衍生版在电商领域的完整落地管理后台用的是 Vue Element UI买家端是 Uniapp 一套代码编译到 H5、小程序和 App后端是 Spring Boot 的模块化工程。它的价值不只是能跑起来的商城而是把商品、交易、支付、营销、会员、分销这些电商通用模块做了标准化拆分后端每个业务模块都有独立的 Controller 和 Service前端每个页面都能对上号。对于需要一个起点做二次开发的团队来说这比从零搭一套快太多。1. 这套源码的门道先搞清楚芋道商城到底给前端提供了什么很多第一次拿到芋道商城源码的人最大的困惑是打开工程后发现项目太多了。其实它不是一个工程而是一整套包含多个端口的解决方案。搞清楚这些代码之间的归属关系是后面所有工作的基础。1.1 一套源码三个前端入口芋道商城源码包里通常包含三类前端工程对应三种使用场景。第一类是管理后台前端Vue2 技术栈使用的 UI 组件库是 Element UI。这一套跑起来是给运营和平台管理员用的处理商品上下架、订单管理、优惠券配置、数据统计这些后台操作。第二类是商城买家端也就是 C 端用户直接使用的商城界面基于 Uniapp 开发。这一套代码是整个项目里最值得研究的因为它能编译成微信小程序、H5、App安卓和 iOS三个平台一套代码多处运行。代码内部按 pages、components、api、store 分层组织页面风格是典型的电商布局包含首页、分类、购物车、个人中心、商品详情、订单确认等核心页面。第三类还有 Vue3 版本的管理后台不过在早期开源版本里 Vue2 的 admin 是主力。实际选择用哪个版本主要看团队的 Vue 技术栈倾向。我自己在测试时用的是 Vue2 版本的 admin 和 Uniapp 买家端组合这个组合最稳。1.2 后端模块划分决定了前端接口的边界管理后台和买家端调用的接口全部由后端统一提供但在模块归属上有明确的边界。后端典型的模块划分如下模块对应前端职责范围yudao-module-system管理后台用户、角色、菜单、部门、字典等系统基础功能yudao-module-infra管理后台代码生成、文件上传、配置管理、定时任务yudao-module-product管理后台 买家端商品 SPU/SKU、分类、品牌、属性、评价yudao-module-trade管理后台 买家端订单、购物车、售后、订单配送yudao-module-promotion管理后台 买家端优惠券、秒杀、拼团、限时折扣yudao-module-pay管理后台 买家端支付订单、退款订单、支付渠道配置yudao-module-member管理后台 买家端会员信息、收货地址、会员等级、积分理解这个边界有什么用它直接决定了二开时改动的位置。比如你想给商城加一个新的营销玩法不能在前端随便写个页面就完事后端要落在 promotion 模块里前端要同时改管理后台的配置页面和买家端的展示页面。很多人二次开发翻车就是因为在 trade 模块里硬塞营销逻辑导致订单服务和促销服务耦合后面维护成本飙升。1.3 该选单体版还是微服务版芋道商城有两个大版本单体版yudao-mall 的 boot 版和微服务版yudao-cloud。很多新手在这上面犹豫很久。我的建议是除非你确定团队有微服务治理能力或者业务量已经大到必须拆分的程度否则直接用单体版。理由很现实单体版部署就是一个 jar 包 MySQL Redis启动调试都很简单而这套单体版在架构上已经做了模块隔离以后真要拆微服务模块之间的边界已经在代码层面划好了迁移成本可预期。微服务版每个模块都需要单独启动还需要 Nacos、Gateway、Sentinel 这一套基础设施光是本地调通这几个服务之间的调用链就能消耗掉两三天时间。对于大多数中小型项目这部分成本完全没必要提前支付。2. 跑通本地环境我踩过的那些文档外细节这套源码的官方文档写了启动步骤但真按文档走一遍你还是会遇到不少文档没提到的细节。我建议严格按照下面的顺序来能少走很多弯路。2.1 环境版本组合一步对不上就得返工先说环境版本这是最常见的坑。我本地实测可行的组合是软件版本要求说明JDK1.8 或 17较新版本支持 JDK17但 1.8 最稳妥Maven3.6.33.8 以上需要留意镜像配置MySQL5.7 或 8.08.0 需要调整连接驱动配置Redis5.0无需特殊插件默认配置即可Node.js14.x 或 16.x管理后台 Vue2 对 Node 版本敏感HBuilderX最新稳定版跑 Uniapp 编译用微信开发者工具最新版调试小程序端用这里要特别强调 Node 版本。Vue2 的管理后台如果用 Node 18 启动很容易出现 node-sass 编译失败或者内存溢出的问题因为 node-sass 对高版本 Node 的兼容性不好。我实际遇到的情况是 npm run dev 报错Error: Node Sass does not yet support your current environment换成 Node 14 后直接正常。2.2 数据库初始化和 Redis 配置的隐形要求代码拉取下来后第一步是导入数据库。sql 文件在源码目录的 sql 文件夹下包含 mall 数据库脚本和 quartz 定时任务脚本。注意导入顺序先导入系统基础脚本再导入业务模块脚本因为业务表的外键依赖 sys_ 开头的系统表。导入后必须检查一个地方数据库连接配置里的useSSL参数。如果 MySQL 是 5.7保持默认即可如果是 MySQL 8.0需要在 JDBC 连接串后面加上useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/Shanghai否则启动时会报 SSL 连接异常。Redis 配置需要注意的不多但有一个隐性要求如果 Redis 设置了密码需要在 yaml 文件里的spring.redis.password填上同时芋道在登录时使用了 Redis 缓存 token 和验证码这个配置不生效的话管理后台登录页面能打开但验证码图片一直刷新不出来。我调试时在这个问题上卡了半小时。2.3 前端项目启动的先后顺序与端口约定三个前端项目的启动顺序没有硬性要求但建议先启动管理后台的 admin 项目因为这能验证后端接口是否正常。命令如下# 进入管理后台前端目录 cd yudao-ui-admin npm install npm run dev管理后台默认端口是 8080后端默认端口是 48080。注意管理后台的请求是通过 Vite 或 webpack 的 proxy 代理到后端的代理配置在 vue.config.js 里默认把/admin-api前缀的请求转发到http://localhost:48080。如果你改了后端端口这里必须同步修改。Uniapp 买家端启动方式不一样。它不是通过 npm 启动的而是用 HBuilderX 打开项目后选择运行到浏览器H5、运行到手机或模拟器App、运行到微信开发者工具小程序。这里有个关键配置Uniapp 端请求后端接口的 BaseURL在config.js或common/config.js文件里配置。H5 端本地调试时因为浏览器有跨域限制建议配置完整的后端地址如http://localhost:48080/admin-api然后在 H5 端的 manifest.json 里配置h5.devServer.proxy或者在后端网关层开放跨域。我自己是直接在后端加了全局跨域配置类这样 H5 调试最省事。2.4 启动报错的排查链从端口占用到业务异常启动过程中大概率会遇到几个报错我把排查顺序整理成一个清单后端启动失败时先看最后一段异常堆栈。如果是Port 48080 was already in use换端口或者杀掉占用进程如果是数据库连接失败检查 MySQL 是否启动、账号密码是否正确。如果启动成功但验证码接口 500多半是 Redis 连接问题。如果管理后台登录接口报用户名或密码错误但账号密码明明没错检查数据库的system_users表密码字段格式旧版本使用的加密方式可能与新版本不同建议用源码里提供的初始化账号admin/admin123有的版本默认密码是admin123456确认后登录成功再改。我把最常见的启动类报错和解决办法整理成表格症状根因解决办法npm install 报 node-sass 错误Node 版本过高改用 Node 14登录页验证码不显示Redis 未启动或密码错误启动 Redis、核对密码列表接口返回 401token 未传入或已过期重新登录获取 token管理后台接口 404代理配置路径错误核对 vue.config.js 的 proxy 配置Uniapp H5 请求跨域浏览器跨域限制后端增加跨域配置3. 管理后台的骨架Vue 路由、权限与页面改造思路把环境跑通只是热身真正的重点是搞清楚管理后台的代码组织因为你日常二开最频繁接触的就是这里。3.1 菜单和权限是怎么跟前端路由挂钩的芋道管理后台的权限设计是标准的 RBAC 模型但它的实现方式比较特别前端路由不是写死的而是后端根据当前登录用户的角色动态返回有权限的菜单前端再把这些菜单渲染成路由。这一步是很多 Vue 新手困惑的地方。打开src/router/index.js你会发现它不是全量路由只定义了基础路由和剩余路由的匹配规则。实际的路由表在用户登录后通过getRouters接口获取然后在前端用addRoute动态注册。这意味着你新增一个页面时不能只在router里加一行记录。正确的流程是在src/views/下新建页面组件。在管理后台的菜单管理中新增菜单目录和菜单项填入路由地址和组件路径。给对应角色授权这个新菜单。刷新后前端会从后端拉取新菜单并动态注册路由。这套机制初期看着绕但一旦理解了功能权限和数据权限的配合就能玩得很顺。比如运营账号只能看到商品菜单看不到系统管理菜单这在后端只需要配置角色权限即可前端根本不需要硬编码判断。3.2 代码生成器从数据库表到完整的 CRUD 页面芋道商城二开效率最高的环节是后端 infra 模块里的代码生成器。它的逻辑是你在 MySQL 里建好表然后在管理后台的代码生成页面导入表结构系统会自动生成 Controller、Service、Mapper、XML、Vue 页面、SQL 菜单脚本下载下来直接放进工程里就能用。我实际体验下来的流程是在数据库中创建新表注意字段注释要写清楚因为注释会直接变成页面表单项的 label。在代码生成页面选择数据源和表点击导入。配置生成选项生成类型选择前后端分离模板类型选择Vue2。下载代码后端代码放到对应模块的 controller/service/mapper 包里前端代码放到src/views/对应模块/下。执行生成的 SQL 文件里面包含菜单权限的 insert 语句。这个功能的使用要特别注意一点生成的代码只是基础 CRUD它不会理解业务逻辑。比如一个订单表代码生成器生成的列表页只有简单的多条件查询和状态展示但如果需要订单完成后自动给用户发放积分这种联动逻辑那必须手动在 Service 层补充。凡是涉及跨模块调用的逻辑都不能指望代码生成器替你解决。3.3 表单项、列表页改造的高频操作实际二开中管理后台改得最多的就是列表页和表单页。有几个高频操作值得单独说。第一列表页搜索条件的增删。在 Vue 页面里搜索区是一个 el-form只需要调整 el-form-item 的代码即可。但要注意搜索字段和列表字段都要保持和 Table 列一致否则会出现搜索条件有值但数据不筛出来的假象。第二列表页按钮的权限控制。页面上的新增删除导出按钮通常通过v-hasPermi[system:xxx:create]指令控制。这个权限标识必须和维护菜单时填写的权限标识保持一致否则按钮会直接消失。很多人在给角色授权后看不到新增按钮就是这个标识没对上。第三日期范围查询。商城类项目经常要查下单时间在某个区间内的数据前端传的是一维数组[2024-01-01 00:00:00, 2024-01-31 23:59:59]但在后端接收参数时必须用DateTimeFormat注解并拆分成开始时间和结束时间两个字段否则数据库里的时间字段无法正确匹配。4. Uniapp 买家端的核心改动登录、支付与视频播放这些逃不掉的环节Uniapp 端是芋道商城源码里最有意思的部分。因为要兼容多端很多业务逻辑不能像 H5 那样随意写每做一个功能都要考虑平台差异。4.1 登录鉴权与 token 刷新Uniapp 端的登录封装在utils/auth.js里。核心流程是首次进入时会检查本地 storage 中是否有 token。没有 token 时引导用户到登录页登录成功后调用uni.setStorageSync(ACCESS_TOKEN, token)保存 token。每次请求时在utils/request.js里的拦截器中把 token 放到 header 的Authorization字段中。如果接口返回 401拦截器会清理本地 token并跳转到登录页。这个配置在request.js里。实际开发中有几个坑。第一个坑是 H5 端 token 的保存位置。Uniapp 的 H5 端本质上还是网页uni.setStorageSync在 H5 端使用的是 localStorage这没有问题但如果你的 H5 部署在境外服务器或跨域场景下需要注意 localStorage 是跟随域名的域名换了一个之前的 token 就直接失效了。第二个坑是 token 过期时间的处理。默认情况下芋道后端 token 有效期是 30 天但如果用户在手机端长期不重新进入小程序微信小程序的登录态过期可能会先于 token 过期发生这时候调用uni.login重新获取 code 再登录即可不要把整个 token 清掉让用户重新输账号密码。商城类项目保持静默无感登录很重要页面一打开登出状态转化率会有明显影响。4.2 支付流程对接与回调处理支付是商城项目绕不开的重头戏。芋道商城把支付能力做成了独立模块支持微信支付和支付宝支付在管理后台配置好商户号和密钥后就可以在买家端发起支付了。从 Uniapp 端的视角看它只做两件事调用后端创建订单接口拿到订单号和支付单号。调用uni.requestPayment拉起支付面板用后端返回的支付参数完成密码支付。代码大致长这样// 发起支付 const res await request({ url: /app-api/pay/wallet-order/create, method: post, data: { orderId: orderId } }) uni.requestPayment({ provider: wxpay, timeStamp: res.data.timeStamp, nonceStr: res.data.nonceStr, package: res.data.package, signType: MD5, paySign: res.data.paySign, success: (payRes) { // 支付成功跳转订单详情 } })这里要特别提醒支付成功的判断不能只依靠 H5 端返回的结果。用户在支付面板输入密码后前端收到 success 回调只能说明调用成功真正的支付结果以后端收到微信/支付宝异步通知为准。所以商城的前端页面一定要有轮询查询订单支付状态的机制不能让用户停留在支付成功前的页面等着而是要不断刷新订单状态直到后端确认为已支付。4.3 商品详情页的视频播放m3u8 和 rtsp 的落地方案最近很多从芋道商城二次开发直播带货、在线课程类项目的同学都会问到视频播放的问题。Uniapp 端处理视频播放要区分不同场景。如果是 H5 端播放 m3u8 直播流直接用原生video标签是不行的因为 H5 的video并不原生支持 HLS 流。常见方案是引入 hls.js 把 m3u8 转成 fMP4 再喂给 video 播放。在 Uniapp 中可以通过条件编译处理!-- #ifdef H5 -- video idmyVideo/video !-- #endif --然后在 script 里引入 hls.js// #ifdef H5 import Hls from hls.js if (Hls.isSupported()) { let hls new Hls() hls.loadSource(http://example.com/live/test.m3u8) hls.attachMedia(this.$refs.myVideo) } // #endif如果是 App 端播放 rtsp 流情况更复杂。rtsp 本质上是监控领域的传输协议不是普通浏览器或 App 直接支持的格式必须依赖带转码能力的流媒体服务器把 rtsp 转成 rtmp 或 m3u8。在真实项目中常见的做法是部署一套 SRS 或 ZLMediaKit把摄像头的 rtsp 流拉进来转成 m3u8买家端再按 m3u8 方式播放。Uniapp 端可以直接用video组件播放 App 端兼容的 m3u8 地址或者用腾讯云直播的 WebRTC 播放器。4.4 微信小程序跳转 H5 与页面分享的适配商城项目跑起来后推广和裂变是必须考虑的功能。Uniapp 端在做微信小程序推广时有两个高频需求自定义分享好友和跳转 H5。自定义分享好友用uni.share或onShareAppMessage。在小程序端建议在pages.json里开启微信小程序的原生分享配置而不是自己写弹窗因为原生分享在 iOS 和安卓上表现更稳定。代码示例onShareAppMessage() { return { title: this.goods.name, path: /pages/goods/detail?id${this.goods.id}, imageUrl: this.goods.picUrl } }跳转 H5 则有两种情况一种是小程序跳到外部网页使用web-view组件需要在微信公众平台配置业务域名否则无法正常加载另一种是 H5 页面跳到小程序这个在你没有开通微信开放平台能力时是做不了的只能在 H5 页面引导用户打开小程序。这里有个比较容易踩的坑微信小程序的web-view域名必须在小程序后台的业务域名里配置过而且要验证文件放在服务器根目录。很多人辛辛苦苦写好 H5在小程序里打开却是空白页十有八九是域名没有配置。5. 商城类项目前后端联调时最容易翻车的几个点前后端联调阶段的坑和单纯写前端或后端的坑完全不同。这类问题在接口对接时才会暴露而且往往不会直接报错而是数据不对。5.1 金额字段分转元的精度问题芋道商城在设计上所有涉及金额的数据库字段都建议使用分作为单位存的是整数比如price字段存的是19900代表 199.00 元。这样设计的目的是避免浮点数运算带来的精度损失。但这也带来一个经典的联调问题后端接口返回的是分前端展示要转成元。Uniapp 端展示金额时一定要做统一的格式处理不能直接price / 100就完事因为 JavaScript 的浮点运算会有精度问题。比如999.99 * 100理论上应该等于99999但由于浮点原因可能会等于99998.99999999999。后端返回的金额是整数分的情况下前端可以这样处理// 金额格式化把分转成元 export function formatPrice(cents) { return (cents / 100).toFixed(2) }但更稳妥的方式是使用字符串拼接来转换或者后端直接返回元的字符串值。我在二开时和后端同事约定所有金额字段在 VO 层统一返回 String 类型的元避免前端各处转换逻辑不一致。5.2 接口返回一维数组与二维数组的差异处理在 Uniapp 端开发时经常遇到一个情况同一个接口在管理后台返回的数据是对象数组但在小程序端因为数据量限制后端会做分页嵌套包装返回的records是数组total是总数。很多新手在取数据时直接res.data.records导致在小程序端正常但在 H5 端异常或者反过来。芋道商城的分页接口统一返回结构是{ code: 0, data: { list: [...], total: 100 } }而某些非分页接口直接返回{ code: 0, data: [...] }前端封装统一的数据处理函数时要兼容这两种结构。比如在 request.js 里统一返回res.data.data.list还是res.data.data需要根据接口文档灵活处理。我的习惯是在封装层加一个getList()方法自动判断是否有list字段。5.3 地图组件遮挡与安卓启动图的适配问题商城系统里如果涉及到店自提、物流轨迹展示会用到地图组件。Uniapp 端使用地图主要有两个坑。第一个坑是 H5 端地图组件层级过高遮挡弹窗和商品卡片。Uniapp 的 H5 端 map 组件是原生渲染的它的层级天然高于普通 DOM 元素所以弹窗、底部菜单经常被地图盖住。解决办法是确保map组件在cover-view中使用或者在不需要地图时用v-if销毁它而不是v-show隐藏。安卓端这个问题尤其明显我在测试时发现地图在页面切换回来后会残留遮挡必须在onHide生命周期里销毁地图实例。第二个坑是安卓端启动图适配。打包 App 时启动图必须在manifest.json的 App 图标配置中为不同分辨率的屏幕准备对应尺寸的图片。如果你只上传了一张尺寸不符的图片安卓真机上会出现启动图拉伸或黑边。建议直接使用 HBuilderX 自带的启动图在线生成工具按要求上传一张 1080x1920 的源图让它自动生成所有分辨率再把生成结果导入工程。6. 部署上线与后续二开的整体建议本地跑通只是起点真正考验人的是部署上线。商城项目的部署比普通后台管理系统复杂因为涉及买家端 H5、管理后台、后端服务、数据库、Redis、对象存储等多个环节。6.1 在 Linux 服务器上的前后端部署流程后端部分最常规的做法是打包成 jar 丢到服务器上运行。使用 Maven 打包时需要跳过测试mvn clean package -Dmaven.test.skiptrue打包产物在yudao-server/target/目录下通过nohup java -jar启动然后配置 Nginx 反向代理。管理后台前端和买家端 H5 都是纯静态资源构建后把 dist 目录上传到 Nginx 的 web 目录即可。Uniapp 的 H5 端构建方式不是 npm run build而是用 HBuilderX 点击发行 - 网站-PC Web 或手机 H5然后选择输出目录。这里要留意H5 端部署后请求接口的路径如果是相对路径需要确认请求前缀匹配 Nginx 的代理规则比如/admin-api前缀代理到后端 48080 端口。小程序端打包则更繁琐。在 HBuilderX 中点击发行 - 小程序-微信会生成一个unpackage/dist/dev/mp-weixin目录然后在微信开发者工具中导入这个目录上传代码后还需要到微信公众平台提交审核。审核期间如果接口还没配置正式域名在小程序后台的开发管理 - 开发设置 - 服务器域名里添加 HTTPS 域名即可。6.2 常见问题清单与排查方向部署上线后前端现象和后端日志对不上是家常便饭。我把几个典型的线上问题和排查方向整理一下。线上现象排查方向H5 页面白屏看控制台是否有资源加载 404可能是静态资源路径问题小程序无法登录检查 request 域名是否配置是否使用 HTTPS接口返回 504后端服务是否存活Nginx 是否超时订单支付成功后订单状态未更新检查支付回调 URL 是否指向公网地址商品图片无法显示检查对象存储配置密钥是否过期特别说一下支付回调。本地调试时支付回调可以配到内网穿透工具上但正式上线一定要用 HTTPS 公网域名而且要在微信支付和支付宝的商户平台配置回调地址。芋道商城在管理后台的支付配置里填写回调地址注意路径要能公网访问否则支付成功后的异步通知丢失订单状态就一直卡在待支付。6.3 从这套源码延伸出去的方向芋道商城的价值不仅在于当商城用它的模块化设计让很多传统业务系统改造变得容易。我见过有团队拿它做本地生活服务平台把商品模块改成服务项目把订单模块改成预约单把营销模块改成会员卡券整个改造周期只用了两周。也有团队拿它的 Uniapp 端做多个小程序通过配置不同的后端地址快速生成不同品牌的小程序端避免了重复开发。对于个人学习来说这套源码也是很好的 Vue 实战案例。管理后台的动态路由、按钮权限、代码生成器Uniapp 端的多端适配、登录态管理、支付流程这些代码都是可以直接学习的例子。我个人的建议是不要急着改功能先用两个星期把代码从头到尾读一遍弄清楚请求从页面到后端再到数据库的完整链路这会让你在后面所有改动里都更有底气。另外如果你正在准备 Uniapp 或 Vue 相关的面试这套源码里的接口封装、动态路由、token 刷新、组件通信这些都是现成的面试素材。把真实项目里遇到的问题讲清楚比背面试题要有说服力得多。最后再说一个实用的小技巧在开始任何二次开发之前先把整个工程提交到自己的 Git 仓库做一个基线版本。之后无论你怎么改都能随时对比回滚。这套源码本身更新很快如果你在早期版本上做了大量改动后续想升级官方的新版本几乎不可能所以基线管理尤其重要。本文还有配套的精品资源点击获取
返回列表