优维低代码:Use Resolves

ContentProvider数据库共享之——实例讲解 前言:现在这段时间没这么忙了,要抓紧时间把要总结的知识沉淀下来,今年重新分了项目组,在新项目中应该不会那么忙了,看来有时间来学一些自己的东西了。现在而言,我需要的是时间。只要不断的努力,总有一天,你会与从不同。加油。 相关文章:1、《ContentProvider数据库共享之——概述》2、《ContentProvider数据库共享之——实例讲解》3、《ContentProvider数据库共... 阅读详情

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。


连载第十四期

《高级指引:Use Resolves》

▽

useResolves 是构件生命周期的重要特性,它扮演着类似 Angular Router 的 Resolve 角色。它主要解决构件初始化需要的异步数据请求,简化构件编写的代码量,并且使平台统一解决相关加载状态和错误反馈成为了可能。

⊙NOTE

现在更推荐通过在路由上定义 Context 上下文来处理异步数据,以实现更高效的请求并发。

# 示例

如下的构件配置,平台在渲染该构件前,将首先调用useProvider 指定的 Provider 构件的 resolve() 方法,并使用指定的 args 参数,请求完成时,将使用 name 指定的属性名赋值给该构件。平台将确保构件渲染前获得该属性,因此构件不再需要对该数据请求处理加载状态及错误反馈,这些将由平台统一处理。

bricks:
  - brick: your.awesome-brick
    lifeCycle:
      useResolves:
        - useProvider: your.awesome-provider
          args: ["${someQueryParam}"]
          name: someProp

在早期版本中,我们只提供了通过 provider 指定CSS Selector 并需提前在 bricks 或 providers 中主动声明对应的 Provider 构件的方式来使用 useResolves,例如以下的构件配置,平台在渲染该构件前,将首先找到 provider 匹配的对应的 Provider 构件,然后执行它的 resolve() 方法,并使用指定的 args 参数,请求完成时,将使用 name 指定的属性名赋值给该构件。

bricks:
  - brick: micro-app-store.provider-app-detail
    bg: true
    args:
      - "${appId}"
  - brick: micro-app-store.micro-app-detail
    lifeCycle:
      useResolves:
        - name: appDetail
          provider: micro-app-store\.provider-app-detail

现在我们更推荐使用 useProvider,因为它相比于早期的 provider 字段具有以下优势:

  • 使用构件名,无需对构件名中的点号 . 进行转义;
  • 不需要在 bricks 或 providers 中提前声明该构件。

useProvider 即用即取、无状态,如果希望在分步更新参数等场景下使用,可以结合 Context 上下文来处理。

注意

  • useProvider 字段为 Provider 的构件名。
  • provider 字段为 Css Selector,因此构件名称中的 . 需要转义。
  • 使用 provider 字段时,对应的 Provider 构件在 bricks 列表中需要指定 bg: true 才能正常工作。

通过平台提供的脚手架工具 yarn yo 或封装的方法 createProviderClass 可以快速创建 Provider 构件,请参考 Provider 构件的创建。

# 配置说明

useResolves 有两种模式:

普通配置模式:

注意:useProvider 和 provider 应选取且只选取一种,它们的差别在本文上一章节有描述。

使用 ref 模式:

其中 args 参数有多种来源:

  1. 优先使用 useResolves 配置中的 args,它支持和属性配置一致的模板字符串,并且默认启用 injectDeep: true。
  2. 其次使用 Provider 构件的 args 属性,它可以通过 Provider 构件的 properties 等方式设置。

注意:templates 也可以使用 useResolves,只不过取得的数据将传递给 params 而不是 properties。

# defineResolves

在Storyboard 的路由配置中,可以使用defineResolves预定义一些resolves 以供 useResolves 引用。例如:

# Route
path: "/index",
defineResolves:
  - id: "cmdb-model-list"
    provider: "cmdb.get-object-list"
    args:
      - pageSize: 3000
    field: "data.list"

在构件中可以这样使用:

# Brick
brick: "your-brick",
lifeCycle:
  useResolves:
    - name: "cmdbModelList"
      ref: "cmdb-model-list"

#配置说明

defineResolves 与 useResolves 的普通配置模式上大体相似,主要有以下不同:

  • defineResolves 必须声明一个 id。
  • defineResolves 不能声明属性名 name。
  • defineResolves 中的 transform 不再有「转换成属性」的用途,而是「给 useResolves 提供数据源」的作用。

# 请求异常处理 onReject

通常不需为 useResolves 设置异常处理,因为系统会统一捕获并显示错误信息。由于 useResolves 请求的数据定义为页面依赖的必要数据,因此页面加载过程中任何 useResolves 出现错误将使整个页面停止加载并显示对应的错误信息。

有时候我们期望某些构件的某些请求错误可以不影响页面中其它构件的渲染,此时我们可以设置 onReject 对请求错误进行特殊处理。

方式一:设置 onReject: { transform: ... } 进行数据转换后重新赋值给构件的相关属性,此时转换的数据源为该错误对象。此方法适用于支持空状态(错误状态)的属性配置的构件。

方式二:设置 onReject: { isolatedCrash: true } 使用系统提供的一个报错构件替代原构件,并显示对应的报错信息。此方法适用于不支持空状态(错误状态)的属性配置的构件。

Spark数据倾斜问题+解决方案 1、数据倾斜 数据倾斜指的是,并行处理的数据集中,某一部分(如Spark或Kafka的一个Partition)的数据显著多于 其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈 数据倾斜俩大直接致命后果 1)数据倾斜直接会导致一种情况:Out Of Memory 2)运行速度慢 主要是发生在Shuffle阶段。同样Key的数据条数太多了。导致了某个key(下图中的80亿条)所在的Task数 据量太大了。远远超过其他Task所处理的数据量 一个经验结论是:一般情况下,OOM的原因都是数据倾斜 2、如 阅读详情

相关推荐

【实用工具】QQ自动发消息

程序下载:蓝奏云 源代码: #include<Windows.h> #include<bits/stdc++.h> #include<conio.h> using namespace std; void HideWindow() { HWND hwnd; hwnd=FindWindow("ConsoleWindowClass",NULL); if(hwnd) ShowWindow(hwnd,SW_HIDE); return; } int main() { pri

liuzich的博客 2644

【JavaScript】Promise 的使用

Promise 是一套处理异步场景的规范,能避免回调地狱的产生,使代码更清晰简洁。这套规范最早诞生于前端社区,并被命名为 Promise A+ 规范。参数executor称为执行器,为一回调函数调用resolve,Promise 实例的状态会从 pending 变为 fulfilled;调用reject,Promise 实例的状态会从 pending 变为 rejected;如果不调用resolvereject,则 Promise 实例的状态将一直是 pending。调用resolve。

Superman_H的博客 4519

机器学习面试笔试求职必背!八股文(1/5)

算法工程师,技术软件类求职机器学习必背八股文 更多算法/业务/HR面等笔试题面试题 —— >个性签名自取! 1. 特征工程: 1.1 为什么要对特征做归一化处理: Feature scaling,常见的提法有“特征归一化”、“标准化”,是数据预处理中的重要技术。特征间的单位(尺度)可能不同,比如身高和体重,比如摄氏度和华氏度,比如房屋面积和房间数,一个特征的变化范围可能是[ 1000 , 10000 ] [1000, 10000][1000,10000],另一个特征的变化范围可能是[ −.

大厂offer宝典 1万+

react的状态管理(全局通信)简单钩子方法

react状态管理简单示例(recoil, context, redux)

qq_42750608的博客 794

从专利库到Zemax:一个6mm定焦镜头从零到交付的完整设计流程(含CodeV转换技巧)

本文详细介绍了6mm定焦镜头从专利库检索到最终交付的全流程设计,重点解析了CodeV与Zemax工具链的无缝衔接技巧。通过实际案例展示规格定义、专利筛选、结构适配、非球面优化等关键步骤,帮助光学设计工程师提升设计效率和制造良率。特别包含CodeV转换Zemax的实用技巧,适用于机器视觉和安防镜头开发。

weixin_42561040的博客 161

OpenCV视频防抖算法实现与优化指南

本文详细解析了如何使用OpenCV实现视频防抖算法。通过特征点检测与光流跟踪估算帧间运动,利用滑动平均平滑运动轨迹,并应用仿射变换重塑视频帧。文章提供了完整的代码实现、参数调优指南及黑边处理等优化技巧,帮助开发者高效处理手持拍摄等场景下的视频抖动问题。

weixin_29062823的博客 341

vue(redux专场、hook(useState、useEffect、useReducer)、context)框架

知识点收尾为项目开始 知识点 redux专场 帮助react维护状态数据 verson 1 //redux/index.js import {createStore} from 'redux' ​ function PersionReducer(stata=[],action){ switch(action.type){ case 'insert': break case 'select': break ..

weixin_48764743的博客 1097

10、利用智能合约实现公平的私有集合交集

本文探讨了利用智能合约实现公平的私有集合交集(PSI)的多种协议,重点分析了协议 Π 和 Π∗ 的气体成本与性能特点。同时对比了包括 Justitia 和 Anesidora 在内的现有方案,突出了仅使用智能合约实现硬币补偿公平性的优势。文中还介绍了相关密码学基础、安全模型及隐私保障机制,为在不同应用场景下选择高效、安全的 PSI 协议提供了理论支持和实践指导。

linux的博客 97

前端开发核心知识进阶 2.6 你以为我真的想让你手写Promise吗

通过前面儿篇的学习,我们认识到,想优雅地进行异步操作,必须要熟识-个极其重要的质概念Promise。 它是取代传统回调,实现同步链式写法的解决方案;是理解Generator、async/awat的关键。但是,对于初学者来说,Promise 并不是很好理解,其中的概念纷杂,且抽象程度较高。与此同时,在中高级前端开发面试中,对于Promise 的考查也多种多样,近几年流行“让面试者实现一个Promise” 。那么,本篇就带大家实现一个简单的Promise。

oneoftwo_three的博客 673

jieba分词

jieba

sikh_0529的博客 1万+

Zephyr内核——内存管理——内存堆

Zephyr提供了一组允许线程动态分配内存。

wayne2018的博客-心情驿站 773

ES6之promise原理

我在这里介绍了promise的原理:https://juejin.im/post/5cc54877f265da03b8585902 我在这里 仅仅张贴 我自己实现的简易promise——DiPromise(自己起的名字,嘿嘿嘿~~) PS: 这个可以在控制台执行 let count = 0 class DiPromise { constructor(executor) { ...

weixin_30834783的博客 135

SOME/IP协议详解「总目录」

SOME/IP系列文章总目录

雪云飞星的博客 2万+

Promise初步详解(resolve,reject,catch)

一:何为Promise? 为了直观一点,首先我们采用console.dir(Promise)看一下它的结构组成。 从上面的图片中我们可以到,Promise其实是一个构造函数,它有resolve,reject,race等静态方法;它的原型(prototype)上有then,catch方法,因此只要作为Promise的实例,都可以共享并调用Promise.prototype上面的方法...

arzu19740204的博客 5217

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

React 使用总结:setState回调 + 设置延时 + promise.then(onCompleted, onRejected) +.....

1.React setState方法回调的写法: 因为js是异步的,所以有时候会用到setState的回调方法,其作用是在setState()执行完后再调用回调方法: this.setState({ days: daysLimit }, () => { console.log("可选日期范围是:" + this.state.days); }); 如果不考虑异步,直接输出th...

qijingpei的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

catch与onRejected之间的真正区别

by Max Belsky 通过Max Belsky catch与onRejected之间的真正区别 (The real difference between catch vs onRejected) Most popular articles describe the difference between catch and onRejected in a code snippet like...

cumian8165的博客 1559

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Js | 不能进行错误处理的onRejected

function throwError(value) { // 抛出异常 throw new Error(value); } // <1> onRejected不会被调用 function badMain(onRejected) { return Promise.resolve(42).then(throwError, onRejected); } // <2>...

GC怪兽的Blog 887

开始全局钩住失败_JS 真的可以为所欲为之绕过 ContextProvider 给 useRequest 注入全局配置...

引言底层实现有时候不必循规蹈矩,能解放业务层才是关键。如果底层为了守规矩反而破坏了业务层的规矩才是得不偿失的添乱行为,行话叫过度设计。其实这也是所谓封装的原则之一,从函数到模块到组件到页面再到工程的设计都应当秉持着为更上一层服务的原则,尽可能地把下一层的脏话累活揽到自己的作用域下,屏蔽到角落里。说到这,突然想到一个词:金玉其外 败絮其中……问题背景项目使用了 hox + useRequest,详情...

weixin_39828956的博客 661

终于有人把“低代码”说清楚了!

作者:流水不争先编辑:Emma来源|技术领导力(ID:jishulingdaoli)今年2月23日,外国低代码平台提供商Creatio宣布获得6800万美元融资;2月22日,国内Sa...

技术领导力 1万+

优维低代码:编排详解菜单配置

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 接下来我们将继续为大家详细讲解编排详解中的菜单配置。 为 Micro App 配置菜单主要有两种方式: 在路由定义中使用menu配置菜单([Storyboard.routes.menu]); 在 Next Builder 上配置菜单(并在路由菜单定义中使用menuId/subMe...

EasyOps_DevOps的博客 427

Hooks使用createStore、Provider、useSelector、useDispatch实现connect功能

Hooks使用createStore、Provider、useSelector、useDispatch实现connect功能

见贤思齐焉,见不贤内自省 2468

十七年运维老兵万字长文讲透优维低代码~

以上,就是对优维整个低代码体系的一个梳理,其实从2020年向外业界去推低代码至今,我们已经积累很多的客户,包括从行业的不同的客户属性以及场景上面,我们都有落地的一些经验,以及在落地的过程中,我们遇到的一些难点,带来的价值等等,我们都有一些经验积累,下回再跟大家详细的分享一下。从2015年创业开始,优维前后服务了很多传统企业的项目客户,我们在服务的过程中其实也发现了一些自己的问题,特别是2019年底,有一个KA的客户提出了一个个性化的需求,对我们带来的触动是蛮大的。第一个,低代码其实也不是一个所谓的新技术。.

EasyOps_DevOps的博客 641

优维低代码:解析构件开发 Step by Step

低代码是优维科技长期深耕的技术板块,在漫长的创业周期中,我们通过不断实践积累和迭代优化,沉淀出EasyMABuilder前端低代码平台,迄今已成功赋能大量优质用户,为多个行业带来前所未有的轻盈体验。 EasyMABuilder成功的背后,是优维人数年的技术探索和EasyOps产品哲学的落地,蕴含了主创团队对低代码生态的深度思考和实践创新。 我们特别推出低代码专题撰稿计划,以专栏系列文章的形式解构低代码在DevOps领域的技术表现。 上一篇文章,我们讲述了在 EasyMABuilder 中如何通...

EasyOps_DevOps的博客 402

Content Provider基础(一)

目的 l  原理 l  从ContentProvider获取数据 l  插入、更新、删除数据     Content Provider 工作原理 l  概览 Content Provider对外部应用程序提供数据共享的表示形式,和关系数据库的表结构类似,例如下面用户字典的表格。每一行唯一表示了一个单词的信息。 word app id frequ

cappuccinoLau 808

优维低代码:Best Practice

导语优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。连载第十二期《编排详解:Best Practice》▽# Storyboard 最佳结构过去:我们能看到很多 provider 是在bricks[]定义的,比如: Menu 重复定义 我们能看到很多同学将menu抽出一个函数,然后在 ts 里面直接调用,但实际上这样生成的storyboard.

EasyOps_DevOps的博客 290

初识微服务之provider和consumer

一、微服务之provider和consumer 新建父工程 对于父工程,编辑pom文件 <dependencyManagement> <dependencies> <dependency> <groupId>org.sprin...

huangwei18351的博客 5081
上一篇: 3800亿交易额背后的超级秘密,是谁在操盘京东618的大数据运维?
下一篇: 一文读懂 Kubernetes的四种服务类型!
优维科技EasyOps
博客等级 码龄5年 1483粉丝 395原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值