【微信小程序】-- 案例 - 本地生活(列表页面)(三十)

news2024/11/18 5:15:57

请添加图片描述

  • 💌 所属专栏:【微信小程序开发教程】

  • 😀 作  者:我是夜阑的狗🐶

  • 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询!

  • 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

文章目录

  • 前言
  • 一、案例 - 本地生活(列表页面)
      • 1、演示页面效果以及主要功能
  • 二、页面导航并传参
  • 三、上拉触底时加载下一页数据
      • 1、动态设置页面标题
      • 2、创建编译模式
      • 3、列表页面的 API 接口
      • 4、实现上拉加载数据和效果
      • 5、对上拉触底进行节流处理
      • 6、判断数据是否加载完毕
  • 四、下拉刷新列表数据
  • 五、使用 wxs 处理手机号
  • 总结


前言

  大家好,又见面了,我是夜阑的狗🐶,本文是专栏【微信小程序开发教程】专栏的第30篇文章;
  今天开始学习微信小程序的第15天💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。
  专栏地址:【微信小程序开发教程】, 此专栏是我是夜阑的狗微信小程序开发过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
  如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。


一、案例 - 本地生活(列表页面)

  前面已经学习了WXS 脚本的概念和基本语法,通过栗子了解到WXS的怎么创建和调用。接下来就来根据前面学的知识,在案例-本地生活上进行实践。话不多说,让我们原文再续,书接上回吧。

请添加图片描述

1、演示页面效果以及主要功能

  首先来看一下页面演示效果,页面中有列表数据,其中还要具备下拉和上拉刷新功能:

在这里插入图片描述

  接下来实现主要功能有三个:

  • 页面导航并传参
  • 上拉触底时加载下一页数据
  • 下拉刷新列表数据

二、页面导航并传参

  首先创建列表页面,可以通过 app.json 文件进行快速创建。

app.json

{
  "pages":[
    "pages/home/home",
    "pages/message/message",
    "pages/contact/contact",
    "pages/shoplist/shoplist"
  ],
}

  可以来看一下实际结果:

在这里插入图片描述

  从 view 组件改造成 navigator 组件,从而支持跳转行为,并且在跳转过程中还要传递参数(id + 名称),为了后续页面标题和查询数据做准备。

home.wxml

<view class="grid-list">
  <navigator class="grid-item" wx:for="{{gridList}}" wx:key="id" 
  url="/pages/shoplist/shoplist?id={{item.id}}&title={{item.name}}">
    <image src="{{item.icon}}"></image>
    <text>{{item.name}}</text>
  </navigator>
</view>

  可以来看一下实际结果:

在这里插入图片描述

三、上拉触底时加载下一页数据

1、动态设置页面标题

  不能通过页面 .json 文件 中 navigationBarTitleText 来进行设置,这个操作是直接把页面标题直接写死,这样不符合需求的。这里需要调用小程序的 ·wx.setNavigationBarTitle(Object object) 来动态设置当前页面的标题。具体参数如下所示:

属性类型默认值必填说明
titlestring页面标题
successfunction接口调用成功的回调函数
failfunction接口调用失败的回调函数
completefunction接口调用结束的回调函数(调用成功、失败都会执行)

  前面刚学完页面生命周期,了解到对界面内容进行设置的 API 如 wx.setNavigationBarTitle ,请在onReady之后进行。而 onReady 是页面初次渲染完成时触发,具体代码如下所示:

shoplist.js

Page({
  /**
   * 页面的初始数据
   */
  data: {
    query: {}
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    this.setData({
      query: options
    })
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
    wx.setNavigationBarTitle({
      title: this.data.query.title,
    })
  },
})

  可以来看一下实际效果:

在这里插入图片描述

2、创建编译模式

  为了方便后续开发,可以创建 showlist 页面的编译模式,指定好启动页面和页面参数,等下一次对 showlist 页面进行改动,编译完就会立即跳转到该页面。具体操作如下:

在这里插入图片描述

3、列表页面的 API 接口

  以分页的形式,加载指定分类下商铺列表的数据,如下表所示:

数据说明
接口地址https://www.escook.cn/categories/:cate_id/shops
URL 地址中的 : cate_id 是动态参数,表示分类的 Id
请求方式GET 请求
请求参数_page 表示请求第几页的数据
_limit 表示每页请求几条数据

  接下来就是定义获取数据方法,并进行调用,具体代码如下所示:

shoplist.js

Page({

  /**
   * 页面的初始数据
   */
  data: {
    query: {},
    shopList: [],
    page: 1, // 当前页数
    pageSize: 10, //一页有多少个数据
    total: 0, // 总页数
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    this.setData({
      query: options
    });
    this.getShopList();
  },
  /**
   * 获取列表数据
   */
  getShopList(){
    wx.request({
      url: `https://www.escook.cn/categories/${this.data.query.id}/shops`,
      method: 'GET',
      data:{
        _page: this.data.page,
        _limit: this.data.pageSize,
      },
      success: (res) =>{
        this.setData({
          shopList: [...this.data.shopList, ...res.data],
          // 页面总数获取到是字符,需要转换成数字
          total: res.header['X-Total-Count'] - 0,
        })
      }
    })
  },
})

  注意!注意!注意!:这里需要注意一点,就 url 是动态填充路径的,所以要用反引号 `,如果这里只用单引号’ 或者双引号 ",是不会有数据的,因为这样就把 ${this.data.query.id} 当成id的值了,肯定查询不到数据。如果要用引号,记得一定要采用拼接的方式:‘+this.data.query.id+’。

  到这里基本上就完成获取数据,可以查看返回的 res 参数里面有什么。

在这里插入图片描述

  知道 res 里有什么数据之后,将其赋给 data 里对应的变量即可,如下图所示:

在这里插入图片描述

  获取商品列表数据之后,接下来就是将其渲染到页面中并进行样式美化。

shoplist.wxml

<view class="shop-item" wx:for="{{shopList}}" wx:key="id">
  <view class="left-thumb">
    <image src="{{item.images[0]}}"></image>
  </view>
  <view class="right-info">
    <text class="shop-title">{{item.name}}</text>
    <text>电话:{{item.phone}}</text>
    <text>地址:{{item.address}}</text>
    <text>营业时间:{{item.businessHours}}</text>
  </view>
</view>

shoplist.wxss

.shop-item {
  display: flex;
  /* 添加边框 */
  padding: 20rpx;
  border: 1rpx solid #efefef;
  /* 圆角样式 */
  border-radius: 10rpx;
  margin: 20rpx;
  /* 盒子阴影 */
  box-shadow: 1rpx 1rpx 15rpx #ddd;
}
.left-thumb image {
  width: 250rpx;
  height: 250rpx;
  display: block;
  margin-right: 20rpx;
}
.right-info{
  display: flex;
  /* 纵向布局 */
  flex-direction: column;
  justify-content: space-around;
  font-size: 24rpx;
}
.shop-title{
  /* 文本加粗 */
  font-weight: bold;
}

  可以来看一下实际效果:

在这里插入图片描述

4、实现上拉加载数据和效果

  通过 wx.showLoading(Object object) 可实现上拉加载效果,具体代码如下:

shoplist.js

Page({
  /**
   * 获取列表数据
   */
  getShopList(){
    // 展示 loading 效果
    wx.showLoading({
      title: '数据加载中',
    })  
    wx.request({
      url: `https://www.escook.cn/categories/${this.data.query.id}/shops`,
      method: 'GET',
      data:{
        _page: this.data.page,
        _limit: this.data.pageSize,
      },
      success: (res) =>{ 
        // console.dir(res);
        this.setData({
          shopList: [...this.data.shopList, ...res.data],
          // 页面总数获取到是字符,需要转换成数字
          total: res.header['X-Total-Count'] - 0,
        });
      },
      complete: ()=>{
        // 隐藏 loading 效果
        wx.hideLoading();
      }
    })
  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
    this.setData({
      page: this.data.page+1
    });
    this.getShopList();
  },
})

shoplist.json

  并将上拉触底的距离改为200。

{
  "usingComponents": {},
  "onReachBottomDistance": 200
}

  可以来看一下实际运行效果:

在这里插入图片描述

5、对上拉触底进行节流处理

  前面也讲过,当连续触底多次,就会引发不必要的问题。所以需要在上拉监听函数做节流处理,如果当前请求正在请求数据,后续发送的请求都应该进行屏蔽。当前没有数据请求的时候,才可以允许发起下一页的请求。

  节流处理可分为以下步骤:

  • Step 1、在 data 中定义 isloading 节流阀

  isloading 为布尔值,false 表示当前没有进行任何数据请求,可以请求, true 表示当前正在进行数据请求,重新触发的下一页请求都要被屏蔽。

  • Step 2、在 getShopList() 方法中修改 isloading 节流阀的值

  当开始发起请求时,调用 getShopList 时将节流阀设置 true,数据请求完成之后,在网络请求的 complete回调函数中,将节流阀重置为 false

  • Step 3、在 onReachBottom 中判断节流阀的值,从而对数据请求进行节流控制

  如果节流阀的值为 true,则阻止当前请求。如果节流阀的值为 false,则发起数据请求。

  具体代码如下:

shoplist.js

Page({
  /**
   * 页面的初始数据
   */
  data: {
    query: {},
    shopList: [],
    page: 1, // 当前页数
    pageSize: 10, //一页有多少个数据
    total: 0, // 总页数
    isloading: false,
  },
  /**
   * 获取列表数据
   */
  getShopList(){
    this.setData({
      isloading: true
    })
    // 展示 loading 效果
    wx.showLoading({
      title: '数据加载中',
    })  
    wx.request({
      url: `https://www.escook.cn/categories/${this.data.query.id}/shops`,
      method: 'GET',
      data:{
        _page: this.data.page,
        _limit: this.data.pageSize,
      },
      success: (res) =>{ 
        // console.dir(res);
        this.setData({
          shopList: [...this.data.shopList, ...res.data],
          // 页面总数获取到是字符,需要转换成数字
          total: res.header['X-Total-Count'] - 0,
        });
      },
      complete: ()=>{
        // 隐藏 loading 效果
        wx.hideLoading();
        this.setData({
          isloading: false
        })
      }
    })
  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
    // 节流处理
    if(this.data.isloading) return;
    this.setData({
      page: this.data.page+1
    });
    this.getShopList();
  },
})

  可以来看一下运行效果:

在这里插入图片描述

6、判断数据是否加载完毕

  当请求 8 页数据之后,再次进行上拉操作时就会发起数据请求。在开发过程中,这种行为是不允许的,所以当数据加载完之后,需要判断是否还有下一页数据,没有的话则后续触发上拉监听就应该不用触发。
  这里就需要公式来进行推导了,如果下面的公式成立,则证明没有下一页数据了:
{ 页码值 ∗ 每页显示多少条数据 > = 总数据条数 p a g e ∗ p a g e S i z e > = t o t a l \begin{cases} 页码值 * 每页显示多少条数据 >= 总数据条数 \\ page * pageSize >= total\\ \end{cases} {页码值每页显示多少条数据>=总数据条数pagepageSize>=total

  可以通过案例来验证一下这个公式准确性:

  • 案例1:总共有 77 条数据,如果每页显示 10 条数据,则总共分为 8 页,其中第 8 页只有 7 条数据;
    { p a g e ( 7 ) ∗ p a g e S i z e ( 10 ) > = t o t a l ( 77 ) p a g e ( 8 ) ∗ p a g e S i z e ( 10 ) > = t o t a l ( 77 ) \begin{cases} page(7)* pageSize(10) >= total(77)\\ page(8)* pageSize(10) >= total(77) \end{cases} {page7pageSize10>=total77page8pageSize10>=total77
  • 案例2:总共有 80 条数据,如果每页显示 10 条数据,则总共分为 8 页,其中第 8 页面有 10 条数据;
    { p a g e ( 7 ) ∗ p a g e S i z e ( 10 ) > = t o t a l ( 80 ) p a g e ( 8 ) ∗ p a g e S i z e ( 10 ) > = t o t a l ( 80 ) \begin{cases} page(7)* pageSize(10) >= total(80)\\ page(8)* pageSize(10) >= total(80) \end{cases} {page7pageSize10>=total80page8pageSize10>=total80

  综上所述,说明该公式是可行的,根据这个公式可以对数据加载请求做处理,当数据已经加载完不能加载的时候,需要给用户添加一个提示框,可以通过调用 wx.showToast(Object object) 来实现,先来了解一下该函数的部分参数:

属性类型默认值必填说明最低版本
titlestring提示的内容
iconstringsuccess图标
imagestring自定义图标的本地路径,image 的优先级高于 icon1.1.0
durationnumber1500提示的延迟时间
maskbooleanfalse是否显示透明蒙层,防止触摸穿透

  具体代码如下:

shoplist.js

Page({
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
    if(this.data.page * this.data.pageSize >= this.data.total){
      // 没有下一页数据
      return wx.showToast({
        title: '数据加载已完成',
        icon:'none'
      })
    }
    // 节流处理
    if(this.data.isloading) return;
    this.setData({
      page: this.data.page+1
    });
    this.getShopList();
  },
})

  当数据加载完之后,可以来看一下运行效果:

在这里插入图片描述

四、下拉刷新列表数据

  完成上拉刷新之后,接下来就是要实现下拉刷新列表数据,并其样式进行美化。
  下拉刷新需要重置页面部分参数,然后在根据重置过后的数据重新发起请求,这里还需要注意一点就是需要主动来关闭下拉刷新窗口,这里可以把关闭操作放在数据请求完成之后。具体代码如下所示:

shoplist.json

  开启下拉刷新功能。

{
  "usingComponents": {},
  "onReachBottomDistance": 200,
  "enablePullDownRefresh": true,
  "backgroundColor": "#efefef",
  "backgroundTextStyle": "dark"
}

shoplist.js

  但是这里有个问题了,如果直接把关闭操作放在 getShopList 里的 complete,这样上拉刷新的时候也会进行调用,这很明显不符合开发需求,所以需要对关闭下拉刷新操作进行限制一下。可以对 getShopList 进行传递回调函数,只有下拉刷新的时候才会给 getShopList 进行传函数,其他时候不传即可。
   stopPD && stopPD(); 而表达的意思是当 stopPD 不为 undefined 的时候就执行该函数,反转不执行。

Page({
  /**
   * 获取列表数据
   */
  getShopList(stopPD){
	...
    wx.request({
	  ...
      complete: ()=>{
        // 隐藏 loading 效果
        wx.hideLoading();
        this.setData({
          isloading: false
        });
        // 数据请求完成关闭下拉刷新窗口
        // wx.stopPullDownRefresh();
        stopPD && stopPD();
      }
    })
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
    // 需要重置关键的数据
    this.setData({
      page: 1,
      shopList: [],
      total: 0
    })
    // 重新发起数据请求
    this.getShopList(() => {
      wx.stopPullDownRefresh();
    });
  },
})

  当数据加载几页之后,触发下拉监听时,会将页面中的 page、shopList 和 total 进行重置,然后在请求第一页的数据,可以来看一下运行效果:

在这里插入图片描述

五、使用 wxs 处理手机号

  最后就是要来处理列表数据中的手机号,可以使用 wxs 脚本来对页面数据进行过滤。创建 tool.wxs 脚本编写功能,具体操作如下:

在这里插入图片描述

tool.wxs

function splitPhone(str){
  if(str.length !== 11) return str;
  var arr = str.split('');

  arr.splice(3, 0, '-');
  arr.splice(8, 0, '-');

  return arr.join('');
}

module.exports = {
  splitPhone: splitPhone
}

shoplist.wxml

<view class="shop-item" wx:for="{{shopList}}" wx:key="id">
  <view class="left-thumb">
    <image src="{{item.images[0]}}"></image>
  </view>
  <view class="right-info">
    <text class="shop-title">{{item.name}}</text>
    <text>电话:{{tools.splitPhone(item.phone)}}</text>
    <text>地址:{{item.address}}</text>
    <text>营业时间:{{item.businessHours}}</text>
  </view>
</view>

<wxs src="../../utils/tool.wxs" module="tools"></wxs>

  到这里基本上就完成整个列表页面的设置了,来看一下实际效果:

在这里插入图片描述


总结

  感谢观看,这里就是案例 - 本地生活(列表页面)的介绍,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹

在这里插入图片描述

  也欢迎你,关注我。👍 👍 👍

  原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉

更多专栏订阅:

  • 😀 【LeetCode题解(持续更新中)】
  • 🚝 【Java Web项目构建过程】
  • 💛 【微信小程序开发教程】
  • 【JavaScript随手笔记】
  • 🤩 【大数据学习笔记(华为云)】
  • 🦄 【程序错误解决方法(建议收藏)】
  • 🚀 【软件安装教程】



订阅更多,你们将会看到更多的优质内容!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是图神经网络?

什么是图神经网络&#xff1f; GNN 将深度学习的预测能力应用于丰富的数据结构&#xff0c;这些数据结构将对象及其关系描述为图中由线连接的点。 当两种技术融合时&#xff0c;它们可以创造出新奇而美妙的东西——比如手机和浏览器融合在一起打造智能手机。 如今&#xff0…

Java使用Springboot+Mybatis构建第一个项目

一、java安装&#xff1a;安装 Java1.8环境 maven3.6.1环境 Gradle-6.9.1环境 IntelliJ IDEA 2022.1.3 下载旗舰版&#xff08;因为包含springboot&#xff09;二、项目构建-数据库是sqlserver&#xff1a;1、打开idea&#xff0c;点击File->New->Project&#xff0c;选中…

华为OD机试题,用 Java 解【英文输入法】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

输入两个数,可以进行加减乘除的操作。

完整代码如下所示&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wi…

博客系统 -- 静态页面

文章目录1. 前言2. 页面展示3. 实现3.1 博客列表页3.2 博客详情页3.3 登录页面3.4 博客编辑页4. 整体代码1. 前言 到此 我们对 HTML &#xff0c; CSS &#xff0c; JavaScript 已经有了个简单的了解 &#xff0c; 但是还不太熟悉 &#xff0c;下面就通过 写一个博客系统的 网站…

易优cms load 加载资源文件标签使用方法

【基础用法】 标签&#xff1a;load 描述&#xff1a;资源文件加载&#xff0c;比如&#xff1a;css/js 用法&#xff1a; {eyou:load href/static/js/common.js veron /} 属性&#xff1a; file 资源文件路径 href 远程资源文件URL ver 开启版本号自动刷新浏览器缓存 …

知著见微——读《战略与路径》

前几天刚读完《战略与路径&#xff1a;黄奇帆的十二堂经济课》&#xff0c;这本书是根据2020-2021年期间黄奇帆先生在复旦大学讲的12堂课编辑成书。放在前几年我是基本不怎么看这种讲宏观经济类的书&#xff0c;但近几年宏观的变化正以前所未有的方式展开&#xff0c;切切实实影…

让AI帮你工作(2)-如何阅读pdf论文

这个系列快结束了&#xff0c;后面会有一到两篇文章介绍&#xff0c;如何用AI实实在在的应用在工业生产研发&#xff0c;如何指导化工分子合成&#xff0c;如何做DNA的研究预测&#xff0c;合成。背景最近chatpdf在各媒体传的风风火火&#xff0c;从效果上是很震撼的。原因大概…

Linux内核Thermal框架详解一、总述

本文部分内容参考万字长文 | Thermal框架源码剖析&#xff0c;特此致谢&#xff01; Linux Thermal Framework是Linux系统下温度控制相关的一套架构&#xff0c;主要用来解决随着设备性能不断增强而引起的日益严重的发热问题&#xff0c;控制系统运行过程中各个器件所产生的热量…

【web前端开发】CSS最常用的11种选择器

文章目录1.CSS介绍2.CSS的语言规则3.CSS的引入方式4.选择器标签选择器类选择器id选择器通配符选择器复合选择器后代选择器子代选择器并集选择器交集选择器伪类选择器hover伪类选择器active伪类选择器结构伪类选择器结语1.CSS介绍 CSS (Cascading Style Sheets&#xff0c;层叠样…

分布式架构-流量治理-服务容错

系列目录 分布式架构-流量治理-服务容错 分布式架构-流量治理-流量控制 引子 容错性设计(Design for Failure)是微服务的一个核心原则。随着拆分出的服务越来越多&#xff0c;随之而来会面临以下两个问题的困扰&#xff1a; 由于某一个服务的崩溃&#xff0c;导致所有用到这个服…

MyBatis的基本使用

MyBatis 为啥MyBatis会使用xml 在一个程序中&#xff0c;若需要操作数据表&#xff0c;那么 SQL 语句有两种存放方式&#xff1a;1. 放到 Java 类里面&#xff08;这个就存在大量的字符串拼接&#xff0c;还有占位符需要处理-----JDBC&#xff09;&#xff1b;2&#xff1a;放…

TypeScript深度剖析: TypeScript 装饰器的理解?应用场景?

面试官&#xff1a;说说你对 TypeScript 装饰器的理解&#xff1f;应用场景&#xff1f; 一、是什么 装饰器是一种特殊类型的声明&#xff0c;它能够被附加到类声明&#xff0c;方法&#xff0c; 访问符&#xff0c;属性或参数上 是一种在不改变原类和使用继承的情况下&#…

程序员中的女性力量——做不被定义的自己

她是office lady&#xff0c;亦是程序媛&#xff0c;程序员界的靓丽色彩&#xff0c;不可或缺。 “只有那些疯狂到以为自己能够改变世界的人——才能真正改变世界。” 女性该如何定义自己&#xff1f;程序媛怎么发挥自己最大的价值。 争取自己做选择&#xff0c;经济和思想都独…

Spring基础与创建

目录 前言 Spring基础与核心概念 Spring是什么 1、什么是容器 2、什么是IoC 3、理解SpringIoC 4、DI&#xff08;依赖注入&#xff09; Spring的创建和使用 1、创建Spring项目 1.1、创建一个普通Maven项目 1.2、添加Spring框架支持 1.3、添加启动类和main方法 2、…

【c++】:STL模板中string的使用

文章目录 STL简介一.认识string二.string中基本功能的使用总结STL简介 STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。STL的版本 原始版本 Alexand…

15_MySQL存储过程与存储函数

MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起&#xff0c;应用程序无须关注存储过程和函数内部复杂的SQL逻辑&#xff0c;而只需要简单地调用存储过程和函数即可。1. 存储过程概述1.1 理解含义&#xff1a;存储过程的英文是 Stored Pro…

JDK8新特性宝典

JDK8新特性 ​ Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台 课程内容的介绍 了解Java发展史Lambda表达式…

[深入理解SSD系列 闪存2.1.5] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现

前言 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义, 下面先来个热身: 问1. 原理图上NAND FLASH只有数据线,怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址 当ALE为高电平时传输的是地址, 问2. 从NAND FLASH芯片手册可知,要…

Apache DolphinScheduler GitHub Star 突破 10000!

点击蓝字 关注我们今天&#xff0c;Apache DolphinScheduler GitHub Star 突破 10000&#xff0c;项目迎来一个重要里程碑。这表明 Apache DolphinScheduler 已经在全球的开发者和用户中获得了广泛的认可和使用。DolphinScheduler 旨在解决公司日常运营中的大数据处理工作流调度…