flask 与小程序 菜品详情和分享功能

2024-01-18 09:20

本文主要是介绍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) | 微信开放文档  关闭所有页面,打开到应用内的某个页面

urlstring需要跳转的应用内页面路径 (代码包路径),路径后可以带参数。参数与路径之间使用?分隔,参数键与参数值用=相连,不同参数用&分隔;如 '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。

函数的主要步骤如下:

  1. 使用getCurrentPages()函数获取当前加载中的所有页面对象,并将其存储在pages数组中。
  2. 通过pages.length - 1获取pages数组中最后一个元素,即当前页面的对象,并将其存储在currentPage变量中。
  3. 使用currentPage.route获取当前页面的URL。
  4. 使用currentPage.options获取当前页面URL中所带的参数,并将其存储在options对象中。
  5. 初始化urlWithArgs变量为url + '?',即将URL和参数拼接起来。
  6. 使用for...in循环遍历options对象,将参数和对应的值拼接到urlWithArgs中。
  7. 使用substring()函数去除最后一个多余的&符号。
  8. 返回拼接好的带参数的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 与小程序 菜品详情和分享功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/618610

相关文章

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

录音功能在哪里? 电脑手机等设备打开录音功能的技巧

《录音功能在哪里?电脑手机等设备打开录音功能的技巧》很多时候我们需要使用录音功能,电脑和手机这些常用设备怎么使用录音功能呢?下面我们就来看看详细的教程... 我们在会议讨论、采访记录、课堂学习、灵感创作、法律取证、重要对话时,都可能有录音需求,便于留存关键信息。下面分享一下如何在电脑端和手机端上找到录音功能

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转