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

资金盘网站开发多少钱/网推渠道

资金盘网站开发多少钱,网推渠道,国外设计网站 behance入口,网站排名查询平台一,Ilitek 触摸屏简介 Ilitek 提供多种型号的触控屏控制器,如 ILI6480、ILI9341 等,采用 I2C 接口。 这些控制器能够支持多点触控,并具有优秀的灵敏度和响应速度。 Ilitek 的触摸屏控制器监测屏幕上的触摸事件。 当触摸发生时&am…

一,Ilitek 触摸屏简介

  1. Ilitek 提供多种型号的触控屏控制器,如 ILI6480、ILI9341 等,采用 I2C 接口。
    这些控制器能够支持多点触控,并具有优秀的灵敏度和响应速度。

  2. Ilitek 的触摸屏控制器监测屏幕上的触摸事件。
    当触摸发生时,控制器将触摸坐标(通常是 x 和 y 坐标)通过 I2C 总线发送给主机。


二,DTS配置

在这里插入图片描述

&i2c1 {status = "okay";ilitek@41 {compatible = "tchip,ilitek";reg = <0x41>;ilitek,irq-gpio = <&gpio7 6 GPIO_ACTIVE_HIGH>;ilitek,reset-gpio = <&gpio7 15 GPIO_ACTIVE_HIGH>; //修改相对应的gpio参数pinctrl-names = "default";pinctrl-0 = <&ilitek_gpio_e>;status = "okay";};
};&pinctrl {touchscreen {ilitek_gpio_e: ilitek-gpio-e {rockchip,pins =<7 6 RK_FUNC_GPIO &pcfg_pull_up>,<7 15 RK_FUNC_GPIO &pcfg_pull_up>;};};
};

注:一定要对应的I2C bus节点(硬件原理图上会有标注)。


三,驱动文件配置

在这里插入图片描述

1. ilitek_lim.c

static int ilitek_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id)
{int ret = 0;int revert_x=0;int revert_y=0;int revert_x_y=0;struct device_node *param_node;
#ifdef ILI_UPDATE_FW#ifdef UPDATE_THREADEstruct task_struct *thread_update = NULL;#endif
#endif#ifdef RECOGNITION_LONGTIME_BUTTON
struct task_struct *thread_longtime_button = NULL;
#endif#ifdef WRITE_2210_CFGstruct task_struct *thread_write_cfg = NULL;
#endif#if IC2120int i = 0;
#endif//int i = 0;//uint8_t buf[8] = {0};
#ifdef DEBUG_NETLINKstruct netlink_kernel_cfg cfg = {.groups = 0,.input	= udp_receive,};#endiftp_log_info("Enter ilitek_i2c_probe +++++++++ client->addr = 0x%x++++++\n", client->addr);if(!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)){tp_log_err("%s, I2C_FUNC_I2C not support\n", __func__);return -1;}// initialize global variable#ifdef TOOLmemset(&dev_ilitek, 0, sizeof(struct dev_data));#endifmemset(&i2c, 0, sizeof(struct i2c_data));// initialize mutex object
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37)init_MUTEX(&i2c.wr_sem);
#elsesema_init(&i2c.wr_sem,1);
#endifi2c.wr_sem.count = 1;mutex_init(&(i2c.irq_mutex));i2c.report_status = 1;i2c.client = client;#ifdef CONFIG_ENABLE_REGULATOR_POWER_ONret = ilitek_get_regulator();if (ret) {tp_log_err("%s, ilitek_get_regulator failed\n", __func__);return ret;}ret = ilitek_power_on(true);if (ret) {tp_log_err("%s, power on failed\n", __func__);return ret;}#endif//ret = ilitek_request_io_port(client);if (ret != 0){tp_log_err("%s, io error", __func__);return ret;}param_node = of_find_node_by_path("/smdt_param");if (!param_node){printk("gt9xx wxl error smdt_param not node!!!\n");}of_property_read_u32(param_node, "ctp_revert_x_flag", &revert_x);of_property_read_u32(param_node, "ctp_revert_y_flag", &revert_y);of_property_read_u32(param_node, "ctp_exchange_x_y_flag", &revert_x_y);if(revert_x == 1 )REVERT_X = 1;else    REVERT_X = 0;if(revert_y == 1 )REVERT_Y = 1;else    REVERT_Y = 0;if(revert_x_y == 1 )EXCHANG_XY = 1;else    EXCHANG_XY = 0;i2c.client->irq  = gpio_to_irq(i2c.irq_gpio);tp_log_info("ilitek i2c.irq_gpio = %d, i2c.client->irq = %d\n", i2c.irq_gpio, i2c.client->irq);i2c.valid_i2c_register = 1;#if 1ilitek_reset(i2c.reset_gpio);#endif#if !IC2120mdelay(200);#elsefor (i = 0; i < 30; i++ ) {ret = ilitek_poll_int();tp_log_info("ilitek int status = %d\n", ret);if (ret == 0) {break;}else {mdelay(5);}}if (i >= 30) {#ifdef ILI_UPDATE_FWtp_log_info("ilitek reset but int not pull low so driver_upgrade_flag = true\n");driver_upgrade_flag = true;#endif}else #endif{#if 0msleep(2000);for (i = 0; i < 127; i++) {//buf[0] = 0x10;client->addr = i;ret = ilitek_i2c_write_and_read(i2c.client, buf, 0, 10, buf, 4);tp_log_info("ilitek %s, write 0x10 read buf = %X, %X, %X\n", __func__, buf[0], buf[1], buf[2]);if (ret < 0) {mdelay(5);}else {tp_log_info("ilitek %s, client->addr = 0x%X, read buf = %X, %X, %X\n", __func__, client->addr, buf[0], buf[1], buf[2]);tp_log_info("ilitek %s, client->addr = 0x%X, read buf = %X, %X, %X\n", __func__, client->addr, buf[0], buf[1], buf[2]);tp_log_info("ilitek %s, client->addr = 0x%X, read buf = %X, %X, %X\n", __func__, client->addr, buf[0], buf[1], buf[2]);tp_log_info("ilitek %s, client->addr = 0x%X, read buf = %X, %X, %X\n", __func__, client->addr, buf[0], buf[1], buf[2]);tp_log_info("ilitek %s, client->addr = 0x%X, read buf = %X, %X, %X\n", __func__, client->addr, buf[0], buf[1], buf[2]);break;}}#endif// read touch parameterret = ilitek_i2c_read_tp_info();if(ret < 0){tp_log_err("ilitek read tp info fail free gpio\n");if (gpio_is_valid(i2c.irq_gpio)) {gpio_free(i2c.irq_gpio);}if (gpio_is_valid(i2c.reset_gpio)) {gpio_free(i2c.reset_gpio);}return ret;}}
#ifdef CLOCK_INTERRUPT
#ifdef REPORT_THREADi2c.thread = kthread_run(ilitek_i2c_touchevent_thread, NULL, "ilitek_i2c_thread");if(i2c.thread == (struct task_struct*)ERR_PTR){i2c.thread = NULL;tp_log_err("%s, kthread create, error\n", __func__);}
#endif
#endifilitek_handle_irqorpolling();i2c.input_dev = input_allocate_device();if(i2c.input_dev == NULL){tp_log_err("%s, allocate input device, error\n", __func__);return -1;}ilitek_set_input_param(i2c.input_dev, i2c.max_tp, i2c.max_x, i2c.max_y);ret = input_register_device(i2c.input_dev);if(ret){tp_log_err("%s, register input device, error\n", __func__);return ret;}i2c.valid_input_register = 1;tp_log_info("%s, register input device, success\n", __func__);
#ifdef ILI_UPDATE_FW#ifndef UPDATE_THREADE{update_wait_flag = 1;ret = ilitek_upgrade_firmware();if(ret == ILITEK_UPDATE_OK) {tp_log_info("update end\n");}else if(ret == ILITEK_I2C_TRANSFER_ERR) {tp_log_info("i2c communication error\n");}if(i2c.reset_request_success){ilitek_reset(i2c.reset_gpio);}// read touch parameterret=ilitek_i2c_read_tp_info();if(ret < 0){tp_log_err("ilitek_i2c_read_tp_info err\n");return ret;}update_wait_flag = 0;#if 1input_unregister_device(i2c.input_dev);#if 1i2c.input_dev = input_allocate_device();if(i2c.input_dev == NULL){tp_log_err("%s, allocate input device, error\n", __func__);return -1;}#endif// register input device//memset(i2c.input_dev, 0, sizeof(struct input_dev));// register input deviceilitek_set_input_param(i2c.input_dev, i2c.max_tp, i2c.max_x, i2c.max_y);ret = input_register_device(i2c.input_dev);if(ret){tp_log_err("%s, register input device, error\n", __func__);return ret;}tp_log_info("%s, register input device, success\n", __func__);#endif}#else{thread_update= kthread_run(ilitek_i2c_update_thread, NULL, "ilitek_i2c_updatethread");if(thread_update == (struct task_struct*)ERR_PTR){thread_update = NULL;tp_log_err("%s,thread_update kthread create, error\n", __func__);}}#endif
#endif#ifdef WRITE_2210_CFGthread_write_cfg = kthread_run(ilitek_i2c_write_cfg_thread, NULL, "ilitek_i2c_write_cfg_thread");if(thread_write_cfg == (struct task_struct*)ERR_PTR){thread_write_cfg = NULL;tp_log_err("%s,thread_write_cfg kthread create, error\n", __func__);}
#endif#ifdef RECOGNITION_LONGTIME_BUTTONthread_longtime_button = kthread_run(ilitek_i2c_check_longtime_button_thread, NULL, "ilitek_i2c_check_longtime_button_thread");if(thread_longtime_button == (struct task_struct*)ERR_PTR){thread_longtime_button = NULL;tp_log_err("%s,thread_longtime_button kthread create, error\n", __func__);}
#endif#ifdef GESTUREilitek_system_resume = 1;input_set_capability(i2c.input_dev, EV_KEY, KEY_POWER);input_set_capability(i2c.input_dev, EV_KEY, KEY_W);input_set_capability(i2c.input_dev, EV_KEY, KEY_LEFT);input_set_capability(i2c.input_dev, EV_KEY, KEY_RIGHT);input_set_capability(i2c.input_dev, EV_KEY, KEY_UP);input_set_capability(i2c.input_dev, EV_KEY, KEY_DOWN);input_set_capability(i2c.input_dev, EV_KEY, KEY_O);input_set_capability(i2c.input_dev, EV_KEY, KEY_C);input_set_capability(i2c.input_dev, EV_KEY, KEY_E);input_set_capability(i2c.input_dev, EV_KEY, KEY_M);
#endif#ifdef TOOLret = create_tool_node();
#endif#ifdef SENSOR_TEST
#ifdef SYS_ATTR_FILEilitek_sensor_test_init();
#endif
#endif#ifdef HALL_CHECK
#if HALL_CHECK == HALL_CHECK_OTHERilitek_hall_check_init();	
#elif HALL_CHECK == HALL_CHECK_HWilitek_hall_check_hw_init();	
#endif //end of HALL_CHECK
#endifReport_Flag=0;#ifdef PLAT_ROCKCHIPi2c.tp.tp_resume = ilitek_i2c_late_resume;i2c.tp.tp_suspend = ilitek_i2c_early_suspend;tp_register_fb(&i2c.tp);
#endif#ifdef ILITEK_ESD_CHECKINIT_DELAYED_WORK(&esd_work, ilitek_touch_esd_func);esd_wq = create_singlethread_workqueue("esd_wq");	 if (!esd_wq) {return -ENOMEM;}queue_delayed_work(esd_wq, &esd_work, delay);
#endif #ifdef WRITE_2210_CFGret = sysfs_create_group(&client->dev.kobj, &ilitek_test_attribute_group);if (ret) {dev_err(&client->dev, "failed to create sysfs attributes: %d\n",ret);return ret;}
#endif
#ifdef DEBUG_NETLINK//netlink_sock = netlink_kernel_create(&init_net, 21, 0,udp_receive, NULL, THIS_MODULE);netlink_sock = netlink_kernel_create(&init_net, 21, &cfg);#endifdevice_init_wakeup(&client->dev, 1);return 0;
}

ilitek_i2c_probe 函数是 I2C 设备的初始化函数,在设备被识别和加载驱动时调用。它的主要职责包括:

  • 初始化设备:根据 I2C 客户端信息和设备 ID 来配置和初始化设备。
  • 分配所需资源:如内存、GPIO 等。
  • 设置中断处理程序(如适用):为设备配置中断。
  • 注册输入设备:根据设备类型设置输入设备的相关参数。

2. ilitek_ts.h

ilitek_ts.h用于定义驱动相关的数据结构、常量、函数原型以及其他必要的包含。该头文件的内容用于抽象和管理与 Ilitek 触摸屏控制器之间的接口。

3. ILI25110CN080O0003_CRC.ili

ILI25110CN080O0003_CRC.ili 可能是与 Ilitek 触摸屏控制器 ILI2511 系列相关的文件。

4. 驱动移植

a.将原厂提供的的驱动(ilitek)拷贝到下面的文件夹:

./kernel/drivers/input/touchscreen

b. 然后修改 touchscreen 目录下的 Makefile以及Kconfig。这个Makefile中定义的就是要编译哪个平台的触摸屏驱动的。

kernel/drivers/input/touchscreen/Makefile中添加:
obj-$(CONFIG_TOUCHSCREEN_ILITEK)     += ilitek/--------------------------------------------------------
kernel/drivers/input/touchscreen/Kconfig中添加:
config TOUCHSCREEN_ILITEKtristate "ILITEK touchscreens matched with screen support for rockchip platform"depends on I2C && ARCH_ROCKCHIPhelpSay Y here if you have a touchscreen interface using the ILITEKtouchscreen chip on Rockchip platform, and your board-specificinitialization code includes that in its table of IIC devices.If unsure, say N.

c. 内核中加载驱动:

kernel/arch/arm/configs/rockchip_defconfig中添加:
CONFIG_TOUCHSCREEN_ILITEK=y

四,调试

  1. 确认 /sys/bus/i2c/devices 下有裝置节点 (-0041);
    在这里插入图片描述
  2. 报点问题:
    有触摸效果,只是坐标 mapping 问题。

X、Y 需要交換。
將 ILITEK_ROTATE_FLAG 设定值由 0 改为 1 或由 1 改为 0。

X、Y 值要做鏡像变化。
將 ILITEK_REVERT_X 或 ILITEK_REVERT_Y 的设定值由 0 改为 1 或由 1 改为 0。

若需要指定显示屏的解析度。
则开放 ILITEK_USE_LCM_RESOLUTION 宏,同时將TOUCH_SCREEN_X_MAX 和 TOUCH_SCREEN_Y_MAX 设为正确值。

相关文章:

RK3288 android7.1 适配 ilitek i2c接口TP

一&#xff0c;Ilitek 触摸屏简介 Ilitek 提供多种型号的触控屏控制器&#xff0c;如 ILI6480、ILI9341 等&#xff0c;采用 I2C 接口。 这些控制器能够支持多点触控&#xff0c;并具有优秀的灵敏度和响应速度。 Ilitek 的触摸屏控制器监测屏幕上的触摸事件。 当触摸发生时&am…...

C++ 越来越像函数式编程了!

C 越来越像函数式编程了 大家好&#xff0c;欢迎来到今天的博客话题。今天我们要聊的是 C 这门老牌的强类型语言是如何一步一步向函数式编程靠拢的。从最早的函数指针&#xff0c;到函数对象&#xff08;Functor&#xff09;&#xff0c;再到 std::function 和 std::bind&…...

maven工程结构说明

1、maven工程文件目录 |-- pom.xml # Maven 项目管理文件 |-- src # 放项目源文件|-- main # 项目主要代码| |-- java # Java 源代码目录| | -- com/example/myapp…...

【GESP】C++一级真题练习(202312)luogu-B3921,小杨的考试

GESP一级真题练习。为2023年12月一级认证真题。逻辑计算问题。 题目题解详见&#xff1a;【GESP】C一级真题练习(202312)luogu-B3921&#xff0c;小杨的考试 | OneCoder 【GESP】C一级真题练习(202312)luogu-B3921&#xff0c;小杨的考试 | OneCoderGESP一级真题练习。为2023…...

游戏中Dubbo类的RPC设计时的注意要点

一.消费方 1.需要使用到动态代理&#xff0c;代理指定的接口&#xff0c;这样子接口被调用时&#xff0c;就可以拿到&#xff1a;"类名 方法名参数返回值" 这些类型。 2.既然是rpc&#xff0c;那么接口被调用时&#xff0c;肯定在动态代理中会进行网络消息的发送&a…...

ARXML汽车可扩展标记性语言规范讲解

ARXML: Automotive Extensible Markup Language &#xff08;汽车可扩展标记语言&#xff09; xmlns: Xml name space &#xff08;xml 命名空间&#xff09; xsd: Xml Schema Definition (xml 架构定义) 1、XML与HTML的区别&#xff0c;可扩展。 可扩展&#xff0c;主要是…...

Hadoop(HDFS)

Hadoop是一个开源的分布式系统架构&#xff0c;旨在解决海量数据的存储和计算问题&#xff0c;Hadoop的核心组件包括Hadoop分布式文件系统&#xff08;HDFS&#xff09;、MapReduce编程模型和YARN资源管理器,最近需求需要用到HDFS和YARN。 文章目录 HDFS优缺点HDFS的读写原理 常…...

机器学习系列----梯度下降算法

梯度下降算法&#xff08;Gradient Descent&#xff09;是机器学习和深度学习中最常用的优化算法之一。无论是在训练神经网络、线性回归模型&#xff0c;还是其他类型的机器学习模型时&#xff0c;梯度下降都是不可或缺的一部分。它的核心目标是最小化一个损失函数&#xff08;…...

AI大模型:软件开发的未来之路

随着AI技术的快速发展&#xff0c;AI大模型正在对软件开发流程产生深远的影响。从代码自动生成到智能测试&#xff0c;AI大模型正在重塑软件开发的各个环节&#xff0c;为软件开发者、企业和整个产业链带来新的流程和模式变化。 首先&#xff0c;AI大模型的定义是指通过大规模…...

指标+AI+BI:构建数据分析新范式丨2024袋鼠云秋季发布会回顾

10月30日&#xff0c;袋鼠云成功举办了以“AI驱动&#xff0c;数智未来”为主题的2024年秋季发布会。大会深度探讨了如何凭借 AI 实现新的飞跃&#xff0c;重塑企业的经营管理方式&#xff0c;加速数智化进程。 作为大会的重要环节之一&#xff0c;袋鼠云数栈产品经理潮汐带来了…...

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto- WriteUp

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto-WriteUp Crypto&#xff1a;Crypto-2&#xff1a;Crypto-3&#xff1a; 前言&#xff1a;本次比赛已经结束&#xff0c;用于赛后复现&#xff0c;欢迎大家交流学习&#xff01; Crypto&#xff1a; Crypto-2&#xff1a; …...

关于Markdown的一点疑问,为什么很多人说markdown比word好用?

markdown和word压根不是一类工具&#xff0c;不存在谁比谁好&#xff0c;只是应用场景不一样。 你写博客、写readme肯定得markdown&#xff0c;但写合同、写简历肯定word更合适。 markdown和word类似邮箱和微信的关系&#xff0c;这两者都可以通信&#xff0c;但微信因为功能…...

NoSQL大数据存储技术测试(1)绪论

写在前面&#xff1a;未完成测试的同学&#xff0c;请先完成测试&#xff0c;此博文供大家复习使用&#xff0c;&#xff08;我的答案&#xff09;均为正确答案&#xff0c;大家可以放心复习 单项选择题 第1题 以下不属于云计算部署模型的是&#xff08; &#xff09; 公…...

Linux命令学习,git命令

Linux系统&#xff0c;Git是一个强大的版本管理系统&#xff0c;允许用户跟踪代码的更改、管理项目历史以及与他人协作。 Linux Git命令&#xff1a; 初始化仓库:当前目录创建一个Git仓库&#xff0c;生成.git隐藏目录存储版本历史和其他Git相关的元数据。 git init 克隆仓库…...

【AI大模型】Transformer中的编码器详解,小白必看!!

前言 Transformer中编码器的构造和运行位置如下图所示&#xff0c;其中编码器内部包含多层&#xff0c;对应下图encoder1…encoder N&#xff0c;每个层内部又包含多个子层&#xff1a;多头自注意力层、前馈神经网络层、归一化层&#xff0c;而最关键的是多头自注意力层。 自注…...

PostgreSQL 字段按逗号分隔成多条数据的技巧与实践 ️

全文目录&#xff1a; 开篇语前言 &#x1f4da;1. PostgreSQL 字段拆分的基本概念 &#x1f3af;2. 使用 string_to_array 函数拆分字段 &#x1f4ac;示例&#xff1a;使用 string_to_array 拆分字段结果&#xff1a; 3. 使用 unnest 和 string_to_array 结合拆分 &#x1f5…...

设计模式学习总结(一)

设计模式学习笔记 面向对象、设计原则、设计模式、编程规范、重构之间的关系 面向对象、设计原则、设计模式、编程规范、重构之间的关系 面向对象 现在&#xff0c;主流的编程范式或者是编程风格有三种&#xff1a;面向过程、面向对象和函数式编程。 需要掌握七大知识点&#…...

软考中级 软件设计师 上午考试内容笔记(个人向)Part.1

软考上午考试内容 1. 计算机系统 计算机硬件通过高/低电平来模拟1/0信息&#xff1b;【p进制】&#xff1a; K n K n − 1 . . . K 2 K 1 K 0 K − 1 K − 2... K − m K n r n . . . K 1 r 1 K 0 r 0 K − 1 r − 1 . . . K − m r − m K_nK_{n-1}...K_2K_1K_0K…...

PHP API的数据交互类型设计

PHP API的数据交互类型设计涉及多个方面&#xff0c;包括请求方法、数据格式、安全性考虑等。以下是对PHP API数据交互类型设计的详细探讨&#xff1a; 一、请求方法 在PHP API中&#xff0c;常见的请求方法包括GET、POST、PUT、DELETE等。这些方法在数据交互中各有其用途和特…...

【EFK】Linux集群部署Elasticsearch最新版本8.x

【EFK】Linux集群部署Elasticsearch最新版本8.x 摘要环境准备环境信息系统初始化启动先决条件 下载&安装修改elasticsearch.yml控制台启动Linux服务启动访问验证查看集群信息查看es健康状态查看集群节点查询集群状态 生成service token验证service tokenIK分词器下载 摘要 …...

【大数据测试 Elasticsearch — 详细教程及实例】

大数据测试 Elasticsearch — 详细教程及实例 1. Elasticsearch 基础概述核心概念 2. 搭建 Elasticsearch 环境2.1 安装 Elasticsearch2.2 配置 Elasticsearch 3. 大数据测试的常见方法3.1 使用 Logstash 导入大数据3.2 使用 Elasticsearch 的 Bulk API3.3 使用 Benchmark 工具…...

用ArkTS写一个登录页面(实现简单的逻辑)

登录页面 1.登录页面编码 Extend(TextInput) function customStyle(){.backgroundColor(#fff).border({width:{bottom:0.5},color:#e4e4e4}).borderRadius(1) //让圆角不明显.placeholderColor(#c3c3c5).caretColor(#fa711d) //input获取焦点样式 }Entry Component struct Log…...

matlab将INCA采集的dat文件多个变量批量读取到excel中

参考资料&#xff1a; MATLAB处理INCA采集数据&#xff08;mdf&#xff0c;dat等&#xff09;一 使用matlab处理INCF采集数据&#xff0c;mdf&#xff08;.dat&#xff09;格式文件&#xff0c;并将将其写入excel文件 这个资料只能一个变量一个变量的提取&#xff0c;本对其进…...

list集合常见去重方式以及效率对比

1.概述 list集合去重是开发中比较常用的操作&#xff0c;在面试中也会经常问到&#xff0c;那么list去重都有哪些方式&#xff1f;他们之间又该如何选择呢&#xff1f; 本文将通过LinkedHashSet、for循环、list流toSet、list流distinct等4种方式分别做1W数据到1000W数据单元测试…...

JavaWeb——Web入门(7/9)-Tomcat-介绍(Tomcat 的简介:轻量级Web服务器,支持Servlet/JSP少量JavaEE规范)

目录 Web服务器的作用 三个方面的讲解 Tomcat 的简介 小结 Web服务器的作用 封装 HTTP 协议操作&#xff1a;Web服务器是一个软件程序&#xff0c;对 HTTP 协议的操作进行了封装。这样开发人员就不需要再直接去操作 HTTP 协议&#xff0c;使得外部应用程序的开发更加便捷、…...

【SpringBoot】19 文件/图片下载(MySQL + Thymeleaf)

Git仓库 https://gitee.com/Lin_DH/system 介绍 从 MySQL 中&#xff0c;下载保存的 blob 格式的文件。 代码实现 第一步&#xff1a;配置文件 application.yml spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT8datasource:driver-class-name: com.mysql.…...

陪诊问诊APP开发实战:基于互联网医院系统源码的搭建详解

时下&#xff0c;开发一款功能全面、用户体验良好的陪诊问诊APP成为了医疗行业的一大热点。本文将结合互联网医院系统源码&#xff0c;详细解析陪诊问诊APP的开发过程&#xff0c;为开发者提供实用的开发方案与技术指导。 一、陪诊问诊APP的背景与功能需求 陪诊问诊APP核心目…...

Spark 中 RDD 的诞生:原理、操作与分区规则

Spark 的介绍与搭建&#xff1a;从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式之Yarn模式的原…...

c++构造与析构

构造函数特性 名称与类名相同&#xff1a;构造函数的名称必须与类名完全相同&#xff0c;并且不能有返回值类型&#xff08;包括void&#xff09;。 自动调用&#xff1a;构造函数在对象实例化时自动调用&#xff0c;不需要手动调用。 初始化成员变量&#xff1a;构造函数的主…...

C++(函数重载,引用,nullptr)

1.函数重载 C⽀持在同⼀作⽤域中出现同名函数&#xff0c;但是要求这些同名函数的形参不同&#xff0c;可以是参数个数不同或者类型不同。传参时会自动匹配传入的参数&#xff0c;对应该函数的形参类型&#xff0c;进行函数调用&#xff0c;这样C函数调⽤就表现出了多态⾏为&a…...