【第二周】基础语法学习

news2024/10/6 0:25:35

0.png


目录

  • 前言
  • 初始化项目
  • 文件介绍
  • 基本介绍
    • JS
    • WXML
    • WXSS
  • 常见组件
    • 基础组件
    • 视图容器
      • match-media
      • movable-area/view
      • page-container
      • scroll-view
      • swiper
    • 表单组件
    • 自定义组件
  • 模板语法
    • 数据绑定
      • 单向数据绑定
      • 双向数据绑定
    • 列表渲染
    • 条件渲染
    • 模板引用
  • 事件系统
    • 事件类型
    • 事件绑定
    • 阻止冒泡
    • 互斥事件
    • 事件参数
  • 页面切换
  • 生命周期
  • 数据通信
    • 全局通信
      • localStorage(本地存储)
      • globData(小程序全局存储)
    • 父 => 子
    • 父 => 父
    • 子 => 父
      • triggerEvent
      • selectComponent
    • 子 => 子
  • 网络请求
  • 第三方组件
    • Vant/weapp 1.11
    • Tailwind
  • 拓展功能
  • 提问改善


前言

8.png
当前教程的示例代码已经在 Github 开源,大家开源下载简易的示例对照学习,https://github.com/bosombaby/wechat_tutorial

在进行一个完整的小程序项目开始时,建议阅读一遍小程序开发的设计指南。
微信小程序设计指南 | 微信开放文档

微信小程序的编码规范链接如下:
https://juejin.cn/post/7047299287264264206

初始化项目

1.png
简单介绍一下初始化项目文件、文件夹的用法和配置

  1. 打开微信开发者工具,通过目录打开本地文件的空文件夹(项目名称识别为目录名称)
  2. AppID 获取流程参考第一周的学习内容
  3. 后端服务学习阶段选择不使用云服务
  4. 模板选择我们工作中使用的 JS 基础模板

文件介绍

1.png
2.png3.png

5.png

  1. 微信开发者工具的使用教程可跳转到第一章查看
  2. 初始化不同文件的含义对比图参见上图
  3. 鼠标右键可以添加页面和组件,同时需要确保在 app.json 配置中被顺利引入

基本介绍

JS

和 js的用法一致,注意的是响应式机制和 vue 前端框架有所不同。

1.在这里定义数据
data: {
  msg:'Hello WeChat'
}

2.获取数据
this.data.msg

3.更新数据
this.setData({
  msg:'更新数据'
})

WXML

https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/
和原生的 html 标签的逻辑一致,但是有部分标签不可用,小程序也内置了相关的标签组件。

HTML通用标签:<div>, <span>, <a>, <img>, <p>, <h1><h6>, <strong>, <em>, <ul>, <ol>, <li> 
WXML专用标签:<view>, <text>, <image>, 
  <button>, <navigator>, <swiper>, <scroll-view>, <picker>, <form> 

WXSS

https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxss.html
rpx是微信小程序中css的尺寸单位,可以根据屏幕宽度进行自适配。
规定屏幕宽度为750px,譬如iphone6,屏幕宽度为375px,共有750个物理像素,则1rpx = 0.5px,后续可以扩展讲解一下 em rem px rpx 逻辑像素 物理像素 等原理,目前只需要了解在标准开发下 1rpx = 0.5px 就行。
其余样式的用法和原生 css 差不多,只是只有一个标签名和类名定义变量

常见组件

基础组件

最常用的就是 view text,相当于html 的 div span 标签

视图容器

match-media

1.png
https://developers.weixin.qq.com/miniprogram/dev/component/match-media.html
相当于前端的媒体查询,页面宽高在一定的范围内才会触发,注意这里是 px 不是 rpx

示例代码如下:

<match-media min-width="300" max-width="600">
  <view>当页面宽度在 300 ~ 500 px 之间时展示这里</view>
</match-media>
<match-media min-width="1200">
  <view>当页面宽度在 300 ~ 500 px 之间时展示这里</view>
</match-media>

movable-area/view

https://developers.weixin.qq.com/miniprogram/dev/component/movable-area.html
2.png

QQ截图20240621141606.png
可以移动拖拽的区域或者视图组件,通常用在验证码、需要交互拖拽的场景中,比如购物车的左滑移动删除
示例代码:

<movable-area class="movable-area">
  <movable-view x="{{x}}" y="{{y}}" direction="all" class="movable-view" bindtap="handleAreaMove"></movable-view>
</movable-area>

this.setData({
  x: 30,
  y: 30,
});

page-container

主要是底部弹出的对话框,效果类似于 popup 弹出层。
https://developers.weixin.qq.com/miniprogram/dev/component/page-container.html
3.png

  1. tip: 当前页面最多只有 1 个容器,若已存在容器的情况下,无法增加新的容器
  2. tip: wx.navigateBack 无法在页面栈顶调用,此时没有上一级页面

示例代码:

<page-container show="{{isShowPage}}" position="bottom" bind:afterleave="afterLeave">
  <view class="poup-content">
    这里是弹窗内容,哈哈哈哈哈
  </view>
</page-container>

scroll-view

可以滚动的视图区域
https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view.html
5.png
示例代码:

<scroll-view scroll-y="true" class="scroll-view-list" scroll-into-view="{{scrollToView}}" scroll-top="{{scrollTop}}" scroll-with-animation="true">
  <view id="demo1" class="scroll-view-item" style="background-color: cadetblue;">1</view>
  <view id="demo2" class="scroll-view-item" style="background-color:chartreuse;">2</view>
  <view id="demo3" class="scroll-view-item" style="background-color:crimson;">3</view>
</scroll-view>

<view class="flex-bc">
  <button type="primary" bindtap="scrollToTop">顶部</button>
  <button type="primary" bindtap="scrollToTarget">特定元素</button>
</view>

swiper

小程序相关的轮播图教程,可以使用微信小程序官方提供的** api(推荐)**或者其他的第三方组件库
6.png

<swiper class="scroll-view-list" indicator-dots="true" autoplay="true" interval="500" circular="true">
  <swiper-item id="demo1" class="scroll-view-item" style="background-color: cadetblue;">1</swiper-item>
  <swiper-item id="demo2" class="scroll-view-item" style="background-color:chartreuse;">2</swiper-item>
  <swiper-item id="demo3" class="scroll-view-item" style="background-color:crimson;">3</swiper-item>
</swiper>

表单组件

0.png
https://developers.weixin.qq.com/miniprogram/dev/component/button.html
和原生的 html 标签差不多,用到的话可以去查

自定义组件

https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/
https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html

  • 自定义组件的流程:定义 => 注册 => 引入
  • 比普通的 Page 的生命周期不同,多了一个 properties 传参

Slot | 微信开放文档
插槽 slot 用法如下:

1. 单个插槽
<my-component parentName="常见组件学习">
  <view style="color:cornflowerblue">我是单个插槽</view>
</my-component>

2. 多个插槽
<view slot="before">组件slot name="before"</view>
<view slot="after">组件slot name="after"</view>

模板语法

WXML是框架设计的一套标签语言,结合常见组件、事件系统 可以构建出页面的结构。

数据绑定

单向数据绑定

概述:data=>页面
3.png

<view>{{message}}</view>


data: {
  message: "你好,数据绑定",
}

和 VUE 的插值表达式一致,允许你将JavaScript表达式的值嵌入到模板字符串中,并且小程序会自动更新DOM以反映该表达式值的变化。

双向数据绑定

概述:data<=>页面
6.png
简易双向绑定 | 微信开放文档

<input model:value="{{num}}" class="input-num" />
<view>{{num}}</view>

在 WXML 中,普通的属性的绑定是单向的,一般都监听数值的变化然后通过方法操作。但是目前微信小程序双向绑定只支持单一字段、不支持对象,可以在组件中自定义双向绑定。

列表渲染

5.png

<text class="second-level-title">2.列表渲染</text>
<view wx:for="{{arrayList}}" wx:key="id" wx:for-index="idx" wx:for-item="myItem">
  {{idx}} -- {{myItem.content}}
</view>

arrayList: [
  { id: "1-1", content: "测试数据1" },
  { id: "1-2", content: "测试数据2" },
  { id: "1-3", content: "测试数据3" },
  { id: "1-4", content: "测试数据4" },
  { id: "1-5", content: "测试数据5" },
]

https://blog.csdn.net/qq_53673551/article/details/127167029
WXML 的列表渲染语法需要提供为唯一值 key ,它是虚拟 DOM 比较的标识

条件渲染

7.png
在框架中,使用 wx:if=“” 来判断是否需要渲染该代码块,如果要一次性判断多个组件标签,可以使用 仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。

<text class="second-level-title">3.条件渲染</text>
<input model:value="{{score}}" class="input-num" />
<view wx:if="{{score >= 90}}"> 优秀 </view>
<view wx:elif="{{ score >= 70}}"> 良好 </view>
<view wx:elif="{{ score >= 60}}"> 及格 </view>
<view wx:else> 不及格 </view>

wx:if 和 hidden 的区别就是 v-if 和 v-show 的区别
7.png

模板引用

模板 template 相当于简易的自定义组件,感觉有点像 VUE 里面的插槽(slot),示例如下:
8.png

<text class="second-level-title">4.模板引用</text>
<template name="odd">
  <view>{{item}} is 奇数 </view>
</template>
<template name="even">
  <view>{{item}} is 偶数 </view>
</template>

<block wx:for="{{[1, 2, 3, 4, 5]}}">
  <template is="{{item % 2 == 0 ? 'even' : 'odd'}}" data="{{item}}" />
</block>

跨文件使用的导入方式如下:

  1. 单个导入 template ,一层关系依赖,不可用递归引入
<template name="header">
  <text style="color: red;"> 头部区域模板 {{score}}</text>
</template>

<import src="./header.wxml" />
<template is="header" data="{{score}}" />
  1. 导入除了 外的整个代码,相当于拷贝,后续可以专注于 wxml 组件的拆分(局部组件)
<include src="./header.wxml" />
<div>这里是内容区域</div>
<include src="./footer.wxml" />

事件系统

事件类型

事件分为冒泡事件和非冒泡事件:

类型触发条件版本
touchstart手指触摸动作开始
touchmove手指触摸后移动
touchcancel手指触摸动作被打断,如来电提醒,弹窗
touchend手指触摸动作结束
tap手指触摸后马上离开
longpress手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发1.5.0
longtap手指触摸后,超过350ms再离开(推荐使用longpress事件代替)
transitionend会在 WXSS transition 或 wx.createAnimation 动画结束后触发
animationstart会在一个 WXSS animation 动画开始时触发
animationiteration会在一个 WXSS animation 一次迭代结束时触发
animationend会在一个 WXSS animation 动画完成时触发
touchforcechange在支持 3D Touch 的 iPhone 设备,重按时会触发1.9.90

注:除上表之外的其他组件自定义事件如无特殊声明都是非冒泡事件,如 form 的submit事件,input** 的input事件,scroll-view 的scroll事件,(详见各个**组件)

事件绑定

10.png

1. bind:[事件名称]="[事件绑定函数名称]"
2. 事件绑定函数名称 是一个字符串,指向在 .ts/.js 文件的 Page 函数中定义的处理函数名。
<button bind:tap="openDialog">点击弹窗</button>

阻止冒泡

8.png

除 bind 外,也可以用 catch 来绑定事件。与 bind 不同, catch 会阻止事件向上冒泡。
<view id="outer" bind:tap="handleTap1">
  outer view
  <view id="middle" catch:tap="handleTap2">
    middle view
    <view id="inner" catch:tap="handleTap3">
      inner view
    </view>
  </view>
</view>

互斥事件

除了 bind 和 catch 外,还可以使用 mut-bind 来绑定互斥事件
所有 mut-bind 绑定都是互斥的,只会触发其中一个绑定函数
不会影响bind 和 catch 绑定的事件

事件参数

和 VUE 直接向方法函数传参不同外,他的事件系统需要自定义属性去获取,示例如下:
11.png
target 触发事件的源组件,currentTarget 事件绑定的当前组件,比如冒泡事件举例:

<view id="outer" data-name="outer" data-msg="hello" bind:tap="handleTap4">
  outer view
  <view id="middle">
    middle view
    <view id="inner">
      inner view
    </view>
  </view>
</view>

handleTap4(event) {
  const name = event.currentTarget.dataset.name;
  const msg = event.currentTarget.dataset.msg;
  console.log("outer", event);
  console.log(name, msg);
}

页面切换

https://juejin.cn/post/7079045451948916744
https://blog.csdn.net/weixin_47124112/article/details/126466315
https://bosombaby.blog.csdn.net/article/details/122012979
10.png

  • 获取当前小程序应用的页面栈使用 getCurrentPages ,后续页面栈(后进先出,也就是数组)过多可以通过这个条件进行清除。
  • 使用 navigateTo 跳转,页面最上方会出现返回上一级的按钮,可以便捷调用 navigateBack

38.png
在微信小程序中的实践结果如下图所示:

  • 动态记录和管理用户在小程序中页面访问顺序和跳转关系的栈结构,支持导航、参数传递、生命周期管理,并具有容量限制。
  • 入栈即使路由路径相同也会添加,本质是由微信小程序定义的 **wxExparserNodeId**唯一
  • wx.navigateTo**(添加新的页面栈,新加入的页面从头渲染,之前的页面 onHide 隐藏,为了使用 navigateBack 走缓存 onShow )**
  • wx.redirectTo(原理和 navigateTo一致,但是这样就没法走 navigateBack 缓存返回)

生命周期

https://juejin.cn/post/7151402790823133215
https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/page-life-cycle.html
跟vue、react框架一样,微信小程序框架也存在生命周期,实质也是一堆会在特定时期执行的函数
小程序中,生命周期主要分成了三部分:

  • 应用的生命周期
  • 页面的生命周期
  • 组件的生命周期

一般页面渲染流程(navigateTo 方法,即页面栈只增加的清空下,A B 代表不同页面):

  • onLaunch(App) => onShow(App)
  • onLoad(A)=> onShow(A)=> onReady(A)=> onHide(A)
  • onLoad(B)=> onShow(B)=> onReady(B)=> onUnload(B)
  • onShow(A)

一般组件的渲染流程(navigateTo 方法,即页面栈只增加的清空下,A B C 代表不同页面和组件):

  • created(C)=> attached(C)
  • onLoad(A)=> onShow(A)=> ready(C)=> onReady(A)=> onUnload(A)=> detached(C)

子组件先完成渲染,父组件先完成卸载

数据通信

https://juejin.cn/post/6995875058224726030
这里父一般指 Page(页面),子一般指组件(Component),通信有很多的技术实现方案,但是自己只列举出最常用的几种方式:

全局通信

localStorage(本地存储)

setStorageSync和setStorage的区别-CSDN博客

wx.setStorageSync("index-data", "哈哈哈哈");

const storageData = wx.getStorageSync("index-data");
if (storageData) {
  console.log("当前存储的数据", storageData);
}

优点:简单操作,易理解
缺点:调用到 storage,有可能设置失败;且设置后是持久缓存,可能污染原逻辑,应及时删除

globData(小程序全局存储)

const app = getApp();

本质是 app.js 看作一个大的对象,通过 getApp() 获取实例并调用
app.调用具体的方法、变量

优点:简单操作,易理解;直接操作globalData对象,相比于storage执行效率更高
缺点:设置后是小程序生命周期内都可访问,可能污染原逻辑,应及时删除

父 => 子

父到子传值一般采用 property 的方式,具体实现代码如下:

<ty-child-a parentName="{{name}}" />

properties: {
  parentName: "父组件传值",
}

父 => 父

EventChannel | 微信开放文档
通过 wx.navigateTo 中的events和eventChannel实现页面间的通信,因为 navigateTo 会加入新页面到页面栈,所以从头开始渲染,能够触及到 onLoad 的 options 方法。

// A 页面
wx.navigateTo({
  url: link + "?a=1&b=2",
  events: {
    calculateResult(data) {
      console.log("计算的结果为", data);
    },
  },
  success: function (res) {
    res.eventChannel.emit("multiplication", { result: 100 });
  },
});


// B 页面
const a = Number(options.a);
  const b = Number(options.b);
  const eventChannel = this.getOpenerEventChannel();
  if (Object.keys(eventChannel).length) {
    eventChannel.emit("calculateResult", { result: a + b });
    eventChannel.on("multiplication", function (data) {
      console.log("相乘之后的结果", data);
    });
  }

// 计算的结果为 {result: 3}
// 相乘之后的结果 {result: 100}
  • 上面代码主要利用 事件频道进行出发操作,B页面触发A页面的事件,进行传递参数
  • B 页面也可以监听自己的事件,然后等待 A 页面触发
  • 这种方式有一个坏处就是单独刷新页面会导致** eventChannel 为空,所以相关的事件可能会出问题。而同驿/优采**的做法就只是传递参数,这里需要主要传递的参数都会变成 **字符串 **类型。

子 => 父

triggerEvent

10.png

<my-component parentName="常见组件学习" bind:send-msg="sendMsg" />

sendMsg(data) {
  console.log("来自子组件的数据", data);
}

this.triggerEvent("send-msg", { id: 111, content: "这里是子组件的内容" });

selectComponent

8.png

// 引入组件的时候需要定义好 id 名称
<my-component id="my-component" parentName="常见组件学习" />
  
const child = this.selectComponent("#my-component");
console.log("子组件实例", child);
  • 这种方式直接让父组件获取到子组件的所有数据和方法,会让父子组件耦合在一起,代码很容易出现bug,一般不推荐这种方式,除非数据交互非常频繁的场景下

子 => 子

这种情况一般很少出现,两个子组件相互通信的概率很少,可以利用全局数据通信或者上述的方法进行通信,使用方法一致

网络请求

// 设置请求的统一配置
const defaultOptions = {
  method: "GET", // 默认请求方法
  data: {}, // 请求参数
  header: {}, // 请求头
  complete: function () {}, // 完成回调
};

function request(url, options) {
  const newOptions = { ...defaultOptions, ...urloptions };

  newOptions.header = {
    "Content-Type": "application/json",
    Authorization: "Bearer your-token-here", // 示例,根据需要设置
    ...newOptions.header,
  };

  return new Promise((resolve, reject) => {
    wx.request({
      url: url,
      method: newOptions.method,
      data: newOptions.data,
      header: newOptions.header,
      success: function (res) {
        // 统一处理响应数据
        if (res.statusCode === 200) {
          resolve(res.data);
        } else {
          reject(err);
        }
        resolve(res.data);
      },
      fail: function (err) {
        // 统一处理请求失败
        reject(err);
      },
      complete: function () {
        // 请求完成的统一处理
      },
    });
  });
}

function get(url, data) {
  return request(url, {
    method: "GET",
    data,
  });
}

function post(url, data) {
  return request(url, {
    method: "POST",
    data,
  });
}

export { get, post };

微信小程序有自己的一套请求机制,使用 wx.request ,但是实际场景使用的时候需要利用 Promise 异步优化一下,这里大家可以先了解,后续进行项目开发的时候根据应用场景详细讲解一下。

第三方组件

Vant/weapp 1.11

https://juejin.cn/post/7229891190900277285

Tailwind

https://weapp-tw.icebreaker.top/
引入成本过高,暂时没必要

拓展功能

后续的分包内存优化、导航栏配置、打包上线流程留到下次课程项目实战去讲解。

提问改善

Q1:xxxxx?

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

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

相关文章

8617 阶乘数字和

这是一个关于计算阶乘结果所有位上的数字之和的问题。我们可以通过以下步骤来解决这个问题&#xff1a; 1. 首先&#xff0c;我们需要一个函数来计算阶乘。由于n的范围可以达到50&#xff0c;阶乘的结果可能非常大&#xff0c;所以我们需要使用一个可以处理大整数的数据类型&a…

[Information Sciences 2023]用于假新闻检测的相似性感知多模态提示学习

推荐的一个视频&#xff1a;p-tuning P-tunning直接使用连续空间搜索 做法就是直接将在自然语言中存在的词直接替换成可以直接训练的输入向量。本身的Pretrained LLMs 可以Fine-Tuning也可以不做。 这篇论文也解释了为什么很少在其他领域结合知识图谱的原因&#xff1a;就是因…

理解MySQL核心技术:触发器功能特点与应用案例解析

触发器&#xff08;Trigger&#xff09;是MySQL中一个重要的功能&#xff0c;它能够在特定的数据表操作发生时自动执行预定义的SQL语句&#xff0c;从而实现在数据库层面的自动化操作和数据维护。在这篇文章中&#xff0c;我们将进一步了解MySQL触发器的相关知识&#xff0c;包…

渲染100农场如何渲染全景图?渲染100邀请码1a12

全景图的制作需要渲染&#xff0c;以国内知名的渲染农场—渲染100为例&#xff0c;我来说下操作过程。 1、进入渲染100官网&#xff0c;点击右上角注册按钮完成注册&#xff0c;记得邀请码一栏填1a12&#xff0c;有30元礼包和2张免费渲染券。 渲染100官网&#xff1a;http://…

【C语言】extern 关键字

在C语言中&#xff0c;extern关键字用于声明一个变量或函数是定义在另一个文件中的。它使得在多个文件之间共享变量或函数成为可能。extern关键字常见于大型项目中&#xff0c;通常用于声明全局变量或函数&#xff0c;这些变量或函数的定义位于其他文件中。 基本用法 变量声明…

Python--进程基础

创建进程 os.fork() 该方法只能在linux和mac os中使用&#xff0c;因为其主要基于系统的fork来实现。window中没有这个方法。 通过os.fork()方法会创建一个子进程&#xff0c;子进程的程序集为该语句下方的所有语句。 import os​​print("主进程的PID为:" , os.g…

零信任沙箱在数据安全领域的意义

在当今日益复杂的网络安全环境中&#xff0c;零信任沙箱作为一种前沿的安全防护技术&#xff0c;受到了广泛关注。而SDC沙箱作为零信任沙箱领域的佼佼者&#xff0c;凭借其独特的技术优势和卓越的价值&#xff0c;为企业和组织提供了强大的数据安全保障。本文将深入探讨SDC沙箱…

全面升级厨房安全,电焰灶引领新时代

煤气是许多家庭日常使用的能源&#xff0c;目前的普及率还是比较高的&#xff0c;但平时因煤气泄漏而引发的事故也很多&#xff0c;只需要查看最近一个月因液化气泄漏引起的爆炸事件屡见不鲜。打开新闻&#xff0c;我们总能时不时看到煤气爆炸的事故&#xff0c;幸运的能够逢凶…

USB PD+TYPE -C快充电源中MOSFET选型,USB PD应用市场包含智能手机,平板电脑,笔记本电脑,游戏本,移动硬盘,数码相机,电动工具等传统领域

USB PD全称为USB Power Delivery&#xff0c;是由USB-IF组织制定的一种快速充电协议&#xff0c;也是目前市场非常看好的一种协议&#xff0c;可以支持输出功率高达100W&#xff1b;Type-C是一种接口规范&#xff0c;能够支持传输更大的电流。USB PD应用市场不仅包含智能手机&a…

uniapp微信小程序使用xr加载模型

1.在根目录与pages同级创建如下目录结构和文件&#xff1a; // index.js Component({properties: {modelPath: { // vue页面传过来的模型type: String,value: }},data: {},methods: {} }) { // index.json"component": true,"renderer": "xr-frame&q…

JVM原理(二):JVM之HotSpot虚拟机中对象的创建寻位与定位整体流程

1. 对象的创建 遇到new指令时 当Java虚拟机遇到一个字节码new指令时。 首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否被加载、解析和初始化过。 如果没有&#xff0c;那么必须执行类的加载过程(加载、检查…

面向工业化的多类电子元件自动计数系统测试报告

目录 1、项目描述 2、登录注册测试 2、主界面测试 2.1、在线计数测试 2.2、离线计数测试 2.3、浏览数据测试 1、项目描述 该系统利用机器视觉平台采集电子元件图像&#xff0c;设计并实现了适应不同形态分布的电子元件计数模型&#xff0c;能够快速且准确地进行计数和分类&…

Unity海面效果——3、漫反射颜色和水波

Unity引擎制作海面效果 大家好&#xff0c;我是阿赵。 之前介绍了菲涅尔水的反射区域区分做法&#xff0c;上一次最后是做到了这个效果&#xff0c;接下来做一下漫反射的颜色和水波。 一、 漫反射颜色 关于漫反射的光照模型&#xff0c;之前分享过&#xff0c;一般比较常用的是…

SSM OA办公系统19159

SSM OA办公系统 摘 要 随着现代信息技术的快速发展以及企业规模不断扩大&#xff0c;实现办公线上流程自动化已成为提升企业核心竞争力的关键。本文主要介绍的是利用Spring、SpringMVC和MyBatis&#xff08;简称为&#xff1a;SSM&#xff09;框架&#xff0c;MySQL数据库等先…

如果这时你还不清理C盘,那只能眼睁睁看着电脑越来越卡 直到系统崩溃

如果这时候你还不清理C盘&#xff0c;那只能眼睁睁看着电脑越来越卡 直到系统崩溃。很多人就是想偷懒&#xff0c;当然这是人的天性&#xff0c;明明知道自己的C盘空间就那么大&#xff0c;一天天看着C盘空间越来越小&#xff0c;还不去清理C盘。 这样的人有两种&#xff0c;一…

【计算机毕业设计】基于Springboot的大学生就业招聘系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

构建LangChain应用程序的示例代码:50、如何在检索-生成 (RAG) 应用中利用多模态大型语言模型 (LLM) 处理包含文本和图像的混合文档的示例

多模态 RAG 许多文档包含多种内容类型&#xff0c;包括文本和图像。 然而&#xff0c;大多数 RAG 应用中&#xff0c;图像中捕获的信息往往被忽略。 随着多模态 LLM 的出现&#xff0c;如 GPT-4V&#xff0c;值得考虑如何在 RAG 中利用图像&#xff1a; 选项 1&#xff1a;…

【Java面试场景题】微信抢红包的功能是如何实现的,如果让你来做你怎么设计?

一、问题解析 实现拼手气红包算法&#xff0c;有以下几个需要注意的地方&#xff1a; 抢红包的期望收益应与先后顺序无关保证每个用户至少能抢到一个预设的最小金额&#xff0c;人民币红包设置的最小金额一般是0.01元&#xff0c;如果需要发其他货币类型的红包&#xff0c;比…