什么是声明式UI什么是命令式UI?鸿蒙ArkTS为什么是声明式UI-优雅草卓伊凡
什么是声明式UI什么是命令式UI?鸿蒙ArkTS为什么是声明式UI-优雅草卓伊凡
一、UI编程范式的根本分野
在软件开发领域,用户界面(UI)构建方式经历了三次重大范式转换。作为优雅草科技CTO,卓伊凡在多个操作系统开发实践中发现,UI框架的选择直接影响着开发效率、维护成本和系统性能。让我们首先厘清三种核心UI范式的本质差异。
1.1 命令式UI(Imperative UI)
定义:命令式UI是一种通过详细描述操作步骤来构建界面的方法。开发者需要精确控制UI元素的创建、更新和销毁过程,如同给计算机下达一系列命令。
核心特征:
- 关注”如何做”(How)
- 基于显式状态变更
- 强依赖控制流语句
- 手动DOM/视图树操作
典型代码模式:
// 传统JavaScript命令式示例
const button = document.createElement('button');
button.textContent = '点击我';
button.style.color = 'blue';
button.addEventListener('click', () => {button.textContent = '已点击';button.style.color = 'red';
});
document.body.appendChild(button);
1.2 声明式UI(Declarative UI)
定义:声明式UI允许开发者描述界面应该是什么样子,而非如何构建它。系统自动处理UI状态与渲染的同步。
核心特征:
- 关注”做什么”(What)
- 状态驱动视图
- 单向数据流
- 自动差异更新
典型代码模式:
// SwiftUI声明式示例
struct ContentView: View {@State private var clicked = falsevar body: some View {Button(clicked ? "已点击" : "点击我") {clicked.toggle()}.foregroundColor(clicked ? .red : .blue)}
}
1.3 混合式UI(Hybrid UI)
定义:混合式UI结合了命令式和声明式的特点,在声明式主体架构中保留必要的命令式操作接口。
核心特征:
- 主体声明式结构
- 关键节点命令式控制
- 渐进式演进路径
- 兼容传统代码
典型代码模式:
// Android ViewCompose混合示例
@Composable
fun HybridExample() {Column {// 声明式组件Text(text = "混合式UI示例")// 命令式视图嵌入AndroidView(factory = { context ->// 传统命令式ViewButton(context).apply {text = "原生按钮"setOnClickListener { /*...*/ }}})}
}
二、三大UI范式的技术对比
2.1 架构差异图解
graph TDA[UI范式] --> B[命令式]A --> C[声明式]A --> D[混合式]B --> E[手动DOM操作]B --> F[事件回调嵌套]B --> G[显式状态管理]C --> H[状态驱动]C --> I[自动差异更新]C --> J[函数式描述]D --> K[声明式主体]D --> L[命令式扩展点]D --> M[渐进迁移]
2.2 性能特征对比
维度 | 命令式UI | 声明式UI | 混合式UI |
初始渲染速度 | 快 | 中等 | 快 |
更新效率 | 精确控制最优 | 虚拟DOM差异更新 | 选择性优化 |
内存占用 | 低 | 中等 | 中等 |
复杂动画性能 | 最优 | 依赖运行时 | 关键帧最优 |
跨平台一致性 | 低 | 高 | 中等 |
2.3 开发体验对比
维度 | 命令式UI | 声明式UI | 混合式UI |
学习曲线 | 平缓 | 陡峭 | 中等 |
代码量 | 多 | 少 | 中等 |
可维护性 | 低 | 高 | 中高 |
热重载支持 | 困难 | 优秀 | 良好 |
类型安全 | 弱 | 强 | 中等 |
三、各范式典型代表剖析
3.1 命令式UI框架实例
(1) Java Swing
// Swing典型命令式代码
JFrame frame = new JFrame("示例");
JButton button = new JButton("点击");
button.addActionListener(e -> {button.setText("已点击");button.setBackground(Color.RED);
});
frame.add(button);
frame.setSize(300, 200);
frame.setVisible(true);
特点:完全的面向对象命令式操作,每个UI操作都需要显式调用方法
(2) jQuery
// jQuery的典型命令式操作
$('#myButton').click(function() {$(this).text('已点击').css('color', 'red').fadeOut(1000).fadeIn(1000);
});
特点:链式调用仍属于命令式范式,需要精确描述每个操作步骤
(3) Android View系统
// 传统Android命令式UI
Button button = findViewById(R.id.my_button);
button.setOnClickListener(v -> {button.setText("已点击");button.setTextColor(Color.RED);
});
特点:基于视图树的手动操作,需要处理生命周期和状态恢复
3.2 声明式UI框架实例
(1) React (JSX)
// React函数组件
function Counter() {const [count, setCount] = useState(0);return (<button onClick={() => setCount(c => c + 1)}>点击次数: {count}</button>);
}
特点:纯函数式描述UI,状态变更自动触发重渲染
(2) SwiftUI
// SwiftUI声明式语法
struct WeatherView: View {@State private var temperature: Double = 25.0var body: some View {VStack {Text("当前温度: \(temperature, specifier: "%.1f")℃")Slider(value: $temperature, in: -10...40)}}
}
特点:基于DSL的界面描述,属性包装器实现状态管理
(3) Flutter
// Flutter widget声明式构建
class Counter extends StatefulWidget {@override_CounterState createState() => _CounterState();
}class _CounterState extends State<Counter> {int _count = 0;@overrideWidget build(BuildContext context) {return ElevatedButton(onPressed: () => setState(() => _count++),child: Text('点击次数: $_count'),);}
}
特点:不可变widget树,setState触发局部重建
3.3 混合式UI框架实例
(1) Android Jetpack Compose
@Composable
fun Greeting(name: String) {// 声明式主体Text(text = "Hello, $name!")// 命令式交互点val context = LocalContext.currentButton(onClick = { // 命令式Toast显示Toast.makeText(context, "Clicked!", Toast.LENGTH_SHORT).show() }) {Text("点击")}
}
特点:90%声明式+10%命令式,兼容传统Android API
(2) Vue.js
<template><!-- 声明式模板 --><button @click="handleClick">点击次数: {{ count }}</button>
</template><script>
export default {data() {return { count: 0 }},methods: {// 命令式方法handleClick() {this.count++;// 直接DOM操作if(this.count > 10) {this.$el.style.backgroundColor = 'red';}}}
}
</script>
特点:选项式API提供渐进式采用路径
(3) Windows UI Library (WinUI)
// WinUI 3混合式示例
muxc.StackPanel stackPanel = new muxc.StackPanel();
muxc.Button button = new muxc.Button();
button.Content = "点击我";// 命令式事件处理
button.Click += (sender, args) => {// 声明式状态更新button.Content = "已点击";
};stackPanel.Children.Add(button);
特点:XAML声明式布局与代码后置(command-behind)结合
四、鸿蒙ArkTS的声明式之道
4.1 ArkTS的设计哲学
鸿蒙的ArkTS语言选择声明式UI作为核心范式,体现了以下设计考量:
- 开发效率优先:
-
- 减少样板代码(相比传统Android开发代码量减少约40%)
- 状态自动跟踪与更新
- 跨平台一致性:
-
- 同一套代码适配手机、平板、智能穿戴等多设备
- 像素级精准还原设计稿
- 高性能渲染:
-
- 基于方舟编译器的静态优化
- 差异更新算法优化(比React Native快1.8倍)
4.2 ArkTS声明式示例
// ArkTS声明式组件
@Component
struct MyComponent {@State count: number = 0build() {Column() {Text(`点击次数: ${this.count}`).fontSize(20)Button('点击增加').onClick(() => {this.count++}).width(100).height(40)}}
}
关键特性解析:
@State
装饰器实现状态管理- 组件化的
build
方法描述UI结构 - 链式调用设置属性
- 类型安全的TS语法
4.3 性能优化机制
ArkTS在声明式范式下实现了多项性能突破:
- 编译时优化:
-
- 组件树静态分析
- 常量表达式预计算
- 渲染管线优化:
graph LRA[状态变更] --> B[差异检测]B --> C[最小化更新]C --> D[GPU加速绘制]
比传统虚拟DOM更高效的更新路径
- 多线程渲染:
-
- UI线程与JS线程分离
- 复杂计算offload到工作线程
五、范式选择的实践指南
5.1 何时选择命令式UI
- 遗留系统维护:
-
- 已有大量命令式代码库
- 渐进式重构过渡期
- 极致性能场景:
-
- 游戏开发引擎
- 高频动画处理
- 底层框架开发:
-
- 需要直接操作渲染管线
- 构建新的声明式框架
5.2 何时选择声明式UI
- 快速原型开发:
-
- 初创项目需要快速迭代
- 设计频繁变更
- 跨平台项目:
-
- 一套代码多端部署
- 团队协作要求高
- 状态复杂应用:
-
- 表单密集型应用
- 实时数据可视化
5.3 何时选择混合式UI
- 渐进式迁移:
-
- 从命令式向声明式过渡
- 部分组件无法重构
- 特殊功能需求:
-
- 需要调用原生API
- 第三方库集成
- 性能关键路径:
-
- 声明式主体+命令式优化点
- 复杂动画的帧精确控制
结语:UI范式的未来演进
在鸿蒙ArkTS的实践中,卓伊凡观察到声明式UI正在向三个方向深化发展:
- 类型系统强化:
-
- 基于TypeScript的静态类型检查
- 编译时UI验证
- 多模态融合:
-
- 3D图形声明式描述
- AR/VR界面统一编程模型
- AI辅助生成:
-
- 设计稿直接转声明式代码
- 自然语言描述生成UI
正如鸿蒙选择ArkTS作为应用开发语言所展现的,声明式UI已成为现代应用开发的基准范式。它不仅提升了开发效率,更通过约束性范式降低了认知负荷,使开发者能更专注于业务逻辑而非界面更新细节。对于新项目,采用声明式UI几乎是必然选择;而对于存量系统,通过混合式架构渐进迁移,则是平衡重构风险与技术债务的务实之道。
未来五年,随着WebAssembly、Serverless等技术的成熟,声明式UI将进一步与分布式计算融合,实现”一次编写,处处运行”的真正跨平台体验。鸿蒙ArkTS在这方面的前瞻性设计,已经为开发者铺就了通往未来的技术轨道。
相关文章:
什么是声明式UI什么是命令式UI?鸿蒙ArkTS为什么是声明式UI-优雅草卓伊凡
什么是声明式UI什么是命令式UI?鸿蒙ArkTS为什么是声明式UI-优雅草卓伊凡 一、UI编程范式的根本分野 在软件开发领域,用户界面(UI)构建方式经历了三次重大范式转换。作为优雅草科技CTO,卓伊凡在多个操作系统开发实践中发现,UI框架…...
nRF Connect SDK system off模式介绍
目录 概述 1. 软硬件环境 1.1 软件开发环境 1.2 硬件环境 2 System Off 模式 2.1 模式介绍 2.2 注意事项 3 功能实现 3.1 框架结构介绍 3.2 代码介绍 4 功能验证 4.1 编译和下载代码 4.2 测试 4.3 使能CONFIG_APP_USE_RETAINED_MEM的测试 5 main.c的源代码文件…...
node.js 实战——餐厅静态主页编写(express+node+ejs+bootstrap)
ejs页面 <!DOCTYPE html> <html> <head><title><% title %></title><link relstylesheet href/stylesheets/style.css/><link relstylesheet href/stylesheets/font-awesome.css/><link relstylesheet href/stylesheets/f…...
晶体布局布线
1Clock时钟电路 时钟电路就是类似像时钟一样准确运动的震荡电路,任何工作都是依照时间顺序,那么产生这个时间的电路就是时钟电路,时钟电路一般是由晶体振荡器、晶振、控制芯片以及匹配电容组成 2.时钟电路布局 晶体电路布局需要优先考虑&…...
数据结构--树
一、树的概念 树是由n(n≥0)个节点组成的有限集合,它满足以下条件: 1. 当n0时,称为空树 2. 当n>0时,有且仅有一个特定的节点称为根节点(root) 3. 其余节点可分为m(m≥0)个互不相交的有限集合,每个集合本身又是一…...
5月7号.
flex布局: 表单标签: 表单标签-表单项:...
Spark 之 YarnCoarseGrainedExecutorBackend
YarnCoarseGrainedExecutorBackend executor ID , 在日志里也有体现。 25/05/06 12:41:58 INFO YarnCoarseGrainedExecutorBackend: Successfully registered with driver 25/05...
Webug4.0靶场通关笔记19- 第24关邮箱轰炸
目录 第24关 邮箱轰炸 1.配置环境 2.打开靶场 3.源码分析 4.邮箱轰炸 (1)注册界面bp抓包 (2)发送到intruder (3)配置position (4)配置payload (5)开…...
机器学习实战:6种数据集划分方法详解与代码实现
在机器学习项目中,合理划分数据集是模型开发的关键第一步。本文将全面介绍6种常见数据格式的划分方法,并附完整Python代码示例,帮助初学者掌握这一核心技能。 一、数据集划分基础函数 1. 核心函数:train_test_split from sklea…...
PostgreSQL 查询历史最大进程数方法
PostgreSQL 查询历史最大进程数方法 PostgreSQL 提供了多种方式来查询数据库的历史最大进程数(连接数)。以下是几种有效的方法: 一、使用统计收集器数据 1. 查看当前统计信息 SELECT max_connections, (SELECT setting FROM pg_settings …...
第十二节:图像处理基础-图像平滑处理 (均值滤波、高斯滤波、中值滤波)
在数字图像处理中,图像平滑(Image Smoothing)是去除噪声、改善图像质量的关键技术之一。通过滤波算法,可以有效地抑制高频噪声,但同时可能牺牲部分图像细节。本文将以均值滤波、高斯滤波和中值滤波为核心,结…...
Python中的global与nonlocal关键字详解
一、前言 在Python编程中,变量作用域是一个非常重要的概念。对于初学者来说,经常会遇到在函数内部无法修改外部变量的问题。这时候,global和nonlocal关键字就能派上用场了。本文将详细介绍这两个关键字的用法、区别以及适用场景,…...
LVGL-对象 lv_obj_t
LVGL-对象 lv_obj_t **LVGL 对象核心概念总结****1. 对象与控件的关系****2. 对象的基本属性****3. 父子对象结构****4. 屏幕与图层管理****活动屏幕(Active Screen)****图层(Layers)** **5. 关键函数与操作****6. 面向对象设计的…...
【C/C++】ARM处理器对齐_伪共享问题
文章目录 1 什么是伪共享?2 为什么对齐?3 伪共享的实际影响4 为什么必须是 64 字节?5 其他替代方案6 验证对齐效果总结 1 什么是伪共享? 伪共享是 多线程编程中的一种性能问题,其本质是: 缓存行ÿ…...
【优化策略】离散化
概念 离散化是算法设计中处理大数据范围时的关键技巧,它将大范围的数据映射到有较小的的离散空间中,同时保持数据的相对关系。 本质:将原始数据映射到紧凑的连续整数空间 数学表示:建立映射函数 f: ℝ → ℤ,满足 x…...
微粉助手 1.1.0 | 专为社交电商用户设计的一站式营销工具,集成了群发消息、智能加好友、清理僵尸粉等功能
微粉助手是一款专为社交电商用户设计的一站式营销工具。此会员版无需登录,去除了更新检测,并优化了启动速度。它集成了群发消息、智能添加好友、精准清理僵尸粉、自动跟圈以及短视频获客等核心功能,是企业实现社交媒体营销自动化的理想选择。…...
【代码优化篇】强缓存和协商缓存
强缓存和协商缓存 一、强缓存与协商缓存的区别二、Vue2 前端实现强缓存(静态资源)三、Spring Boot 后端实现协商缓存(动态接口)四、测试缓存效果五、注意事项 一、强缓存与协商缓存的区别 强缓存:浏览器直接读取本地缓…...
分区器(2)
2. 设置ReduceTask 在MapReduce框架中,Reducer的数量(即ReduceTask的数量)可以通过配置参数来设置。 设置方法 通过配置文件: 在mapred-site.xml文件中设置mapreduce.job.reduces参数: xml <property><nam…...
外包团队协作效率低,如何优化
外包团队协作效率低是许多公司面临的挑战,尤其是在跨地域、跨文化和远程工作环境下。 优化外包团队的协作效率需要从沟通方式、项目管理工具、文化差异及团队结构等多个方面入手。首先,明确的沟通与及时的反馈是提高团队效率的基础, 通过定期…...
2020年NCA CCF-C,改进灰狼算法RSMGWO+大规模函数优化,深度解析+性能实测
目录 1.摘要2.灰狼算法GWO原理3.改进策略4.结果展示5.参考文献6.代码获取7.读者交流 1.摘要 灰狼优化算法(GWO)是一种新型自然启发式算法,具备较强的局部搜索能力,但在处理大规模问题时全局搜索能力较弱。本文提出了改进灰狼算法…...
【EasyPan】saveShare代码分析
【EasyPan】项目常见问题解答(自用&持续更新中…)汇总版 保存分享文件到个人网盘代码分析 一、代码结构概览 该代码实现了一个将他人分享的文件保存到自己网盘的功能,主要分为三个部分: 控制器层(Controller&a…...
基于Django框架开发的B2C天天生鲜电商平台
天天生鲜 介绍 天天生鲜是一个基于Django框架开发的B2C(Business-to-Customer)电商平台,专注于生鲜食品的在线销售。该项目采用了主流的Python Web开发框架Django,结合MySQL数据库、Redis缓存等技术,实现了一个功能完整、界面友好的电商网站…...
[数据库之九] 数据库索引之顺序索引
1、什么是索引? 拿到一本书,想直接跳到感兴趣的章节,而不是从头看到尾,这时需要看书的目录,上面列出章节和对应的页码,这里的目录可以看成是书的索引,如果没有索引,要查找书中某块内…...
使用 Celery + Redis + Eventlet 实现 Python 异步编程(Windows 环境)
一、环境搭建与依赖安装 1. 安装依赖包 pip install celery redis eventletcelery:异步任务队列框架。redis:作为消息中间件(Broker)和结果存储(Backend)。eventlet:用于 Windows 环境下的协程…...
Selenium Web自动化测试学习笔记(二)--八大元素定位
前置设置及代码 目录结构如下,将驱动器chromedriver.exe复制粘贴到此目录下,具体环境配置参考笔记一: Selenium Web自动化测试学习笔记(一)-CSDN博客 首先和笔记(一)一样导入一些包用于设置谷…...
如何设置飞书多维表格,可以在扣子平台上使用
扣子可以链接到飞书多维表格,但很多人不知道具体如何操作,今天给大家分享下操作流程。 大家好,我是涛涛,欢迎来到我的空间。因为需要管理员审核,所以最好有管理员的手机就在旁边方便操作。 (一) 进入应用中心 https…...
C++初阶-string类的简单应用
目录 1.仅仅反转字母 2.字符串中第一个唯一字符 3.字符串最后一个单词的长度 4.验证回文串 5.字符串相加 6.总结 1.仅仅反转字母 题目链接:https://leetcode.cn/problems/reverse-only-letters/description/ 在数据结构中我们学了一种方法叫做前后指针法&…...
企业数字化转型第二课:接受不完美(1/2)
一.引言 先看一组中国企业数字化转型相关的数据: 战略认知层面:92%中国企业将数字化纳入战略核心(麦肯锡2023)执行困境层面:63%企业转型首年遭遇重大挫折(BCG 2024追踪)价值释放周期࿱…...
【MCP】function call与mcp若干问题整理
前言:大模型里agent 的 funcation call 是什么概念 在大模型中,Agent是一个能够理解目标、进行自主规划,并利用可用工具(包括Function Call)来执行任务以达成目标的系统或程序。Function Call是大型语言模型提供的一项…...
QT聊天项目DAY09
1. 安装Redis 直接从老师的网盘下载 链接: https://pan.baidu.com/s/1v_foHZLvBeJQMePSGnp4Ow?pwdyid3 提取码: yid3 启动Redis服务看一下,启动成功了 .\redis-server.exe .\redis.windows.conf 启动客户端看一下 2. 配置redis库,调用API 编译一下 …...
JAVA八股文
一、JAVA基础 1.面向对象: 面向对象编程是一种以对象为核心的编程,通过封装、继承、多态和抽象管理代码。 1.封装:将数据(属性)和行为(方法)绑定在一个对象中,隐藏内部细节&#…...
『深夜_MySQL』数据库操作 字符集与检验规则
2.库的操作 2.1 创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,create_specification]….]create_spcification:[DEFAULT] CHARACTER SET charset_nam[DEFAULT] COLLATE collation_name说明: 大写的表示关键字 …...
1688拍立淘搜索相似商品API接口概述,json数据示例参考
1688拍立淘搜索相似商品API接口概述 1688拍立淘是阿里巴巴1688平台提供的以图搜图功能,允许开发者通过上传商品图片或图片URL,快速检索1688平台上的相似商品。该接口基于图像识别技术,结合1688的海量商品库,为商家、采购商或开发…...
使用 Java 11 的 HttpClient 处理 RESTful Web 服务
在现代 Web 开发中,与 RESTful Web 服务交互是一项核心任务。Java 作为一种广泛使用的编程语言,提供了多种处理 HTTP 请求的方法。在 Java 11 之前,开发者通常使用 HttpURLConnection 或第三方库(如 Apache HttpClient)。然而,这些方法要么过于底层,要么需要额外依赖。J…...
学习笔记:黑马程序员JavaWeb开发教程(2025.3.30)
11.6 案例-文件上传-阿里云OSS-集成 从程序中获取URL给前端,前端显示图片 拿到URL,但是在浏览器里面是直接下载,展示可以使用html中的<image>标签 Spring环境下,不建议再去new对象,将其交给IOC容器管理ÿ…...
【MySQL】-- 联合查询
文章目录 1. 简介1.1 为什么要使用联合查询1.2 多表联合查询时MySQL内部是如何进行计算的 2. 内连接2.1 语法2.2 示例 3. 外连接3.1 语法3.2 示例 4. 自连接4.1 应用场景4.2 示例4.3 表连接练习 5. 子查询5.1 语法5.2 单行子查询5.3 多行子查询5.4 多列子查询5.5 在from 子句中…...
《C++ Templates》:有关const、引用、指针的一些函数模板实参推导的例子
1.T按值传递 最简单的模板例子: template<typename T> void func(T x) {std::cout << typeid(T).name() << std::endl;x 20;cout << x; } 这种情况下,T永远不会被推导成带顶层const或引用的类型 【顶层const即变量本身不能…...
【算法】随机快速排序和随机选择算法
文章目录 1、随机快速排序1.1 什么是随机快排1.2 随机快排的好处 2、随机选择算法 前言: 快速排序就是每次划分前,通过一种方法将一个基准值的位置确定好,再进入不同的部分重复相同的工作以此确定好每个值的位置以达到有序。如果你之前并不了…...
si551x时钟芯片linux下调试总结
目录 前言一、依赖文档、工具二、让芯片工作的流程三、以上步骤的SOC下代码实现 前言 本文总结调试SKYWORKS芯片厂商Si5512时钟芯片时的笔记,基于linux5.10.xxx内核,在arm64架构的SOC上验证; 一、依赖文档、工具 文档名说明下载链接Si5518…...
5.6-DAE实现
解决问题: 随机缺失(实验室指标未检测)系统性噪声(设备测量误差)类别不平衡(健康/患病人群比例悬殊) 思路:引入可控噪声 → 重建原始数据 实现步骤 (1)…...
MCU怎么运行深度学习模型
Gitee仓库 git clone https://gitee.com/banana-peel-x/freedom-learn.git项目场景: 解决面试时遗留的问题,面试官提了两个问题:1.单片机能跑深度学习的模型吗? 2.为什么FreeRTOS要采用SVC去触发第一个任务,只用Pend…...
背单词软件开发英语app开发,超级单词表开发,河南数匠软件开发
在数字化教育浪潮席卷全球的当下,英语教育行业面临着教学模式创新与教学效率提升的双重挑战。如何借助技术力量,为学生提供更优质、更高效的英语学习体验,成为众多英语教育机构亟待解决的问题。河南数匠软件开发有限公司,作为专注…...
AI视觉质检的落地困境与突破路径
摘要 人工智能(AI)视觉质检技术凭借其在提升效率、降低成本和优化质量控制方面的巨大潜力,正成为现代制造业转型升级的关键驱动力。然而,尽管前景广阔,AI视觉质检在实际落地过程中仍面临诸多严峻挑战,主要…...
检测内存条好坏有工具,推荐几款内存检测工具
检测内存条的好坏其实很重要,这直接就关系到计算机是不是能够稳定的运行,也有一部分人就会关注内存检测的工具。你应该如何来选择的,不如看一下以下的这几个。 MemTest86是一个比较受到大家喜欢的内存检测工具,会支持各种类型&…...
认识tomcat(了解)
启动 1. windows版本 解压后,就能用,启动,是bin路径下的startup.bat , 关闭是ctrl C . 启动后,可以访问 http://127.0.0.1:8080。为什么是8080,因为如下这个配置文件 部署 将项目放置到webapps目录下,即…...
[20250507] AI边缘计算开发板行业调研报告 (2024年最新版)
[20250507] AI边缘计算开发板行业调研报告 (2024年最新版) 一、行业背景 随着物联网设备激增与AI模型轻量化,边缘计算成为AI落地核心场景。AI边缘计算开发板(Edge AI Board)作为硬件载体,需满足低延迟…...
前端实现文件下载
目录 1.说明 2.示例--excel 3.示例--csv 1.说明 在开发中经常会出现下载csv或者excel文件,可以通过后端下载,也可以通过前端下载,如果在前端页面中可以直接获取到要下载的数据,可以通过前端下载的方式,更加高效便捷…...
深入理解Redis缓存与数据库不一致问题及其解决方案
什么是Redis缓存数据与数据库不一致 在现代应用中,Redis作为一种高速缓存系统,被广泛用于提升系统性能。Redis缓存数据与数据库不一致,指的是缓存中的数据与数据库中的数据不匹配,导致读取缓存时得到的不是最新或正确的数据。 R…...
六级阅读———2024.12卷一 仔细阅读2
文章 An awakening has been taking place in the physical world against the beauty model that has been dictated to us for years.But in the digital arena,social media determines what is considered beautiful.(51) The two opposing struggles are taking place i…...
【Python】字符串 转为 JSON 格式的注意事项
1. 字符串转json 我们如果使用sql存储json格式,要将json转为字符串才能转。 存入sql前,字典格式转json字符串可以用这个: Table_ [{"id": 1,"name": "Alice","task": 25,"work": &quo…...