- 博客(322)
- 资源 (2)
- 收藏
- 关注
原创 SpringBoot集成支付宝,看这一篇就够了。
在开发环境中,我们可以采用内网穿透的方式,将我们本机的端口暴露在某个公网地址上,这里推荐 https://natapp.cn/ ,可以免费注册使用。最后如果一切就绪,我们就可以把APP提交上线了,上线成功之后,我们需要把下面SpringBoot中的properties替换为线上APP的信息,然后就可以在生产环境调用支付宝的接口进行支付了。在开始集成支付宝支付之前,我们需要准备一个支付宝商家账户,如果是个人开发者,可以通过注册公司或者让有公司资质的单位进行授权,后续在集成相关API的时候需要提供这些信息。
2023-12-31 13:00:44
1832
原创 SpringBoot 如何进行全局异常处理
在下面的例子中,我们继承了ResponseEntityExceptionHandler并使用@RestControllerAdvice注解了这个类,接着结合@ExceptionHandler针对不同的异常类型,来定义不同的异常处理方法。这里可以看到我处理的异常是自定义异常,后续我会展开介绍。ResponseEntityExceptionHandler中包装了各种SpringMVC在处理请求时可能抛出的异常的处理,处理结果都是封装成一个ResponseEntity对象。
2023-12-17 11:04:52
2143
原创 Spring Boot 优雅地处理重复请求
上面的问题其实已经是一个很不错的解决方案了,但是实际投入使用的时候可能发现有些问题:某些请求用户短时间内重复的点击了(例如1000毫秒发送了三次请求),但绕过了上面的去重判断(不同的KEY值)。原因是这些请求参数的字段里面,是带时间字段的,这个字段标记用户请求的时间,服务端可以借此丢弃掉一些老的请求(例如5秒前)。对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。
2023-12-09 17:31:54
4213
1
原创 高并发场景下的httpClient使用优化技巧
关于keep-alive,本文不展开说明,只提一点,是否使用keep-alive要根据业务情况来定,它并不是灵丹妙药。还有一点,keep-alive和time_wait/close_wait之间也有不少故事。在本业务场景里,我们相当于有少数固定客户端,长时间极高频次的访问服务器,启用keep-alive非常合适再多提一嘴,http的keep-alive 和tcp的KEEPALIVE不是一个东西。//如果没有约定,则默认定义时长为60s。
2023-12-08 23:01:06
1751
原创 MySQL查询优化
一个好的web应用,最重要的一点是有着优秀的访问性能。数据库MySQL是web应用的组成部分,也是决定其性能的重要部分。所以提升MySQL的性能至关重要。MySQL性能的提升可分为三部分,包括硬件、网络、软件。其中硬件、网络取决于公司的财力,需要白哗哗的银两,这里就不说啦。软件又细分为很多种,在这里我们通过MySQL的查询优化从而达到性能的提升。最近看了一些关于查询优化的书籍,同时也在网上看一些前辈们写的文章。
2023-11-29 23:42:19
1212
原创 如何合理估算 Java 线程池大小
这是根据大量的案例总结的Java线程池大小确定的公式,但在实操中所考虑的侧重点可能有不同,那么需要根据实际场景来微调,本文提供一种确定最优的思路,希望对你开发中确定线程池大小有所帮助!对于 CPU 密集型任务,我们希望最大限度地提高 CPU 利用率,但又不会因为过多的线程而压垮系统,否则会导致过多的上下文切换。我们的目标是确定有效处理这些请求的最佳线程池大小。IO密集型任务是那些与存储设备交互的设备(例如,读/写文件)、网络套接字(例如,进行 API 调用),或用户输入(例如,图形用户界面中的用户交互)。
2023-11-17 22:13:40
1034
原创 订单 延后自动关闭,五种方案优雅搞定!
这样可以看出定时轮由个3个重要的属性参数,ticksPerWheel(一轮的tick数),tickDuration(一个tick的持续时间)以及 timeUnit(时间单位),例如当ticksPerWheel=60,tickDuration=1,timeUnit=秒,这就和现实中的始终的秒针走动完全类似了。该方案是利用JDK自带的DelayQueue来实现,这是一个无界阻塞队列,该队列只有在延迟期满的时候才能从中获取元素,放入DelayQueue中的对象,是必须实现Delayed接口的。
2023-10-22 00:23:21
1176
原创 C++ 运算符重载
这些指针是行为与正常指针相似的对象,唯一不同的是,当您通过指针访问对象时,它们会执行其他的任务。当重载()时,您不是创造了一种新的调用函数的方式,相反地,这是创建一个可以传递任意数目参数的运算符函数。同样地,下面的实例演示了如何重载类成员访问运算符->。下面的实例演示了如何重载加运算符(+),减运算符(-)和乘运算符(*)。我们平常使用的加运算符(+)、减运算符(-)、乘运算符(*)和除运算符(/)都属于二元运算符。就像其他运算符一样,您可以重载赋值运算符(=),用于创建一个对象,比如拷贝构造函数。
2023-10-05 22:49:38
695
原创 C++ 内存空间总结
因为结构体有时候需要字节对齐。一般而言,struct 的 sizeof 是所有成员字节对齐后长度相加,而 union 的 sizeof 是取最大的成员长度。在默认情况下,编译器为每一个变量或数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变默认的对界条件:(1) 使用伪指令#pragma pack(n),C编译器将按照n个字节对齐。(2) 使用伪指令#pragma pack(),取消自定义字节对齐方式。
2023-10-04 18:44:30
954
原创 C++中的四种强制类型转换符详解
C++ 既支持 C 风格的类型转换,又有自己风格的类型转换。reinterpret 的英文含义有重新转换的含义,就相当于 C 语言中不相关类型的转换,强转。下面程序中,参数 pb 指向的是 B 类对象,pd1 的值不为0,而 pd2 的值为 0。C++ 风格完美的解决了上面两个问题。
2023-10-03 22:45:55
787
原创 c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)
如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有 virtual 关键字,此时基类的函数才被隐藏。如果派生类的函数与基类的函数同名,但是参数不同,则不论有无 virtual 关键字, 基类的函数都将被隐藏。在调用一个类的成员函数时,编译器会沿着类的继承链逐级地向上查找函数的定义,如果找到了就停止查找了。
2023-10-02 22:43:12
1726
原创 禁用adb install 安装app功能
在android 的产品开发只中,在进行一些定制开发中,对于一些apo需要通过属性来控制禁上安装,adb nstl也不分许安装,所以就典熟悉adb install的安装流程,然后来禁用adb install安装功能,接下来分析下adb 下的安装流程。
2023-10-02 22:05:57
989
原创 解决recovery页面反转的问题
在android 10.0的系统rom定制化开发工作中,在系统中recoverv的页面也是相关重要的一部分,在系统recovery ta升级等功能,都是需要recoverv功能的,在某些产品定制化中在recovery的时候,发现居然旋转了180度,接下来分析下recovery关于屏幕显示方向的相关源码,来修改这个功能。
2023-10-02 21:55:30
658
原创 优雅的写Controller 层代码这样写才可以
但是你要是这样返回给前端,前端妹妹就提刀过来了,当年约定好的状态码,你个负心人说忘就忘?为了跟前端妹妹打好关系,我们通常需要对后端返回的数据进行包装一下,增加一下状态码,状态信息,这样前端妹妹接收到数据就可以根据不同的状态码,判断响应数据状态,是否成功是否异常进行不同的显示。每个系统都会有自己的业务异常,比如库存不能小于0子类的,这种异常并非程序异常,而是业务操作引发的异常,我们也需要进行规范的编排业务异常状态码,并且写一个专门处理的异常类,最后通过刚刚学习过的异常拦截统一进行处理,以及打日志。
2023-10-02 10:47:23
266
原创 Redis BitMap+SpringBoot 实现签到与统计功能
在各个项目中,我们都可能需要用到签到和 统计功能。签到后会给用户一些礼品以此来吸引用户持续在该平台进行活跃。签到功能,使用 Redis 中的 BitMap 功能来实现,就是一个非常不错的选择。
2023-10-01 21:23:37
439
原创 [C++基础] 变量、关键字、运算符、位操作篇
定义(definition)为变量分配存储空间,还可以为变量指定初始值。而声明(declaration)是指向程序表明变量的类型和名字。定义也是声明,定义变量的同时也声明了它的类型和名字。一般为了叙述方便,把建立存储空间的声明称定义,而不把建立存储空间的声明称为声明。
2023-09-16 23:38:28
395
原创 在Qt5中SQLite3的使用
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。
2023-09-10 00:36:10
1259
原创 Java 项目防止 SQL 注入的四种方案
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。SQL案列这个id从请求参数中获取,若参数被拼接为:此时,数据库的数据都会被清空掉,后果非常严重。
2023-09-07 23:34:12
865
原创 QT项目使用Qss的总结
QSS称为Qt Style Sheets也就是Qt样式表,它是Qt提供的一种用来自定义控件外观的机制。QSS大量参考了CSS的内容,只不过QSS的功能比CSS要弱很多,体现在选择器要少,可以使用的QSS属性也要少很多,并且并不是所有的属性都可以用在Qt的所有控件上。
2023-08-27 23:21:34
2704
1
原创 基于 Nginx 实现一个灰度上线系统
软件开发一般不会上来就是最终版本,而是会一个版本一个版本的迭代。新版本上线前都会经过测试,但就算这样,也不能保证上线了不出问题。所以,在公司里上线新版本代码一般都是通过灰度系统。灰度系统可以把流量划分成多份,一份走新版本代码,一份走老版本代码。而且灰度系统支持设置流量的比例,比如可以把走新版本代码的流量设置为 5%,没啥问题再放到 10%,50%,最后放到 100% 全量。这样可以把出现问题的影响降到最低。不然一上来就全量,万一出了线上问题,那就是大事故。
2023-08-25 23:35:59
264
原创 使用 EasyExcel 实现 百万级数据导入导出
在项目开发中往往需要使用到数据的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。大数据的导入和导出,相信大家在日常的开发、面试中都会遇到。很多问题只要这一次解决了,总给复盘记录,后期遇到同样的问题就好解决了。好啦,废话不多说开始正文!1.如此大批量数据的导出和导入操作,会占用大量的内存实际开发中还应限制操作人数。2.在做大批量的数据导入时,可以使用jdbc手动开启事务,批量提交。
2023-08-19 16:06:59
2080
原创 Qt 项目架构之----MVC架构
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
2023-07-16 01:27:59
1639
1
原创 Qt 常用全局宏定义
用于函数中未使用的变量,告诉编译器这个变量不需要告警。使用 Q_DECL_OVERRIDE 宏后,如果重载的虚函数没有进行任何重载操作,编译器将会报错。用于将一个虚函数定义为最终级别,不能再被重载,或者定义一个类不能再被继承。不需要 signals 关键字就可以将一个函数指定为 singal 函数。不需要 slots 关键字就可以将一个函数指定为 slot 函数。在 pro 文件添加如下代码,软件中所有 QDebug 将失效。表示系统内存中数据使用的字节序;函数所属类和参数信息。
2023-07-09 15:56:19
1551
原创 SpringBoot 实现 PDF 添加水印方案
PDF(Portable Document Format,便携式文档格式)是一种流行的文件格式,它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下,我们需要对 PDF 文件添加水印,以使其更具有辨识度或者保护其版权。本文将介绍如何使用 Spring Boot 来实现 PDF 添加水印的方式。
2023-07-05 09:21:45
5058
原创 CMake 使用教程 (四)
int a = 10;# ifdef DEBUG printf("我是一个程序猿, 我不会爬树...\n");i < NUMBER;++ i) {!!\n");} return 0;# ifdef DEBUG printf("我是一个程序猿, 我不会爬树...\n");i < NUMBER;++ i) {!!\n");} return 0;
2023-07-03 23:10:35
5111
原创 CMake 使用教程 (三)
由于在 Linux 下生成的静态库默认不具有可执行权限,所以在指定静态库生成的路径的时候就不能使用 EXECUTABLE_OUTPUT_PATH 宏了,而应该使用 LIBRARY_OUTPUT_PATH,这个宏对应静态库文件和动态库文件都适用。在程序编写过程中,除了在项目中引入静态库,好多时候也会使用一些标准的或者第三方提供的一些动态库,关于动态库的制作、使用以及在内存中的加载方式和静态库都是不同的,在此不再过多赘述,如有疑惑请参考。对于生成的库文件来说和可执行程序一样都可以指定输出路径。
2023-06-30 23:58:24
5482
原创 CMake 使用教程 (二)
在上面的例子中一共提供了 5 个源文件,假设这五个源文件需要反复被使用,每次都直接将它们的名字写出来确实是很麻烦,此时我们就需要定义一个变量,将文件名对应的字符串存储起来,在 cmake 里定义变量需要使用 set。# SET 指令的语法是: # [ ] 中的参数为可选项 , 如不需要可以不写 SET(VAR [ VALUE ] [ CACHE TYPE DOCSTRING [ FORCE ] ])**VAR:**变量名**VALUE:**变量值。
2023-06-30 16:58:18
5503
原创 CMake 使用教程 (一)
CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有 Makefile(通过 make 命令进行项目的构建),大多是 IDE 软件都集成了 make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake 等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。
2023-06-30 00:03:59
6203
1
原创 QT多线程之QtConcurrent::run()
调用run()之后,函数不一定会被立即执行,如果有多个run()被调用,函数的调用顺序不一定是run()的调用顺序,这些都和线程的调度有关系。run(function) 实际上等价于run(QThreadPool::globalInstance(),function)如果只是简单的想在其他线程中调用某个函数,不需要复杂的数据同步,那么QtConcurrent::run()相比其他实现多线程的方式绝对是不二之选。
2023-06-29 00:08:41
7039
原创 Qt 中线程池的使用
在 Qt 中使用线程池需要先创建任务,添加到线程池中的每一个任务都需要是一个 QRunnable 类型,因此在程序中需要创建子类继承 QRunnable 这个类,然后重写 run() 方法,在这个函数中编写要在线程池中执行的任务,并将这个子类对象传递给线程池,这样任务就可以被线程池中的某个工作的线程处理掉了。得到线程池对象之后,调用 start() 方法就可以将一个任务添加到线程池中,这个任务就可以被线程池内部的线程池处理掉了,使用线程池比自己创建线程的这种多种多线程方式更加简单和易于维护。
2023-06-28 18:26:08
8179
原创 Qt中多线程的使用
在进行桌面应用程序开发的时候, 假设应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事件,其他线程进行逻辑运算,多个线程各司其职,不仅可以提高用户体验还可以提升程序的执行效率。默认的线程在Qt中称之为窗口线程,也叫主线程,负责窗口事件处理或者窗口控件数据的更新子线程负责后台的业务逻辑处理,子线程中不能对窗口对象做任何操作,这些事情需要交给窗口线程处理。
2023-06-26 23:59:24
8025
原创 Qt 发送带结构体数据的信号
因为跨线程时,当发送方信号发出时,此时接受对象所在的线程未取得控制权,所以需要发送方需要将信号放在信号队列中储存发送的参数,QT就会去构造对象,而我们定义的是自定义类型,所以需要使用qRegisterMetaType()来注册,告诉QT怎么去构造对象.
2023-06-23 18:51:22
8097
原创 Qt 实现应用程序单实例
但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸崩溃,会导致共享内存无法释放,从而无法重新运行程序!使用共享内存,当第二个进程启动时,判断内存区数据是否建立,如有,则退出;这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动。在程序运行的时候就在目录下创建一个文件,当程序运行时就判断这个文件是否存在,如果存在说明程序已经在运行。使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现。该方法实现简单,代码简洁。
2023-06-23 17:05:40
8762
原创 Qt 信号和槽
信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。槽的本质是类的成员函数,其参数可以是任意类型的。和普通C++成员函数几乎没有区别,它可以是虚函数;也可以被重载;
2023-06-22 22:35:42
10416
原创 Qt键盘事件
QKeyEvent 类用来描述一个键盘事件。当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输人焦点的部件。QKeyEvent 的 key() 函数可以获取具体的按键,对于 Qt 中给定的所有按键,可以在帮助中查看 Qt: :Key 关键字。需要特别说明的是,回车键在这里是 Qt::Key_Return;
2023-06-19 23:19:19
11126
原创 Qt 定时器与定时事件
对于一个 QObject 的子类,只需要使用 int QObject::startTimer ( int interval) 函数来开启一个定时器,这个函数需要输人一个以毫秒为单位的整数作为参数来表明设定的时间,它返回一个整型编号来代表这个定时器。这里在构造函数中开启了一个 1 秒的定时器,当它溢出时就会发射 timeout() 信号,这时就会执行我们的定时器溢出处理函数。使用 QTimerEvent 的 timerId() 函数来获取定时器的编号,然后判断是哪一个定时器并分别进行不同的操作。
2023-06-18 00:53:37
11148
原创 Qt下存储读写应用程序设置的三种方法
List item用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小、位置和密码等等。使用注册表;使用配置文件(.ini);使用自定义文件(例如.txt)。/*****************将设置的锁屏时间数值写入文本中*****************/ //读取文本 QFile file(config . txt);while(!
2023-06-18 00:30:29
10515
原创 Qt 多语言实现
Qt Linguist 提供了一套加速应用程序翻译和国际化的工具。Qt 使用单一的源码树和单一的应用程序二进制包就可同时支持多个语言和书写系统。使用 QTranslator 来加载生成的 qm 文件,就可以让程序显示指定的语言。// 国际化翻译 QString language = "CH";// 默认为中文,后期可以使用ini方式保存语言选项 QTranslator translator;对用户可见的文本信息全部使用 tr() 进行封装提供用户可以用来切换语言的一种方法。
2023-06-14 23:00:01
11995
原创 QT实现 WebsocketServer端与WebsocketClient 端通信
1、该示例代码简单实现了webSocketServer的创建。但是并没有用到多线程的技术,所以对并发处理不不适合。2、本示例对数据处理,和错误事件并没有很好的解析,这需要后续实现。
2023-06-03 21:46:03
21311
2
20个常见的项目经理面试问题与答案详细分析
2024-03-01
使用C++实现 QT实现颜色选择器
2023-12-13
Mysql 3.7 在linux centos 下的安装
2023-12-12
Spring Boot 微服务开发基础框架
2023-12-11
工作5-10年简历模板请大家借鉴
2023-12-11
三年工作经验优秀Java 服务端简历模板
2023-12-11
QTableViewDemo1.zip
2023-03-08
ListwidgetDeno.zip
2023-03-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人