当前位置: 首页 > news >正文

uni-app云开发总结

uni-app云开发总结

云开发无非就三个概念:云数据库、云函数、云存储

uni-app中新增了一个概念叫做云对象,它其实就是云函数的加强版,它是导出的一个对象,对象中可以包含多个操作数据库的函数,接下来咱们就详细对uni-app的云开发的三部分进行讲解:

一、云数据库知识讲解

uni-app中的云数据库的类型是非关系型数据库,那么我们可以回顾一下 关系型数据库非关系型数据库 的区别

云数据库辅助理解(两者区别)

关系型数据库(如MySQL、PostgreSQL)与非关系型数据库(如MongoDB、Redis)的核心区别可总结为以下四大维度,最大区别在于数据模型的灵活性与适用场景:


1. 数据模型(核心差异)
维度关系型数据库非关系型数据库
存储结构表格(行和列),严格预定义Schema灵活格式(文档、键值、图等),无固定Schema
数据关联通过外键实现多表关联(JOIN操作)通常无关联,数据内嵌或冗余存储
典型场景结构化数据(如订单、用户信息)半/非结构化数据(如日志、社交网络)

存储结构-直观体现

非关系型:

在这里插入图片描述

关系型:

在这里插入图片描述

示例对比:

-- 关系型:用户表和订单表分离,通过user_id关联
SELECT * FROM users 
JOIN orders ON users.id = orders.user_id;
// 非关系型:用户文档内嵌订单数据(MongoDB)
{"_id": "user123","name": "Alice","orders": [{ "orderId": "O1", "amount": 100 },{ "orderId": "O2", "amount": 200 }]
}

2. 扩展性与性能
维度关系型数据库非关系型数据库
扩展方式垂直扩展(升级硬件)水平扩展(分布式集群)
读写性能复杂事务下性能较低高并发读写优化(如Redis每秒百万级)
适用规模中小规模数据海量数据(TB/PB级)

3. 事务与一致性
维度关系型数据库非关系型数据库
事务支持完整ACID(原子性、一致性、隔离性、持久性)部分支持(如MongoDB多文档事务),多数为BASE模型(基本可用、软状态、最终一致性)
一致性要求强一致性弱一致性(优先可用性和分区容忍性)

4. 查询与功能
维度关系型数据库非关系型数据库
查询语言SQL(结构化查询语言)多样化API(如MongoDB的JSON查询)
索引支持B树索引、联合索引灵活索引(如地理位置、全文索引)
复杂计算支持复杂JOIN和聚合依赖MapReduce或聚合管道

如何选择?
  1. 选关系型:
    • 数据结构固定,需要强一致性(如银行交易)。

    • 复杂多表关联查询(如ERP系统)。

    • 事务密集型场景(如库存扣减)。

  2. 选非关系型:
    • 数据结构多变(如用户行为日志)。

    • 高并发读写(如社交平台动态)。

    • 水平扩展需求(如物联网海量设备数据)。


一句话总结最大区别

关系型数据库用“表格”锁死结构,保障严谨;非关系型数据库用“自由格式”换取弹性,拥抱变化。
根据业务需求在“严格规范”与“灵活扩展”之间权衡,是现代数据库选型的核心逻辑。

uni-app云数据库解析

在 uni-app 的云开发(uniCloud)中,数据库采用的是基于 JSON 文档的 NoSQL ( 非关系型 )数据库(类似 MongoDB)。以下是 uniCloud 数据库的核心类型概念解析:


1. 数据库类型特点

• 文档型数据库:数据以 JSON 文档 形式存储,无需预定义表结构(Schema),但可通过 Schema 规范数据格式。

• 集合(Collection):相当于关系型数据库中的“表”,用于存储一组文档(如 users 集合存储用户数据)。

• 文档(Document):集合中的单条数据记录,格式为 JSON 对象(如一个用户的信息)。


2. 核心数据类型

uniCloud 数据库支持以下基础数据类型:

基本类型

类型说明示例
String字符串"Hello"
Number数字(整型或浮点型)1233.14
Boolean布尔值truefalse
Date日期对象(存储为时间戳)new Date()
Null空值null
Undefined未定义(通常不建议存储)undefined

特殊类型

类型说明示例
GeoPoint地理位置点(经纬度){ type: "Point", coordinates: [经度, 纬度] }
GeoLineString地理路径(多个点连成的线){ type: "LineString", coordinates: [[lon1, lat1], [lon2, lat2]] }
Object嵌套的 JSON 对象{ address: { city: "北京", district: "朝阳区" } }
Array数组,可包含混合类型["apple", 123, true]
Buffer二进制数据(如图片、文件)通过 new Buffer() 创建

3. 特殊字段说明

系统保留字段

字段名说明
_id文档唯一标识(主键),自动生成(可自定义或由系统生成)
_createTime文档创建时间(时间戳,由系统自动维护)
_updateTime文档最后更新时间(时间戳,由系统自动维护)
_openid用户唯一标识(仅限客户端创建文档时自动插入当前用户的 OpenID)
uid开发者自定义的用户 ID(需结合权限系统使用)

4. 与传统数据库对比
概念关系型数据库(如 MySQL)uniCloud 数据库(NoSQL)
数据单位表(Table)集合(Collection)
数据记录行(Row)文档(Document)
字段类型严格预定义(Schema)动态灵活(Schema 可选)
关联查询JOIN 操作嵌套文档或多次查询(非实时关联)

5. 使用示例
// 插入一条用户数据到 users 集合
const db = uniCloud.database();
await db.collection('users').add({name: "John",          // Stringage: 25,               // NumberisAdmin: false,        // BooleancreatedAt: new Date(),  // Datelocation: {             // GeoPointtype: "Point",coordinates: [116.397428, 39.90923]},tags: ["developer", "reader"],  // Arrayprofile: {              // Objectbio: "全栈开发者",website: "https://example.com"}
});

6. 注意事项
  1. 类型严格性:查询时需匹配字段类型(如 Number 类型字段不能直接与字符串比较)。
  2. 地理位置索引:使用地理位置查询前需在 uniCloud 控制台创建 地理位置索引。
  3. 日期处理:数据库存储的是时间戳,需在客户端转换为 Date 对象。

通过理解这些类型概念,可以更高效地设计 uniCloud 数据库结构和编写查询逻辑。建议结合官方文档进一步实践:uniCloud 数据库文档

二、数据库操作讲解

在 uni-app 云开发中,数据库操作存在两种主要方式:**传统 MongoDB 风格 API(database())**和 JQL 查询语言(databaseForJQL()。以下是详细对比和操作方式解析:

JQL 是什么?

JQL 是 uniCloud 为简化数据库操作设计的查询语言,融合了 SQL 的易用性和 NoSQL 的灵活性。特点包括:

  • 类SQL语法:简化 MongoDB 原生 API 的复杂写法。
  • 权限控制:自动校验客户端请求,防止越权操作。
  • 跨表查询:支持联表查询(类似 SQL JOIN),突破 NoSQL 单表限制。
  • 安全过滤:内置防注入机制,避免恶意代码执行。

在哪里操作?

说了操作云数据库的方式,那么我们应该在哪里去进行操作呐,可以在客户端直接操作云函数操作云对象操作 这三个地方进行操作

       ┌───────────────┐       ┌───────────────┐│   客户端操作   │       │ 服务端操作     │└───────┬───────┘       └───────┬───────┘│                       │┌───────────┴───────────┐ ┌─────────┴─────────┐│ 直接操作数据库          │ │   通过云函数/云对象││ (需安全规则限制)        │ │   (拥有管理员权限) │└───────────┬───────────┘ └─────────┬─────────┘│                       │┌───────┴───────┐       ┌───────┴───────┐│ 简单查询/写入  │       │ 复杂业务逻辑    ││ 低风险操作     │       │ 敏感数据操作    │└───────────────┘       └───────────────┘

不同位置操作对比表

对比维度客户端直接操作云函数操作云对象操作
权限级别受安全规则限制管理员权限管理员权限
执行环境用户浏览器/小程序环境Node.js 服务端环境Node.js 服务端环境
网络延迟直连数据库(较快)需要两次网络请求需要两次网络请求
安全性需严格配置规则天然安全(服务端执行)天然安全(服务端执行)
事务支持不支持支持支持
代码复用无法复用通过模块化复用天然支持类方法复用
典型场景公开数据查询复杂事务处理业务逻辑封装

一、操作方式对比表

1. JQL 核心概念对比(与传统 MongoDB 对比)

对比维度database()(传统MongoDB风格)databaseForJQL()(JQL查询语言)
语法风格链式调用,接近原生MongoDB语法类似SQL的声明式语法,更贴近前端开发习惯
联表查询需要手动使用lookup聚合操作支持自动联表(通过foreignKey自动关联)
权限控制依赖安全规则配置内置权限系统,支持动态权限控制
事务处理需要显式使用startTransaction自动管理事务
执行位置客户端/云函数均可执行主要在客户端执行(也可服务端)
性能优化需要手动优化查询语句自动优化查询计划
学习成本需要熟悉MongoDB语法类似SQL的简化语法更易上手
官方推荐度基础用法新项目推荐使用

2. JQL 核心操作对比(与传统 MongoDB 对比)

操作类型JQL 写法MongoDB 原生写法
查询单条数据db.collection('user').doc('id').get()db.user.findOne({ _id: 'id' })
条件查询db.collection('user').where('age > 20').get()db.user.find({ age: { $gt: 20 } })
字段过滤db.collection('user').field('name,age').get()db.user.find({}, { name: 1, age: 1 })
联表查询使用 lookup 语法(见下方示例)需多次查询或手动聚合
分页查询db.collection('user').skip(10).limit(5).get()db.user.find().skip(10).limit(5)

二、具体操作方式示例

1. 传统 MongoDB 风格(database()
const db = uniCloud.database()
const cmd = db.command // 操作指令// 查询
db.collection('articles').where({category: 'tech',view_count: cmd.gt(1000)}).field('title,author').orderBy('publish_date', 'desc').limit(10).get()// 新增
db.collection('users').add({name: 'John',email: 'john@example.com',created_at: Date.now()
})// 更新
db.collection('orders').doc('order-id').update({status: 'shipped',updated_at: Date.now()
})// 删除
db.collection('logs').doc('log-id').remove()// 联表查询(需要聚合)
db.collection('orders').aggregate().lookup({from: 'users',localField: 'user_id',foreignField: '_id',as: 'user_info'}).end()
2. JQL 查询语言(databaseForJQL()
const db = uniCloud.databaseForJQL()// 简单查询
db.collection('articles').where('category == "tech" && view_count > 1000').field('title,author').orderBy('publish_date desc').limit(10).get()// 自动联表查询(关联users表)
db.collection('articles,users').where('articles.author_id == users._id').field('articles.title, users.name as author_name').get()// 带权限控制的更新
db.collection('users').doc('user-id').update({age: 30}, {permission: { write: "auth.uid == targetDoc._id" }})// 事务操作(自动管理)
const transaction = await db.startTransaction()
try {await transaction.collection('accounts').doc('account-A').update({ balance: db.command.inc(-100) })await transaction.collection('accounts').doc('account-B').update({ balance: db.command.inc(100) })await transaction.commit()
} catch (e) {await transaction.rollback()
}

三、具体操作位置说明

1. 客户端直接操作(前端代码)

适用场景

  • 简单数据查询(如文章列表)
  • 用户自主数据维护(如修改个人资料)
  • 低风险数据写入(如评论提交)

代码位置

// 页面/组件的.vue文件中
export default {methods: {async loadData() {const db = uniCloud.databaseForJQL() // 推荐JQL方式const res = await db.collection('articles').where('status == "published"').get()console.log(res)}}
}

安全要求

  • 必须配置数据库安全规则

  • 禁止开放敏感字段权限

  • 示例安全规则:

    {"read": "doc.status == 'published'","write": "auth.uid == doc.author_id"
    }
    
2. 云函数中操作

适用场景

  • 支付订单处理
  • 需要事务的操作(如库存扣减)
  • 第三方服务集成(如发送短信)

代码位置

// cloudfunctions/order-function/index.js
exports.main = async (event) => {const db = uniCloud.database()const transaction = await db.startTransaction()try {// 库存扣减await transaction.collection('goods').doc(event.goodsId).update({stock: db.command.inc(-1)})// 生成订单const orderRes = await transaction.collection('orders').add({userId: event.uid,goodsId: event.goodsId,status: 'created'})await transaction.commit()return orderRes} catch (e) {await transaction.rollback()throw e}
}
3. 云对象中操作(推荐方式)

适用场景

  • 用户中心功能(注册/登录/资料管理)
  • 需要复用逻辑的业务模块
  • 需要统一权限控制的场景

代码位置

// cloudobjects/user-center/index.js
module.exports = {// 统一鉴权中间件_before() {const clientInfo = this.getClientInfo()if (!clientInfo.uniIdToken) {throw new Error('未授权访问')}},// 用户信息更新方法async updateProfile(profileData) {const db = uniCloud.database()const uid = this.getClientInfo().uid// 数据校验if (profileData.age && (profileData.age < 0 || profileData.age > 120)) {throw new Error('年龄数据异常')}return db.collection('users').doc(uid).update({...profileData,updated_at: Date.now()})}
}

四、核心差异点解析

1. 联表查询机制
  • 传统方式:需要手动编写聚合管道,使用lookup进行多阶段联表
  • JQL方式
    // 自动联表示例
    db.collection('orders,users').where('orders.user_id == users._id').field('orders.*, users.name as user_name').get()
    

连表查询这里需要注意的是,直接写上面的代码(.where('orders.user_id == users._id'))时候报错的:说找不到两张之间的关系。这里我们需要配置项目的 表结构/schema,从而设置数据表之间的关系。

场景举例:

场景:现在有 user 和 **activity **两张数据表,activity 表中的 user_id 对应了 user 表中的 _id

目的:我现在要查询所有活动以及对应的发布人信息

表结构配置:
在这里插入图片描述

对应的schema文件:

{"bsonType": "object","required": [],"permission": {"read": true,"create": true,"update": true,"delete": false},"properties": {"_id": {"description": "ID,系统自动生成","foreignKey": "community.activity_id"},"user_id": {"description": "ID,系统自动生成","foreignKey": "user._id" // 使用foreignKey表示,此字段关联user表的_id。}}
}

通过以上配置以后,咱们就可以进行连表查询

const userTemp = db.collection("user").getTemp() // 获取临时数据表
const activityTemp = db.collection("activity").where("title == '跨区出行'").field("user_id,type,title,loscation,content").getTemp()
db.collection(activityTemp, userTemp).get()

查询数据:

上面连表查询的"user_id"字段就会去user表中查找对应的用户数据,

[{"_id": "67fdcafcf08210c5a2ab7e36","content": "乘坐地铁15公里,用时40分钟","loscation": "上海市浦东新区","title": "跨区出行","type": "公共交通","user_id": [{"_id": "67fdc8d3862066ed97752665","carbon_points": 1000,"create_time": "2025-05-10T14:20:00Z","nickname": "蓝天白云","openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2N","password": "e10adc3949ba59abbe56e057f20f883e","phone": "13987654321","status": 1,"total_reduction": 30.800000000000001,"update_time": "2025-05-11T08:45:00Z","user_pic": "https://img0.baidu.com/it/u=306649616,2230355986&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500"}]}
]
2. 权限控制实现
  • 传统方式:依赖数据库安全规则(JSON配置)
    // 安全规则示例
    {"read": "doc.status == 'published'","write": "auth.uid == doc.author_id"
    }
    
  • JQL方式:支持动态权限(代码级控制)
    db.collection('articles').get({permission: { read: "doc.status == 'published' || auth.uid == doc.author_id"}
    })
    
3. 查询性能优化
  • 传统方式:需要手动创建索引
    db.createIndex({collectionName: 'articles',indexes: [{ name: 'category_index', fields: [{ category: 1 }] }]
    })
    
  • JQL方式:自动索引建议(控制台提示优化方案)
4. 数据类型处理
  • 传统方式:严格类型校验(需手动处理Date等类型)
    db.collection('logs').add({timestamp: new Date().getTime() // 需显式转换
    })
    
  • JQL方式:自动类型转换
    db.collection('logs').add({timestamp: new Date() // 自动转为时间戳
    })
    

五、使用场景建议

推荐使用 database() 的场景:
  1. 需要复杂聚合查询(如多阶段管道操作)
  2. 已有MongoDB开发经验的团队
  3. 需要直接操作数据库指令(如地理位置查询)
推荐使用 databaseForJQL() 的场景:
  1. 新项目启动(特别是前后端分离架构)
  2. 需要简化联表查询逻辑
  3. 希望在前端实现复杂业务逻辑
  4. 需要动态权限控制的场景

六、混合使用建议

// 在云函数中结合使用
exports.main = async (event) => {const db = uniCloud.database()const jqlDB = uniCloud.databaseForJQL({ clientInfo: event })// 传统方式处理事务const transaction = await db.startTransaction()// JQL方式处理联表查询const result = await jqlDB.collection('orders,users').where('orders.user_id == users._id').get()// 提交事务await transaction.commit()return result
}

七、注意事项

  1. JQL限制

    • 单次查询最多关联3张表
    • 客户端查询最大返回1000条数据
    • 复杂聚合仍需使用传统方式
  2. 迁移成本

    • 现有项目从传统方式迁移到JQL需重写查询逻辑
    • 两种方式的数据索引可以复用
  3. 安全规范

    • JQL客户端查询仍需配置安全规则
    • 敏感操作仍需通过云函数/云对象
  4. 性能监控

    • 控制台可分别查看两种方式的慢查询日志
    • JQL查询建议使用explain()分析执行计划
    db.collection('articles').explain().get()
    

根据项目需求选择合适方案,小型快速开发项目推荐JQL,复杂企业级系统建议两种方式结合使用。

三、云函数与云对象讲解

以下是云函数(Cloud Function)与云对象(Cloud Object)的详细对比


一、核心概念对比

对比维度云函数 (Cloud Function)云对象 (Cloud Object)
代码组织形式单个函数处理请求类对象封装多个方法
调用方式uniCloud.callFunction({ name: 'funcName' })uniCloud.importObject('objName').methodName()
开发范式函数式编程面向对象编程
路由机制手动管理(通过函数名区分)自动路由(对象方法即接口)

调用方式对比表

对比维度云函数 (Cloud Function)云对象 (Cloud Object)
调用入口uniCloud.callFunctionuniCloud.importObject
参数传递通过 event 对象统一传递直接作为方法参数传递
方法调用单入口函数(需自行路由)多方法直接调用
错误处理需手动捕获异常自动错误冒泡(try-catch 统一处理)
返回结构需手动包装返回格式自动标准化响应格式
类型提示无自动提示支持 JSDoc 类型提示
中间件触发需手动实现自动执行 _before 等生命周期方法

二、技术特性对比

  1. 参数处理

    • 云函数 ➔ 需手动解析event参数

      exports.main = async (event) => {const { action, data } = event
      }
      
    • 云对象 ➔ 自动解析参数(方法直接接收)

    • module.exports = {addUser(userData) { /* 直接使用userData */ }
      }
      
  2. 错误处理

    • 云函数 ➔ 需手动catch错误
      try { await callFunction('func') 
      } catch(e) {...}
      
    • 云对象 ➔ 自动错误冒泡(客户端自动捕获)
      // 客户端自动接收标准化错误格式
      
  3. 中间件支持

    • 云函数 ➔ 自行实现中间件机制
      const auth = require('uni-id').checkToken(event.uniIdToken)
      
    • 云对象 ➔ 内置中间件系统
      module.exports = {_before() { // 统一鉴权逻辑 }
      }
      
  4. 类型校验

    • 云函数 ➔ 手动校验参数类型
      if(typeof event.name !== 'string') throw...
      
    • 云对象 ➔ 自动类型校验(基于JSDoc)
      /*** @param {string} userId* @param {number} newAge*/
      updateAge(userId, newAge) {...}
      

三、功能特性对比

  1. 代码复用性

    • 云函数 ➔ 通过模块化实现
    const common = require('./common.js')
    
    • 云对象 ➔ 天然支持继承/混入
class BaseObject { ... }
module.exports = class User extends BaseObject {...}
  1. 调试支持

    • 云函数 ➔ 需要模拟event参数
    • 云对象 ➔ 支持方法级断点调试
  2. 文档生成

    • 云函数 ➔ 手动维护接口文档
    • 云对象 ➔ 自动生成API文档(基于JSDoc)
  3. 性能表现

    • 云函数 ➔ 单个函数独立冷启动
    • 云对象 ➔ 对象级缓存(方法调用共享上下文)

四、生命周期对比

云函数生命周期:
客户端调用 ➔ 创建实例 ➔ 执行main函数 ➔ 销毁实例云对象生命周期:
客户端调用 ➔ 创建对象实例 ➔ 执行中间件 ➔ 执行目标方法 ➔ 保持常驻(可复用)

五、最佳实践对比

场景推荐方案示例
简单原子操作云函数发送短信验证码
复杂业务逻辑云对象订单创建(涉及多表操作)
高频调用接口云对象(常驻内存)实时聊天消息处理
需要严格权限控制云对象(中间件统一处理)支付操作
第三方服务对接云函数微信支付回调处理

六、代码结构对比

云函数典型结构
// cloudfunctions/user-function/index.js
exports.main = async (event, context) => {const { action, data } = eventswitch(action) {case 'addUser':return addUser(data)case 'deleteUser':return deleteUser(data)default:throw new Error('Invalid action')}
}function addUser(userData) { /* ... */ }
function deleteUser(userId) { /* ... */ }
云对象典型结构
// cloudobjects/user-object/index.js
module.exports = {// 前置中间件_before() {this.verifyToken() // 统一鉴权},/*** 添加用户* @param {Object} userData 用户数据*/async addUser(userData) {// 业务逻辑},/*** 删除用户* @param {string} userId 用户ID*/async deleteUser(userId) {// 业务逻辑},// 私有方法(不对外暴露)verifyToken() {// 鉴权逻辑}
}

七、迁移路径建议

传统云函数 ➔ 云对象演进路线:
1. 拆分功能模块 → 2. 封装业务对象 → 3. 添加中间件 → 4. 增加类型校验 → 5. 实现方法复用

关键结论:

  1. 新项目优先使用云对象(架构更清晰、维护成本低)
  2. 存量项目逐步迁移(混合使用两种方案)
  3. 性能敏感场景评估使用(云对象常驻内存 vs 云函数独立实例)
  4. 复杂业务必用云对象(继承/中间件/类型校验等特性优势明显)

通过对比可以看出,云对象在代码组织、开发效率和可维护性方面具有显著优势,而云函数在简单场景和特殊需求场景仍保有其适用价值。

四、云存储讲解

1. 云存储是什么?

云存储是uniCloud提供的文件存储服务,类似于“云端硬盘”,开发者可以快速上传、下载、管理文件(如图片、视频、文档等),无需自建文件服务器。
​核心特点​​:

  • 免运维:无需配置服务器或CDN,开箱即用。
  • 权限控制:通过安全规则限制文件访问权限。
  • 自动生成链接:上传后自动返回文件URL,可直接用于前端展示。
  • 与数据库联动:文件ID可与云数据库关联,实现文件元数据管理。

以下是对 uni-app 云开发中 云存储(Cloud Storage) 的详细知识点讲解,采用结构化方式呈现:


一、核心功能概述

1. **文件全生命周期管理**  - 上传 → 存储 → 处理 → 下载 → 删除
2. **多端统一API**  - 支持Web/H5、小程序、App全平台
3. **CDN加速**  - 自动全球分发,提升访问速度
4. **权限控制体系**  - 支持「公有读/私有」两种访问模式
5. **文件处理能力**  - 图片压缩、裁剪、水印- 视频截图、音频转码(需配置扩展)

二、核心操作API及示例

操作方法示例说明
上传文件uniCloud.uploadFile()客户端或云函数上传文件到云存储
下载文件uniCloud.downloadFile()根据文件ID下载到本地临时路径
删除文件uniCloud.deleteFile()通过文件ID删除云端文件
获取文件列表uniCloud.getTempFileList()查询存储桶中的文件列表(需云函数调用
1. 文件上传(重点)

基础上传

// 选择文件
const res = await uni.chooseImage({ count: 1 })
const tempFile = res.tempFiles[0]// 执行上传
const uploadRes = await uniCloud.uploadFile({filePath: tempFile.path,cloudPath: `user_avatar/${Date.now()}.jpg`, // 云端路径onUploadProgress: (e) => {console.log(`上传进度: ${e.progress}%`)}
})
// 注意:这里的uploadRes.fileID就可以在HTML中访问了,但是最好用uniCloud.getTempFileURL转化为HTTPS 可访问URL
console.log('文件ID:', uploadRes.fileID)

高级特性

  • 分片上传(大文件自动处理)
    uniCloud.uploadFile({filePath: largeFile.path,cloudPath: 'bigfile.zip',uploadChunked: true // 启用分片
    })
    
  • 自定义metadata
    uploadFile({filePath: file.path,cloudPath: 'data.json',fileMeta: { // 自定义元数据category: 'config',version: '1.0'}
    })
    
2. 文件下载
// 公有读文件直接使用URL
const publicUrl = 'cloud://prod-env.7072-prod-env-1303011235/user_avatar/1.jpg'// 私有文件需获取临时链接
const downloadRes = await uniCloud.downloadFile({fileID: 'cloud://prod-env.7072-prod-env-1303011235/private/file.txt'
})
console.log('临时路径:', downloadRes.tempFilePath)
3. 文件删除
// 删除图片const handleDelete = (fileID, index) => {uni.showModal({title: '确认删除',content: '确定要删除这张图片吗?',success: async (res) => {if (res.confirm) {try {const result = await active.deleteFile(fileID)if (result.errCode === 0) {fileIDs.value.splice(index, 1)uni.showToast({title: '删除成功'})}} catch (err) {uni.showToast({title: `删除失败: ${err.message}`,icon: 'none'})}}}})}

配套云对象代码:

// 删除活动图片async deleteFile(fileID) {// 参数校验if (!fileID) {return {errCode: 400,errMsg: '缺少fileID参数'}}try {// 实际删除操作const result = await uniCloud.deleteFile({fileList: fileID})return {errCode: 0,data: result}} catch (error) {return {errCode: 500,errMsg: '文件删除失败: ' + error.message,error: error}}},
4. 文件管理
const result = await uniCloud.getTempFileURL({fileList: ['cloud://xxx.jpg'] // 获取临时URL
})await uniCloud.deleteFile({fileList: ['cloud://obsolete.jpg'] // 批量删除
})const listRes = await uniCloud.listFiles({prefix: 'user_avatar/', // 目录前缀limit: 100 // 分页大小
})

三、权限控制体系

云存储通过 安全规则(Security Rules) 实现精细化权限管理,规则基于 JSON 配置,在 uniCloud 控制台中设置。权限验证发生在文件操作(读/写/删除)时,由云端自动执行。

1. 权限模式
权限类型访问规则典型场景
公有读任何人可读,不可写网站图片/公开文档
私有需通过云函数/云对象获取临时URL用户私有文件/敏感数据
2. 权限配置方式

通过文件路径前缀控制

cloud://env-id.7072-env-id-1303011235/  # 根目录
├─ public/          # 公有读目录
└─ private/         # 私有目录

动态权限管理(云函数中):

// 生成带时效的下载链接
const getSecureURL = async (fileID) => {return uniCloud.getTempFileURL({fileList: [fileID],expire: 3600 // 1小时有效})
}

四、文件处理能力

1. 图片处理(URL参数方式)
// 原图:cloud://env-id.7072-env-id-1303011235/photo.jpg
const processedURL = originalURL + '?imageMogr2/thumbnail/300x300'// 组合操作示例:
// 缩略图 + 圆形裁剪 + 水印
const complexURL = originalURL + '?imageMogr2/thumbnail/200x200' +'|circle/radius/!50p' +'|watermark/2/text/5paw5LiJ5Y-R/image/aHR0cHM6Ly9...'
2. 视频处理(需扩展)
// 获取视频封面
const videoCoverURL = videoFileID + '?vframe/jpg/offset/5'// 视频转码(HLS格式)
const hlsURL = videoFileID + '?transcode/hls'

五、安全防护策略

1. **上传防护**  - 文件类型白名单(MIME类型检查)- 文件大小限制(单文件≤100MB)- 病毒扫描(需集成安全能力)2. **访问控制**  - 私有文件临时URL时效性(默认1小时)- 防盗链设置(Referer白名单)3. **存储安全**  - 自动多副本存储- 跨地域容灾备份4. **监控预警**  - 异常流量告警- 敏感文件操作日志

六、最佳实践示例

这里给出一个用户头像上传的例子,帮助理解云存储的使用方法

1. 用户头像上传方案
1.1 选择并上传头像(前端)
<template><view class="container"><!-- 头像展示 --><image :src="avatarUrl" mode="aspectFill" @click="chooseAvatar" /><!-- 上传按钮 --><button @click="uploadAvatar">确认上传</button></view>
</template><script>
export default {data() {return {tempFilePath: '', // 临时文件路径avatarUrl: '',    // 头像网络URLuserId: ''        // 当前用户ID(可从uni-id获取)}},onLoad() {this.userId = uni.getStorageSync('uni_id') || ''; // 获取当前用户IDthis.loadUserAvatar(); // 加载已有头像},methods: {// 选择图片chooseAvatar() {uni.chooseImage({count: 1,sizeType: ['compressed'],success: (res) => {this.tempFilePath = res.tempFilePaths[0];}});},// 上传到云存储async uploadAvatar() {if (!this.tempFilePath) return uni.showToast({ title: '请选择图片', icon: 'none' });uni.showLoading({ title: '上传中...' });try {// 1. 上传到云存储(路径格式:avatars/{userId}/timestamp.jpg)const cloudPath = `avatars/${this.userId}/${Date.now()}.jpg`;const uploadRes = await uniCloud.uploadFile({filePath: this.tempFilePath,cloudPath: cloudPath});// 注意:这里的uploadRes.fileID就可以在HTML中访问了,但是最好用uniCloud.getTempFileURL转化为HTTPS 可访问URL// 2. 将 fileID 存入用户表(关联头像)const db = uniCloud.database();await db.collection('uni-id-users').doc(this.userId).update({avatar: uploadRes.fileID // 存储云存储文件ID});// 3. 更新本地头像显示this.avatarUrl = await this.getFileUrl(uploadRes.fileID);uni.showToast({ title: '上传成功' });} catch (e) {uni.showToast({ title: '上传失败: ' + e.message, icon: 'none' });} finally {uni.hideLoading();}},// 加载用户已有头像async loadUserAvatar() {const db = uniCloud.database();const userRes = await db.collection('uni-id-users').doc(this.userId).get();if (userRes.data[0]?.avatar) {this.avatarUrl = await this.getFileUrl(userRes.data[0].avatar);}},// 将 cloud://fileID 转为 HTTPS 可访问URLasync getFileUrl(fileID) {const { result } = await uniCloud.getTempFileURL({ fileList: [fileID] });return result.fileList[0].tempFileURL;}}
}
</script><style>
image {width: 150rpx;height: 150rpx;border-radius: 50%;
}
</style>

1.2. 云函数(可选)

如果需要更复杂的逻辑(如图片压缩、敏感内容检测),可增加云函数处理:

// 云函数入口文件(cloudfunctions/avatar-processor/index.js)
exports.main = async (event, context) => {const { fileID, userId } = event;// 示例:调用图片压缩APIconst result = await uniCloud.downloadFile({ fileID });const compressedPath = await imageCompress(result.fileContent);// 重新上传压缩后的图片const newFile = await uniCloud.uploadFile({filePath: compressedPath,cloudPath: `avatars/${userId}/compressed_${Date.now()}.jpg`});return { fileID: newFile.fileID };
};// 简易图片压缩(实际需调用三方服务或使用sharp库)
async function imageCompress(buffer) {// ...实现压缩逻辑
}
2. 大文件分片上传优化
// 自定义分片策略
uniCloud.uploadFile({filePath: largeFile.path,cloudPath: 'bigfile.zip',uploadChunked: true,chunkSize: 2 * 1024 * 1024, // 2MB分片onChunkUpload: ({ progress, chunkIndex }) => {console.log(`分片${chunkIndex}上传完成`)}
})

七、调试与监控

1. 开发阶段调试
// 查看文件元数据
const metadata = await uniCloud.getFileInfo({fileList: [fileID]
})
console.log('文件信息:', metadata)// 本地文件模拟上传
uniCloud.uploadFile({fileContent: new Buffer.from('test content'), // Node环境可用cloudPath: 'test.txt'
})
2. 生产环境监控项
监控维度检查指标告警阈值
存储量总存储空间使用率≥80%
流量CDN下行流量突增环比增长≥300%
请求数异常404请求量每分钟≥100次
安全事件病毒文件上传次数单日≥1次

关键结论:

  1. 路径规划原则

    • 按业务类型分目录(如 /user_upload//system_config/
    • 使用时间戳/UUID防止文件名冲突
  2. 性能优化重点

    • 前端压缩(减少传输量)
    • CDN缓存策略(合理设置Cache-Control)
    • 异步处理机制(大文件后台处理)
  3. 安全必做项

    • 设置上传文件类型白名单
    • 私有文件必须设置访问时效
    • 定期审计存储桶权限
  4. 成本控制技巧

    • 开启低频存储类型
    • 设置生命周期自动删除临时文件
    • 使用图片处理减少存储冗余

}.jpg`
});

return { fileID: newFile.fileID };
};

// 简易图片压缩(实际需调用三方服务或使用sharp库)
async function imageCompress(buffer) {
// …实现压缩逻辑
}

#### 2. 大文件分片上传优化```javascript
// 自定义分片策略
uniCloud.uploadFile({filePath: largeFile.path,cloudPath: 'bigfile.zip',uploadChunked: true,chunkSize: 2 * 1024 * 1024, // 2MB分片onChunkUpload: ({ progress, chunkIndex }) => {console.log(`分片${chunkIndex}上传完成`)}
})

七、调试与监控

1. 开发阶段调试
// 查看文件元数据
const metadata = await uniCloud.getFileInfo({fileList: [fileID]
})
console.log('文件信息:', metadata)// 本地文件模拟上传
uniCloud.uploadFile({fileContent: new Buffer.from('test content'), // Node环境可用cloudPath: 'test.txt'
})
2. 生产环境监控项
监控维度检查指标告警阈值
存储量总存储空间使用率≥80%
流量CDN下行流量突增环比增长≥300%
请求数异常404请求量每分钟≥100次
安全事件病毒文件上传次数单日≥1次

关键结论:

  1. 路径规划原则

    • 按业务类型分目录(如 /user_upload//system_config/
    • 使用时间戳/UUID防止文件名冲突
  2. 性能优化重点

    • 前端压缩(减少传输量)
    • CDN缓存策略(合理设置Cache-Control)
    • 异步处理机制(大文件后台处理)
  3. 安全必做项

    • 设置上传文件类型白名单
    • 私有文件必须设置访问时效
    • 定期审计存储桶权限
  4. 成本控制技巧

    • 开启低频存储类型
    • 设置生命周期自动删除临时文件
    • 使用图片处理减少存储冗余

通过合理使用云存储能力,结合uni-app的多端特性,可以构建高效安全的文件管理系统。建议结合uni-admin进行可视化文件管理,并定期使用listFilesAPI进行存储空间审计。

相关文章:

uni-app云开发总结

uni-app云开发总结 云开发无非就三个概念&#xff1a;云数据库、云函数、云存储 uni-app中新增了一个概念叫做云对象&#xff0c;它其实就是云函数的加强版&#xff0c;它是导出的一个对象&#xff0c;对象中可以包含多个操作数据库的函数&#xff0c;接下来咱们就详细对uni-…...

uniapp-商城-37-shop 购物车 选好了 进行订单确认3 支付栏

支付栏 就是前面用的 car-Layout 在shop也用来这个组件 只是在那里用来的是购物车。 1、 样式 我们开始进入这个页面是点击的shop的购物篮 到这里就变成了支付栏 其实他们是同一个组件 只是做了样式区分 2、具体看看样式和代码 2.1 消失了购物车和改变了按钮名字 如何…...

搜索二叉树-key的搜索模型

二叉搜索树(Binary Search Tree, BST)是一种重要的数据结构&#xff0c;它有两种基本模型&#xff1a;Key模型和Key/Value模型。 一、Key模型 1.基本概念 Key模型是二叉搜索树中最简单的形式&#xff0c;每个节点只存储一个键值(key)&#xff0c;没有额外的数据值(value)。这…...

Qt ModbusSlave多线程实践总结

最近项目中用到了ModbusSlave&#xff0c;也就是Modbus从设备的功能&#xff0c;之前用的基本都是master设备&#xff0c;所以读取数据啥的用单线程就行了&#xff0c;用 void WaitHelper::WaitImplByEventloop(int msec) {QEventLoop loop;QTimer::singleShot(msec, &loop…...

Leetcode刷题记录18——接雨水

题源&#xff1a;https://leetcode.cn/problems/trapping-rain-water/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述&#xff1a; 思路一&#xff1a; &#x1f31f; 本题核心思想&#xff1a;木桶效应 每个位置的“桶”&#xff1a;假设每个柱子的位…...

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤

以下是在 IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤&#xff1a; 步骤 1&#xff1a;创建 Maven Web 项目 新建项目 File -> New -> Project → 选择 Maven → 勾选 Create from archetype → 选择 maven-archetype-webapp。输入 GroupId&#xff08;如 com.examp…...

全球玻璃纸市场深度洞察:环保浪潮下的材料革命与产业重构(2025-2031)

一、行业全景&#xff1a;从传统包装到绿色经济的战略支点 玻璃纸&#xff08;Cellulose Film&#xff09;&#xff0c;即再生纤维素薄膜&#xff0c;以木浆、棉浆等天然纤维素为原料&#xff0c;通过碱化、黄化、成型等工艺制成&#xff0c;兼具透明性、柔韧性及100%生物降解性…...

提示js方法未定义,但是确实<textarea>标签未闭合。

1、问题现象。 Uncaught ReferenceError: showOtherDismantleFn is not defined 但是这个方法&#xff0c;在代码中明明存在。 #if($!{isNewEnergy})#if($!{batteryName} 宁德时代)<button class"btn btn-info btn-xs" onclick"showNingDismantleFn()&quo…...

spring中的@bean注解详解

在Spring框架中&#xff0c;Bean注解是用于显式声明一个Bean的核心方式之一&#xff0c;尤其在基于Java的配置中。Spring框架中的Bean注解实现原理涉及多个核心机制&#xff0c;包括配置类解析、Bean定义注册、动态代理及依赖注入等 一、Bean注解的作用 Bean用于标注在方法上&…...

计算机网络中的DHCP是什么呀? 详情解答

目录 DHCP 是什么&#xff1f; DHCP 的工作原理 主要功能 DHCP 与网络安全的关系 1. 正面作用 2. 潜在安全风险 DHCP 的已知漏洞 1. 协议设计缺陷 2. 软件实现漏洞 3. 配置错误导致的漏洞 4. 已知漏洞总结 举例说明 DHCP 与网络安全 如何提升 DHCP 安全性 总结 D…...

uniapp-商城-38-shop 购物车 选好了 进行订单确认4 配送方式1

配送方式在订单确认页面最上方&#xff0c;可以进行选中配送还是自提&#xff0c;这里先看看配送。 代码样式&#xff1a; 可以看出来是通过组件来实现的。组件名字是&#xff1a;delivery-layout 1、建立组件文件夹和页面&#xff0c;delivery-layout这里就只有配送 2、具体…...

粒子群优化算法(Particle Swarm Optimization, PSO)的详细解读

最近研究基于进化算法的神经网络架构搜索&#xff0c;仔细阅读了TEVC2023年发表的一篇NAS搜索的文章&#xff0c;觉得收益颇多&#xff0c;对比NSGA-2&#xff0c;这里给出PSO的详细解释。【本人目前研究的是多目标进化算法&#xff0c;欢迎交流、留言】 文章题目是&#xff1…...

大模型在直肠癌预测及治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 研究方法与创新点 二、大模型技术概述 2.1 大模型的基本原理 2.2 常见大模型类型及特点 2.3 在医疗领域的应用进展 三、直肠癌预测相关数据收集与处理 3.1 数据来源 3.2 数据清洗与预处理 3.3 特征工程 四、大…...

【C++】继承----下篇

文章目录 前言一、实现一个不能继承的类二、友元与继承三、继承与静态成员四、多继承以及菱形继承问题1.继承模型&#xff1a;2.菱形继承的问题3.虚拟继承解决数据冗余和二义性的原理4.虚拟继承的原理 五、继承的总结和反思1.继承和组合 总结 前言 各位好呀!今天呢我们接着讲继…...

windows安装jax和jaxlib的教程(cuda)成功安装

本文你将解决3个问题&#xff1a;1、jaxlib没有安装的问题&#xff1b;2、python3.9以上&#xff08;不可忽略&#xff09;、cuda12.1&#xff08;可忽略&#xff09;以上配置要求不满足的问题&#xff1b;3、numpy版本太高的问题。 1、问题描述 当你直接pip install jax或者c…...

软考【网络工程师】2023年5月上午题答案解析

1、固态硬盘的存储介质是()。 A 光盘 B 闪存 C 软盘 D 磁盘 答案是 B。 固态硬盘(Solid State Drive),简称 SSD,是用固态电子存储芯片阵列制成的硬盘,其存储介质是闪存(Flash Memory)。闪存具有非易失性,即在断电后仍能保留存储的数据,且读写速度快、抗震性强、能…...

支付场景下,乐观锁的实现(简洁版)

1、问题描述 看到一个同事建的数据库表&#xff0c;好奇打开看看。 create table db_paycenter.t_pay_order_divide (id bigint auto_increment comment 主键id|20250402|XXXprimary key,user_id bigint not null comment user…...

AI视频技术赋能幼儿园安全——教师离岗报警系统的智慧守护

教师离岗报警系统如一位无形的守护者&#xff0c;实时监测教室动态&#xff0c;一旦发现教师离岗超30秒&#xff0c;立即通知园方&#xff0c;确保幼儿不被忽视。这套开源系统以高效检测和即时报警为核心&#xff0c;助力园所优化管理&#xff0c;增强家长信心&#xff0c;开启…...

SCI论文结构笔记

摘要五要素(Abstract)&#xff1a; 背景和研究问题研究目的研究方法研究结果结论和意义 引言&#xff08;Introduction)&#xff1a; 研究背景研究问题研究现状现有的研究的问题与不足本研究的研究目标文章结构 研究综述(Literature review): 选题的理由现存文献中可借鉴的…...

《修仙家族模拟器2》:游戏背景故事介绍!

《修仙家族模拟器2》构建了一个以修仙文明为根基的宗族传承世界&#xff0c;玩家将扮演家族初代掌舵者&#xff0c;在动态演变的修仙江湖中完成从凡俗世家到仙道巨擘的蜕变。以下为具体背景设定解析&#xff1a; 一、世界观架构&#xff1a;仙凡交织的修真宇宙 空间维度 游戏…...

Linux部署ragflow,从安装docker开始~

安装docker https://download.docker.com/linux/static/stable/x86_64/docker-28.0.1.tgz #首先创建一个文件夹&#xff0c;存放我们需要的各类文件,并切换到该目录 mkdir /project && cd /project #此时我们的工作目录已经切换到刚刚创建的文件夹下了&#xff0c;接…...

苹果iosApp提交审核常见问题--内购订阅篇

常见问题1- 准则2.1.1 Guideline 2.1 - Information Needed The app binary includes the PassKit framework for implementing Apple Pay, but we were unable to verify any integration of Apple Pay within the app. Next Steps If the app integrates the functionali…...

从代码学习深度学习 - 微调 PyTorch 版

文章目录 前言一、迁移学习与微调概念二、微调步骤解析三、实战案例:热狗识别3.1 数据集准备3.2 图像增强处理3.3 加载预训练模型3.4 模型重构3.5 差异化学习率训练3.6 对比实验分析总结前言 深度学习模型训练通常需要大量数据,但在实际应用中,我们往往难以获得足够的标记数…...

Registry镜像仓库的安装与使用

任务目标 &#xff08;1&#xff09;了解目前主流的镜像仓库 &#xff08;2&#xff09;掌握registry私有镜像仓库的部署与使用 任务实施 基础信息 Docker私有仓库个宿主机配置信息 主机名 IP地址 节点角色 registry 192.168.110.80 私有仓库 node1 192.168.110.9…...

java多线程(6.0)

目录 ​编辑 阻塞队列 阻塞队列概念 生产者消费者模型 阻塞队列的作用 阻塞队列的使用 阻塞队列的实现 阻塞队列 阻塞队列概念 阻塞队列是一种特殊的队列&#xff0c;同样遵循“先进先出”的原则&#xff0c;支持入队操作和出队操作和一些基础方法。在此基础上&#…...

tkinter的文件对话框:filedialog

诸神缄默不语-个人技术博文与视频目录 文章目录 一、前言二、tkinter.filedialog模块详解2.1 模块导入方式2.2 通用参数说明 三、五大核心函数实战3.1 选择单个文件 - askopenfilename()3.2 多文件选择 - askopenfilenames()3.3 保存文件对话框 - asksaveasfilename()3.4 选择目…...

HOW - 如何模拟实现 gpt 展示答案的交互效果

文章目录 产品设计维度核心目标实现方式主要靠一些技巧1. 用 emoji 做语义锚点2. 每个段落只传达一件事3. 有节奏地对话式切换4. 使用 Markdown 风格来排版5. 用“你”而不是“用户”说话 如果想实现类似体验&#xff08;比如写文档、教程、产品介绍&#xff09; 前端开发维度想…...

达梦数据库压力测试报错超出全局hash join空间,适当增加HJ_BUF_GLOBAL_SIZE解决

1.名词解释&#xff1a;达梦数据库中的HJ_BUF_GLOBAL_SIZE是所有哈希连接操作可用的最大哈希缓冲区大小&#xff0c;单位为兆字节&#xff08;MB&#xff09; 2.达梦压测报错&#xff1a; 3.找到达梦数据库安装文件 4.压力测试脚本 import http.client import multiprocessi…...

第11章 面向分类任务的表示模型微调

​​​​​​第1章 对大型语言模型的介绍第2章 分词和嵌入第3章 解析大型语言模型的内部机制第4章 文本分类第5章 文本聚类与主题建模第6章 提示工程第7章 高级文本生成技术与工具第8章 语义搜索与检索增强生成第9章 多模态大语言模型第10章 构建文本嵌入模型第12章 微调生成模…...

c#加密证件号的中间部分,改为*号

前言 使用场景&#xff1a;在我项目中&#xff0c;我需要给前端提供接口&#xff0c;所以我要吧证件号进行加密。例如&#xff1a;411421199510225612&#xff0c;这是一个身份证号&#xff0c;18为的&#xff0c;那么我加密完成之后就会是 411421********5612&#xff0c;类似…...

qt中写一个简易的计算器

以下是添加了详细代码注释的版本&#xff1a; cpp #include <iostream>using namespace std;定义加法函数&#xff08;已注释掉&#xff09; //int add(int a, int b) { // return a b; //}定义减法函数&#xff08;已注释掉&#xff09; //int min(int a, int b) {…...

[特殊字符] Docker 从入门到实战:全流程教程 + 项目部署指南(含镜像加速)

Docker 是现代 DevOps 的基石&#xff0c;应用广泛于微服务、CI/CD、K8s、云原生等场景。本文将从 0 到 1 手把手带你掌握 Docker 的核心知识点&#xff0c;并完成 Java Nginx 项目部署&#xff0c;适合新手与进阶开发者阅读与实战。 &#x1f4da; 目录 Docker 快速入门 入门…...

《R语言SCI期刊论文绘图专题计划》大纲

今天开始&#xff0c;我将和大家分享系统且详细的《R语言SCI期刊绘图专题教程》&#xff0c;内容会从基础到高阶应用&#xff0c;从配色美学到顶刊风格复现&#xff0c;确保大家可以学到高质量内容&#xff01;下面是大纲。 &#x1f4da;《R语言SCI期刊论文绘图专题计划》 第…...

从氛围到节奏:情绪化配乐网站指南

在影视、短视频、广告甚至游戏开发中&#xff0c;配乐的作用早已超越了简单的背景音效&#xff0c;它能够深刻地影响观众的情绪&#xff0c;为作品注入灵魂。但如何找到那些能够精准传达情绪、完美契合画面的配乐呢&#xff1f;今天&#xff0c;就让我们一起探索那些能够助力你…...

矩阵运营:抢占市场与流量的利器

还在为无法超越行业老大而苦恼&#xff1f;还在为市场份额难以扩大而焦虑&#xff1f;还在为流量匮乏、客资不足而发愁&#xff1f;别担心&#xff0c;矩阵运营就是你突破困局的关键&#xff01; 一、矩阵运营&#xff1a;颠覆传统的运营模式 在当今竞争激烈的商业环境中&…...

【2025最新面试操作系统八股】CPU利用率和load(负载)的区别,CPU利用率怎么算。

总结 负载&#xff08;Load&#xff09;和 CPU 利用率是衡量系统性能的两个不同的指标&#xff0c;它们从不同的角度反映了系统的状态。 CPU 利用率表示 CPU 正在执行指令的时间比例&#xff0c;即 CPU 忙碌的程度。它是一个百分比值&#xff0c;表示在某个时间间隔内&#x…...

ApplicationRunner的run方法与@PostConstruct注解

ApplicationRunner 的 run 方法与 PostConstruct 注解在 Spring Boot 中均用于初始化逻辑&#xff0c;但二者的 执行时机、作用范围 和 功能特性 存在显著差异。以下是详细对比分析&#xff1a; 一、核心差异对比 维度PostConstructApplicationRunner.run()触发时机Bean 实例化…...

【leetcode刷题日记】lc.73-矩阵置零

目录 1.题目 2.代码 1.题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]…...

配置 RDP 远程桌面协议连接ubuntu服务器桌面

文章目录 一、简介二、服务安装三、桌面安装小结 一、简介 RDP&#xff08;Remote Desktop Protocol&#xff0c;远程桌面协议&#xff09;是微软开发的一种专有协议&#xff0c;用于在网络上实现远程桌面访问&#xff0c;允许用户通过客户端设备&#xff08;如 Windows、Linu…...

统计文件中单词出现的次数并累计

# 统计单词出现次数 fileopen("E:\Dasktape/python_test.txt","r",encoding"UTF-8") f1file.read() # 读取文件 countf1.count("is") # 统计文件中is 单词出现的次数 print(f"此文件中单词is出现了{count}次")# 2.判断单词出…...

【初识Trae】字节跳动推出的下一代AI原生IDE,重新定义智能编程

​ 初识官网文档 从官网可以看到有两个大标签页&#xff0c;即Trae IDE CN和Trae插件&#xff0c;这就说明Trae在发布Trae IDE的同时考虑到对主流IDE的插件支持&#xff0c;这一点非常有心&#xff0c;但是我估测Trae IDE的体验更好&#xff08;就是AI IDE出生&#xff0c;毕…...

Spark读取Apollo配置

--conf spark.driver.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 --conf spark.executor.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 在spark的提交命令中&…...

前端技术Ajax实战

1.1 案例_图书管理-介绍 目标 掌握图书管理案例的增删改查业务和 Bootstrap 弹框的使用。 讲解 1. 运行图书管理案例效果 展示增删改查业务效果&#xff0c;并使用 Bootstrap 弹框承载表单。 2. 分析步骤 学习 Bootstrap 弹框&#xff08;用于添加和编辑图书&#xff09…...

ctfshow web入门 命令执行(29-77)

Web 命令执行是指攻击者借助Web应用程序里的漏洞&#xff0c;在服务器端执行任意系统命令的一种攻击手段。 原理&#xff1a; Web 应用程序在处理用户输入时&#xff0c;有时会调用系统命令。若开发人员没有对用户输入进行严格的过滤与验证&#xff0c;攻击者就能够通过构造恶意…...

Mac「brew」快速安装Redis

安装Redis 步骤 1&#xff1a;安装 Redis 打开终端&#xff08;Terminal&#xff09;。 运行以下命令安装 Redis&#xff1a; brew install redis步骤 2&#xff1a;启动 Redis 安装完成后&#xff0c;可以使用以下命令启动 Redis 服务&#xff1a; brew services start redis…...

非对称电容减重实验

加载高压的非对称电容在变压器油中的减重实验 早年国外流传飘升机&#xff08;Lifter&#xff09;的视频。爱好者们用简单的材料制作了非对称电容&#xff0c;通高压直流电&#xff0c;它就能飘起来。 所谓的飘升机&#xff0c;就是一种非对称电容。它由面积相差极大的两个极板…...

day37图像处理OpenCV

文章目录 一、图像预处理19 霍夫变换19.1 理解霍夫变换19.2 (标准)霍夫直线变换19.3 统计概率霍夫直线变换19.4 霍夫圆变换 一、图像预处理 19 霍夫变换 19.1 理解霍夫变换 霍夫变换是图像处理的一种技术&#xff0c;主要用于检测图像中的直线、圆等几何形状。基本思想就是将…...

23种设计模式-行为型模式之责任链模式(Java版本)

Java 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;详解 &#x1f9e0; 什么是责任链模式&#xff1f; 责任链模式是一种行为型设计模式&#xff0c;它使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者与接收者之间的耦合关系。将这些对象…...

机器学习的基本概念

机器学习是人工智能的一个重要研究领域。与计算机科学、心理学等多种学科都有密切的关系&#xff0c;牵涉的面比较宽&#xff0c;而且许多理论及技术上的问题尚处于研究之中&#xff0c;接下来对它的一些基本概念和方法作一简要讨论&#xff0c;以便对它有一个初步的认识。 一…...

【6】GD32 高级通信外设 CAN、USBD

高级通信外设&#xff1a;CAN、USBD CAN CAN简介、主要功能与相关API回环模式收发发送特定ID的数据帧实验CAN数据帧的接收实验使用过滤器接收特定的数据帧 USBD USB通信简介USBD设备固件库架构、分层文件与库函数说明USBD模拟键盘应用USBD虚拟串口应用USBD模拟U盘应用...