uni-app的来龙去脉,技术要点及技术难点,语法结构及应用场景,其实前端也很难,顶级的前端比后端都重要,感觉第一,理性第二

Uni-App 的来龙去脉

Uni-App 是由 DCloud 推出的一款跨平台前端框架,用于开发一次性代码并可以同时在 iOS、Android、H5、微信小程序、支付宝小程序、百度小程序、字节跳动小程序和 QQ 小程序等多个平台上运行的应用。Uni-App 的出现应对了移动互联网时代多平台应用开发的需求,减少了开发者在多个平台之间重复编写代码的负担。

历史背景:

  • 多平台需求:在移动互联网时代,各大平台(如 iOS、Android、各类小程序平台)纷纷崛起,开发者需要为每个平台单独开发应用,增加了开发和维护成本。
  • 前端技术的进步:HTML5、CSS3 和 JavaScript 的发展,使得前端技术具备了更强的表现力和功能性,支持跨平台开发成为可能。
  • 跨平台框架兴起:包括 React Native、Flutter、Weex 等在内的跨平台框架相继问世,Uni-App 作为其中的一员,提供了更加灵活和高效的解决方案。

技术要点

  1. 跨平台能力

    • 一次开发,多端运行:通过统一的代码库,支持生成 iOS、Android、H5 和多种小程序平台的应用。
    • 平台适配:Uni-App 提供了对不同平台特性的适配和封装,使得开发者可以用统一的 API 进行调用。
  2. Vue.js 生态

    • Vue.js 支持:Uni-App 基于 Vue.js 构建,利用其简洁和灵活性的特点,开发者可以快速上手。
    • 组件化开发:支持 Vue 组件和自定义组件,方便复用和维护。
  3. 丰富的插件和扩展

    • 插件市场:提供丰富的插件市场,涵盖各种常用功能,方便快速集成。
    • 扩展能力:支持自定义插件和模块开发,满足特殊需求。
  4. 高性能渲染

    • 渲染优化:通过原生渲染引擎和 JavaScript 引擎优化,提升渲染性能。
    • 离线缓存:支持离线缓存和预加载,提升用户体验。

技术难点

  1. 跨平台兼容性

    • 平台差异:不同平台的特性和限制不同,需要处理大量的兼容性问题。
    • API 一致性:保证统一 API 的同时,适配各个平台的特性和差异是一个挑战。
  2. 性能优化

    • 渲染性能:在不同平台上,尤其是性能较弱的小程序平台,保持高效的渲染性能是一个难点。
    • 资源管理:高效管理和加载资源,避免内存泄漏和性能瓶颈。
  3. 开发调试

    • 多平台调试:在多个平台上进行调试和问题定位,需要高效的工具和方法。
    • 错误排查:跨平台框架的中间层导致的错误,有时难以快速定位和修复。

语法结构

Uni-App 使用 Vue.js 语法进行开发,主要包括以下结构:

  1. 模板(Template)

    <template>
      <view>
        <text>{{ message }}</text>
      </view>
    </template>
    
  2. 脚本(Script)

    <script>
    export default {
      data() {
        return {
          message: 'Hello Uni-App!'
        }
      }
    }
    </script>
    
  3. 样式(Style)

    <style>
    text {
      color: blue;
    }
    </style>
    

应用场景

  1. 跨平台移动应用:适用于需要同时在 iOS 和 Android 平台上运行的应用,减少开发和维护成本。
  2. 多端小程序:适用于需要发布到多个小程序平台(如微信、支付宝、百度等)的应用,统一代码库管理。
  3. H5 应用:适合开发基于浏览器运行的 Web 应用,利用 Uni-App 的高效渲染和组件化开发。

Uni-App 的详细分析

技术架构

Uni-App 的技术架构主要包括以下几个部分:

  1. 编译器

    • 源码编译:Uni-App 的编译器将 Vue.js 的模板、脚本和样式编译成各个平台的原生代码。
    • 多平台输出:根据不同平台的需求,编译器可以输出适用于 iOS、Android、小程序、H5 等平台的代码。
  2. 运行时

    • WebView:在 H5 端和部分小程序中,Uni-App 使用 WebView 进行页面渲染。
    • Native 渲染:在 iOS 和 Android 端,Uni-App 通过原生渲染引擎提升性能,减少 WebView 带来的性能损耗。
  3. API 层

    • 统一 API:提供一套统一的 API,屏蔽不同平台的差异,开发者可以通过这些 API 进行跨平台调用。
    • 平台适配:API 层负责将统一 API 转换为各个平台的原生 API 调用。
  4. 插件系统

    • 官方插件:DCloud 提供了丰富的官方插件,涵盖各种常见功能,如地图、支付、推送等。
    • 第三方插件:社区和第三方开发者可以开发和发布插件,扩展 Uni-App 的功能。
  5. 调试与发布

    • 调试工具:提供丰富的调试工具,如 HBuilderX IDE,支持实时预览和调试。
    • 一键发布:支持一键打包和发布到多个平台,简化发布流程。
技术难点与应对策略
  1. 跨平台兼容性

    • 差异化处理:通过平台差异化处理机制,在编译阶段进行特定平台的代码分支处理。
    • 测试覆盖:通过自动化测试和多平台测试工具,确保应用在不同平台上的一致性。
  2. 性能优化

    • 原生渲染引擎:在原生端使用高效的渲染引擎,减少 WebView 的使用,提升渲染性能。
    • 资源管理:通过懒加载、按需加载和缓存策略,优化资源的管理和使用。
  3. 开发调试

    • 模拟器和真机调试:提供多种模拟器和真机调试工具,帮助开发者快速定位和修复问题。
    • 错误报告:集成错误报告和日志系统,帮助开发者追踪和解决生产环境中的问题。
语法结构与示例

Uni-App 使用 Vue.js 语法进行开发,以下是一个简单的示例应用:

模板(Template)

<template>
  <view class="container">
    <text>{{ message }}</text>
    <button @click="changeMessage">点击我</button>
  </view>
</template>

脚本(Script)

<script>
export default {
  data() {
    return {
      message: 'Hello Uni-App!'
    }
  },
  methods: {
    changeMessage() {
      this.message = '你点击了按钮!';
    }
  }
}
</script>

样式(Style)

<style>
.container {
  padding: 20px;
  text-align: center;
}
text {
  color: blue;
  font-size: 18px;
}
button {
  margin-top: 20px;
}
</style>
应用场景
  1. 企业级应用

    • 适用于需要覆盖多个平台的企业应用,如企业内部管理系统、客户关系管理系统等。
    • 通过 Uni-App 的跨平台特性,可以减少开发和维护成本,提高开发效率。
  2. 电商应用

    • 电商平台通常需要在多个渠道(如移动端、微信小程序、H5)上提供服务,Uni-App 可以帮助快速开发和发布。
    • 支持复杂的前端交互和数据处理,通过插件系统可以快速集成支付、物流等功能。
  3. 社交应用

    • 社交应用需要高性能和良好的用户体验,Uni-App 的原生渲染引擎和优化策略可以满足这些需求。
    • 支持实时通讯和多媒体处理,通过插件扩展可以实现更多功能。
  4. 内容发布应用

    • 适用于新闻、博客、视频等内容发布平台,通过 Uni-App 可以实现多平台内容同步发布。### 10. 常见问题和解决方案
10.1 数据一致性
  • 问题:在多租户系统中,确保数据一致性和完整性非常重要,特别是在并发操作和分布式环境下。

  • 解决方案

    • 事务管理:使用数据库事务确保多个相关操作要么全部成功,要么全部失败。大多数ORM框架和数据库驱动都支持事务管理。

      // Java 示例:Spring事务管理
      @Transactional
      public void updateUserAndOrder(User user, Order order) {
          userRepository.save(user);
          orderRepository.save(order);
      }
      
    • 分布式事务:在需要跨多个服务或数据库实例的场景下,使用分布式事务管理工具(如Two-Phase Commit、Saga模式)来保证数据一致性。

      // Java 示例:Saga 模式
      @Saga
      public class OrderManagementSaga {
          @SagaStep
          public void createOrder(Order order) {
              // 创建订单逻辑
          }
      
          @SagaStep
          public void reserveInventory(Order order) {
              // 预留库存逻辑
          }
      
          @SagaStep
          public void confirmPayment(Order order) {
              // 确认支付逻辑
          }
      }
      
10.2 数据迁移和备份
  • 问题:随着系统的演进和租户数量的增加,数据库的结构和内容可能需要进行迁移和备份。

  • 解决方案

    • 数据库迁移工具:使用数据库迁移工具(如Flyway、Liquibase)管理数据库结构的变更。通过版本控制和自动化脚本,确保在不同环境中应用一致的数据库变更。

      # Flyway 示例配置
      flyway:
        url: jdbc:mysql://localhost:3306/mydb
        user: user
        password: password
        locations: classpath:db/migration
      
    • 定期备份:设置定期备份策略,使用数据库自带的备份工具或第三方工具(如AWS RDS备份、pg_dump)进行数据库备份。

      # pg_dump 示例:PostgreSQL 数据库备份
      pg_dump -U username -h localhost mydb > backup.sql
      
    • 数据恢复演练:定期进行数据恢复演练,确保在数据丢失或损坏时能够快速恢复。

10.3 多租户定制化需求
  • 问题:不同租户可能有不同的定制化需求,包括功能、UI、配置等方面。

  • 解决方案

    • 配置驱动:通过配置文件或数据库表存储租户的个性化配置,在应用启动时加载这些配置。

      // 配置示例:租户配置文件
      {
        "tenantId": "tenant1",
        "theme": {
          "primaryColor": "#ff0000"
        },
        "features": {
          "featureA": true,
          "featureB": false
        }
      }
      
    • 插件架构:设计插件架构,允许租户根据需求启用或禁用特定功能模块。

      // Java 示例:Spring Boot 插件架构
      @Configuration
      public class TenantFeatureConfig {
          @Bean
          public FeatureManager featureManager() {
              FeatureManager manager = new FeatureManager();
              // 根据租户配置加载功能模块
              if (tenantConfig.isFeatureAEnabled()) {
                  manager.enableFeature(new FeatureA());
              }
              if (tenantConfig.isFeatureBEnabled()) {
                  manager.enableFeature(new FeatureB());
              }
              return manager;
          }
      }
      
10.4 性能瓶颈
  • 问题:随着租户和数据量的增加,系统可能会遇到性能瓶颈。

  • 解决方案

    • 性能监控和优化:使用APM工具和性能监控工具识别性能瓶颈,并进行针对性的优化,如数据库索引优化、代码优化等。

      -- SQL 示例:创建索引优化查询性能
      CREATE INDEX idx_orders_order_date ON orders(order_date);
      
    • 缓存:使用分布式缓存(如Redis、Memcached)缓存热点数据,减少数据库查询次数。

      // Java 示例:使用Spring Cache
      @Cacheable("orders")
      public Order getOrderById(Long orderId) {
          return orderRepository.findById(orderId).orElse(null);
          ### 更深入了解 Uni-App
      
      
开发工具

HBuilderX IDE

  • HBuilderX 是 DCloud 提供的一款集成开发环境 (IDE),专为 Uni-App 开发优化。
  • 特性
    • 代码智能提示:支持 Vue.js 语法和 Uni-App 特有 API 的智能提示。
    • 实时预览:支持在本地模拟器和真机上实时预览和调试应用。
    • 一键云端打包:提供云打包服务,简化多平台应用的打包和发布流程。

调试工具

  • Weinre:用于调试 H5 页面和 WebView 内容。
  • Chrome DevTools:通过 Chrome 浏览器的开发者工具调试 H5 和 WebView 页面。
  • 真机调试:通过 USB 或无线方式连接真机进行调试。
应用生命周期

Uni-App 应用的生命周期与 Vue.js 类似,同时也有一些特有的生命周期方法:

  • onLaunch:应用初始化时触发。
  • onShow:应用启动或从后台切换到前台时触发。
  • onHide:应用从前台切换到后台时触发。

示例代码:

// 在 main.js 中
import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

App.mpType = 'app'

const app = new Vue({
  ...App
})
app.$mount()

// 在 App.vue 中
export default {
  onLaunch() {
    console.log('App Launch')
  },
  onShow() {
    console.log('App Show')
  },
  onHide() {
    console.log('App Hide')
  }
}
数据管理

Vuex 状态管理

  • Uni-App 支持 Vuex 进行状态管理,适合大型应用的数据管理需求。
  • 示例:
    // store.js
    import Vue from 'vue'
    import Vuex from 'vuex'
    
    Vue.use(Vuex)
    
    const store = new Vuex.Store({
      state: {
        count: 0
      },
      mutations: {
        increment(state) {
          state.count++
        }
      }
    })
    
    export default store
    
    // main.js
    import store from './store'
    const app = new Vue({
      store,
      ...App
    })
    
网络请求

uni.request

  • Uni-App 提供了统一的网络请求 API uni.request,类似于 axios,可以进行 GET、POST 等 HTTP 请求。

示例代码:

uni.request({
  url: 'https://api.example.com/data',
  method: 'GET',
  success: res => {
    console.log(res.data)
  },
  fail: err => {
    console.error(err)
  }
})
本地存储

uni.setStorage 与 uni.getStorage

  • 提供类似于浏览器 LocalStorage 的本地存储功能。

示例代码:

// 保存数据
uni.setStorage({
  key: 'user',
  data: {
    name: 'John Doe',
    age: 30
  },
  success: () => {
    console.log('Data saved successfully')
  }
})

// 获取数据
uni.getStorage({
  key: 'user',
  success: res => {
    console.log(res.data)
  }
})
原生能力扩展

插件市场

  • Uni-App 提供了一个插件市场,开发者可以找到各种常见功能的插件,如地图、支付、推送等。
  • 插件使用
    • 在 HBuilderX 中打开插件市场,选择需要的插件并安装。
    • 在项目中通过配置文件引用和使用插件。

自定义插件

  • 开发者可以根据需求创建自定义插件,并在应用中使用。
  • 插件开发文档提供了详细的 API 和开发指南。
跨平台适配

条件编译

  • Uni-App 支持条件编译,开发者可以根据平台差异编写特定平台的代码。
  • 条件编译语法:
    // #ifdef MP-WEIXIN
    // 仅在微信小程序中执行的代码
    // #endif
    
    // #ifdef APP-PLUS
    // 仅在 App 端执行的代码
    // #endif
    
性能优化

懒加载与按需加载

  • 通过组件的懒加载和按需加载,减少初始加载时间,提高应用性能。
  • 示例:
    const MyComponent = () => import('@/components/MyComponent.vue')
    ```Uni-App 的插件市场提供了丰富的功能插件,涵盖了各种常见的应用场景和需求。以下是一些常见的功能插件:
    
    

1. UI 组件

  • uView:一个基于 Uni-App 的 UI 框架,提供丰富的 UI 组件,如按钮、表单、列表、弹窗等。
  • ColorUI:另一个流行的 UI 框架,提供美观的界面设计和多样化的组件。

2. 网络与数据

  • Axios:用于处理 HTTP 请求的库,方便进行网络请求和数据交互。
  • Flyio:轻量级的 HTTP 请求库,支持浏览器、小程序和 Node.js 环境。

3. 地图与位置

  • 高德地图插件:集成高德地图的功能,提供地图显示、位置定位、路线规划等功能。
  • 百度地图插件:集成百度地图的功能,支持地图展示、地址解析、导航等功能。

4. 支付与金融

  • 微信支付插件:集成微信支付功能,支持在微信小程序中进行支付操作。
  • 支付宝支付插件:集成支付宝支付功能,支持在支付宝小程序中进行支付操作。

5. 推送与通知

  • 极光推送插件:集成极光推送服务,支持消息推送和统计分析。
  • 个推插件:集成个推服务,提供高效的消息推送功能。

6. 媒体处理

  • 音视频插件:支持音频和视频的播放、录制、编辑等功能。
  • 图片处理插件:提供图片的裁剪、压缩、滤镜等处理功能。

7. 社交分享

  • 微信分享插件:支持在微信小程序中进行内容分享。
  • QQ 分享插件:支持在 QQ 小程序中进行内容分享。

8. 数据存储

  • 本地存储插件:提供本地数据存储的功能,支持读取和写入本地文件。
  • 云存储插件:集成云存储服务,支持上传和下载云端文件。

9. 用户认证

  • 微信登录插件:支持微信小程序的登录功能,方便获取用户信息。
  • 支付宝登录插件:支持支付宝小程序的登录功能。

10. 其他常用功能

  • 二维码扫描插件:支持二维码和条形码的扫描和识别。
  • 蓝牙插件:提供蓝牙设备的连接和数据通信功能。
  • 支付宝生活号插件:集成支付宝生活号的功能,支持消息推送和用户互动。

插件市场的使用

  1. 查找插件:在 HBuilderX 中打开插件市场,浏览或搜索需要的插件。
  2. 安装插件:选择插件并点击安装,插件将自动添加到项目中。
  3. 配置插件:根据插件的文档进行配置,如添加依赖和初始化。
  4. 使用插件:在代码中引用和调用插件提供的功能。

示例:使用高德地图插件

  1. 安装插件
    在 HBuilderX 的插件市场中搜索并安装高德地图插件。

  2. 配置插件
    根据插件文档,在项目的 manifest.json 中添加高德地图的配置。

    {
      "app-plus": {
        "modules": {
          "Maps": {
            "provider": "amap"
          }
        }
      }
    }
    
  3. 使用插件
    在代码中引用和使用高德地图的功能。

    <template>
      <map id="map" :latitude="latitude" :longitude="longitude" :markers="markers"></map>
    </template>
    
    <script>
    export default {
      data() {
        return {
          latitude: 39.909604,
          longitude: 116.397228,
          markers: [{
            id: 1,
            latitude: 39.909604,
            longitude: 116.397228,
            iconPath: '/static/map-marker.png'
          }]
        }
      },
      mounted() {
        // 初始化地图等相关操作
      }
    }
    </script>
    

通过插件市场,Uni-App 提供了广泛的功能扩展,开发者可以根据需求快速集成各种常见功能,提升开发效率和应用的功能性。### Uni-App 插件市场详细介绍

Uni-App 插件市场提供了广泛的插件,帮助开发者快速集成各种功能,提升开发效率。以下是对插件市场中一些重要插件的详细介绍及其使用方法。

1. UI 组件插件

uView UI

  • 简介:uView 是一款基于 Uni-App 的高质量 UI 框架,提供丰富的 UI 组件和工具函数,适用于快速构建美观的移动应用。
  • 主要功能
    • 丰富的基础组件:按钮、输入框、表单、列表、弹窗等。
    • 高级组件:图表、日历、图像裁剪等。
    • 主题定制:支持全局主题定制,轻松换肤。
  • 使用示例
    // 安装 uView
    npm install uview-ui
    
    // 在 main.js 中引入
    import uView from 'uview-ui'
    Vue.use(uView)
    

ColorUI

  • 简介:ColorUI 是另一个流行的 UI 框架,提供多样化的 UI 组件和设计风格。
  • 主要功能
    • 精美的 UI 组件:卡片、导航栏、图表等。
    • 多主题支持:提供多种预设主题,快速切换。
  • 使用示例
    // 在项目中引入 ColorUI
    import 'color-ui/dist/color-ui.css'
    
2. 网络与数据插件

Axios

  • 简介:Axios 是一个基于 Promise 的 HTTP 库,适用于浏览器和 Node.js。
  • 主要功能
    • 支持请求和响应拦截器。
    • 支持并发请求。
    • 提供丰富的配置选项。
  • 使用示例
    import axios from 'axios'
    
    axios.get('https://api.example.com/data')
      .then(response => {
        console.log(response.data)
      })
      .catch(error => {
        console.error(error)
      })
    

Flyio

  • 简介:Flyio 是一个轻量级 HTTP 请求库,支持浏览器、小程序和 Node.js 环境。
  • 主要功能
    • 轻量快速,适合小程序环境。
    • 支持拦截器和全局配置。
  • 使用示例
    import Fly from 'flyio/dist/npm/wx'
    
    const fly = new Fly()
    
    fly.get('https://api.example.com/data')
      .then(response => {
        console.log(response.data)
      })
      .catch(error => {
        console.error(error)
      })
    
3. 地图与位置插件

高德地图插件

  • 简介:高德地图插件提供了强大的地图显示和位置服务功能。
  • 主要功能
    • 地图展示:支持多种地图视图和覆盖物。
    • 位置服务:提供定位、路线规划等功能。
  • 使用示例
    <template>
      <map id="map" :latitude="latitude" :longitude="longitude" :markers="markers"></map>
    </template>
    
    <script>
    export default {
      data() {
        return {
          latitude: 39.909604,
          longitude: 116.397228,
          markers: [{
            id: 1,
            latitude: 39.909604,
            longitude: 116.397228,
            iconPath: '/static/map-marker.png'
          }]
        }
      }
    }
    </script>
    

百度地图插件

  • 简介:百度地图插件提供了丰富的地图和位置服务功能。
  • 主要功能
    • 地图服务:支持地图展示、位置标记等。
    • 定位服务:提供精准定位、路线规划等功能。
  • 使用示例
    <template>
      <map id="map" :latitude="latitude" :longitude="longitude" :markers="markers"></map>
    </template>
    
    <script>
    export default {
      data() {
        return {
          latitude: 39.915,
          longitude: 116.404,
          markers: [{
            id: 1,
            latitude: 39.915,
            longitude: 116.404,
            iconPath: '/static/map-marker.png'
          }]
        }
      }
    }
    </script>
    
4. 支付与金融插件

好的,让我们继续深入了解 Uni-App 插件市场中的其他常见功能插件及其使用方法。

4. 支付与金融插件

微信支付插件

  • 简介:微信支付插件集成了微信支付功能,方便在微信小程序中实现支付功能。
  • 主要功能
    • 支持微信支付的发起和回调处理。
    • 提供支付的安全性和便捷性。
  • 使用示例
    // 发起微信支付
    uni.requestPayment({
      provider: 'wxpay',
      timeStamp: '...',
      nonceStr: '...',
      package: '...',
      signType: 'MD5',
      paySign: '...',
      success: (res) => {
        console.log('Payment successful', res)
      },
      fail: (err) => {
        console.error('Payment failed', err)
      }
    })
    

支付宝支付插件

  • 简介:支付宝支付插件集成了支付宝支付功能,适用于支付宝小程序。
  • 主要功能
    • 支持支付宝支付的发起和回调处理。
    • 提供支付的安全性和便利性。
  • 使用示例
    // 发起支付宝支付
    my.tradePay({
      tradeNO: '...',
      success: (res) => {
        console.log('Payment successful', res)
      },
      fail: (err) => {
        console.error('Payment failed', err)
      }
    })
    

5. 推送与通知插件

极光推送插件

  • 简介:极光推送插件集成了极光推送服务,支持消息推送和统计分析。
  • 主要功能
    • 支持多平台消息推送。
    • 提供丰富的推送数据统计和分析。
  • 使用示例
    // 初始化极光推送
    JPush.init()
    
    // 监听推送消息
    JPush.addReceiveNotificationListener((message) => {
      console.log('Received notification', message)
    })
    

个推插件

  • 简介:个推插件集成了个推服务,提供高效的消息推送功能。
  • 主要功能
    • 支持多平台消息推送。
    • 提供丰富的推送数据统计和分析。
  • 使用示例
    // 初始化个推
    GeTui.init({
      appId: '...',
      appKey: '...',
      masterSecret: '...'
    })
    
    // 监听推送消息
    GeTui.onReceiveMessage((message) => {
      console.log('Received message', message)
    })
    

6. 媒体处理插件

音视频插件

  • 简介:音视频插件支持音频和视频的播放、录制、编辑等功能。
  • 主要功能
    • 支持音频和视频的播放和录制。
    • 提供视频剪辑和音频处理功能。
  • 使用示例
    // 播放音频
    const audioContext = uni.createInnerAudioContext()
    audioContext.src = 'path/to/audio/file'
    audioContext.play()
    
    // 录制视频
    uni.chooseVideo({
      sourceType: ['camera'],
      success: (res) => {
        console.log('Video path', res.tempFilePath)
      }
    })
    

图片处理插件

  • 简介:图片处理插件提供图片的裁剪、压缩、滤镜等处理功能。
  • 主要功能
    • 支持图片的裁剪和压缩。
    • 提供丰富的滤镜效果。
  • 使用示例
    // 选择图片并进行裁剪
    uni.chooseImage({
      count: 1,
      success: (res) => {
        const imagePath = res.tempFilePaths[0]
        uni.getImageInfo({
          src: imagePath,
          success: (imageInfo) => {
            // 裁剪图片
            const canvasContext = uni.createCanvasContext('imageCanvas')
            canvasContext.drawImage(imagePath, 0, 0, imageInfo.width, imageInfo.height)
            canvasContext.draw(false, () => {
              uni.canvasToTempFilePath({
                canvasId: 'imageCanvas',
                success: (result) => {
                  console.log('Cropped image path', result.tempFilePath)
                }
              })
            })
          }
        })
      }
    })
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8.12 矢量图层面要素单一符号使用十二(插值线渲染边界)

文章目录 前言插值线渲染边界&#xff08;Outline: Interpolated Line&#xff09;QGis设置面符号为插值线渲染边界&#xff08;Outline: Interpolated Line&#xff09;二次开发代码实现插值线渲染边界&#xff08;Outline: Interpolated Line&#xff09; 总结 前言 本章介绍…

C++ STL unique_ptr智能指针源码剖析

由于上一篇博客将shared_ptr,weak_ptr,enable_shared_form_this的源码实现整理了一遍,想着cpp智能指针还差个unique_ptr故写下此篇博客,以供学习 源码剖析 一,模板参数 首先,我们先看unique_ptr的模板参数,第一个参数_TP自是不用说表示对象类型,第二个模板参数定义了unique_p…

适合任何行业在线DIY预约报名小程序源码系统 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;便捷高效的预约报名系统成为了许多行业的迫切需求。“适合任何行业在线 DIY 预约报名小程序源码系统”便是一款为满足这一需求而设计开发的创新解决方案。 这款源码系统是基于先进的技术架构&#xff0c;旨在为各类企业和组织提供一个强…

Avalonia 常用控件三 Window窗体相关二

1、效果演示 2、在Views中创建WindowDemo.axaml如下图 WindowDemo.axaml代码如下 <Window xmlns"https://github.com/avaloniaui"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/…

Python读写文本、图片、xml

Python操作文本、图片、xml 1.Python读写文本1.1文本读取1.2文本写入 2.Python读取、显示图片3.Python读写Xml &#xff08;1&#xff09;Python读写文本 &#xff08;2&#xff09;Python读取、显示图片 &#xff08;3&#xff09;Python读写Xml 1.Python读写文本 新建hellow…

mybatis延迟加载

mybatis延迟加载 1、延迟加载概述 应用场景 ​ 如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求&#xff0c;当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。 延迟加载的好处 ​ 先从单表查询、需要时再从关联表去关联查…

el-input-number 点击加减只能加一次

el-input-number 点击加减只能加一次 <el-input-number v-model"editForm.quantity" placeholder"请输入下单数量(店均)" change"quantityChangeFn"></el-input-number>需要在方法里面加 this.$forceUpdate() quantityChangeFn(val…

web学习笔记(六十九)vue2

目录 1. vue2创建脚手架项目 2.vue2如何关闭eslint 1. vue2创建脚手架项目 &#xff08;1&#xff09;在cmd窗口输入npm install -g vue/cli命令行&#xff0c;快速搭建脚手架。 &#xff08;2&#xff09; 创建vue2项目 &#xff08;3&#xff09; 选择配置项目&#xff0c…

前端学习篇一(HTML)

Introduction ##文章内容&#xff1a;使用HBuilder制作一个简单的HTML5网页以此达到学习HTML5 的目的 ##编写内容&#xff1a;1.HTML实现平台 2.HTML简介 3.HTML语言解析 ##编写人&#xff1a;贾雯爽 ##最后更新时间&#xff1a;2024/07/01 Overview Details 一、HTML简介…

骑行十里箐:风景,挑战与心灵,在幽谷中的协奏曲

2024年6月29日&#xff0c;星期六&#xff0c;一个看似平凡的日子&#xff0c;却因一次不同寻常的骑行而变得难以忘怀。作为校长骑行群的一员&#xff0c;我有幸参加了这次骑行十里箐的活动。从滇池后海的宁静开始&#xff0c;到宝珠山顶的壮观落幕&#xff0c;这一天的旅程充满…

本地Navicat/客户端连接阿里云RDSMySQL时遇到过的问题及解决

1.之前开发的RDS MySQL版本和本地MySQL版本最好接近&#xff0c;比如8.0.28和8.0.20好像都是可以兼容的&#xff0c;他们里面都有那个utf8的字符编码&#xff0c;但是后面我选的RDS MySQL版本有点新&#xff0c;是8.0.30甚至更新的版本&#xff0c;之前用C#语言写的连接MySQL以…

如何通过TPM活动提升员工的设备管理能力?

在快节奏的现代职场中&#xff0c;设备管理能力已成为员工综合素质的重要一环。然而&#xff0c;如何有效提升这一能力&#xff0c;让员工在设备操作、维护和管理上更加得心应手呢&#xff1f;答案就隐藏在TPM&#xff08;Total Productive Maintenance&#xff0c;全面生产维护…

嵌入式Linux系统编程 — 5.4 rand、srand 函数产生随机数

目录 1 随机数与伪随机数 2 rand和srand函数 3 示例程序 1 随机数与伪随机数 随机数在编程有广泛的应用场景&#xff0c;以下是一些常见的例子&#xff1a; 游戏开发&#xff1a;在电子游戏中&#xff0c;随机数用来决定各种事件的结果&#xff0c;如怪物的出现位置、敌人…

大会员体系是如何让积分流动起来,实现跨业态引流的?

积分&#xff0c;是大会员体系建设的重点&#xff0c;也是难点之一。 假设积分跨业态或者跨品牌流通&#xff0c;但没有一套统一的积分结算体系&#xff0c;就容易出现各业态或品牌利益分配不均的问题。 因此&#xff0c;大会员体系能有效落地的重点之一&#xff1a;集团必须…

【Week-G1】调用官方GAN实现MNIST数字识别,Pytorch框架

文章目录 1. 准备数据1.1 配置超参数1.2 下载数据1.3 配置数据 2. 创建模型2.1 定义鉴别器2.2 定义生成器 3. 训练模型3.1 创建实例3.2 开始训练3.3 保存模型 4. 什么是GAN&#xff08;对抗生成网络&#xff09;? &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学…

千益畅行,旅游卡,如何赚钱?

​ 赚钱这件事情&#xff0c;只有自己努力执行才会有结果。生活中没有幸运二字&#xff0c;每个光鲜亮丽的背后&#xff0c;都是不为人知的付出&#xff01; #旅游卡服务#

2024推荐整理几个磁力导航网站可提供海量资源的

都2024现在网上找资源像流水得鱼一样&#xff0c;抓一大把结果很难吃&#xff0c;我通宵特意整理的网站&#xff0c;网上有许多磁力导航网站可以提供海量的磁力链接资源&#xff0c;以下是一些有效的磁力导航网站推荐&#xff1a; 磁力搜索 链接&#xff1a; 资源类型&#x…

并发控制-事务的调度、数据不一致问题(更新丢失、脏读、不可重复读)、非串行调度的的可串行化

一、引言 1、数据库管理系统DBMS的事务处理技术实现的另一个主要功能部分是并发控制机制。并发控制机制完成的功能就是对并发执行的事务进行控制&#xff0c;保证事务的隔离性&#xff0c;从而进一步保持数据库的一致性。 2、事务的并发控制就是对并发执行的不同事务中的数据…

SpringMvc 执行原理

当用户请求 会发送到前端控制器&#xff0c;DisptcherServlet根据请求参数生成代理请求&#xff0c;找到对应的实际控制器&#xff0c;控制器处理请求&#xff0c;创建数据模型&#xff0c;访问数据库&#xff0c;将模型响应给中心控制器&#xff0c;控制器使用模型与视图渲染视…

前沿重器[52] | 聊聊搜索系统5:召回:检索、粗排、多路召回

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…