当前位置: 首页 > news >正文

分享一套锋哥原创的微信小程序系统小店会员管理(适合理发店,宠物店等各种小店),使用 云函数 + 云数据库

大家好,我是锋哥,分享一套锋哥原创的微信小程序系统小店会员管理(适合理发店,宠物店等各种小店),使用 云函数 + 云数据库,分享下哈。

项目介绍

随着移动互联网的快速发展和微信生态的日益完善,微信小程序凭借其"即用即走"、无需安装的特点,成为线下商户数字化转型的重要工具。传统线下小店在会员管理方面普遍存在管理方式落后、信息化程度低、会员信息易丢失等问题,严重影响了门店的运营效率和服务质量。

本文设计并实现了一个基于微信小程序的小店会员管理系统,采用微信云开发技术架构,前端使用微信小程序原生框架(WXML/WXSS/JS),后端采用云函数(Node.js)作为服务层,数据存储使用微信云数据库(文档型NoSQL数据库)。系统实现了用户手机号授权登录、会员储值充值、消费扣费管理、消费与充值流水查询、店铺信息展示与管理、消费项目与常用价格维护等核心功能。系统采用单云函数多路由架构,通过中间件管道实现了鉴权、限流和操作日志等横切关注点。

源码下载

链接:https://pan.baidu.com/s/1Ae2eAF4APSKiwf-HGYyZpg?pwd=1234
提取码:1234

系统展示

核心代码

const cloud = require('wx-server-sdk') // 云函数初始化:使用当前环境变量动态选择环境 cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 鉴权:判断是否已注册/是否管理员等 const { authenticate } = require('./middleware/auth') // 频率限制:限制单用户/管理员群体的调用次数 const { checkRateLimit } = require('./middleware/rateLimit') // 操作日志:记录管理员/会员的关键操作 const { logOperation } = require('./middleware/logger') // 业务控制器:用户相关接口 const userCtrl = require('./controllers/user') // 业务控制器:店铺信息相关接口 const shopCtrl = require('./controllers/shop') // 业务控制器:会员查询相关接口 const memberCtrl = require('./controllers/member') // 业务控制器:充值/消费/记录查询相关接口 const financeCtrl = require('./controllers/finance') // 业务控制器:后台配置(项目/价格/警报/日志)相关接口 const systemCtrl = require('./controllers/system') // 开发期:初始化集合与测试数据(生产应禁用) const initDbCtrl = require('./controllers/initDb') // 无需登录即可访问的接口(仅做 openid 校验) const PUBLIC_ACTIONS = ['user.login', 'user.getProfile'] // 开发期:允许免鉴权执行的接口(仍校验 openid) const DEV_NO_AUTH_ACTIONS = ['initDb.run'] // 需要管理员权限的接口列表 const ADMIN_ACTIONS = [ 'shop.updateInfo', 'member.list', 'member.getByMemberNo', 'finance.recharge', 'finance.consume', 'finance.getMemberRecords', 'system.getItems', 'system.addItem', 'system.deleteItem', 'system.getPrices', 'system.addPrice', 'system.deletePrice', 'system.getAlerts', 'system.dismissAlert', 'system.getAdminLogs', // 'system.initDB' 已移除(改为启动自动 initDb.run) ] // action -> 处理函数 的路由映射表 const ROUTE_MAP = { 'user.login': userCtrl.login, 'user.getProfile': userCtrl.getProfile, 'user.updateName': userCtrl.updateName, 'shop.getInfo': shopCtrl.getInfo, 'shop.updateInfo': shopCtrl.updateInfo, 'member.list': memberCtrl.list, 'member.getByMemberNo': memberCtrl.getByMemberNo, 'finance.recharge': financeCtrl.recharge, 'finance.consume': financeCtrl.consume, 'finance.getMyRecords': financeCtrl.getMyRecords, 'finance.getMemberRecords': financeCtrl.getMemberRecords, 'system.getItems': systemCtrl.getItems, 'system.addItem': systemCtrl.addItem, 'system.deleteItem': systemCtrl.deleteItem, 'system.getPrices': systemCtrl.getPrices, 'system.addPrice': systemCtrl.addPrice, 'system.deletePrice': systemCtrl.deletePrice, 'system.getAlerts': systemCtrl.getAlerts, 'system.dismissAlert': systemCtrl.dismissAlert, 'system.getAdminLogs': systemCtrl.getAdminLogs, 'initDb.run': initDbCtrl.run } /** * 云函数入口。 * - **入参**: event.action 指定路由;其余字段为各接口参数 * - **鉴权**: 基于 openid 判断登录/管理员权限 * - **限流**: 按月/按日统计并触发警报 * - **返回**: { code, data|message } */ exports.main = async (event, context) => { try { // 前端传入的动作名(如 'user.login') const { action } = event if (!action || !ROUTE_MAP[action]) { return { code: 400, message: '无效的操作' } } // 微信上下文(包含 OPENID 等身份信息) const wxContext = cloud.getWXContext() // 当前调用者 openid(唯一标识) const openid = wxContext.OPENID if (!openid) { return { code: 401, message: '身份验证失败,无法获取openid' } } // 开发期:启动自动初始化(无鉴权,但仍校验 openid) if (DEV_NO_AUTH_ACTIONS.includes(action)) { const handler = ROUTE_MAP[action] const result = await handler(event) return { code: 0, data: result } } // 鉴权结果:registered/isAdmin/userInfo/phone 等 const authResult = await authenticate(openid) // 限流检查(管理员与普通用户规则不同) const rateLimitResult = await checkRateLimit(openid, authResult.isAdmin, authResult.phone) if (rateLimitResult.limited) { return { code: 429, message: rateLimitResult.message } } // 非公开接口必须先完成手机号授权登录 if (!PUBLIC_ACTIONS.includes(action) && !authResult.registered) { return { code: 403, message: '请先完成手机号授权登录' } } // 管理员接口:校验管理员权限 if (ADMIN_ACTIONS.includes(action) && !authResult.isAdmin) { return { code: 403, message: '权限不足,需要管理员权限' } } // 命中路由并执行处理器 const handler = ROUTE_MAP[action] const result = await handler(event, authResult) // 异步写操作日志(不影响主流程返回) logOperation(authResult, action, event).catch(err => { console.error('日志记录失败:', err) }) return { code: 0, data: result } } catch (err) { console.error('云函数执行错误:', err) return { code: 500, message: err.message || '服务器内部错误' } } }
http://www.jsqmd.com/news/566042/

相关文章:

  • 洛雪音乐音源终极指南:3个步骤快速部署开源项目,享受全网高品质音乐
  • 6大维度精通Pencil原型工具:从部署到高效设计全指南
  • 2026年化妆品代加工厂家推荐:涵美化妆品工厂,OEM/ODM代工全品类化妆品加工服务 - 品牌推荐官
  • 5步快速解决小爱音箱音乐服务启动失败问题:xiaomusic完整配置指南
  • dexcount-gradle-plugin扩展开发:如何自定义计数规则和输出格式
  • 微信小程序语音交互实战:长按录制与点击播放的完整实现方案
  • Win11Debloat:Windows系统优化终极指南,一键告别臃肿
  • OpCore-Simplify:黑苹果配置的自动化革命——技术新手的高效配置解决方案
  • ViT图像分类-中文-日常物品完整指南:4090D单卡环境配置与中文类别映射说明
  • 从‘冷启动’到‘热响应’:深入理解DevEco Studio 6.0热更新背后的ArkTS增量编译原理
  • 2026年期权开户服务平台推荐:方正中期期货,原油/股指/ETF期权开户一站式服务 - 品牌推荐官
  • 乙巳马年春联生成终端惊艳效果:鼠标悬停触发门钉微光动画效果
  • 2026年闸阀厂家推荐:祖蠡实业有限公司,弹性/气动/铸钢/电动/不锈钢闸阀全品类供应 - 品牌推荐官
  • 3步解锁微信多设备自由:WeChatPad带来的跨终端协同革命
  • Pixel Couplet Gen快速上手:Colab Notebook在线体验像素春联生成Demo
  • Phi-4-mini-reasoning业务落地:教育SaaS中个性化习题生成与解析闭环
  • 无锡高端腕表维修门店全解析:2026年六城3.2万例故障数据揭示的闲置表“隐形杀手”与品牌修复指南 - 时光修表匠
  • 南通如皋本地月嫂服务哪家更好?南通翔禾家政(如皋爱月宝)少不了 - 速递信息
  • Mac Charles抓包实战:从基础配置到HTTPS解密全攻略
  • Java量化交易系统架构设计与实现:基于Ta4j的专业级技术分析解决方案
  • 地平线旭日派X3上的ROS2实战:Ubuntu20.04环境搭建与小车手势控制入门
  • 3种方法让Unity游戏秒变中文:XUnity.AutoTranslator全攻略
  • 2026重庆最知名水处理工艺推荐,为你筛选优质工艺,水处理怎么选择东隆环保市场认可度高 - 品牌推荐师
  • nli-distilroberta-base数据预处理实战:文本清洗、分词与向量化全流程
  • SMU 2026 Spring 天梯赛6题解
  • Pyfa:EVE Online舰船配置终极免费工具完整使用指南
  • VideoAgentTrek-ScreenFilter入门指南:3步完成Dify工作流集成
  • 阿里云效流水线全攻略:从Docker镜像打包到k8s工作负载配置(含多模块处理)
  • 安全可靠的dll修复软件推荐:2026年专业级修复方案
  • Scarab:空洞骑士模组管理终极指南,一键安装告别繁琐操作