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

加油站小程序实战教程10开通会员

目录

  • 1 修改用户登录逻辑
  • 2 创建变量
  • 3 调用API
  • 总结

我们上一篇搭建了开通会员的界面,有了界面的时候就需要加入一些逻辑来控制界面显示。我们的逻辑是当用户打开我的页面的时候,在页面加载完毕后调用API看用户是否已经开通会员了,如果未开通就显示我们已经搭建好的界面。

1 修改用户登录逻辑

在用户登录教程中,我们已经实现了用户登录的API。但是在会员管理中,我们又增加了一张会员表,并且将会员的信息和用户信息进行了关联,因此需要完善一下登录逻辑,加入是否是会员的判断,输入如下代码

const ErrorCode = {SUCCESS: 0,PARAM_ERROR: 1001,SYSTEM_ERROR: 1003,USER_NOT_FOUND: 1005 // (Optional, if using the second return style below)
};module.exports = async function (params, context) {const { openid } = params;if (!openid) {return { code: ErrorCode.PARAM_ERROR, message: '参数错误: openid 不能为空' };}try {// 1. 查询用户基础信息const user = await context.callModel({name: "users",methodName: "wedaGetItemV2",params: {filter: { where: { $and: [{ openid: { $eq: openid } }] } },select: { $master: true } // Or specify fields including _id},});// 2. **修正后的用户存在检查**// 检查 user 是否为 null/undefined 或者是一个空对象 {}// 方法一:检查对象是否有 key (推荐)const userExists = user && Object.keys(user).length > 0;// 方法二:检查是否存在关键字段 (例如 _id), 如果 _id 总是存在的话// const userExists = user && user._id;if (!userExists) {// 用户不存在console.log(`用户不存在或返回空对象: openid=${openid}, user=`, user);return {code: ErrorCode.SUCCESS,data: {userExists: false,isMember: false}};// 或者如果你想明确区分错误码:// return { code: ErrorCode.USER_NOT_FOUND, message: '用户不存在' };}// 3. 用户存在,查询会员信息const member = await context.callModel({name: "members", // *** 修改为你的会员表名 ***methodName: "wedaGetItemV2",params: {filter: { where: { $and: [{ user_id: { $eq: user._id } }] } }, // *** 确认关联字段 ***select: { $master: true } // Or specify needed member fields}});// 4. **修正后的会员存在检查**// 检查 member 是否为 null/undefined 或者是一个空对象 {}// 方法一:检查对象是否有 key (推荐)const isMember = member && Object.keys(member).length > 0;// 方法二:检查是否存在关键字段 (例如 _id), 如果 _id 总是存在的话// const isMember = member && member._id;// 5. 构建返回结果if (isMember) {// 用户存在且是会员return {code: ErrorCode.SUCCESS,data: {userExists: true,isMember: true,userInfo: user,memberInfo: member}};} else {// 用户存在但不是会员 (member 为 null/undefined 或 {})console.log(`用户存在但非会员或会员信息为空对象: openid=${openid}, member=`, member);return {code: ErrorCode.SUCCESS,data: {userExists: true,isMember: false,userInfo: user,memberInfo: null // 保持返回 null 表示无会员信息}};}} catch (error) {console.error("查询用户及会员信息时出错:", error);return {code: ErrorCode.SYSTEM_ERROR,message: '系统查询出错,请稍后重试'};}
};

在这里插入图片描述
在现有的用户管理模块的登录方法,我们增加了是否是会员的判断

2 创建变量

有了API之后,就需要考虑如果接收调用结果的问题,我们在我的页面创建变量用来接收API的返回结果

先创建一个布尔值变量用来存储用户是否存在
在这里插入图片描述
再定义一个变量用来存储会员是否存在
在这里插入图片描述
再添加一个变量用来存储用户信息
在这里插入图片描述
再添加一个变量用来存储会员信息
在这里插入图片描述

3 调用API

变量创建好了之后,我们再创建一个javascript方法,用来调用我们的API,输入如下代码

export default async function ({ event, data }) {try {const userInfo = await $w.auth.getUserInfo()const openid = userInfo.openIdif (!openid) {console.error("OpenID 未获取");// 可能需要引导用户登录或授权$w.utils.showToast({title: "请先登录",icon: "error",duration: 1000});return;}// 调用你修改后的云函数/APIconst res = await $w.cloud.callDataSource({dataSourceName: 'userManagement_nqq7c6l',methodName: 'login',params: {openid: openid}, // 方法入参});if (res.code === 0) { // ErrorCode.SUCCESSconst { userExists, isMember, userInfo, memberInfo } = res.data;if (!userExists) {// 用户在系统中完全不存在,可能需要特殊处理,比如跳转到登录/注册页console.log("用户不存在于系统中");// 根据你的业务逻辑决定是否显示“开通会员”视图,或者其他操作$w.page.dataset.state.userExists = false$w.page.dataset.state.isMember = false} else {// 用户存在,根据是否是会员来设置视图$w.page.dataset.state.userExists = true$w.page.dataset.state.userInfo = userInfoif (isMember) {// 可以在这里做一些会员视图的额外初始化(如果需要)console.log("用户是会员,余额:", memberInfo.balance); // 假设有 balance 字段$w.page.dataset.state.isMember = true$w.page.dataset.state.memberInfo = memberInfo} else {// 可以在这里做一些非会员视图的额外初始化console.log("用户非会员");$w.page.dataset.state.isMember = false}}} else {// API 返回错误console.error("获取用户会员状态失败:",res.code, res.message);$w.utils.showToast({title: (res.message || "加载失败,请稍后重试"), // 显示错误提示icon: 'error',duration: 1000})// 根据情况,可能也需要设置 showMemberView 为 false 或显示一个错误状态$w.page.dataset.state.isMember = false}} catch (err) {console.error("调用 API 出错:", err);$w.utils.showToast({title: "网络或服务异常,请重试",icon: "error",duration: 1000});$w.page.dataset.state.isMember = false} finally {// 可能需要在这里隐藏加载中的提示 (loading)// hideLoading();}
}

选中页面组件,设置onShow事件,调用我们的自定义方法
在这里插入图片描述
然后给我们会员开通的视图绑定条件展示即可
在这里插入图片描述

总结

本篇我们介绍了控制会员开通视图是否展示的功能。先修改了我们用户登录的逻辑,然后创建变量用来接收API返回结果。接着创建了自定义方法调用我们的API,最后给会员开通视图绑定了条件展示。

总体上像这种有权限判断的功能都是要写前后端逻辑的,这就要求你具备全栈的开发能力,否则是做不出来的。

相关文章:

加油站小程序实战教程10开通会员

目录 1 修改用户登录逻辑2 创建变量3 调用API总结 我们上一篇搭建了开通会员的界面,有了界面的时候就需要加入一些逻辑来控制界面显示。我们的逻辑是当用户打开我的页面的时候,在页面加载完毕后调用API看用户是否已经开通会员了,如果未开通就…...

TorchServe部署模型-index_to_name.json

在TorchServe部署模型时,若要将模型输出结果映射到指定标签(如分类任务的类别名称),需通过index_to_name.json文件定义索引与标签的映射关系,并在打包模型时将其作为额外文件包含。以下是完整流程和命令示例&#xff1…...

Python 3.x cxfreeze打包exe教程

Python 3.x cxfreeze打包exe教程 https://blog.csdn.net/qq_33704787/article/details/123926953 去官网 下载安装 pip install cx-Freeze7.2.9 https://pypi.org/project/cx-Freeze/7.2.9/ 安装到 你的 python 的 script文件夹下面 (全局或是 虚拟环境都行&#x…...

Vue/React组件/指令/Hooks封装的基本原则以及示例

一、组件封装原则与示例 Vue组件封装 核心原则 • 单一职责:每个组件只解决一个功能(如分页、过滤表单) • Props控制输入:通过定义明确的Props接口接收外部数据(类型校验、默认值) • Emit事件通信:子组件通过$emit向父组件传递动作(如分页切换) • 插槽扩展性:使用…...

【蓝桥杯】15届JAVA研究生组F回文字符串

一、思路 1.这题去年考的时候想的是使用全排列进行尝试,实际不用这么麻烦,只用找到第一个和最后一个非特殊字符串的位置,然后分别向内检查是否对称,向外检查是否对称直到左指针小于0(可以通过添加使其对称) 2.至于如何找到第一个…...

SDL显示YUV视频

文章目录 1. **宏定义和初始化**2. **全局变量**3. **`refresh_video_timer` 函数**4. **`WinMain` 函数**主要功能及工作流程:总结:1. 宏定义和初始化 #define REFRESH_EVENT (SDL_USEREVENT + 1) // 请求画面刷新事件 #define QUIT_EVENT...

没有他的“变换”,就没有今天的人工智能

从ChatGPT发布以来,大语言模型(LLM)是所有人追逐的方向,无论是将其看作“万能神”或是人工智能应用的基础构件,其重要性毋庸置疑。而随着大语言模型扩展到多模态领域,就需要更多的工具来帮助其进行处理。 例…...

el-input 中 select 方法使用报错:属性“select”在类型“HTMLElement”上不存在

要解决该错误,需明确指定元素类型为 HTMLInputElement,因为 select() 方法属于输入元素。 步骤解释: 类型断言:使用 as HTMLInputElement 将元素类型断言为输入元素。 可选链操作符:保持 ?. 避免元素为 null 时出错…...

MCP 实战:实现server端,并在cline调用

本文动手实现一个简单的MCP服务端的编写,并通过MCP Server 实现成绩查询的调用。 一、配置环境 安装mcp和uv, mcp要求python版本 Python >3.10; pip install mcppip install uv 二、编写并启用服务端 # get_score.py from mcp.server.fastmcp import…...

关于C++日志库spdlog

关于C日志库spdlog spdlog是一个高性能、易于使用的C日志库,广泛应用于现代C项目中。它支持多线程、异步日志记录、多种日志格式、以及灵活的输出方式(如控制台、文件、甚至自定义输出)。下面将就常用功能方面介绍spdlog的安装、配置和使用方…...

回归预测 | Matlab实现RIME-CNN-GRU-Attention霜冰优化卷积门控循环单元注意力机制多变量回归预测

回归预测 | Matlab实现RIME-CNN-GRU-Attention霜冰优化卷积门控循环单元注意力机制多变量回归预测 目录 回归预测 | Matlab实现RIME-CNN-GRU-Attention霜冰优化卷积门控循环单元注意力机制多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME…...

ruby self

在 Ruby 中,self 是一个指向当前对象的特殊变量,它的值根据代码的上下文动态变化。理解 self 的指向是掌握 Ruby 面向对象编程的关键。以下是详细解析: 一、self 的核心规则 self 始终指向当前方法的执行者(即调用方法的对象&…...

液氮恒温器是做什么的

‌液氮恒温器‌是一种利用液氮作为冷源的恒温装置,主要用于提供低温、恒温或变温环境,广泛应用于科研、工业和医疗等领域。液氮恒温器通过液氮的低温特性来实现降温效果,具有效率高、降温速度快、振动小、成本低等优点。 液氮恒温器应用场景和…...

突破,未观测地区罕见极端降雨的估计

文章中文总结(重点为方法细节) 一、研究背景与目的 在无测站或短观测记录地区,传统极值理论(如GEV)难以估计稀有极端降雨事件;本文提出一种新的区域化极值估计方法:区域化 Metastatistical Ex…...

`mpi4py` 是什么; ModuleNotFoundError: No module named ‘mpi4py

mpi4py 是什么 目录 `mpi4py` 是什么ModuleNotFoundError: No module named mpi4pyModuleNotFoundError: No module named mpi4py mpi4py 是一个 Python 模块,它提供了对 MPI(Message Passing Interface)标准的接口,使得 Python 程序能够利用 MPI 进行并行计算。其作用主要…...

大数据 - 1. 概述

早期的计算机(上世纪70年代前) 是相互独立的,各自处理各自的数据上世纪70年代后,出现了基于TCP/IP协议的小规模的计算机互联互通。上世纪90年代后,全球互联的互联网出现。当全球互联网逐步建成(2000年左右&…...

Java基础下

一、Map Map常用的API //map常用的api//1.添加 put: 如果map里边没有key&#xff0c;则会添加&#xff1b;如果有key&#xff0c;则会覆盖&#xff0c;并且返回被覆盖的值Map<String,String> mnew HashMap<>();m.put("品牌","dj");m.put("…...

数据结构和算法(十二)--最小生成树

一、有向图 定义: 有向图是一副具有方向性的图&#xff0c;是由一组顶点和一组有方向的边组成的&#xff0c;每条方向的边都连着一对有序的顶点。 出度: 由某个顶点指出的边的个数称为该顶点的出度。 入度: 指向某个顶点的边的个数称为该顶点的入度。 有向路径: 由一系列顶点组…...

TK广告素材优化:提升投放效果的核心策略

在广告投放领域&#xff0c;决定投放效果的三大关键要素是&#xff1a;产品、素材和人群。由于产品相对固定且人群多采用通投策略&#xff0c;因此素材质量成为影响投放效果的决定性因素。 为什么素材如此重要&#xff1f; 素材质量直接影响广告的点击率&#xff0c;进而影响…...

Python3笔记之号称替代pip的uv包管理器

uv是什么&#xff1f; uv&#xff0c;这是一个由 Astral 团队开发的极快速的Python包和项目管理工具&#xff0c;用Rust语言编写。它集成了多种功能&#xff0c;旨在替代pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv等多个工具&#xff0c;提供更高效、更全面的Py…...

8.3.1 MenuStrip(菜单)控件

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 MenuStrip控件提供了程序窗体的主菜单&#xff0c;即显示于窗体顶端部分的菜单。 MenuStrip常用属性&#xff1a; ImageScalingSize…...

STM32单片机入门学习——第29节: [9-5] 串口收发HEX数据包串口收发文本数据包

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.09 STM32开发板学习——第29节: [9-5] 串口收发HEX数据包&串口收发文本数据包 前…...

【Springboot知识】Springboot进阶-Micrometer指标监控深入解析

文章目录 ​​Micrometer 核心概念与标准指标详解**Micrometer 核心概念与标准指标详解****一、Micrometer 核心概念****二、Micrometer 标准指标****1. JVM 监控指标****2. 系统资源监控****3. HTTP 请求监控****4. 数据库监控****5. 缓存监控** **三、配置与自定义指标****1.…...

Skyline配置指南-微信小程序

Skyline 是微信小程序推出的新一代渲染引擎&#xff0c;提供了更强大的渲染能力和更流畅的性能体验。以下是配置 Skyline 的详细步骤&#xff1a; 一、app.json文件配置 "componentFramework": "glass-easel", "lazyCodeLoading": "requi…...

Go 微服务框架 | 中间件

文章目录 定义中间件前置中间件后置中间件路由级别中间件 定义中间件 中间件的作用是给应用添加一些额外的功能&#xff0c;但是不会影响原有应用的编码方式&#xff0c;想用的时候直接添加&#xff0c;不想用的时候也可以轻松去除&#xff0c;实现所谓的可插拔。中间件的实现…...

Spring MVC 重定向(Redirect)详解

Spring MVC 重定向&#xff08;Redirect&#xff09;详解 1. 核心概念与作用 重定向&#xff08;Redirect&#xff09; 是 Spring MVC 中一种客户端重定向机制&#xff0c;通过 HTTP 302 状态码&#xff08;默认&#xff09;将用户浏览器重定向到指定 URL。 主要用途&#xf…...

项目开发流程总结

目录 1. 项目启动阶段&#xff08;需求分析&#xff09; 2. 项目设计阶段 3. 开发阶段 4. 测试阶段 5. 打包和发布阶段 6. 运维和监控阶段 7. 版本迭代和维护阶段 项目生命周期中的管理要点&#xff1a; 总结&#xff1a; 一个完整的项目开发流程通常包括以下几个阶段…...

window上 docker使用ros2开发并usbip共享usb设备

曾经参考 https://blog.csdn.net/laoxue123456/article/details/138339029 来共享windows上的usb 发现没有办法成功总是出现 tcp 错误。telnet测试能够正常连接 很是奇怪&#xff0c;window上换成低版本的usbipd仍然是同样的错误&#xff0c;没有办法的情况下参考了docker官方文…...

基于MATLAB/simulink的信号调制仿真--AM调制

实验内容&#xff1a; 假设y(t)(20.5*2cos&#xff08;2*pi*1000*t&#xff09;)*5cos&#xff08;2*pi*2*1e4*t&#xff09;调幅系统&#xff0c;请将一个频率为1000HZ的余弦波信号&#xff0c;通过进行AM调制&#xff0c;载波信号频率为20kHZ的余弦波&#xff0c;调制度ma0.…...

Vue3+Ts封装ToolTip组件(2.0版本)

本组件支持hover和click两种触发方式&#xff0c;需要更多的触发方式&#xff0c;可自行去扩展&#xff01;&#xff01;&#xff01; 1.传递三个参数&#xff1a; content&#xff1a;要展示的文本 position&#xff1a;文本出现的位置&#xff08;"top" | "t…...