文章目录

      • 一.项目介绍和前置内容
        • 1.重要链接
        • 2.技术栈
      • 二.创建uniapp项目
        • 1.使用HBuilderX创建
        • 2.使用命令行创建
        • 3.如何使用vscode开发uniapp项目?
          • step1:把项目拉入vscode,开始下相关插件
          • step2:ts类型校验
          • step3:设置json文件可以允许注释
        • 4.pages.json文件的作用是什么?
        • 5.示例:在项目中实现一个tabbar功能
        • 6.如何在手机上查看当前项目效果?
        • 7.uniapp和原生小程序开发的区别?
      • 三. 拉取项目代码(直接从这儿开始)
        • 如何拉取项目代码?
        • 拉取项目代码后需要做什么?
      • 四.小程序的基础架构
        • 1.构建页面
          • 1.1.安装uni-ui组件库
          • 1.2.让uni-ui组件库中的组件实现自动按需导入
          • 1.3.配置TS类型
        • 2.状态管理(以my页的数据持久化为例)
          • step0:安装持久化存储插件pinia-plugin-persistedstate
          • step1:在`stores/index.ts`中准备好pinia相关代码
          • step2:在`main.ts`中准备好相关代码
          • step3:在`stores/modules/member.ts`中提前准备好文件用于管理会员信息
          • step4:在`src/pages/my/my.vue`中提前准备好页面和代码
          • step5【重点】:改`member.ts`中的 `persist: true`语句
        • 3.数据交互
          • 3.1.封装拦截器
            • uniapp中如何添加一个拦截器(语法)?
            • 拦截器要做什么?
            • 如何实现对request请求和上传文件请求的拦截?(重点)
            • 验证:拦截器是否添加成功
          • 3.2.封装请求函数
            • 3.2.1.请求成功的业务处理
            • 3.2.2.请求失败的业务处理
            • 3.2.3.http.ts完整代码

一.项目介绍和前置内容

该项目是一个B2C电商平台项目

1.重要链接

项目演示: http://erabbit.itheima.net/#/
接口文档:https://www.apifox.cn/apidoc/shared/0e6ee326-d646-41bd-9214-29dbf47648fa
项目代码(从这里开始开发):git clone http://git.itcast.cn/heimaqianduan/erabbit-uni-app-vue3-ts.git

2.技术栈
  • vue3.0组合式api
  • vue-cli项目脚手架
  • axios请求接口
  • vue-router单页路由
  • vuex状态管理
  • vuex-persiststate数据持久化
  • normalize.css初始化样式
  • @vueuse/core组合api常用工具库
  • 算法Power Set
  • dayjs日期处理小组件
  • validate表单校验

二.创建uniapp项目

两种方式创建uni-app项目:HBuilderX(都是DCloud公司旗下)和命令行

1.使用HBuilderX创建
  • 创建项目:HBuilderX:创建项目>uniapp>默认模板>vue3
  • 下载插件:工具>插件安装>安装新插件:uni-app(vue3)编译器
    在这里插入图片描述

在这里插入图片描述

  • 在微信开发者工具中运行项目:运行>微信开发者工具>选择路径
    在这里插入图片描述

  • 开启服务端口:前往微信开发者工具>设置>安全服务端口:开启
    在这里插入图片描述

  • 分离窗口并固定:开发者工具只做效果展示,只留该效果窗口即可

2.使用命令行创建
vue create -p dcloudio/uni-preset-vue my-uniapp-project
3.如何使用vscode开发uniapp项目?

vscode的优势是对ts类型的支持比较友好,本项目也将使用vscode进行uniapp开发

step1:把项目拉入vscode,开始下相关插件

uni-create-view插件:快速创建uniapp页面或组件
uni-helper插件:uni-app代码提示
uniapp小程序扩展插件:鼠标悬停查文档

step2:ts类型校验
  • 安装类型声明文件:pnpm i -D @types/wechat-miniprogram @uri-helper/uni-app-types
  • 配置tsconfig.json文件
{......"types": ["@dcloudio/types","miniprogram-api-typings","@types/wechat-miniprogram","@uni-helper/uni-app-types","@uni-helper/uni-ui-types"]},"vueCompilerOptions": {// experimentalRuntimeMode 已废弃,请升级 Vue - Official 插件至最新版本"plugins": ["@uni-helper/uni-app-types/volar-plugin"]},
step3:设置json文件可以允许注释

vscode设置>搜"文件关联">添加:

    项                值
manifest.json        jsonc
pages.json           jsonc
4.pages.json文件的作用是什么?

配置页面的路由,导航栏,tabBar等页面类信息
*有些类似routes数组

5.示例:在项目中实现一个tabbar功能

把图标在pages/static作为静态资源放在该目录下
实现tabBar步骤:

1.pages右键>新建uniapp页面:my
2.pages/pages.json中新增tabBar配置如下:
"tabBar":{"list":[{'pagePath':'pages/index/index','text':'首页','iconPath':"xxx.png",'selectedIconPath':'xxx_selected.png'},{'pagePath':'pages/my/my','text':'我的'}]
}3.复制图标文件到statics文件夹中,配置图标路径
6.如何在手机上查看当前项目效果?

manifest.json配置AppID,从微信小程序配置复制
在这里插入图片描述

7.uniapp和原生小程序开发的区别?

每个页面都是vue文件,数据绑定和事件处理使用vue规范

  • 数据绑定:

属性绑定不再需要写成src='{{ url }}',直接写成vue的动态绑定属性:src='url'

  • 事件绑定:

之前:bindtap='eventName'
现在:@tap='eventName',并支持传参

  • 支持vue常用指令

三. 拉取项目代码(直接从这儿开始)

如何拉取项目代码?

项目并非从零开发,直接拉取项目代码:git clone http://git.itcast.cn/heimaqianduan/erabbit-uni-app-vue3-ts.git

拉取项目代码后需要做什么?
  • manifest.json中添加微信小程序的appid
  • 初始化:pnpm install
  • 生成 list/mp-weixin文件:pnpm dev:mp-weixin
  • 微信开发者工具中导入项目mp-weixin

四.小程序的基础架构

小程序的基础架构具体实现分为:构建页面,状态管理和数据交互

1.构建页面

构建界面分为:安装uni-ui,自动引入组件,配置ts类型

1.1.安装uni-ui组件库

安装命令:npm i @dcloudio/uni-ui

1.2.让uni-ui组件库中的组件实现自动按需导入
// pages.json
{// 组件自动导入"easycom": {"autoscan": true,"custom": {// uni-ui 规则如下配置  "^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue" }},"pages": [// …省略]
}

此时可以直接使用uni-ui的相关组件:

<uni-card>.....
</uni-card>
1.3.配置TS类型
  • step1:安装依赖npm i -D @uni-helper/uni-ui-types
  • step2:配置tsconfig.js

确保compilerOptions.types中含有@dcloudio/types@uni-helper/uni-ui-types,且include包含了对应的vue文件

// tsconfig.json
{"compilerOptions": {// ..."types": ["@dcloudio/types", // uni-app API 类型"miniprogram-api-typings", // 原生微信小程序类型"@uni-helper/uni-app-types", // uni-app 组件类型"@uni-helper/uni-ui-types" // uni-ui 组件类型  ]},// vue 编译器类型,校验标签类型"vueCompilerOptions": {"nativeTags": ["block", "component", "template", "slot"]}
}
  • step3:重启vscode,成功标志----<uni-card>有了类型声明
2.状态管理(以my页的数据持久化为例)

最终目的是设置小程序端的Pinia持久化

Pinia持久化的方案与之前的写法有些许不同:
以前的持久化主要针对的是网页端的localStorage
而小程序端的持久化针对的是小程序端的api,即:uni.setStorageSync()getsetStorageSync()

step0:安装持久化存储插件pinia-plugin-persistedstate

安装命令:pnpm i pinia-plugin-persistedstate
(Pinia 用法与 Vue3 项目完全一致,uni-app 项目仅需解决持久化插件兼容性问题。)

step1:在stores/index.ts中准备好pinia相关代码
import {createPinia} from "pinia"
import persist from 'pinia-plugin-persistedstate'//创建pinia实例
const pinia = createPinia()
//使用持久化存储插件
pinia.use(persist)
//默认导出,给main.ts使用
export default pinia
//模块统一导出
export * from "/modules/member"
step2:在main.ts中准备好相关代码
import {createSSRApp} from 'vue'
import App from './App.vue'//导入pinia实例
import pinia from './stores'export function createApp(){//创建vue实例const app=createSSRApp(App)//使用piniaapp.use(pinia)return {app}
}

*若pinia类型报错,解决方法:npm i pinia

step3:在stores/modules/member.ts中提前准备好文件用于管理会员信息
import { defineStore } from 'pinia'
import { ref } from 'vue'// 定义 Store
export const useMemberStore = defineStore('member',() => {// 会员信息const profile = ref<any>()// 保存会员信息,登录时使用const setProfile = (val: any) => {profile.value = val//用户保存的信息更新到空的profile中}// 清理会员信息,退出时使用const clearProfile = () => {profile.value = undefined}// 记得 returnreturn {profile,setProfile,clearProfile,}},// TODO: 持久化{persist: true,},
)
step4:在src/pages/my/my.vue中提前准备好页面和代码
<script setup lang="ts">
import { useMemberStore } from '@/stores'const memberStore = useMemberStore()
</script><template><view class="my"><view>会员信息:{{ memberStore.profile }}</view><button@tap="memberStore.setProfile({nickname: '黑马先锋',})"size="mini"plaintype="primary">保存用户信息</button><button @tap="memberStore.clearProfile()" size="mini" plain type="warn">清理用户信息</button></view>
</template><style lang="scss">
//
</style>

当前的代码可以实现数据的添加和清除,但是还没有实现持久化
一刷新页面,数据就会丢失
如何实现?

step5【重点】:改member.ts中的 persist: true语句
  // TODO: 持久化{persist: true,},

该语句只能在网页端实现持久化,要在小程序端实现持久化,要改正如下:

  // TODO: 持久化{persist: {storage:{getItem(key){uni.getStorageSync(key)},setItem(key,value){uni.setStorageSync(key,value)}}}},

*注:此处遇到了persist的类型报错问题,后续解决

3.数据交互

封装请求工具:拦截器和请求函数

3.1.封装拦截器

通过拦截器的封装,实现request请求和uploadFile上传文件的拦截
接口文档:https://www.apifox.cn/apidoc/shared/0e6ee326-d646-41bd-9214-29dbf47648fa

uniapp中如何添加一个拦截器(语法)?
uni.addIntercepters(STRING,OBJECT),其中,STRING是拦截器的名称,OBJECT的参数是传入具体的配置(可以写一个invoke函数,在拦截前触发)
拦截器要做什么?
  • 封装请求基地址
  • 超时时间
  • 添加请求头标识
  • 添加token
如何实现对request请求和上传文件请求的拦截?(重点)
//src/utils/http.tsimport { useMemberStore } from '@/stores'
/* 请求拦截器 */
/*
添加拦截器:拦截请求和上传文件两个接口
TODO:1.非http开头的url,会自动拼接baseURL2.请求超时3.添加小程序端请求头标识4.添加token请求头标识
*///基地址
const baseURL = 'http://pcapi-xiaotuxian-front-devtest.itheima.net'
// 添加拦截器:拦截请求和上传文件两个接口
const httpInterceptor = {// 拦截器对象//拦截前触发的函数,其中options就是请求的配置对象//它会拿到uni.request({methods:xxx,url:'xxx'})中的配置对象invoke(options: UniApp.RequestOptions) {//指定参数的类型:鼠标悬停在uni.request上获取//1.对于非http开头的url,会自动拼接baseURLif (!options.url.startsWith('http')) {options.url = baseURL + options.url}//2.请求超时:默认10soptions.timeout = 10000//3.添加小程序端请求头标识options.header = {...options.header, //如果存在,就保留原有header'source-Client': 'miniapp',}//4.添加token请求头标识:登录成功后,拿到token,放到这里const memberStore = useMemberStore()const token = memberStore.profile?.token //此处的token从memberStore,profile中获取if (token) {options.header.Authorization = token}return options},
}
// 拦截request请求
uni.addInterceptor('request', httpInterceptor)
// 拦截上传文件请求
uni.addInterceptor('uploadFile', httpInterceptor)
验证:拦截器是否添加成功
src/pages/my/my.vue<script setup lang="ts">
import { useMemberStore } from '@/stores'const memberStore = useMemberStore()
import { http } from '@/utils/http' //在src/utils/http.ts中配置了拦截器,里面有基地址
//测试接口按钮
const getData = async () => {// uni.request({//   method: 'GET',//   url: '/home/banner',// })//为http添加类型成功后,尝试传入一个string格式的数组,测试泛型是否生效//此时res的类型是:Data<string[]>,会决定res.code等数据的类型const res = await http<string[]>({method: 'GET',url: '/home/banner',header: {},})console.log('请求成功:', res.code) //code的类型成功推断为string
}
</script><template><view class="my"><view>会员信息:{{ memberStore.profile }}</view><!-- 模拟token --><button@tap="memberStore.setProfile({nickname: '黑马先锋',token: '123456',})"size="mini"plaintype="primary">保存用户信息</button><button @tap="memberStore.clearProfile()" size="mini" plain type="warn">清理用户信息</button><!-- 新增一个按钮 --><button @tap="getData">点击</button></view>
</template><style lang="scss">
//
</style>
3.2.封装请求函数

封装请求函数是为了更方便地发起请求

回顾:axios函数的返回值是一个Promise对象,配置async和await可以更方便获取成功的数据

为了方便使用,我们封装的请求函数也要返回一个Promise对象

同时,由于uniapp的拦截器并不完善,因此响应拦截器的功能对类型支持并不友好,因此,前面的拦截器只完成了请求前的拦截,但响应后的拦截还没设置
我们要通过自己封装的请求函数实现之前axios响应拦截器的业务功能

对于响应拦截器,又分为成功和失败两种情况

成功时,提取核心数据(res.data)添加类型(支持泛型):uni.request函数不支持添加类型,因此要通过函数封装,自己添加泛型,通过泛型来确定后续使用的具体类型
失败时,处理网络错误:提示用户更换网络401 错误:清理用户信息,跳转登录页其他错误:根据后端错误信息轻提示
3.2.1.请求成功的业务处理

在这里插入图片描述

  • http.ts
/* TODO:
* 1.返回Promise对象
* 2.请求成功
* 2.1.获取核心数据res.data
* 2.2.添加类型,支持泛型
* 3.请求失败
* 3.1.网络错误:提示用户换网络
* 3.2.401错误:清理用户信息,跳转登录页面
* 3.3.其他错误:根据后端返回的message提示用户
*/
//定义一个后端返回值的类型
interface Data<T> {code: string //状态码:'1"msg: string //提示信息:'请求成功'result: T //核心数据类型:{{}.{},{},{},{}}
}
// 2.给http添加类型(其类型可变)--泛型:T代表任意类型
//T接收到的类型用来确定my.vue中res的类型
export const http = <T>(options: UniApp.RequestOptions) => {//给Promise(当前是Unknown)指定响应成功的类型return new Promise<Data<T>>((resolve, reject) => {uni.request({...options,// 请求成功success(res) {// resolve(res.data) //1.获取核心数据res.data//res.data类型报错,应为string|AnyObject|ArrayBuffer中的AnyObject,并准确指定为Data<T>//使用类型断言,将res.data的类型断言为Data<T>resolve(res.data as Data<T>)// 此时可以去my.vue中使用res进行测试},})})
}
  • my.vue:使用res进行测试
//测试接口按钮
const getData = async () => {// uni.request({//   method: 'GET',//   url: '/home/banner',// })//为http添加类型成功后,尝试传入一个string格式的数组,测试泛型是否生效//此时res的类型是:Data<string[]>,会决定res.code等数据的类型const res = await http<string[]>({method: 'GET',url: '/home/banner',header: {},})console.log('请求成功:', res.code) //code的类型成功推断为string
}
  • 步骤总结
    首先内部返回一个Promise对象,方便通过asyncawait获取到数据,为了使用的数据更加简洁使用类型推断提取出核心数据:res.data as Data<T>最后再为TS项目设置类型:(通过泛型实现)
3.2.2.请求失败的业务处理

uni.request的success回调函数仅仅表示服务器响应成功,但未处理状态码,业务中使用不方便

uni.request({...options,//响应成功success(res){},//响应失败fail(err){}
})

一有响应就走success,带来的问题:
若服务器有响应,但是响应的结果是token获取失败,此时也会走success回调,这无疑在逻辑上不准确
而axios函数仅仅只有响应状态码为2xx时才调用resolve函数,表示获取数据成功,业务中使用更准确
核心代码如下:

  if (res.statusCode >= 200 && res.statusCode < 300) {//请求成功:2xxresolve(res.data as Data<T>)} else if (res.statusCode === 401) {//请求失败:401//清理用户信息,跳转登录页面uni.showToast({// title:'登录过期,请重新登录',icon: 'none',title: (res.data as Data<T>).msg || '登录过期,请重新登录',})} else {//其他错误:根据后端返回的message提示用户uni.showToast({title: (res.data as Data<T>).msg || '请求错误',icon: 'none',})reject(new Error((res.data as Data<T>).msg))}
3.2.3.http.ts完整代码
import { useMemberStore } from '@/stores'
/* 请求拦截器 */
/*
添加拦截器:拦截请求和上传文件两个接口
TODO:1.非http开头的url,会自动拼接baseURL2.请求超时3.添加小程序端请求头标识4.添加token请求头标识
*///请求基地址
const baseURL = 'http://pcapi-xiaotuxian-front-devtest.itheima.net'
// 添加拦截器:拦截请求和上传文件两个接口
const httpInterceptor = {// 拦截器对象//拦截前触发的函数,其中options就是请求的配置对象//它会拿到uni.request({methods:xxx,url:'xxx'})中的配置对象invoke(options: UniApp.RequestOptions) {//指定参数的类型:鼠标悬停在uni.request上获取//1.对于非http开头的url,会自动拼接baseURLif (!options.url.startsWith('http')) {options.url = baseURL + options.url}//2.请求超时:默认10soptions.timeout = 10000//3.添加小程序端请求头标识options.header = {...options.header, //如果存在,就保留原有header'source-Client': 'miniapp',}//4.添加token请求头标识:登录成功后,拿到token,放到这里const memberStore = useMemberStore()const token = memberStore.profile?.token //此处的token从memberStore,profile中获取if (token) {options.header.Authorization = token}return options},
}
// 拦截request请求
uni.addInterceptor('request', httpInterceptor)
// 拦截上传文件请求
uni.addInterceptor('uploadFile', httpInterceptor)/* 响应拦截器 */
/*** 请求函数* @params UniApp.RequestOptions* @returns Promise<any>* TODO:* 1.返回Promise对象* 2.请求成功* 2.1.获取核心数据res.data* 2.2.添加类型,支持泛型* 3.请求失败* 3.1.网络错误:提示用户换网络* 3.2.401错误:清理用户信息,跳转登录页面* 3.3.其他错误:根据后端返回的message提示用户*/
//定义一个后端返回值的类型
interface Data<T> {code: string //状态码:'1"msg: string //提示信息:'请求成功'result: T //核心数据类型:{{}.{},{},{},{}}
}// 2.给http添加类型(其类型可变)--泛型:T代表任意类型
//T接收到的类型用来确定my.vue中res的类型
export const http = <T>(options: UniApp.RequestOptions) => {//给Promise(当前是Unknown)指定响应成功的类型return new Promise<Data<T>>((resolve, reject) => {uni.request({...options,// 请求成功success(res) {// resolve(res.data) //1.获取核心数据res.data//res.data类型报错,应为string|AnyObject|ArrayBuffer中的AnyObject,并准确指定为Data<T>//使用类型断言,将res.data的类型断言为Data<T>// resolve(res.data as Data<T>)// 此时可以去my.vue中使用res进行测试//优化:根据后端返回的状态码,判断请求是否成功if (res.statusCode >= 200 && res.statusCode < 300) {//请求成功:2xxresolve(res.data as Data<T>)} else if (res.statusCode === 401) {//请求失败:401//清理用户信息,跳转登录页面uni.showToast({// title:'登录过期,请重新登录',icon: 'none',title: (res.data as Data<T>).msg || '登录过期,请重新登录',})} else {//其他错误:根据后端返回的message提示用户uni.showToast({title: (res.data as Data<T>).msg || '请求错误',icon: 'none',})reject(new Error((res.data as Data<T>).msg))}},// 请求失败fail(err) {//提示用户换网络uni.showToast({title: '请求失败,请检查您的网络',icon: 'none',})reject(err)},})})
}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Uniapp H5端SEO优化全攻略:提升搜索引擎排名与流量

在移动互联网时代&#xff0c;H5页面因其跨平台、低成本、易传播的特性&#xff0c;成为许多企业的首选。Uniapp作为一款优秀的前端跨端开发框架&#xff0c;能够快速开发H5、小程序、App等多端应用。然而&#xff0c;由于Uniapp默认采用SPA&#xff08;单页应用&#xff09;架…

一[3.3]、ubuntu18.04环境 利用 yolov8 实现列车轨道检测,并提取正确的轨道线【全网最详细】

一、参考文献 https://blog.csdn.net/u010117029/category_12977729.html 一[3.2]、ubuntu18.04环境 利用 yolov8 训练开源列车数据集,并实现列车轨道检测【全网最详细】-CSDN博客 火车轨道铁路轨道检测识别(附带Python源码+详细解析)_轨道点云提取铁轨代码-CSDN博客

pp-ocrv5中的改进-跨阶段特征融合(CSP-PAN)以及在 Neck 部分引入 CSP-PAN后为何就能解决小文本漏检问题?

好的&#xff0c;我们来详细解析一下 PP-OCRv5 中的**跨阶段特征融合&#xff08;CSP-PAN&#xff09;**改进&#xff0c;以及它如何有效解决小文本漏检问题。 背景&#xff1a;PP-OCR 的 Neck 部分与 PAN 在 PP-OCRv3 及之前的版本中&#xff0c;Neck 部分使用的是标准的 **…

【数据分析四:Data Preprocessing】数据预处理

一、数据预处理 直接收集的数据通常是“脏的”&#xff1a; 不完整、不准确、不一致 数据预处理是进行大数据的分析和挖掘的工作中占工作量最大的一个步骤&#xff08;80%&#xff09; 二、处理缺失值 处理缺失数据的方法&#xff1a;首先确认缺失数据的影响 数据删除&#x…

一起来入门深度学习知识体系

前言 什么是深度学习&#xff1f;它有什么魔力&#xff1f; 想象一个机器人能识别人脸、写诗、翻译语言、甚至和你聊天。它是怎么学会这些能力的&#xff1f;答案正是——深度学习&#xff08;Deep Learning&#xff09;。 简单来说&#xff0c;深度学习就像是教会一台计算机…

Prompt+Agent+LLM:半导体炉管设备健康评估的落地实战

引言 在高端制造业的核心场景中&#xff0c;设备健康管理正面临前所未有的挑战。以半导体制造为例&#xff0c;一台价值数百万美元的炉管设备意外停机&#xff0c;可能导致整条产线瘫痪、晶圆批次报废&#xff0c;单日损失可达千万级。传统基于阈值规则的监控系统难以捕捉早期…

PostgreSQL的扩展bloom

PostgreSQL的扩展bloom 一、扩展概述 bloom 是 PostgreSQL 提供的一个基于**布隆过滤器(Bloom Filter)**的索引扩展&#xff0c;特别适合多列任意组合查询的优化场景。 二、核心特性 特性描述优势多列索引单索引支持多列组合减少索引数量模糊匹配高效处理和IN查询优于B-tre…

算法与数据结构学习之旅:从入门到进阶

在计算机科学的浩瀚宇宙中&#xff0c;算法与数据结构如同闪耀的恒星&#xff0c;驱动着整个程序世界的运转。无论是手机上流畅运行的 APP&#xff0c;还是搜索引擎瞬间返回的海量结果&#xff0c;背后都离不开算法与数据结构的精妙设计。对于想要深入探索计算机领域的开发者和…

C++map和set类(简介)

文章目录 一、关联式容器二、键值对三、树形结构的关联式容器3.1 set类的简介3.2 set的接口3.2.1 set的模版参数列表3.2.2 set的构造3.2.3 set的迭代器3.2.4 set的容量3.2.5 set的修改操作 3.3 set的使用案例3.4 multiset类的介绍3.5 multiset的使用案例3.6 map类的简介3.7 map…

圆柱电池自动化升级:面垫机如何破解生产痛点?

在圆柱电池的生产流程中&#xff0c;面垫&#xff08;绝缘垫片&#xff09;的安装是保障电池安全与性能的关键环节。传统手工操作不仅效率低&#xff0c;还容易出现面垫偏移、漏贴等问题&#xff0c;影响产品一致性。圆柱电池自动面垫机的出现&#xff0c;通过自动化技术解决了…

【AI Study】第四天,Pandas(1)- 基础知识

文章概要 本文详细介绍 Pandas 库的基础知识&#xff0c;包括&#xff1a; Pandas 的基本概念和特点安装和配置方法核心数据结构&#xff08;Series 和 DataFrame&#xff09;各种数据类型的处理方法实际应用示例 什么是 Pandas Pandas 是 Python 中最流行的数据分析库之一…

重构气血经络的数学模型:气血经络级联控制系统核心方程

从融智学视域&#xff0c;重构气血经络的数学模型 摘要&#xff1a; 融智学视域&#xff0c;通过三元耦合框架&#xff0c;重构气血经络模型&#xff0c;建立跨学科认知体系。五大分支协同运作&#xff1a;数学融智学构建纤维丛模型&#xff0c;逻辑融智学建立防歧义语义网&…

python爬虫:某网站价格数字加密破解

文章目录 前言一、案例二、破解流程1.原理2.找到woff文件3.分析woff文件4.代码实现1.转化woff文件2.绘图并ocr识别3.映射数据 三、总结 前言 有时我们在进行网页抓取采集数据时&#xff0c;有些重要的数据比如说价格,数量等信息会进行加密&#xff0c;通过复制或者简单的采集是…

DigitalOcean 携手 AMD 推出 AMD Instinct™ MI300X GPU Droplet,加速 AI 创新

近日&#xff0c;DigitalOcean&#xff08;NYS:DOCN&#xff09;作为全球最简单易用的可扩展云平台&#xff0c;宣布与 AMD 建立合作&#xff0c;为 DigitalOcean 客户提供 AMD Instinct™ GPU&#xff0c;以 AMD Instinct™ MI300X GPU Droplet 的形式支持其 AI 工作负载。此举…

小白畅通Linux之旅-----DNS项目实战配置

目录 一、项目要求 1、正反向解析配置 2、主从配置 二、脚本编写配置 1、主服务器脚本编写 2、从服务器脚本编写 三、项目检测 1、正反向解析检测 &#xff08;1&#xff09;主服务器脚本启动 &#xff08;2&#xff09;测试主机配置 &#xff08;3&#xff09;正反…

Codigger:探索数字工作新架构

在软件开发与数字工作领域&#xff0c;技术迭代的脚步从未停歇&#xff0c;开发者和系统管理员都在寻找更高效的工具和平台。Codigger 作为一项创新技术成果&#xff0c;凭借其独特的定位和架构&#xff0c;在行业内逐渐崭露头角。 Codigger “分布式操作系统”&#xff0c;它…

微信中 qrcode 生成二维码长按无效果的解决方案

引言 我们先来看这样一段代码 <divid"qrcode"ref"qrcode"class"bind-code-img"style"height: 180px;width: 180px;margin-top: 22px;display: none; "></div> new QRCode("qrcode", {width: 210,height: 210,t…

《网络安全与防护》作业复习

填空题 1. 网络数据库与数据安全专项作业 填空题解析&#xff1a; 数据库安全的“三大核心目标”是 完整性&#xff1b;保密性&#xff1b;可用性 解释&#xff1a;数据库安全的三个核心目标是确保数据的完整性、保密性以及可用性&#xff0c;即保护数据不被篡改、未经授权访…

【windows常见文件后缀】

文件后缀解释css层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff1a;用于描述HTML或XML&#xff08;包括如SVG、XHTML等XML方言&#xff09;文档的呈现样式&#xff0c;控制网页的布局、颜色、字体等视觉效果。jsJavaScript&#xff1a;一种轻量级的解释型或…

labelme启动报错动态链接库DLL初始化例程失败

安装 pip install labelme启动 labelmewin11python3.12&#xff0c;pycharm venv 安装&#xff1a; pip install labelme&#xff0c;启动labelme报错&#xff1a; 降级numpy&#xff0c;降级onnxruntime pip install “numpy<2.0” pip install onnxruntime1.18.0 再次cm…