拓冰建站拓冰建站
首页 / 资讯中心 / 正文

美妆护肤小程序商城搭建指南:从零代码到原生开发全流程

很多刚开始接触小程序商城的朋友会把“搭建”想成一件需要编程基础才能完成的事。实际上美妆护肤品小程序商城的搭建路径并不只有一条你可以完全使用零代码平台也可以用微信官方工具写一个可运行的商城雏形。对于想要长期运营品牌、把用户沉淀在自己后台的店主来说从零开始理解一个小程序商城如何构成反而更重要。这篇文章会从美妆护肤品小程序的整体概念讲起覆盖账号注册、开发者工具安装、页面结构、商品列表、商品详情、购物车以及上线发布前需要准备的内容。就算你是完全小白只要跟着章节一步步操作也能得到一个能在微信开发者工具里预览的商城雏形。1. 美妆护肤品小程序商城本质上是做什么的1.1 小程序商城解决什么问题传统美妆护肤品的销售场景通常依赖线下门店、微信朋友圈接单、微信群团购或者淘宝天猫。这些渠道各有各的问题朋友圈发图容易被刷过去微信群团购需要人工统计订单淘宝店铺又要面临平台流量竞争。小程序商城的核心价值在于它长在微信生态里客户不需要额外下载 App点开就能逛商家可以把商品图片、详情、价格、规格、购物车、订单都放到一个独立“门面”里。配合公众号、视频号、企业微信就形成了私域运营的闭环。对美妆护肤品类来说小程序商城还有几个特殊价值可以按护肤、彩妆、香水、身体护理等维度做分类。可以把同一款商品的多个规格、多张细节图集中展示。可以在详情页讲成分、讲肤质适配、讲使用方法比朋友圈一张图的信息量大得多。后续可以扩展会员积分、优惠券、分销裂变等功能。1.2 常见的小程序商城搭建方式目前市面上能做成美妆护肤品小程序商城的方案可以分成这三类方案是否写代码主要成本适合人群第三方商城 SaaS 平台基本不写代码后台拖拽配置按年付费、交易抽佣或增值功能付费想快速开店、缺乏技术支持的店铺云开发模板 / 开源商城源码少量修改代码需要会部署服务器或云开发按量付费有一定基础想低成本自研微信原生小程序 DIY需要写 WXML、WXSS、JS主要是人工成本服务器可选想深度定制、学习小程序开发的个人或团队这三种方案并不冲突。我见过不少店主先用 SaaS 快速验证模式等订单量上来后再找人定制开发。如果你本身有学习意愿用原生小程序写一个商城 Demo也是理解小程序底层逻辑非常有效的方式。1.3 零基础到底怎么选如果你是“今天就要开店”型先考虑 SaaS如果你是“想长期自主运营、不想被平台抽成”型至少要学会微信小程序的基础开发流程。本文后面的内容会尽量兼顾两条路线但重点放在“使用微信开发者工具搭建一个真实可运行的美妆护肤品商城雏形”上。2. 搭建前需要的账号和工具准备2.1 注册小程序账号打开微信公众平台官网选择“小程序”注册。注册时需要使用一个从未绑定过公众号或小程序的邮箱。注册完成后需要选择主体类型。这里要特别提醒美妆护肤品商家微信支付的正常开通通常要求主体为企业、个体工商户等营业执照主体。个人主体小程序在电商类目和支付权限上有很大限制所以如果你是想真实卖货不是做学习测试建议直接用营业执照注册。注册完成后登录小程序后台在“设置 - 基本设置”里可以看到 AppID。AppID 是后续开发者工具必填的参数相当于这个小程序的身份证。2.2 小程序认证与备案小程序注册成功后还需要完成微信认证。认证成功后部分高级接口才可以使用。另外根据目前的监管要求小程序上线通常还需要完成 ICP 备案。这个小程序备案流程可以在微信公众平台后台发起需要填写主办者信息、小程序名称、服务内容等。因为涉及个人或企业真实信息建议由营业执照法人或熟悉工商信息的同事来操作。2.3 安装微信开发者工具在微信官方下载页面找到“微信开发者工具”根据操作系统下载稳定版即可。第一次打开需要用管理员微信扫码登录。安装完成后新建项目时会看到几个输入框项目名称例如“美妆商城演示”。目录选择一个空文件夹。AppID填入刚才注册得到的小程序 AppID。后端服务如果暂时不需要云开发选择“不使用云服务”。如果你是第一次做项目建议先选择“小程序”模板而不是“小游戏”或“插件”模板。3. 一个美妆护肤商城的基本项目结构3.1 页面组成在动手写代码之前先想清楚商城需要哪些页面。一个最小可用的美妆护肤品商城至少包含这些页面页面作用首页展示 banner 图、主推商品、活动入口商品列表 / 分类按护肤、彩妆等分类展示商品商品详情展示图片、价格、规格、成分和“加入购物车”按钮购物车查看已选商品、修改数量、计算总价个人中心展示头像、订单入口、售后入口在微信原生小程序里每个页面通常由四个同名的文件组成.wxml类似 HTML负责页面结构。.wxss类似 CSS负责样式。.js负责数据和交互逻辑。.json负责页面级配置。3.2 全局配置 app.json新建项目后先打开根目录下的app.json。这个文件负责注册所有页面、设置窗口样式、配置底部导航栏。下面是一个适合美妆商城的配置示例{ pages: [ pages/index/index, pages/category/category, pages/detail/detail, pages/cart/cart, pages/user/user ], window: { navigationBarTitleText: XX美妆小铺, navigationBarBackgroundColor: #ffffff, navigationBarTextStyle: black, backgroundColor: #f7f7f7 }, tabBar: { color: #999999, selectedColor: #d43d8c, backgroundColor: #ffffff, borderStyle: black, list: [ { pagePath: pages/index/index, text: 首页 }, { pagePath: pages/category/category, text: 分类 }, { pagePath: pages/cart/cart, text: 购物车 }, { pagePath: pages/user/user, text: 我的 } ] } }配置说明如下pages数组的第一个元素是小程序启动后默认打开的页面。所有用到 tabBar 的页面必须写在pages数组里。navigationBarTitleText是顶部导航栏文字可以改成你的店铺名。selectedColor建议替换成与美妆品牌调性一致的颜色比如玫红、裸粉、深棕。如果 tabBar 暂时不想用图标只保留文字也没有问题后续想要更精致的体验再准备 81px 的 PNG 图标配置iconPath和selectedIconPath。4. 核心开发实战从商品数据到购物车4.1 准备一份商品数据文件微信小程序页面不能直接读取本地 Excel所以第一步是先准备一份结构化的商品数据。这些数据可以暂时放在utils/products.js文件里方便首页、分类页、详情页共同引用。在项目根目录新建utils文件夹然后新建products.jsconst products [ { id: 1, name: 水润保湿精华水, category: 护肤, price: 128, originalPrice: 169, sales: 3266, img: /images/p1.jpg, desc: 质地清爽适合日常基础保湿。 }, { id: 2, name: 丝绒哑光口红, category: 彩妆, price: 99, originalPrice: 129, sales: 5210, img: /images/p2.jpg, desc: 柔雾质地上唇显色度高。 }, { id: 3, name: 温和氨基酸洁面乳, category: 护肤, price: 68, originalPrice: 89, sales: 1832, img: /images/p3.jpg, desc: 弱酸性配方洗后不紧绷。 }, { id: 4, name: 清透隔离防晒乳, category: 护肤, price: 156, originalPrice: 199, sales: 984, img: /images/p4.jpg, desc: 轻薄不假白适合日常通勤。 } ]; module.exports { products: products };注意以上数据里的图片路径只是示意。你需要在小程序根目录下创建images文件夹并把真实商品图片命名为p1.jpg、p2.jpg等或者修改img字段为实际图片路径。新手最容易犯的错误是图片使用网络链接但是没有把图片域名配置到小程序的合法域名中。开发阶段可以在开发者工具右上角“详情 - 本地设置”勾选“不校验合法域名”但上线后必须使用 HTTPS 图片并且配置合法域名。这个问题在后续章节会详细说明。商品数据放到独立文件里核心原因是方便多页面复用。首页展示热销商品详情页通过id找到对应商品购物车也需要商品名称、图片和价格。数据源统一后修改一次商品价格所有页面会同步更新。4.2 实现商品列表首页首页的 WXML 结构可以这样写。打开pages/index/index.wxmlview classpage view classbanner image src/images/banner.jpg modewidthFix / /view view classsection-title热销单品/view view classproduct-grid view classproduct-card wx:for{{productList}} wx:keyid bindtapgoDetail >const { products } require(../../utils/products.js); Page({ data: { productList: [] }, onLoad() { this.setData({ productList: products }); }, goDetail(event) { const id event.currentTarget.dataset.id; wx.navigateTo({ url: /pages/detail/detail?id id }); } });这里的bindtapgoDetail表示点击卡片时触发goDetail函数。>.page { background: #f7f7f7; min-height: 100vh; padding-bottom: 40rpx; } .banner image { width: 100%; height: 320rpx; display: block; } .section-title { font-size: 34rpx; font-weight: 600; margin: 30rpx 24rpx 20rpx; } .product-grid { display: flex; flex-wrap: wrap; padding: 0 12rpx; } .product-card { width: calc(50% - 24rpx); background: #ffffff; margin: 12rpx; border-radius: 16rpx; overflow: hidden; } .product-img { width: 100%; height: 320rpx; } .product-name { font-size: 28rpx; color: #333333; padding: 12rpx 16rpx 4rpx; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .product-info { display: flex; justify-content: space-between; align-items: center; padding: 8rpx 16rpx 18rpx; } .product-price { color: #d43d8c; font-size: 32rpx; font-weight: 600; } .price-symbol { font-size: 22rpx; } .product-sales { font-size: 22rpx; color: #999999; }这段样式使用了rpx作为单位。rpx是微信小程序里的自适应单位屏幕宽度按 750rpx 计算这样同一套样式在不同手机上显示比例基本一致。4.3 商品详情页与“加入购物车”商品列表的每个商品都绑定了跳转函数跳转 URL 中带上了id。接下来实现pages/detail/detail.js接收 URL 上的商品 id并展示商品信息。写入以下内容到pages/detail/detail.jsconst { products } require(../../utils/products.js); Page({ data: { product: null }, onLoad(query) { const id Number(query.id); const product products.find(function (item) { return item.id id; }); this.setData({ product: product || null }); wx.setNavigationBarTitle({ title: product ? product.name : 商品详情 }); }, addToCart() { const product this.data.product; if (!product) { return; } let cartList wx.getStorageSync(cartList) || []; const index cartList.findIndex(function (item) { return item.id product.id; }); if (index -1) { cartList[index].num 1; } else { cartList.push({ id: product.id, name: product.name, price: product.price, img: product.img, num: 1 }); } wx.setStorageSync(cartList, cartList); wx.showToast({ title: 已加入购物车, icon: success }); } });这里使用wx.getStorageSync和wx.setStorageSync完成购物车数据的本地存取。对于个人学习者或者早期验证阶段这种本地购物车方案足够让你快速跑通流程。但它有一个明显限制购物车数据只存在当前手机本地换设备后看不到。真实商用必须把购物车和订单数据保存到服务器或云数据库。详情页的 WXML 可以是view classdetail-page wx:if{{product}} image classdetail-img src{{product.img}} modeaspectFill / view classdetail-info view classdetail-price¥ {{product.price}}/view view classdetail-name{{product.name}}/view view classdetail-desc{{product.desc}}/view /view view classdetail-bottom view classcart-btn bindtapaddToCart加入购物车/view /view /view view wx:else classempty-tip商品不存在或已下架/view对应的样式可以自行补充核心是要把底部的“加入购物车”按钮固定住方便用户在看完详情之后单击加入。样式示例.detail-page { padding-bottom: 120rpx; } .detail-img { width: 100%; height: 500rpx; } .detail-info { padding: 24rpx; background: #ffffff; } .detail-price { color: #d43d8c; font-size: 44rpx; font-weight: 600; } .detail-name { font-size: 34rpx; color: #333333; margin-top: 12rpx; } .detail-desc { color: #888888; font-size: 26rpx; margin-top: 16rpx; line-height: 1.6; } .detail-bottom { position: fixed; left: 0; right: 0; bottom: 0; padding: 16rpx 24rpx; background: #ffffff; box-shadow: 0 -4rpx 12rpx rgba(0, 0, 0, 0.04); } .cart-btn { width: 100%; height: 88rpx; line-height: 88rpx; text-align: center; color: #ffffff; background: #d43d8c; border-radius: 44rpx; }4.4 购物车页面数量加减、删除与总价购物车页面是整个商城 Demo 中最能体现小程序数据绑定逻辑的部分。当用户从详情页加入商品后购物车页面需要在每次显示时重新读取本地缓存。实现pages/cart/cart.jsPage({ data: { cartList: [], totalPrice: 0 }, onShow() { const cartList wx.getStorageSync(cartList) || []; this.setData({ cartList: cartList }); this.updateTotal(); }, changeNum(event) { const id Number(event.currentTarget.dataset.id); const delta Number(event.currentTarget.dataset.delta); const cartList this.data.cartList; const index cartList.findIndex(function (item) { return item.id id; }); if (index -1) { return; } const newNum cartList[index].num delta; if (newNum 0) { return; } cartList[index].num newNum; this.setData({ cartList: cartList }); wx.setStorageSync(cartList, cartList); this.updateTotal(); }, removeItem(event) { const id Number(event.currentTarget.dataset.id); let cartList this.data.cartList; cartList cartList.filter(function (item) { return item.id ! id; }); this.setData({ cartList: cartList }); wx.setStorageSync(cartList, cartList); this.updateTotal(); }, updateTotal() { let total 0; this.data.cartList.forEach(function (item) { total item.price * item.num; }); this.setData({ totalPrice: total.toFixed(2) }); }, goCheckout() { if (this.data.cartList.length 0) { wx.showToast({ title: 购物车还是空的, icon: none }); return; } wx.showToast({ title: 示例版暂未接入支付, icon: none }); } });购物车 WXML 可以写为view classcart-page view classcart-list wx:if{{cartList.length 0}} view classcart-item wx:for{{cartList}} wx:keyid image classcart-img src{{item.img}} modeaspectFill / view classcart-info view classcart-name{{item.name}}/view view classcart-price¥ {{item.price}}/view view classcart-bottom view classnum-control text classnum-btn bindtapchangeNum >
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门