简介:这是一套开箱即用的微信小程序商城前端源码,面向小程序初学者、快速原型开发者及教学实践者,解决无后台依赖下构建标准化电商界面与交互逻辑的需求。资源共172个文件,包含38个JS逻辑脚本(如functionData.js、showdown.js)、23个WXML结构模板、26个WXSS样式文件、21个JSON配置文件,以及55张PNG图标与8张JPG页面示意图,整体压缩包仅907KB,轻量易读易改。已有618人学习下载,适合作为小程序UI组件学习、页面跳转与数据绑定实践、模板消息集成参考的典型范例。源码覆盖完整商城核心模块:轮播图、多级分类、商品列表与详情、购物车、订单状态流转、促销活动展示等,并预置客服电话、运费规则、VIP标识等业务配置项,目录结构清晰,页面截图(如主页、分类页、支付页)直观呈现真实使用场景。 做商城小程序,最难受的一步往往不是界面写不好,而是后台系统迟迟定不下来。产品经理说先跑通流程,后端说接口还没排期,前端只能对着空白页面发呆。“不带后台”的商城源码,就是专门解决这个尴尬阶段的方案:商品数据直接内置在小程序本地,购物车用本地存储维护,订单在本地生成记录,整个购物链路不依赖任何服务器也能完整跑通。
这套源码最适合三类人。第一类是刚学小程序开发的新人,想研究商城页面怎么布局、购物车数量怎么联动、订单状态怎么流转;第二类是产品经理或独立开发者,需要快速做一个可交互原型去验证业务闭环;第三类是团队里后台还没就绪、但前端需要先动工的老手。说白了,它就是一个“先跑起来再说”的底子,核心价值在于把商城的前端交互完整沉淀下来,后续接真实接口时只需要替换数据层,不用重写页面。
很多人第一次看到“不带后台”会犯迷糊:没有后台,商品从哪来?订单存哪里?用户登录怎么办?我先把这套逻辑讲透,再带你从源码导入到功能改造一步步实操,最后把白屏、字体适配、分包加载这些高频坑一并列出来,能帮你省下大量查资料的时间。
1. 整体设计与思路拆解:没有后台的商城是怎么“活”起来的
1.1 不带后台的真相:数据层被“本地化”了
常规电商系统的数据流是“小程序 -> 接口 -> 后台 -> 数据库”,而“不带后台”的源码把整个数据链路压缩成了两层:页面直接读取内置数据文件,或通过 wx.request 请求一个远端 JSON 静态文件。商品列表是 JS 对象数组,商品详情是同一个对象,购物车是 Storage 里存的一个数组,订单是另一个数组,用户信息同样放在 Storage 里。数据没有消失,只是换了个地方住。
这种模式在源码层面一般表现为几个固定文件:data/goods.js存放商品基本信息,data/category.js存放分类关系,utils/里放价格格式化、购物车增删改查的工具函数。首页的轮播图、金刚区、推荐位也都是写死的配置数据,改一行数组,页面上立马变化。优点是结构极其清晰,新人看源码时能一眼分辨“哪段是页面渲染、哪段是数据操作”,对理解小程序开发的数据流很有帮助。
1.2 为什么有人愿意选“无后台”方案,而不是直接上云开发
云开发现在很方便,免费额度也够个人项目用,但严格来说它也算一种后台,很多小白卡在开通环境、初始化集合、配置权限上。不带后台的源码则完全绕开了这一步:下载项目、改个 AppID、编译,三分钟就能在模拟器里看到一个完整商城的模样。
从工程进度角度来看,无后台方案的核心价值是“让前端交互先定型”。需求阶段改页面布局、改商品展示逻辑的成本,远比后端接口定稿后再返工低。很多团队在实际落地时也是先用无后台源码把首页、分类页、购物车交互评审完,后台接口开发完后再逐个替换。它不替代后端,但它是需求的“可视化原型模板”。
1.3 这套源码解决什么,解决不了什么
能解决的:商城前端完整页面,商品展示、分类筛选、购物车联动、下单流程、我的页面;页面的加载与切换性能(因为数据都在本地);离线预览可能性,适合演示和教学;后续接接口时前端结构不需要大改。
解决不了的:商品库存真实扣减、订单同步到多终端、用户支付闭环、营销活动配置、后台数据统计分析。所以如果项目要正式上线收款,一定得接真实后端和微信支付。无后台源码给你的是“形”,真实运营还需要“魂”。理解了这一点,你才会合理预期,不踩坑、不背锅。
2. 核心细节解析:商城源码里那些容易忽略的关键点
2.1 商品数据组织:一个 JSON 对象藏着多少信息
无后台商城的商品数据通常长这样:
{ id: 1001, categoryId: 1, title: '无线蓝牙耳机', price: 199, originalPrice: 259, cover: '/images/goods/headset.png', images: ['/images/goods/headset_1.png', '/images/goods/headset_2.png'], skus: [ { name: '颜色', values: ['黑色', '白色'] }, { name: '版本', values: ['标准版', '套装版'] } ], detail: '商品详情描述…', stock: 999, sales: 128 }这种结构基本是商城后台商品模型的“最小集”。看源码时你要重点理解三个关联点:categoryId把分类和商品关联起来,分类页筛选时第一步就是拿当前选中分类的 id 去过滤商品数组;skus是前端做规格选择的数据底座,但无后台版本往往省略了不同规格对应不同价格和库存的能力,因为它本质上是静态数据,没法动态算 SKU 链路;images数组决定详情页轮播图数量。改造时若发现规格选择没反应,十有八九是源码实现里 SKU 只是展示,并没有和商品主数据做联动。
2.2 购物车:本地 Storage 的增删改查逻辑
购物车是无后台商城中最核心的交互模块,也是源码里最能看出开发者水平的部分。它的本质是一个数组,每个元素包含商品 id、规格文字、购买数量、单价、选中状态等字段。每次新增、修改数量、切换选中、删除都要从 Storage 里读出来、改完再写回去,这个过程叫“读改写”。
这里有几个细节值得留意。第一,商品加购时重复加入同一个商品,正确逻辑应该是数量累加而不是新增一条记录,判断依据是商品 id 加规格文字组合成的唯一 key;第二,购物车全选、反选、单项选的数据状态会影响底部结算栏的“合计金额”,源码中一般用一个computedTotal函数实时计算;第三,Storage 的 key 名建议用cartList这类固定常量,避免页面间传值不一致。
我见过的源码还有一个普遍习惯:把购物车操作方法全部收敛到utils/cart.js,页面里只调用addToCart、updateCount、removeItem,这样后续即使换成云数据库存储,页面层也不用动。你在读源码时如果发现购物车逻辑散落在各个页面里,就要小心后期维护成本。
2.3 页面间传参:商品详情页和列表页的衔接
列表页点击商品跳详情页时,通常用wx.navigateTo({ url: '/pages/goods/detail?id=' + id })带一个商品 id 过去。详情页在onLoad(options)里取到options.id,再到商品数据源里find出对应商品对象。这个传参逻辑很简单,但新手常踩两个坑:一个是商品 id 数字和字符串类型不一致导致find不到数据,页面白屏或空白;另一个是图片路径如果是相对路径,详情页的图片会失效,因为页面路径层级变了。
针对第二个坑,无后台源码里图片路径有个约定俗成的写法:/images/goods/xx.png开头的绝对路径,而不是../../images/xx.png。这样无论在列表页还是详情页都能正确加载。如果下载的源码图片全挂了,第一件事就是检查图片路径前缀是不是少了斜杠。
2.4 导航栏和 tabBar 配置:商城源码的门面
小程序商城的底部 tabBar 通常有四个:首页、分类、购物车、我的。app.json里的tabBar.list固定了每个 tab 的页面路径和图标,注意图标文件的绝对路径建议用/开头,并且尺寸要控制在 81x81 像素以内,否则真机上图标会变形模糊。
顶部导航栏方面,无后台源码一般用默认的navigationBarTitleText,但商城首页为了视觉好看,很多源码会把首页设为“自定义导航栏”,在json文件里声明"navigationStyle": "custom"。一旦自定义,页面顶部就会顶到状态栏,留给你的就是头秃的兼容问题。这时候需要获取状态栏高度和胶囊按钮位置,才能做出合理的标题布局。一套稳定的做法如下:
const systemInfo = wx.getSystemInfoSync(); const capsule = wx.getMenuButtonBoundingClientRect(); // 状态栏高度 const statusBarHeight = systemInfo.statusBarHeight; // 导航栏整体高度 = (胶囊顶部 - 状态栏高度) * 2 + 胶囊高度 const navBarHeight = (capsule.top - statusBarHeight) * 2 + capsule.height;这套计算几乎成了自定义导航栏的标准公式。源码里如果已经写了,建议保留;没写的话,你在做视觉调整时一定要补上,否则在带刘海屏和灵动岛的新机型上会翻车。
2.5 数据请求预留位:从静态数据到云端接口的“桥”
无后台源码并不是不能用 wx.request,只是默认不依赖。源码里通常会留一个request工具函数,常见的写法是:
function request(url, method = 'GET', data = {}) { return new Promise((resolve, reject) => { wx.request({ url: baseUrl + url, method, data, success: res => resolve(res.data), fail: err => reject(err) }); }); }这个函数就是后续接后端的“桥”。当你拿到真实接口后,要做的事情就是把data/goods.js的静态读取逻辑替换成request('/api/goods')。由于页面层和商品数据源是分离的,替换成本通常不高。无后台源码的聪明之处就在这里:它不是拒绝联网,而是把联网的入口给你留好了,用不用看你的阶段。
3. 实操过程:把商城源码跑起来并改造出自己的版本
3.1 环境准备:下载源码、注册测试 AppID、导入开发者工具
实操第一步是准备开发环境。你需要微信开发者工具(稳定版即可)、一个微信小程序测试号或自己的小程序 AppID、以及一份商城源码。
拿到源码后先不要急着编译,按顺序做三件事:第一,解压源码到纯英文路径下,中文路径偶尔会引发编译异常,尤其是 Windows 系统上;第二,用开发者工具“导入项目”,目录选择源码根目录,AppID 选择“测试号”(如果你只是学习,测试号足够),后端服务选择“不使用云服务”;第三,点击编译,如果看到首页渲染出来,说明环境没问题。
如果在导入时提示“当前版本开发者工具版本过低导致基础库无法运行”,去工具设置里把调试基础库调低或升级工具版本。源码一般使用 2.x 基础库,不需要追最新版。导入后先看看 Console 面板有没有红色的报错,常见的错误主要是图片资源路径不对、app.json 里注册了不存在的页面路径。
3.2 app.json 全局配置:把路由和外观理清楚
打开app.json,你会看到pages数组、window配置、tabBar配置。pages数组第一项就是小程序启动页,商城源码一般把首页放在第一位。如果你希望启动页是商品列表页,把对应路径挪到第一位即可。
window里的navigationBarBackgroundColor、navigationBarTitleText、backgroundColor决定了整站的默认导航栏样式。商城源码里常见的是"navigationBarBackgroundColor": "#ff4d4f"这类亮色主题,你要换品牌色时同步改这里和 tabBar 的selectedColor。
一个关键细节:如果你想把商城首页改成自定义导航栏,需要在pages/index/index.json里加"navigationStyle": "custom",而不是改全局window。因为只有首页需要沉浸式头部,其余页面保留默认导航条更省事。很多新手把自定义导航栏写进了全局配置,结果所有页面都要手动处理顶部间距,白白增加一堆工作量。
3.3 商品数据改造:替换图片和文案的完整步骤
无后台商城源码默认带的商品数据是示例数据,你要改成自己的商品信息,改的是各页面引用的商品数据文件。以常见的data/goods.js为例,操作流程如下:
- 打开
data/goods.js,确认商品数组的结构字段; - 准备你自己的商品图片,建议先压缩到 200KB 以下,宽高比和源码示例保持一致;
- 把图片文件放到项目的
images/goods/目录下,路径写/images/goods/你的文件名.png; - 按字段含义逐条替换商品标题、价格、库存、描述;
- 替换后重新编译,到首页、分类页、详情页分别检查图片和价格显示是否正常。
替换数据时最容易忽略的是sales(销量)和stock(库存)字段。如果源码有“销量排序”功能,sales字段缺失会导致排序结果异常;而stock字段虽然无后台版本不真正校验库存,但详情页的“库存不足”提示会读取它,不设置会出现“已售罄”按钮状态错误。保持每个字段都有值,是改造时最稳妥的做法。
3.4 页面级 JSON 配置:下拉刷新、分享和小标题
除了页面结构,每个页面文件夹下的.json文件控制着单页表现。商城列表页一般需要开启下拉刷新,对应的配置是:
{ "enablePullDownRefresh": true, "backgroundTextStyle": "dark" }详情页想支持分享到好友,需要写onShareAppMessage生命周期函数,并把当前商品的数据拼进path参数。比如:
onShareAppMessage() { return { title: this.data.goods.title, path: '/pages/goods/detail?id=' + this.data.goods.id }; }这样别人点开分享卡片时,详情页能根据 id 找到对应商品。如果分享出去后页面空白,基本可以确定是 id 传递或者商品查找失败。页面 JSON 配置里还有navigationBarTitleText,我建议每个页面都单独设置,而不是统一用全局标题,这样在微信后台的页面访问分析里能一眼看出用户停留在哪个功能模块。
3.5 从静态数据切换到云开发:不写后台也能“动态”更新商品
如果后续想脱离源码本地数据,又暂时不想自己开发后台,可以直接用微信云开发做过渡。具体做法是:在开发者工具里点“云开发”开通环境,建一个goods集合,把商品数据以 JSON 数组形式导入集合;然后改造商品列表页,把读取模式从“本地 require”换成“数据库查询”:
const db = wx.cloud.database(); db.collection('goods').get().then(res => { this.setData({ goodsList: res.data }); });这个改造只需要改数据源部分,页面的wxml模板基本不动。这样商品信息就能直接在云开发控制台里增删改,真正做到“不用开发后台也能动态维护商品”。这里有一个需要注意的点:云数据库默认权限下,前端读集合可能有权限限制,你要在集合权限设置里选择“所有用户可读,仅创建者可写”,否则真机上预览会读不到数据。
3.6 常见改造场景:增加搜索功能、购物车批量删除
大部分无后台商城源码不带搜索功能,需要自己加。最简单的实现是在首页顶栏加一个输入框,提交时跳转到商品列表页并带上关键词参数,列表页在onLoad里接收关键词后对商品数组做filter:
const keyword = options.keyword || ''; const filtered = goodsList.filter(item => item.title.indexOf(keyword) > -1); this.setData({ goodsList: filtered });购物车批量删除同样简单。在购物车数组上先通过filter把所有checked为true的项剔除,再写回 Storage,界面上的合计金额同步重算。这两处改造都是纯前端逻辑,不需要动架构,特别适合拿源码练手时加深理解。
4. 常见问题与排查技巧实录:开发与预览阶段的高频故障
4.1 Tab 页面切换白屏:“一瞬白”的真相与解法
网上讨论非常多的问题就是“原生微信小程序 tab 页面切换会白屏一瞬间”。这个问题在商城源码上尤其明显,因为 tabBar 的首页和分类页都有大量图片渲染。白屏的直接原因通常是页面渲染和 WebView 切换不同步,常见于 Android 设备,尤其是低端机或复杂页面。
解决方案有几个层级。最优先做的是把首页的图片资源压缩,避免一次性加载大量高清大图;其次,在页面onShow里不要做重型计算,把数据请求或过滤逻辑放到onLoad里,因为onShow每次切换 tab 都会触发;另一个很有效的办法是使用骨架屏,在数据未渲染前先展示占位视图,视觉上减少白屏观感。如果源码里首页写了复杂的onShow逻辑,优先检查那里有没有耗时的同步任务。
4.2 开发工具报错:maximum setlocal recursion level reached
这是一个容易被忽略的问题。有用户在编译时遇到[微信小程序开发者工具] maximum setlocal recursion level reached.,这实际上不是小程序代码的问题,而是 Windows 环境变量PATH过长导致的开发者工具进程启动异常。处理方法很简单:清理 Windows 系统里的用户环境变量,把不用的路径删掉,或者用管理员身份打开开发者工具。遇到这类报错时先别急着改代码,先看看是不是环境本身的问题,能省下半小时排查时间。
4.3 rpx、1rem 和顶部导航栏高度的那些误解
小程序官方适配单位是rpx,它是按屏幕宽度 750 设计稿进行比例的,不是 CSS 的rem。有的源码注释或教程里把两者混为一谈,导致新手改了font-size: 0.5rem后在不同屏幕上表现不一致。在微信小程序里我建议你记住一条原则:所有尺寸优先用rpx,但涉及文字时如果追求像素级一致,可以用px结合wx.getSystemInfo动态换算。边框粗细这种需要保持物理像素一致的场景,也建议直接写1rpx或0.5px,避免在不同 DPR 手机上粗细不一。
顶部导航栏的高度问题在上面已经给出公式,这里再补充一个细节:wx.getMenuButtonBoundingClientRect()返回的胶囊位置在 Android 和 iOS 上存在差异,所以不要硬编码导航栏高度。自定义导航栏的页面一定在拿到胶囊信息后再渲染标题,否则会出现标题上下偏移。商城首页如果放了自定义头部,这个细节直接决定页面是否显得“专业”。
4.4 真机预览和开发者工具表现不一致的问题
开发者工具里一切正常,一上真机就白屏、布局错乱或图片加载失败,这类问题几乎每个人都会遇到。总结下来常见原因有三种:第一,图片资源是本地相对路径,但源码引用时大小写和实际文件名不一致,电脑开发工具对大小写不敏感,真机文件系统敏感,直接导致图片加载失败;第二,开发者工具基础库版本和手机微信基础库版本不一致,某些 API 在低版本上不可用,重点检查app.json里的"libVersion"设置,建议和手机基础库保持一致;第三,本地网络域名问题,如果你在源码里预留的接口请求走了http协议且没配合法域名,真机会直接请求失败,开发者工具里却因为勾选了“不校验合法域名”而正常。
排查这类问题有个通用流程:先看真机 vConsole 日志,确认是资源加载失败还是接口请求失败,再分别检查路径和域名;工具真机调试面板里的 Network 标签也能看到资源请求状态,基本都是 404 或 fail,一下就能定位。千万不要只在模拟器里反复编译,真机日志才是最终答案。
4.5 支付虚拟支付、截图限制等特定场景避坑
商城源码虽然不带真实支付,但如果你是开发者,迟早会遇到“虚拟支付”提示。微信小程序明确不支持虚拟支付,如果商品属于虚拟服务类(比如会员卡、在线课程、充值类),真实上线前必须有实物或线下履约业务支撑,否则审核阶段就会被打回。这是平台规则层面的事,源码本身没法解决,只能在上线规划时提前避开。
关于截屏限制,现在可以调用wx.setVisualEffectOnCapture({ visualEffect: 'hidden' })设置页面在截屏时隐藏敏感信息,适合订单确认页或优惠码页面。这个 API 的基础库版本要求是 2.11.0 以上,使用时注意做兼容判断。商城源码里订单确认页如果展示用户手机号、地址,可以考虑加上,避免用户分享或系统截屏时隐私泄露。
4.6 uni-app 开发的商城白屏,和原生小程序排查方向不一样
网上热词里有一类“uniapp 做微信小程序在手机上预览没问题,但是在微信开发者工具上是白屏”,这个方向和无后台原生源码的调试思路不同。如果你使用的是 uni-app 开发的商城,开发者工具白屏通常是因为uni-app编译产物和开发者工具版本的兼容问题,优先检查开发者工具的“本地设置”里是否开启了ES6 转 ES5、是否使用npm 模块,以及minified配置。另一个常见原因是 eslint 报错导致编译中断,页面没渲染出来,Console 面板会有明显报错提示。
如果你拿到的“不带后台”源码其实是用 uni-app 写的,那上手逻辑和原生小程序会有差异:页面文件可能是.vue格式,生命周期钩子叫onLoad但实际来自 uni-app 的插件语法。这时先确认技术栈,再按对应方案梳理数据流和数据文件,不要用原生小程序的思路去改.vue文件,会越改越乱。
5. 从“不带后台”到“能运营”:无后台源码的升级路径
5.1 引入云开发:给商城补上订单和商品管理能力
当你用无后台源码跑通流程、确认交互没问题后,下一步往往是补管理能力。成本最低的方案是云开发。在商品数据层面,前面已经讲了把商品集合迁到云数据库的方法;订单层面,用户提交订单时不再只写本地 Storage,而是写入云数据库的orders集合。这样管理端可以在云开发控制台里查看订单,甚至导出 Excel,基本满足小规模自营的运营需求。
订单写入云数据库的代码大致如下:
const db = wx.cloud.database(); const orders = db.collection('orders'); orders.add({ data: { orderNo: 'ORD' + Date.now(), total: this.data.totalPrice, goodsList: this.data.cartList.filter(i => i.checked), address: this.data.address, status: 1, createTime: db.serverDate() } });需要提醒的是,云函数在正式项目里通常承担服务端角色,不要把wx.cloud.database()的增删改查操作全暴露在前端,涉及订单金额计算和用户身份校验最好放在云函数里。但作为从源码到可运营的“最小改造”,前端直写集合可以先把流程攒起来,后续再逐步收敛到云函数。
5.2 对接真实后台接口的替换策略
如果你的团队后端已经就绪,要做的就是把data/goods.js静态数据源替换成wx.request请求。我建议替换时做一个“数据适配层”,统一在utils/api.js里封装函数,比如getGoodsList()、getGoodsDetail(id)、submitOrder(data),页面只调用这些函数,不直接操作数据源。这样后端接口变动时只需要改api.js,不用全项目搜代码。
一个小技巧是:先让后端把返回数据结构设计成和现有静态数据一致的模型,前端不用大改页面模版,后端只加code/message/data包裹层即可。如果后端返回的数据模型差距很大,前端只需要在api.js里做一层字段映射,把goods_name映射成title、goods_pic映射成cover。这个把接口差异“消化在适配层”的做法,能显著降低联调阶段的心智负担。
5.3 学习与扩展建议:有源码更要读懂源码,不要只做“CV 工程师”
对于学习小程序的开发者,我特别建议不要只把源码当模板一粘了事。拿到源码后,先把它“读薄”:用思维导图画出页面结构、数据流、每个页面的生命周期;再把它“改厚”:自己加一个商品标签筛选、加一个收藏功能、把购物车改成滑动删除,每加一个小功能都会逼你去理解原有代码的边界和耦合点。
带后台代码 vs 不带后台代码,对初学者的区别在于后者让你被迫理解数据在前后端链路中的位置,因为你没有后端可以甩锅,一切逻辑都在前端闭环里。你可以在本机上改任意一处代码,马上看到结果,这种即时反馈对建立判断力非常宝贵。先读懂、再改错、最后重写,一套源码学下来,比看十遍教程都管用。
6. 无后台商城源码常见问题速查表
| 问题现象 | 可能原因 | 排查方向 |
|---|---|---|
| 编译后首页白屏 | 页面路径注册错误、图片路径失效、未导入 merchants 数据文件 | 检查 app.json 的 pages 数组和 Console 报错 |
| 真机图片加载失败,工具预览正常 | 路径大小写、文件名不一致 | 检查图片文件名和引用路径大小写是否完全一致 |
| 商品详情页找不到商品 | id 类型不一致或传参丢失 | 在详情页 onLoad 打印 options.id,并和商品数据源 id 比对 |
| 购物车数据刷新后丢失 | 只存在 Page data 中,未写入 Storage | 查看 utils/cart.js 是否每次变更后调用 wx.setStorageSync |
| 切换 tab 白屏闪烁 | 页面 onShow 重逻辑、图片过大 | 压缩图片,把请求逻辑移到 onLoad |
| rpx 在不同手机显示不一致 | 单位被写成了 rem 或用错了 px | 统一改用 rpx |
| 自定义导航栏在刘海屏错位 | 没读取胶囊按钮位置和状态栏高度 | 用官方公式动态计算 |
| 请求接口真机不通,工具正常 | 域名未配置、未关闭工具校验 | 配置合法域名或在工具中临时跳过校验 |
| 分享卡片打开空白 | 分享 path 没带商品 id 或 id 查找失败 | 检查 onShareAppMessage 的 path 参数 |
| 云开发读取商品集合无数据 | 集合权限限制或数据未导入 | 检查集合权限和数据是否确实导入 |
最后分享一个我自己的实操习惯:拿到任何无后台商城源码,我第一件事不是看页面效果,而是找data/goods.js和utils/cart.js这两个文件,把它们从头到尾读一遍,标注出哪些方法是“全局共用”的、哪些数据是“跨页面传递”的。这套读代码的顺序不变,后面不管接到云开发还是真实后台,心里都有一张清晰的地图。这套源码的边界就在那里,你清楚它能做到哪里、不能做到哪里,才不会在项目排期里被无谓的技术方案折腾。
本文还有配套的精品资源,点击获取