ARTICLE DETAIL

资讯详情

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

Flask+uniapp打造畲族文创商城:微信小程序全栈开发实战

Flask+uniapp打造畲族文创商城:微信小程序全栈开发实战 1. 项目概述与方案选型1.1 畲族文创商城到底要做什么先说清楚这个项目解决的痛点。福建是畲族人口最集中的省份畲族有着凤凰装、畲歌、三月三、彩带编织这些非常有辨识度的文化符号但长期以来这些文化资源分散在各个村落和传承人手里缺乏一个集中的线上展示和销售渠道。外地游客想买一件正宗的手工银饰不知道去哪买本地传承人做了好东西也只能靠线下集市和熟人圈子慢慢卖。这个平台要做的就是用一个微信小程序把文化展示和商品交易两件事合到一起去——让用户一边看畲族文化故事一边下单买文创产品。从技术视角看这个项目本质上是一个典型的电商系统但比普通电商多了一层文化内容模块。这就意味着你不能只做商品CRUD和订单流程还得考虑文化内容的组织方式——比如非遗项目的分类、传承人故事、图文视频的展示形式以及这些内容如何自然地引导到商品页而不是生硬地做广告。这是整个项目设计时最需要想清楚的地方。1.2 为什么用Flask uniapp这套技术栈选Flask做后端最直接的原因是项目体量适中团队如果只有一两个开发者用Flask这种轻量框架能快速把API搭起来不用像Django那样带一堆默认配置。而且Python生态做数据处理和内容管理很方便后台上架商品、维护文化专题都能快速写脚本。另外一个实际考量是Flask的SQLAlchemy ORM对电商这种多表关联的开发非常顺手用户表、商品表、订单表、库存表之间的关系清晰直接后期如果要加数据分析功能Python的pandas可以直接接数据库做统计不用切换语言。前端选uniapp核心就一个理由一套代码跑微信小程序、App、H5。虽然这个项目主要目标是微信小程序但畲族文创这类旅游文化产品很多场景是在景区扫二维码打开H5页面游客不用下载小程序就能看到商品和文化介绍。uniapp的uni-ui组件和微信小程序原生API对接做得比较好像微信登录、支付、分享这些高频操作都有现成的封装开发效率比原生小程序写WXML快不少。而且uniapp的vue3语法对前端开发者来说上手成本低招人也好招。这里补充一个选型背后的实际考量。当初要不要用Spring Boot或者Node.js也纠结过最后定Flask是因为这个项目的核心人员在Python数据处理和爬虫上有经验后期要给商品打文化标签、做用户画像分析的时候Python的文本处理和机器学习库直接用起来不用跨语言调服务。如果你团队是Java背景当然可以用Spring Boot但如果是Python背景想做文化电商Flask是性价比最高的选择。1.3 系统整体模块划分这个平台从功能上拆可以分成两大块四小条。内容展示侧畲族文化库非遗项目、传承人故事、节庆活动、文创商品展示图文详情、视频演示、文化元素解读。交易侧用户中心微信登录、地址管理、订单查询、购物流程购物车、下单、微信支付、物流跟踪、商家后台商品管理、库存管理、订单处理。用户端小程序uniapp ↓ HTTPS/JSON Flask API服务 ↓ SQLAlchemy MySQL数据库商品/订单/用户/内容 ↓ 对象存储图片/视频 Redis缓存商品详情/会话这套结构的好处是前后端完全分离小程序端只管UI和交互Flask只管出接口数据存储独立后期要加管理后台、数据大屏或者做App端都不用动核心逻辑。2. 数据库设计与后端API实现2.1 核心数据表结构设计电商系统最忌讳的就是表设计没想清楚就开写后面改起来全是返工。这个项目的表结构我按领域划分成三组每组之间只用外键关联。用户域用户表users、收货地址表addresses。用户表设计时除了微信openid和unionid一定要预留nickname、avatar字段因为后续可能接入抖音小程序或者App端多端用户的昵称头像不能混在一起存。商品域商品表products、商品图片表product_images、商品SKU表product_skus、库存表inventory。畲族文创产品的SKU很特别像银饰是按克重和尺寸分SKU的彩带是按图案和长度分SKU的设计SKU表时要用JSON字段存规格属性这样加新规格不用改表结构。订单域订单表orders、订单明细表order_items、支付流水表payment_records。订单表要单独存一个order_sn字段做业务订单号不要用数据库自增id方便后期跟物流系统和财务对账。CREATE TABLE products ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(200) NOT NULL, category_id INT NOT NULL, culture_tag VARCHAR(100), description TEXT, cover_image VARCHAR(500), video_url VARCHAR(500), status TINYINT DEFAULT 1, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE product_skus ( id INT AUTO_INCREMENT PRIMARY KEY, product_id INT NOT NULL, sku_attrs JSON, price DECIMAL(10,2) NOT NULL, stock INT NOT NULL DEFAULT 0, sales INT NOT NULL DEFAULT 0 ); CREATE TABLE orders ( id INT AUTO_INCREMENT PRIMARY KEY, order_sn VARCHAR(32) NOT NULL UNIQUE, user_id INT NOT NULL, total_amount DECIMAL(10,2) NOT NULL, status TINYINT DEFAULT 0, address_snapshot JSON, created_at DATETIME DEFAULT CURRENT_TIMESTAMP );2.2 微信登录与JWT认证的完整流程微信小程序登录和后端Session方案跟传统Web登录不一样它不涉及用户名密码全靠微信的code2session换openid。流程是这样的小程序端先调用wx.login拿到临时code然后发给后端后端拿这个code去微信的接口换openid和session_key。openid是用户在这个小程序里的唯一标识session_key用来解密用户手机号等敏感信息。拿到openid后我建议不要直接拿它当登录凭证返回给前端而是生成一个自己的token用JWT实现。原因很简单openid是长期有效的身份标识如果直接暴露给前端一旦被拿到就能冒充用户。JWT加一个过期时间比如2小时过期配合refresh_token保证用户体验这样安全性和便利性平衡得比较合理。# Flask后端处理微信登录 import requests from itsdangerous import TimedJSONWebSignatureSerializer as Serializer app.route(/api/auth/wx_login, methods[POST]) def wx_login(): code request.json.get(code) appid current_app.config[WX_APPID] secret current_app.config[WX_SECRET] # 向微信服务器换openid resp requests.get( fhttps://api.weixin.qq.com/sns/jscode2session, params{ appid: appid, secret: secret, js_code: code, grant_type: authorization_code } ).json() if errcode in resp: return jsonify({code: 400, msg: 微信登录失败}) openid resp[openid] user User.query.filter_by(openidopenid).first() if not user: user User(openidopenid, nickname微信用户) db.session.add(user) db.session.commit() s Serializer(current_app.config[SECRET_KEY], expires_in7200) token s.dumps({uid: user.id}).decode() return jsonify({code: 200, data: {token: token, user: user.to_dict()}})2.3 商品列表与文化分类的联查畲族文创商品有一个很典型的浏览场景用户先看了一个关于畲族银饰非遗的专题文章然后想看看有哪些银饰可以买。这就要求商品接口不仅要支持按价格、销量排序还要支持按文化标签筛选。我建议在商品表里单独加一个culture_tag字段存的就是文化分类的标识。这样设计比建关联表简单因为一个商品主要只属于一个文化主题用字段直接查效率更高。但如果你后续要做一个商品对应多个文化标签的推荐逻辑那就需要商品-文化-标签多对多关联表前期可以先不设计后期数据量大了再拆。商品列表接口建议用Flask的marshal_with做序列化控制返回字段不要把description全文都丢出来列表页只需要标题、封面、价格、销量四个字段。详情页再单独查详情接口分开流量消耗能省不少。3. 小程序前端与uniapp开发实践3.1 页面架构与tabBar配置微信小程序的tabBar最多支持5个畲族文创商城我建议分成四个首页、文化、购物车、我的。首页放推荐商品和专题活动入口文化板块专门做畲族文化的图文和视频内容购物车和我的就是标准的电商功能。uniapp里配置tabBar要同时改pages.json和manifest.json。pages.json里定义tabBar列表每个tab至少需要pagePath和text图标iconPath和selectedIconPath可以用本地图片。这里有个坑tabBar的图标必须用png格式而且建议尺寸81px*81px太大或太小都会被微信小程序端自动缩放但缩放后清晰度会打折。pages.json中tabBar配置节选 tabBar: { color: #8A8078, selectedColor: #C62F2F, list: [{ pagePath: pages/index/index, text: 首页, iconPath: static/tab/home.png, selectedIconPath: static/tab/home-active.png }] }3.2 商品展示页的视频与图片处理畲族的手工艺商品比如银饰锻打过程、彩带编织过程用视频展示比图片直观得多。uniapp里用video组件播放视频但要注意两个问题一是视频文件体积建议用微信云开发的存储或者阿里云OSS转码成HLS切片保证弱网环境也能流畅播放二是video组件的封面图小程序端video组件需要设置poster属性不然加载时是黑屏体验很不好。商品图片用swiper组件做轮播这个比较常规但有个细节值得注意不要把所有图片一次性加载。小程序端swiper默认会加载当前页和相邻页的图片图片多的时候建议用v-if控制只渲染当前显示的图片swiper的current变化后再切换渲染不然首屏加载会特别慢。3.3 购物车与订单提交的前端流程购物车在uniapp里实现我推荐用pinia做状态管理vue3的uniapp项目。原因很简单购物车的选中状态、商品数量、总价这些数据如果在每个页面各自管理切页之后状态容易丢失用户加了好多商品一刷新购物车空了这个体验灾难级别的。用pinia把购物车状态全局化同时配合uni.setStorageSync做持久化。订单提交时前端要做两件事一是把购物车选中的商品信息格式化传给后端二是把后台返回的订单号接住跳转到支付页。这里有个非常重要的细节订单金额千万别信任前端传过来的数字前端传商品id列表和数量后端重新从数据库查价格来计算总价防止用户篡改请求。这是电商系统的基础防坑原则。3.4 微信支付接入与回调处理微信支付的商户号开通后后端需要做三件事统一下单、签名生成、回调验签。小程序端拿到后端返回的payParams后调用uni.requestPayment把timeStamp、nonceStr、package、signType、paySign这五个参数传进去。真正容易出问题的是回调验签微信服务器会把支付结果以POST请求发给你的回调地址你必须验证签名后才更新订单状态。# Flask处理微信支付回调简化版 app.route(/api/pay/notify, methods[POST]) def pay_notify(): data request.data # 解析xml验证签名 result parse_and_verify(data) if result[return_code] SUCCESS: order_sn result[out_trade_no] order Order.query.filter_by(order_snorder_sn).first() if order and order.status 0: order.status 1 # 已支付 db.session.commit() return xmlreturn_code![CDATA[SUCCESS]]/return_code/xml return xmlreturn_code![CDATA[FAIL]]/return_code/xml注意支付回调接口的URL一定要走HTTPS而且不能用Flask的开发服务器直接收回调必须deploy到公网服务器上不然微信服务器连不上你的回调地址支付状态就永远更新不了。4. 文化交流模块的内容化运营4.1 畲族文化内容的结构化设计文化交流模块是这个平台区别于普通电商的核心亮点。怎么把文化内容做得有深度而不是做成百度百科的搬运呢我建议把内容拆成三种结构化类型分别用不同的数据库表存储非遗项目表记录畲族银饰制作技艺、畲族彩带编织、畲歌等非遗项目的名称、级别国家级、省级、市级、所在地、传承历史。这类内容的展示形式是时间轴式的图文长文用户在阅读时自然会看到底部关联的文创商品推荐。传承人故事表每个非遗传承人单独一张信息卡片包含姓名、师承、代表作、传承故事音频。这个模块的独特价值在于人是文化传承的核心用户信任传承人才会信任他的作品。我给传承人做了一对一的作品关联相当于给每件商品赋予了手工匠人这个信任背书。节庆活动表记录三月三、会亲节这些畲族传统节日的由来和活动安排配合时间提醒功能。用户在节日前收到站内信推送可以作为运营活动拉活用户的抓手。4.2 互动功能与社区氛围搭建文化内容不能只做单向阅读得有互动。我在这个项目里做了三件互动的事文章评论区、用户收藏夹、传承人问答。评论区用的是小程序原生的富文本输入用户看完一篇银饰锻打的文章可以留言提问。传承人在后台回复形成类似问答的互动闭环。这个项目运营一段时间后发现用户提问最多的不是商品价格而是这个花纹是什么意思、这个图案有什么寓意说明用户是真的对文化感兴趣这给我们后续做内容选题提供了方向。用户收藏夹不只是收藏商品我做了收藏文化内容的入口。用户在文化板块收藏了一篇关于彩带编织的文章系统会自动推荐相关彩带商品。这个推荐的逻辑很简单就是根据收藏文章的culture_tag关联商品本质上一个标签匹配但效果立竿见影收藏过文章的用户转化率比普通浏览用户高出不少。4.3 文化IP与商品的内在联动文创商城最容易犯的错是文化是文化商品是商品两边各做一个模块就完了用户看着文化内容觉得新鲜但逛到商品区又觉得只是普通网店这就白瞎了文化这块料。我的做法是在商品详情页专门加一个文化溯源区块。商品详情页除了SKU选择、价格、库存这些交易要素顶部有一块文化信息区展示这件商品对应的非遗项目、传承人故事、工艺流程图。用户下单之前能清晰看到这件银饰是谁打的、用了什么手艺、有什么寓意。这块内容做完商品详情页的停留时间明显变长退货率也降低了因为用户在购买前就建立了合理的预期。技术实现上很简单商品表里存category_id和culture_tag详情页根据这两个字段去查非遗表和传承人表把相应的内容拼接到详情接口的返回里。难的不是技术是运营层面的内容归集与关系梳理——平台上架每一件商品时都需要运营人员为它挂上对应的文化标签这是需要长期积累的基础工作。5. 遇到的高频坑与解决记录5.1 小程序审核屡次被拒的应对文创电商小程序在微信审核时容易触碰两条红线一是涉及非遗文化传播的内容需要提供相关资质证明二是商城类小程序必须有明确的客服和售后入口否则会被判为类目不符。我在这个项目里踩过的最深的坑是小程序里展示了畲族服饰的图片和文字介绍审核方要求补充非经营性互联网文化单位备案的资质。但实际上我们做的是电商平台文化内容只是商品介绍的一部分。解决的方法是把文化内容归入商品描述范畴避免出现独立的文化资讯栏目同时在类目选择时选择商家自营-服饰箱包而不要选文娱-文化用品后者资质要求会高很多。还有一点小程序里涉及用户生成内容UGC的评论功能审核时要求必须有内容审核机制。我做了最简单的关键词过滤加人工审核虽然技术上很初级但能过审就行。5.2 Flask跨域和HTTPS配置问题开发阶段用Flask自带的开发服务器小程序开发者工具里配置不校验合法域名就能调试接口。但是真机上测试就必须用HTTPS域名而且域名必须是备案过的。这个坑我栽过一次为了方便在服务器上直接用HTTP跑了Flask结果小程序真机一请求就报request:fail错误查了半天才发现是没有HTTPS。解决办法是给Nginx配上SSL证书让Nginx反向代理到Flask服务。Flask本身不用改代码只需要注意处理代理后的真实IP用request.headers.get(X-Real-IP)替代request.remote_addr获取用户IP。跨域方面小程序端不遵循浏览器的同源策略理论上不存在跨域问题但H5端跑在浏览器里就有跨域了。所以Flask后端还是需要配置CORS我用flask-cors扩展设置allow_origins为具体域名列表不要直接全开*否则被别人域名直接调用API接口就麻烦了。5.3 uniapp打包与上线经验uniapp开发完成后打包微信小程序版本特别简单在HBuilderX里点击发行-小程序-微信就会生成一个dist目录用微信开发者工具导入这个目录就能预览和上传审核。但是要注意一个问题uniapp项目里的环境变量配置。开发环境的API地址写的是http://localhost:5000发布时一定要切换到线上域名。我建议统一维护一个config.js文件用条件编译区分环境。// config.js let baseUrl ; // #ifdef MP-WEIXIN baseUrl https://api.example.com; // 小程序线上环境 // #endif // #ifdef H5 baseUrl https://api.example.com; // H5环境 // #endif export default baseUrl;还有个细节uniapp的video组件在微信小程序端播放视频视频域名必须加到小程序的downloadFile合法域名里不然视频黑屏调不出来。音频文件也一样都要在微信公众平台后台配置业务域名。5.4 性能与图片资源优化小程序包体积限制2MB主包超过这个数就直接上传不了。uniapp开发时用到的图片资源一定要压缩我建议做一个icon字体库替代小的图标图片图片都放线上OSS本地只保留tabBar的图标。商品图片的线上存储也要注意压缩和裁剪。我用的OSS可以在上传时指定处理参数比如图片缩放至宽度800px质量80%这样详情页加载速度快很多。畲族银饰这些手工产品细节重要图片太小看不清纹理太大加载又慢800px宽度配合懒加载是比较平衡的选择。6. 运营层面的一些实际心得平台开发完只是开始怎么把畲族文化真正传播出去才是这个项目的灵魂。我在运营中有几个比较管用的做法一是联合非遗传承人做直播不需要很复杂的推流设备一个小程序直播组件就能实现用户一边看传承人打银饰一边下单二是在三月三这类节日做主题活动设计限定款文创产品配合节日氛围冲销量三是鼓励用户分享文化文章到朋友圈后端配合做分享有礼用户分享一篇畲族文化介绍文章可以获得一张小额优惠券这个活动拉新效果很可观。有个运营数据值得参考上架了带文化溯源内容的商品比不带文化溯源内容的同价位商品转化率大约高出三成左右。这说明用户购买文创产品买的不只是物品本身还有背后的故事和情感认同。这是文化电商区别于普通电商的核心价值也是这个项目能持续运营下去的根基。
返回列表