flask 与小程序 菜品详情和分享功能
mina/pages/food/info.wxml
<import src="../../wxParse/wxParse.wxml" />
<view class="container"> <!--商品轮播图--> <view class="swiper-container"><swiper class="swiper_box" autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}" bindchange="swiperchange"><block wx:for="{{info.pics}}" wx:key="id"><swiper-item><image src="{{item}}" class="slide-image" width="355" height="150" mode="aspectFit" lazy-load="true"/></swiper-item></block></swiper><view class="dots"> <block wx:for="{{info.pics}}" wx:key="unique"><view class="dot{{index == swiperCurrent ? ' active' : ''}}"></view> </block> </view> </view><!--商品基本介绍--><view class="goods-info"><view class="goods-title">{{info.name}}</view><view class="goods-price" style="padding-left:35rpx;">¥ {{info.price}}</view><view class="goods-price" style="color:#999;font-size:24rpx;">购买{{info.total_count}}次</view><view class="goods-price" style="color:#999;font-size:24rpx;">共收到 {{info.comment_count}} 次好评</view><view class="goods-info-fx"><image src='/images/qd.png' /><button open-type="share">分享</button><text>分享有赏</text></view></view><view class="goods-des-info"><view class="label-title">商品介绍</view><view class="goods-text"><template is="wxParse" data="{{wxParseData:article.nodes}}"/></view></view><!--用户评价--><view class="goods-des-info" style="margin-top:35rpx;" wx:if="{{commentList}}"><view class="label-title" style="border-bottom:1px solid #eee;">大家评价<text style="color:red">({{commentCount}})</text></view><view class="goods-text" style="margin-top:15rpx;border-bottom:1px solid #eee;" wx:for="{{commentList}}"><view style="width:100rpx;float:left;"><image style="width: 100rpx; height: 100rpx;" src="{{item.user.avatar_url}}"></image><view style="text-align:center;width:100rpx;">{{item.score}}</view></view><view style="width:550rpx;float:left;margin-left:35rpx;"><view>{{item.content}}</view><view style="color: #B0B0B0;font-size:24rpx;">{{item.date}}</view></view></view></view><!--底部--><view class="footer-box"> <view class="shop-cart-btn" bindtap="goShopCar"><view class="shop-num">({{shopCarNum}})</view><view style='position:absolute;bottom:10rpx;'> 购物车 </view></view><view class="join-shop-cart" bindtap="toAddShopCar">加入购物车</view><view class="now-buy" bindtap="tobuy">立即购买</view></view><!--购买和收藏弹窗--><view class="show-popup" hidden="{{hideShopPopup}}" ><view class="popup-mask" bindtap="closePopupTap"></view><view class="popup-contents"><view class="pop-goods-info"><view class="pop-img-box"><image src="{{info.main_image}}" class="goods-thumbnail"/></view><view class="pop-goods-des"><view class="pop-goods-title">{{info.name}}</view><view class="pop-goods-price">¥ {{info.price}}</view></view><view class="pop-goods-close" bindtap="closePopupTap"></view></view><view class="buy-num-box"><view class="num-label">购买数量</view><view class="num-box"><view class="num-jian {{buyNumber == buyNumMin ? 'hui': ''}}" bindtap="numJianTap">-</view><view class="num-input"><input type="number" value="{{buyNumber}}" disabled/></view><view class="num-jia {{buyNumber== buyNumMax ? 'hui': ''}}" bindtap="numJiaTap">+</view></view></view> <view class="popup-join-btn" wx:if="{{shopType =='addShopCar'}}" bindtap="addShopCar">加入购物车</view><view class="popup-join-btn" wx:if="{{shopType =='tobuy'}}" bindtap="buyNow">立即购买</view> </view></view>
</view>
商品基本介绍
问题1: <template is /> 是什么函数?有什么作用和功能?如何使用?
模板 | 微信开放文档
WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。
使用 is 属性,声明需要的使用的模板,然后将模板所需要的 data 传入
is 属性可以使用 Mustache 语法,来动态决定具体需要渲染哪个模板
模板拥有自己的作用域,只能使用 data 传入的数据以及模板定义文件中定义的 <wxs /> 模块。
该段代码的作用是在购物车页面中展示商品的介绍信息。具体来说,它使用了wxParse组件来解析并渲染article.nodes中的内容,将商品介绍以富文本的形式展示在页面上。
问题2: Mustache 语法 是什么?
Mustache语法是一种轻量级的前端模板引擎,它主要用于在表现和数据相分离的前端技术架构中,根据数据生成特定的动态内容。Mustache语法的特点是逻辑简单,没有复杂的条件判断和循环语句,只关注数据的展示。它可以应用于多种平台,如JavaScript、Java、.NET、PHP、C++等。在微信小程序中,Mustache语法被用于生成WXML结构。你可以通过在WXML中使用Mustache语法来动态渲染页面内容。
购买和收藏弹窗
问题1:disabled 什么作用?
disabled属性用于禁用输入框,使其无法编辑或接收用户输入。在给定的代码中,disabled属性被应用于<input>标签,导致输入框无法编辑,并且显示的值是通过buyNumber变量绑定的。这意味着用户无法更改输入框中的值,只能查看当前的buyNumber值。
mina/pages/food/info.js
在顶部将utils里封装好的方法使用require 加载进来
//index.js
//获取应用实例
var app = getApp();
var WxParse = require('../../wxParse/wxParse.js');
var utils = require('../../utils/util.js');Page({data: {autoplay: true,interval: 3000,duration: 1000,swiperCurrent: 0,hideShopPopup: true,buyNumber: 1,buyNumMin: 1,buyNumMax: 1,canSubmit: false, // 选中时候是否允许加入购物车shopCarInfo: {},shopType: "addShopCar",//购物类型,加入购物车或立即购买,默认为加入购物车,id: 0,shopCarNum: 4,commentCount:2},onLoad: function (e) {var that = this;that.setData({id: e.id});},onShow:function(){this.getInfo();this.getComments();},goShopCar: function () {wx.reLaunch({url: "/pages/cart/index"});},toAddShopCar: function () {this.setData({shopType: "addShopCar"});this.bindGuiGeTap();},tobuy: function () {this.setData({shopType: "tobuy"});this.bindGuiGeTap();},addShopCar: function () {var that = this;var data = {"id": this.data.info.id,"number": this.data.buyNumber};wx.request({url: app.buildUrl("/cart/set"),header: app.getRequestHeader(),method: 'POST',data: data,success: function (res) {var resp = res.data;app.alert({"content": resp.msg});that.setData({hideShopPopup: true});}});},buyNow: function () {var data = {goods: [{"id": this.data.info.id,"price": this.data.info.price,"number": this.data.buyNumber}]};this.setData({hideShopPopup: true});wx.navigateTo({url: "/pages/order/index?data=" + JSON.stringify(data)});},/*** 规格选择弹出框*/bindGuiGeTap: function () {this.setData({hideShopPopup: false});},/*** 规格选择弹出框隐藏*/closePopupTap: function () {this.setData({hideShopPopup: true})},numJianTap: function () {if (this.data.buyNumber <= this.data.buyNumMin) {return;}var currentNum = this.data.buyNumber;currentNum--;this.setData({buyNumber: currentNum});},numJiaTap: function () {if (this.data.buyNumber >= this.data.buyNumMax) {return;}var currentNum = this.data.buyNumber;currentNum++;this.setData({buyNumber: currentNum});},//事件处理函数swiperchange: function (e) {this.setData({swiperCurrent: e.detail.current})},getInfo: function () {var that = this;wx.request({url: app.buildUrl("/food/info"),header: app.getRequestHeader(),data: {id: that.data.id},success: function (res) {var resp = res.data;if (resp.code != 200) {app.alert({"content": resp.msg});wx.navigateTo({url: "/pages/food/index"});return;}that.setData({info: resp.data.info,buyNumMax: resp.data.info.stock,shopCarNum:resp.data.cart_number});WxParse.wxParse('article', 'html', resp.data.info.summary, that, 5);}});},getComments:function(){var that = this;wx.request({url: app.buildUrl("/food/comments"),header: app.getRequestHeader(),data: {id: that.data.id},success: function (res) {var resp = res.data;if (resp.code != 200) {app.alert({"content": resp.msg});return;}that.setData({commentList: resp.data.list,commentCount: resp.data.count,});}});},onShareAppMessage: function () {var that = this;return {title: that.data.info.name,path: '/pages/food/info?id=' + that.data.info.id,success: function (res) {// 转发成功wx.request({url: app.buildUrl("/member/share"),header: app.getRequestHeader(),method: 'POST',data: {url: utils.getCurrentPageUrlWithArgs()},success: function (res) {}});},fail: function (res) {// 转发失败}}}
});
onShow:function(){}
当读取页面时自己重新去请求数据,保持数据是最新的。
问题0: wx.reLaunch 是什么函数?
wx.reLaunch(Object object) | 微信开放文档 关闭所有页面,打开到应用内的某个页面
| url | string | 是 | 需要跳转的应用内页面路径 (代码包路径),路径后可以带参数。参数与路径之间使用?分隔,参数键与参数值用=相连,不同参数用&分隔;如 'path?key=value&key2=value2' |
问题1: shopType 作用
shopType: "tobuy"
这段代码是一个小程序中的一个函数,名为tobuy。该函数用于设置购物类型为"tobuy",并调用bindGuiGeTap函数。
问题2: wx.Parse 的具体作用
wxParse是一个微信小程序的自定义组件,用于解析富文本内容。它支持解析HTML和Markdown,并且能够解析HTML的大部分标签和小表情emoji。通过使用wxParse组件,开发者可以在小程序中嵌入包含HTML代码的富文本内容,并实现对这些内容的解析和展示。
wxParse组件的源码和案例可以在引用和引用提供的压缩包中找到。这些资源可以帮助开发者更好地理解和使用wxParse组件,以实现小程序中富文本内容的展示和解析。
小程序富文本解析 | 微信开放社区
onShareAppMessage:function(){}
Page(Object object) | 微信开放文档
监听用户点击页面内转发按钮(button 组件 open-type="share")或右上角菜单“转发”按钮的行为,并自定义转发内容。
注意:只有定义了此事件处理函数,右上角菜单才会显示“转发”按钮
mina/utils/util.js
const formatTime = date => {const year = date.getFullYear()const month = date.getMonth() + 1const day = date.getDate()const hour = date.getHours()const minute = date.getMinutes()const second = date.getSeconds()return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}const formatNumber = n => {n = n.toString()return n[1] ? n : '0' + n
}/*参考文章:https://segmentfault.com/q/1010000008005954/a-1020000008187652*/
/*获取当前页url*/
function getCurrentPageUrl() {var pages = getCurrentPages() //获取加载的页面var currentPage = pages[pages.length - 1] //获取当前页面的对象var url = currentPage.route //当前页面urlreturn url
}/*获取当前页带参数的url*/
function getCurrentPageUrlWithArgs() {var pages = getCurrentPages() //获取加载的页面var currentPage = pages[pages.length - 1] //获取当前页面的对象var url = currentPage.route //当前页面urlvar options = currentPage.options //如果要获取url中所带的参数可以查看options//拼接url的参数var urlWithArgs = url + '?'for (var key in options) {var value = options[key]urlWithArgs += key + '=' + value + '&'}urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length - 1)return urlWithArgs
}module.exports = {formatTime: formatTime,getCurrentPageUrl: getCurrentPageUrl,getCurrentPageUrlWithArgs: getCurrentPageUrlWithArgs
}
function getCurrentPageUrlWithArgs() { }
该段代码是一个JavaScript函数,用于获取当前页面带参数的URL。
函数的主要步骤如下:
- 使用
getCurrentPages()函数获取当前加载中的所有页面对象,并将其存储在pages数组中。 - 通过
pages.length - 1获取pages数组中最后一个元素,即当前页面的对象,并将其存储在currentPage变量中。 - 使用
currentPage.route获取当前页面的URL。 - 使用
currentPage.options获取当前页面URL中所带的参数,并将其存储在options对象中。 - 初始化
urlWithArgs变量为url + '?',即将URL和参数拼接起来。 - 使用
for...in循环遍历options对象,将参数和对应的值拼接到urlWithArgs中。 - 使用
substring()函数去除最后一个多余的&符号。 - 返回拼接好的带参数的URL。
该函数的作用是方便获取当前页面带参数的URL,可以在需要获取URL参数的场景中使用
web/controllers/api/Food.py
@route_api.route("/food/info" )
def foodInfo():resp = {'code': 200, 'msg': '操作成功~', 'data': {}}req = request.valuesid = int(req['id']) if 'id' in req else 0food_info = Food.query.filter_by( id = id ).first()if not food_info or not food_info.status :resp['code'] = -1resp['msg'] = "美食已下架"return jsonify(resp)member_info = g.member_infocart_number = 0if member_info:cart_number = MemberCart.query.filter_by( member_id = member_info.id ).count()resp['data']['info'] = {"id":food_info.id,"name":food_info.name,"summary":food_info.summary,"total_count":food_info.total_count,"comment_count":food_info.comment_count,'main_image':UrlManager.buildImageUrl( food_info.main_image ),"price":str( food_info.price ),"stock":food_info.stock,"pics":[ UrlManager.buildImageUrl( food_info.main_image ) ]}resp['data']['cart_number'] = cart_numberreturn jsonify(resp)
相关文章:
flask 与小程序 菜品详情和分享功能
mina/pages/food/info.wxml <import src"../../wxParse/wxParse.wxml" /> <view class"container"> <!--商品轮播图--> <view class"swiper-container"><swiper class"swiper_box" autoplay"{{autop…...
C语言通过MSXML6.0读写XML文件(同时支持char[]和wchar_t[]字符数组)
开发环境:Visual Studio 2010 运行环境:Windows XP SP3 第一节 读取XML文件(使用wchar_t[]字符数组) 读取XML文件可使用IXMLDOMDocument_load函数。 /* 这个程序只能在C编译器下编译成功, 请确保源文件的扩展名为c */ #define …...
在react中说说对受控组件和非受控组件的理解?以及应用场景
在react中说说对受控组件和非受控组件的理解?以及应用场景 回答思路:说说受控组件-->说说非受控组件-->应用场景受控组件:非受控组件应用场景 回答思路:说说受控组件–>说说非受控组件–>应用场景 受控组件ÿ…...
【算法练习Day50】下一个更大元素II接雨水
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 下一个更大元素II接雨水单调…...
深耕文档型数据库12载,SequoiaDB再开源
1月15日,巨杉数据库举行SequoiaDB新特性及开源项目发布活动。本次活动回顾了巨杉数据库深耕JSON文档型数据库12年的发展历程与技术演进,全面解读了SequoiaDB包括在高可用、安全、实时、易用性四个方向的技术特性,宣布了2024年面向技术社区的开…...
json解析
1什么是json JSON(JavaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式。它是基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰…...
【AI】深度学习在编码中的应用(8)
接上文,本文来梳理和学习智能编码中, 基于残差编码的框架。 智能图像编解码器的成功也推动了智能视频编解码器的发展。传统的视频压缩方法依靠预测编码对运动信息和残差信息分别进行编码。根据时-空域冗余消除方式和阶段不同,现有相关方法可…...
什么是VUE 创建第一个VUE实例
一、什么是Vue 概念:Vue (读音 /vjuː/,类似于 view) 是一套 构建用户界面 的 渐进式 框架 Vue2官网:Vue.js 1.什么是构建用户界面 基于数据渲染出用户可以看到的界面 2.什么是渐进式 所谓渐进式就是循序渐进,不一定非得把Vu…...
进程间协同:从进程启动、同步与互斥到进程间通信
进程间协同的目的 在操作系统中,进程是计算机进行任务分配和调度的基本单位。在计算机系统中,有很多任务是无法由单个进程独立完成的,需要多个进程共同参与并协作完成。这就像在现实生活中,有些工作需要一个团队来完成࿰…...
【驱动】TI AM437x(内核调试-06):网卡(PHY和MAC)、七层OSI
1、网络基础知识 1.1 七层OSI 第一层:物理层。 1)需求: 两个电脑之间如何进行通信? 具体就是一台发比特流,另一台能够收到。于是就有了物理层:主要是定义设备标准,如网线的额接口类型、管线的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流,就是从1/0…...
Java基础面试题 Object
Java基础面试题 Object 文章目录 Java基础面试题 ObjectObjectObject 类的常见方法有哪些? 和 equals() 的区别hashCode() 有什么用?为什么要有 hashCode?为什么重写 equals() 时必须重写 hashCode() 方法? 文章来自Java Guide 用…...
5G_射频测试_接收机测量(五)
7.2 Reference sensitivity level 接收灵敏度是表示接收机能解析出信号的最小功率(和接收机noise figure相关所以RX lineup的大部分工作就是在调整Gain达到最佳NF)The throughput shall be ≥ 95%(BER:bit error rate 并不是L3ca…...
ESP32-HTTP_webServer库(Arduino)
ESP32-HTTP 介绍 ESP32是一款功能强大的微控制器,具有丰富的网络和通信功能。其中之一就是支持HTTP协议,这使得ESP32可以用于创建Web服务器。 HTTP是什么? HTTP(Hyper Text Transfer Protocol),即超文本传…...
无法找到mfc100.dll的解决方法分享,如何快速修复mfc100.dll文件
在日常使用电脑时,我们可能会碰到一些系统错误提示,比如“无法找到mfc100.dll”的信息。这种错误通常会阻碍代码的执行或某些应用程序的启动。为了帮助您解决这一问题,本文将深入探讨其成因,并提供几种不同的mfc100.dll解决方案。…...
[VulnHub靶机渗透]:billu_b0x 快速通关
🍬 博主介绍👨🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步…...
Docker安装开源Blog(Typecho)
前言 首先这个镜像是centos7.9进行安装PHP环境,然后挂载目录去运行的,镜像大概300MB左右,没学过PHP,没办法给Dockerfile文件 参考文章:Docker安装Typecho | D-y Blog感知不强,图一乐https://www.wlul.top…...
【Qt-license】误操作qt下载导致只能安装商业版试用十天,无法安装社区版
背景: 原本是为了学习qml,需要下载一个design studio,而这个需要比较新版的安装程序,但新版的安装程序官方都是online安装。于是从官网找下载链接。毕竟是英文的,又心急,误打误撞中我选择了商业版试用。 其…...
数据操作——缺失值处理
缺失值处理 缺失值的处理思路 如果想探究如何处理无效值, 首先要知道无效值从哪来, 从而分析可能产生的无效值有哪些类型, 在分别去看如何处理无效值 什么是缺失值 一个值本身的含义是这个值不存在则称之为缺失值, 也就是说这个值本身代表着缺失, 或者这个值本身无意义, 比如…...
【刷题笔记4】
动态规划题目汇总 斐波那契数列:1,1,2,3,5,8,13…… 递归一把解决三类问题:1.数据定义是按照递归的(斐波那契数列)。2.问题解法是按递归算法实现的。 3.数据…...
cuda二进制文件中到底有些什么
大家好。今天我们来讨论一下,相比gcc编译器编译的二进制elf文件,包含有 cuda kernel 的源文件编译出来的 elf 文件有什么不同呢? 之前研究过一点 tvm。从 BYOC 的框架中可以得知,前端将模型 partition 成 host 和 accel(accel 表…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
