当前位置:   article > 正文

Flask 与小程序 的图片数据交互 过程及探讨研究学习

Flask 与小程序 的图片数据交互 过程及探讨研究学习

今天不知道怎么的,之前拿编程浪子地作品抄过来粘上用好好的,昨天开始照片突的就不显示了。

今天不妨再耐味地细细探究一下微信小程序wxml 和flask服务器端是怎么jpg图片数据交互的。

mina/pages/food/index.wxml

  1. <!--index.wxml-->
  2. <!--1px = 750/320 = 2.34rpx;-->
  3. <view class="container">
  4. <!--轮播图-->
  5. <view class="swiper-container">
  6. <swiper class="swiper_box" autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}" bindchange="swiperchange">
  7. <block wx:for="{{banners}}" wx:key="id">
  8. <swiper-item>
  9. <image bindtap="tapBanner" data-id="{{item.id}}" src="{{item.pic_url}}" class="slide-image" width="750rpx" height="562.5rpx" />
  10. </swiper-item>
  11. </block>
  12. </swiper>
  13. <view class="dots">
  14. <block wx:for="{{banners}}" wx:key="unique">
  15. <view class="dot{{index == swiperCurrent ? ' active' : ''}}"></view>
  16. </block>
  17. </view>
  18. </view>
  19. <!--分类展示-->
  20. <view class="type-container">
  21. <scroll-view class="type-navbar" scroll-x="true">
  22. <view class="type-box" wx:for-items="{{categories}}" wx:key="id">
  23. <view id="{{item.id}}" class="type-navbar-item {{activeCategoryId == item.id ? 'type-item-on' : ''}}" bindtap="catClick">
  24. {{item.name}}
  25. </view>
  26. </view>
  27. <!-- 这段代码是一个小程序中的一个视图组件,它使用了小程序的模板语法。具体来说,这段代码定义了一个视图组件,其中包含一个view标签,
  28. 该标签具有id属性和class属性,并且绑定了一个tap事件处理函数"catClick"。
  29. 在view标签内部,使用了双花括号语法来插入动态数据,其中item.id和item.name是动态的数据,根据实际情况进行渲染。-->
  30. </scroll-view>
  31. </view>
  32. <!--搜索框-->
  33. <view class="search-view" style="background:{{ scrollTop === 0 ?'-webkit-linear-gradient(top, rgba(105,195,170, 1), rgba(105,195,170, 0.3))' :( scrollTop<200 ? 'rgba(105,195,170,'+(scrollTop/400+0.3) +')' : 'rgba(105,195,170,1)') }} ">
  34. <view class="search-content">
  35. <image src="/images/search-pic.png" class="search-icon" />
  36. <input placeholder="请输入搜索内容" class="search-input" maxlength="30" confirm-type="搜索" bindinput='listenerSearchInput'>
  37. </input>
  38. <button class='search-btn' bindtap="toSearch">搜索</button>
  39. </view>
  40. </view>
  41. <view class="goods-container">
  42. <!-- wx:for-items="{{goods}}" 是一个循环遍历的功能,将 goods 数组中的每个元素都渲染成一个 goods-box 组件。-->
  43. <view class="goods-box" wx:for-items="{{goods}}" bindtap="toDetailsTap" data-id="{{item.id}}">
  44. <view class="img-box">
  45. <image src="{{item.pic_url}}" class="image" mode="aspectFill" lazy-load="true" />
  46. </view>
  47. <view class="goods-title">{{item.name}}</view>
  48. <view style='display:flex;'>
  49. <view class="goods-price">¥ {{item.min_price}}</view>
  50. <view wx:if="{{item.price && item.price > 0 && item.min_price != item.price}}" class="goods-price" style='color:#aaa;text-decoration:line-through'>¥ {{item.price}}</view>
  51. </view>
  52. </view>
  53. </view>
  54. <view hidden="{{loadingMoreHidden ? true : false}}" class="no-more-goods">哥也是有底线的</view>
  55. </view>

如上例代码所示,图片的展示是通过一个image src='{{item.pic_url}}'标签引入的。通常情况下,item是一个对象或数组,它包含了多个属性,其中pic_url就是其中一个属性。在这个例子中,item.pic_url表示图片的URL地址,通过该地址可以加载并显示对应的图片。

总之,image 标签是小程序中用于显示图片的组件,通过 src="{{item.pic_url}}" 绑定了图片的地址。追根溯源,找goods数组是从哪里传来的。

goods数组是通过小程序端地js文件绑定的一个getBannerAndCat()函数,并将其设置在onshow生命周期里,通过调用getFoodList(),自动进行的数据读取和刷新。

  1. //解决切换不刷新维内托,每次展示都会调用这个方法
  2. onShow:function(){
  3. this.getBannerAndCat();
  4. },

问题: 这个item对象或数组从何而来?是小程序端的js文件吗?

mina/pages/food/index.js

  1. //index.js
  2. //获取应用实例
  3. var app = getApp();
  4. Page({
  5. data: {
  6. indicatorDots: true,
  7. autoplay: true,
  8. interval: 3000,
  9. duration: 1000,
  10. loadingHidden: false, // loading
  11. swiperCurrent: 0,
  12. categories: [],
  13. activeCategoryId: 0,
  14. goods: [],
  15. scrollTop: "0",
  16. loadingMoreHidden: true,
  17. searchInput: '',
  18. p:1,
  19. processing:false
  20. },
  21. onLoad: function () {
  22. var that = this;
  23. wx.setNavigationBarTitle({
  24. title: app.globalData.shopName
  25. });
  26. },
  27. //解决切换不刷新维内托,每次展示都会调用这个方法
  28. onShow:function(){
  29. this.getBannerAndCat();
  30. },
  31. scroll: function (e) {
  32. var that = this, scrollTop = that.data.scrollTop;
  33. that.setData({
  34. scrollTop: e.detail.scrollTop
  35. });
  36. },
  37. //事件处理函数
  38. swiperchange: function (e) {
  39. this.setData({
  40. swiperCurrent: e.detail.current
  41. })
  42. },
  43. listenerSearchInput:function( e ){
  44. this.setData({
  45. searchInput: e.detail.value
  46. });
  47. },
  48. toSearch:function( e ){
  49. this.setData({
  50. p:1,
  51. goods:[],
  52. loadingMoreHidden:true
  53. });
  54. this.getFoodList();
  55. },
  56. // tapBanner是一个函数,它用于处理轮播图的点击事件具体的实现逻辑如下:
  57. tapBanner: function (e) {
  58. // 首先,通过e.currentTarget.dataset.id获取到当前点击的轮播图的id。
  59. // 然后,判断id是否为0,如果不为0,则执行以下操作:
  60. if (e.currentTarget.dataset.id != 0) {
  61. // 使用wx.navigateTo函数进行页面跳转,跳转到指定的页面。
  62. wx.navigateTo({
  63. // 跳转的目标页面是"/pages/food/info",并且通过url参数传递了点击轮播图的id,参数名为id。
  64. url: "/pages/food/info?id=" + e.currentTarget.dataset.id
  65. });
  66. // 这段代码的作用是当用户点击轮播图,如果轮播图的id不为0,则跳转到指定的页面,并将点击轮播图的id作为参数传递给标页面。
  67. }
  68. },
  69. // toDetailsTap是一个函数,它是在小程序中用于点击事件的回调函数。当触发点击事件时,会执行该函数。
  70. toDetailsTap: function (e) {
  71. // 该函数的作用是跳转到指定的页面。在函数内部,通过调用wx.navigateTo方法来实现页面跳转。
  72. // 其中,url参数指定了跳转的目标页面路径,通过拼接字符串的方式将参数id传递给目标页面。
  73. // 总结一下,toDetailsTap函数的作用是在点击事件发生时,跳转到指定的页面,并将参数id传递给目标页面。
  74. wx.navigateTo({
  75. url: "/pages/food/info?id=" + e.currentTarget.dataset.id
  76. });
  77. },
  78. getBannerAndCat: function () {
  79. var that = this;
  80. // 使用微信小程序的wx.request方法发送一个请求。
  81. wx.request({
  82. // 请求的URL是通过app.buildUrl(“/food/index”)方法构建的
  83. url: app.buildUrl("/food/index"),
  84. // 请求头部信息通过app.getRequestHeader()方法获取
  85. header: app.getRequestHeader(),
  86. // 请求成功后,会将返回的数据保存在resp变量中。
  87. success: function (res) {
  88. var resp = res.data;
  89. // 如果返回的code不等于200,会通过app.alert方法弹出一个提示框显示返回的错误信息,并结束函数的执行。
  90. if (resp.code != 200) {
  91. app.alert({"content": resp.msg});
  92. return;
  93. }
  94. // 如果返回的code等于200,会将返回的banner_list和cat_list数据分别保存在banners和categories变量中,
  95. that.setData({
  96. banners: resp.data.banner_list,
  97. categories: resp.data.cat_list
  98. });
  99. // 并调用getFoodList方法
  100. that.getFoodList();
  101. }
  102. });
  103. },
  104. // 这段代码是一个小程序中的一个函数,名为catClick。它的作用是在点击某个分类时,根据点击的分类id更新数据,并调用getFoodList函数获取对应分类的商品列表。
  105. catClick: function (e) {
  106. this.setData({
  107. // 通过e.currentTarget.id获取点击的分类id。
  108. activeCategoryId: e.currentTarget.id
  109. });
  110. // 使用setData方法更新数据,将activeCategoryId设置为点击的分类id。
  111. this.setData({
  112. // 将loadingMoreHidden设置为true,p设置为1(表示当前页数为1),goods设置为空数组(清空商品列表)。
  113. loadingMoreHidden: true,
  114. p:1,
  115. goods:[]
  116. });
  117. // 调用getFoodList函数获取对应分类的商品列表。
  118. this.getFoodList();
  119. },
  120. onReachBottom: function () {
  121. var that = this;
  122. setTimeout(function () {
  123. that.getFoodList();
  124. }, 500);
  125. },
  126. // 通过发送请求获取食品列表,并将获取到的数据更新到页面上。
  127. getFoodList: function () {
  128. var that = this;
  129. // 首先,函数会检查是否正在处理其他请求,如果是,则直接返回,避免重复请求。
  130. if( that.data.processing ){
  131. return;
  132. }
  133. // 接着,函数会检查是否还有更多数据需要加载,如果没有,则直接返回。
  134. if( !that.data.loadingMoreHidden ){
  135. return;
  136. }
  137. // 然后,函数会将processing标志设置为true,表示正在处理请求。
  138. that.setData({
  139. processing:true
  140. });
  141. // 接下来,函数会发送一个请求到服务器,请求的URL是"/food/search",并且会带上一些参数,
  142. // 如cat_id(食品分类ID)、mix_kw(搜索关键词)、p(页码)等。
  143. wx.request({
  144. url: app.buildUrl("/food/search"),
  145. header: app.getRequestHeader(),
  146. data: {
  147. cat_id: that.data.activeCategoryId,
  148. mix_kw: that.data.searchInput,
  149. p: that.data.p,
  150. },
  151. // 当服务器返回响应时,函数会判断响应的状态码是否为200,如果不是,则弹出一个提示框显示错误信息,并返回。
  152. success: function (res) {
  153. var resp = res.data;
  154. if (resp.code != 200) {
  155. app.alert({"content": resp.msg});
  156. return;
  157. }
  158. // 如果响应的状态码为200,则从响应数据中获取到食品列表,并将其与之前已有的食品列表进行合并。
  159. var goods = resp.data.list;
  160. that.setData({
  161. goods: that.data.goods.concat( goods ),
  162. p: that.data.p + 1,
  163. //最后,函数会更新页面上的数据,包括goods(食品列表)、p(页码)和processing(处理状态),
  164. // 并将processing标志设置为false,表示请求处理完成。
  165. processing:false
  166. });
  167. // 判断变量resp.data.has_more的值是否为0。如果resp.data.has_more的值为0,
  168. // 则执行setData方法,将loadingMoreHidden属性设置为false。
  169. if( resp.data.has_more == 0 ){
  170. that.setData({
  171. loadingMoreHidden: false
  172. });
  173. }
  174. }
  175. });
  176. }
  177. });

那接下来,就去flask服务器端看看/food/search路由是什么情况,图片传参是怎么传的。

web/controllers/api/Food.py

  1. @route_api.route("/food/search" )
  2. def foodSearch():
  3. resp = {'code': 200, 'msg': '操作成功~', 'data': {}}
  4. req = request.values
  5. cat_id = int( req['cat_id'] ) if 'cat_id' in req else 0
  6. mix_kw = str(req['mix_kw']) if 'mix_kw' in req else ''
  7. p = int( req['p'] ) if 'p' in req else 1
  8. if p < 1:
  9. p = 1
  10. page_size = 10
  11. offset = ( p - 1 ) * page_size
  12. query = Food.query.filter_by(status=1 )
  13. if cat_id > 0:
  14. query = query.filter_by(cat_id = cat_id)
  15. if mix_kw:
  16. rule = or_(Food.name.ilike("%{0}%".format(mix_kw)), Food.tags.ilike("%{0}%".format(mix_kw)))
  17. query = query.filter(rule)
  18. food_list = query.order_by(Food.total_count.desc(), Food.id.desc())\
  19. .offset( offset ).limit( page_size ).all()
  20. data_food_list = []
  21. if food_list:
  22. for item in food_list:
  23. tmp_data = {
  24. 'id': item.id,
  25. 'name': "%s"%( item.name ),
  26. 'price': str( item.price ),
  27. 'min_price':str( item.price ),
  28. 'pic_url': UrlManager.buildImageUrl(item.main_image)
  29. }
  30. data_food_list.append(tmp_data)
  31. resp['data']['list'] = data_food_list
  32. resp['data']['has_more'] = 0 if len( data_food_list ) < page_size else 1
  33. return jsonify(resp)

common/libs/UrlManager.py

  1. # -*- coding: utf-8 -*-
  2. import time
  3. from app import app
  4. class UrlManager(object):
  5. def __init__(self):
  6. pass
  7. @staticmethod
  8. def buildImageUrl( path ):
  9. app_config = app.config['APP']
  10. url = app_config['domain'] + app.config['UPLOAD']['prefix_url'] + path
  11. return url

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/294110
推荐阅读
相关标签
  

闽ICP备14008679号