如何设计一个ToC的弹窗
本文主要分享了如何设计一个具有高可扩展性的弹窗功能。
本设计参考了优惠券功能的设计思路,有兴趣的朋友可以看看优惠券的分享:如何设计一个可扩展的优惠券功能_java优惠券系统设计-CSDN博客
一、需求介绍
假如你的项目需要实现以下弹窗,你会怎么去实现?

需求:
1.展示1张图片,点击图片后跳转到另外1个页面(支持H5、小程序、其他小程序),有个关闭按钮,点击关闭按钮停留在当前页面
2.该弹窗功能提供给运营通过管理后台进行配置
3.弹窗频率需要有所控制,比如1天1次,有优先级,比如运营配置了3个弹窗,不能同时弹,需要按优先级每次进入页面的时候才弹(参考某团的体验)
4.支持灵活配置弹窗条件,比如地域属性、平台属性、时间属性、指定某些用户、用户来源等
5.在配置弹窗过程中有些变量属性,需要运行时才能确定,比如跳转链接中增加当前登录用户ID或者token作为参数
二、数据库设计(存储设计好坏往往决定一个功能日后的可维护、可扩展)
1.错误的表设计(按需求一一列举各种条件作为表结构的字段)
| id | 有效期 | 图片url | H5链接 | 小程序链接 | 频率控制 | 优先级 | 条件1 | 条件2 | ... | 条件n |
| 1 | 2023-09-24 | https://image.com/aa/bb.jpg | /page/mini | 1次/天 | 99 | ios | 深圳市 |
相信很多朋友都是这样设计弹窗表的,这种表设计非常大的问题就是每次需要增加1个新的弹窗条件的话就要新增1个字段,非常不利于功能扩展。
2.正确的表设计(抽象区分‘配置数据’和‘弹窗条件’)
配置数据:使用1个字段,以json结构进行存储,可以做到灵活增加数据或改变数据,配置数据不涉及数据过滤,所以不涉及性能问题
| id | 有效期 | 优先级 | 背景图json |
| 1 | 2023-09-24 | 99 | {"imgUrl":"https://image.com/aa/bb.jpg","type":"redirct_mini","value":"/page/mini"} |
弹窗条件:由列式转化为行式存储,增加条件不需要增加字段,而是加1行数据
| id | popup_id | 条件 | 条件值 |
| 1 | 1 | 条件1 | 1次/天 |
| 2 | 1 | 条件2 | ios |
| 3 | 1 | 条件3 | 深圳市 |
核心设计思想:
1.把数据库表的列式条件转化为行式条件,比如 where a=? and b=?,转化为2行数据作为条件(当然转化后不再是sql能表达的)
2.运用设计模式(类似责任链模式)把1中的行式条件转化为一段代码,可简单可复杂,通过关联关系来做到可插拔
3.完整的表结构设计(remark、create_time、update_time是固定字段)
CREATE TABLE `mk_popup_pop_condition` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`bean_name` varchar(32) NOT NULL DEFAULT '' COMMENT 'bean名称(PopCondition的实现类)',`descrpition` varchar(255) DEFAULT NULL COMMENT '描述',`remark` varchar(255) DEFAULT NULL COMMENT '备注',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `uniq_beanname` (`bean_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='弹窗条件';CREATE TABLE `mk_popup` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`begin_time` datetime NOT NULL COMMENT '有效期开始时间',`end_time` datetime NOT NULL COMMENT '有效期结束时间',`status` varchar(8) NOT NULL DEFAULT '' COMMENT '状态(off:下架,on:上架)',`priority` int(11) NOT NULL DEFAULT '0' COMMENT '优先级(值越大,优先级越高)',`title` varchar(32) NOT NULL DEFAULT '' COMMENT '标题',`text` varchar(128) NOT NULL DEFAULT '' COMMENT '文案',`bg_img` varchar(255) NOT NULL DEFAULT '' COMMENT '背景图json数据',`close_btn` varchar(255) NOT NULL DEFAULT '' COMMENT '关闭按钮json数据',`remark` varchar(255) DEFAULT NULL COMMENT '备注',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,KEY `idx_begintime` (`begin_time`),KEY `idx_endtime` (`end_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='弹窗';CREATE TABLE `mk_popup_condition` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`popup_id` int(11) NOT NULL COMMENT 'mk_popup.id',`pop_condition` varchar(32) NOT NULL DEFAULT '' COMMENT '弹窗条件(bean名称,mk_popup_pop_condition.bean_name)',`pop_condition_value` varchar(255) DEFAULT '' COMMENT '弹窗条件值',`remark` varchar(255) DEFAULT NULL COMMENT '备注',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_popupid` (`popup_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='弹窗-弹窗条件';CREATE TABLE `mk_popup_log` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`business_type` varchar(64) NOT NULL DEFAULT '' COMMENT '业务类型(popup:mk_popup,user_popup:mk_user_popup)',`business_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '业务ID',`user_id` int(11) NOT NULL DEFAULT '0' COMMENT 'bu_user_info.id',`deviceid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备号',`remark` varchar(255) DEFAULT NULL COMMENT '备注',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,KEY `idx_userid` (`user_id`),KEY `idx_deviceid` (`deviceid`),KEY `idx_businessid_businesstype` (`business_id`,`business_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户弹窗记录';
表说明:
mk_popup_pop_condition:主要是记录有哪些弹窗条件,管理后台中配置弹窗时有用
mk_popup:弹窗配置,运营配置数据就往这里写数据
mk_popup_condition:某个弹窗的弹窗条件(1对多),条件组合配置就是利用该表
mk_popup_log:用户弹窗记录,用于控制弹窗频率
数据样例说明:
弹窗配置

弹窗条件

1) 弹窗1只有1个条件FrequencyCondition,可以理解为只控制弹窗频率为2次/天
2) 弹窗2有3个条件,需要符合场景为小程序首页,地域属性为深圳才弹,并且控制弹窗频率为1次/天
三、代码设计
1.抽象弹窗条件,定义一个接口,其子类对应mk_popup_pop_condition的数据

PopParam说明:

2.核心代码(PopService)中提供1个方法‘用户最优的弹窗’(此处代码过多,只贴核心部分,完整的可以通过gitee查看源码)


设计思想:
1.查询有效期内上架的所有弹窗(按优先级倒排,找到第1个就是最优的了),遍历每个弹窗的多个弹窗条件,判断有1个条件不满足就放弃该弹窗,进入下一个判断
2.运行时替换一些配置的参数,简单的如{userId},复杂的参数就实现ReplaceParam接口,下文有响应结果demo
tips:此处利用CompletableFuture优化性能,实现了多线程并发判断每个弹窗条件,只要有1个条件不满足就立马返回。
3.如何新增1种弹窗条件?
实现接口PopCondition,重写canPop方法,以下为‘场景’弹窗条件的代码

把Bean名称配置到弹窗条件表mk_popup_condition即可使用该条件,无需新增其他代码,也不改动主流程代码。
4.Controller固定入口

5.API定义
前端将弹窗封装成1个公共组件,只需请求固定接口/popup/best即可,在需要弹窗的页面直接引用该组件
入参:
| 字段 | 说明 |
| sence | 前端每个页面定义1个唯一值 |
| 经纬度 | 非固定参数,可不传 |
| 地域信息 | 非固定参数,可不传 |
| 渠道信息 | 非固定参数,可不传 |
| ... | 非固定参数,可不传 |
响应:
| 字段 | 说明 |
| model | 前端渲染模板定义,需要与前端协商,不同的值代表不同的渲染模板 |
| title | 标题,本来想用于背景图的标题,但其实可以把标题设计到背景图中 |
| text | 文案,同标题 |
| bgImg | 背景图JSON,存储背景图位置的数据和动作 |
| bgImg.imgUrl | 背景图 |
| bgImg.type | 点击背景图做什么?(close:关闭,api:请求API,subscribe:订阅消息,redirect_http:跳转http链接,redirect_mini:跳转小程序链接,redirect_other_mini:跳转其他小程序链接) |
| bgImg.value | 点击背景图做什么携带的信息 |
| closeBtn | 关闭按钮JSON,存储关闭按钮位置的动作(一般都是关闭,也可以做一些骚操作,比如点击关闭按钮跳转到某个页面,或者没有关闭按钮,一定要点击背景图) |
| popupLogId | 弹窗记录ID,本设计中查询到弹窗就会往mk_popup_log插入记录,而不是用户看到弹窗才记录,如果需要了解用户是否有真正看到弹窗,需要与前端协商一起实现,这个ID可以作为下个api的传参 |
示例:
https://domain.com/popup/best?sence=mini_home&cityCode=440300

四、需求升级
1.点击图片后不跳转到另外1个页面,而是实现特殊逻辑(如拉起小程序订阅消息)
解:需要前端协作实现,增加bgImg.type的定义值,数据通过bgImg.value返回给前端
2.点击图片后不跳转到另外1个页面,而是切换到下一张图片,点击后下一张图片后才跳转页面(比如发优惠券,第一张图片展示立即领取,点击后请求api进行发券,随后切换至去使用的图片,点击后再跳转到对应用券页面)
解:增加下一步操作设计,next结构与最外层的响应一样,类似递归结构

3.图片位置除了背景图,还需要展示其他的信息,比如新人礼包弹窗展示优惠券(需要实现ReplaceParam来完成)

1)实现接口ReplaceParam,bean名称为参数名,重写replace方法,以下为‘新人券包’的demo代码

2)配置demo(即bg_img字段值),{newUserCoupon}是一个动态参数,运行过程中替换掉:
{"imgUrl": "{\"imgUrl\":\"https://img.domain.com/aaa.png\",\"newUserCoupon\":{newUserCoupon}}","type": "api","value": "https://domain.com/api/coupon/recive?id=8"
}
问:imgUrl为什么要配置为json字符串?
答:灵活运用固定字段响应数据给到前端,不同业务场景可定义不同的字段返回,只要跟前端约定好即可
数据响应示例:

4.在运行时给用户做一些弹窗埋点,比如完成某个事件后给用户埋一个弹窗,用户下次进入应用就给他弹
解:增加1张表mk_user_popup,字段与mk_popup差不多,但是不需要配置mk_popup_condition,因为这种弹窗只弹1次已经能满足需求,如有特殊需求也可以特殊设计
CREATE TABLE `mk_user_popup` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`user_id` int(11) NOT NULL COMMENT 'bu_user_info.id',`begin_time` datetime NOT NULL COMMENT '有效期开始时间',`end_time` datetime NOT NULL COMMENT '有效期结束时间',`status` varchar(8) NOT NULL DEFAULT '' COMMENT '状态(off:下架,on:上架)',`priority` int(11) NOT NULL DEFAULT '0' COMMENT '优先级(值越大,优先级越高)',`title` varchar(32) NOT NULL DEFAULT '' COMMENT '标题',`text` varchar(128) NOT NULL DEFAULT '' COMMENT '文案',`bg_img` varchar(255) NOT NULL DEFAULT '' COMMENT '背景图json数据',`close_btn` varchar(255) NOT NULL DEFAULT '' COMMENT '关闭按钮json数据',`remark` varchar(255) DEFAULT NULL COMMENT '备注',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,KEY `idx_userid` (`user_id`),KEY `idx_userid_begintime` (`user_id`,`begin_time`),KEY `idx_userid_endtime` (`user_id`,`end_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户弹窗';
PopService中增加以下代码

tips:还有些步骤型的逻辑,每步骤都有1个弹窗,比如进行到第1步,给用户埋了1个弹窗,但用户一直没有进入应用,后面流转到第2步了,又埋了1个弹窗。此时如果用户进入应用,就会先后看到2个弹窗,其实第1步的弹窗对于用户来说已经没有意义了(造成不好的用户体验),直接给用户弹第2步的弹窗即可。所以可以设计取消弹窗的操作,在埋第2步弹窗的同时把第1步弹窗取消掉。
扩展思考:
1.弹窗做成不同的表现形式,比如提示框效果,过一段时间自动消失
2.弹窗自动关闭,比如倒计时n秒后自动关闭
怎么样?如果你觉得有用的话,还不快快收藏起来!!!
附:涉及的代码目录
github:https://github.com/897665787/springcloud-template
gitee:springcloud-template: 一个基于springcloud netflix微服务框架,记录了关于微服务开发的一些最佳应用,欢迎大家学习指导。
springcloud-template
└── template-tool
└──controller
└── PopupController -- 最优弹窗查询API
└── popup
└── PopCondition -- 抽象定义使用条件
└── PopParam -- 弹窗条件参数
└── PopService -- 弹窗查询的核心代码
└── ReplaceParam -- 参数替换接口
└── condition -- 弹窗条件实现类(条件就新增到这下面)
└── FrequencyCondition -- 弹窗频率
└── PushAreaCondition -- 推送地区
└── ... -- 其他弹窗条件
└── param -- 参数替换实现类(复杂条件就新增到这下面)
└──NewUserCouponReplaceParam -- 新人券包
└── ... -- 其他参数替换
相关文章:
如何设计一个ToC的弹窗
本文主要分享了如何设计一个具有高可扩展性的弹窗功能。 本设计参考了优惠券功能的设计思路,有兴趣的朋友可以看看优惠券的分享:如何设计一个可扩展的优惠券功能_java优惠券系统设计-CSDN博客 一、需求介绍 假如你的项目需要实现以下弹窗,…...
Idea执行Pom.xml导入jar包提示sun.misc.BASE64Encoder jar找不到---SpringCloud工作笔记197
奇怪之前都是好好的,这个是因为,jdk的版本不对,重新打开以后自动被选择成jdk11了...记录一下 原因是从jdk9的时候,这个jar包已经被删除了,所以会报错,如果你用的是jdk自带的这个jar包就会报错,那么还可以,修改,不让他用jdk的,让他用 用org.apache.commons.codec.binary.Base64…...
大数据面试题:Spark和Flink的区别
面试题来源: 《大数据面试题 V4.0》 大数据面试题V3.0,523道题,679页,46w字 可回答:1)Spark Streaming和Flink的区别 问过的一些公司:杰创智能科技(2022.11),阿里蚂蚁(2022.11)&…...
2023年9月青少年软件编程(C 语言) 等级考试试卷(二级)
2023年9月青少年软件编程(C 语言) 等级考试试卷(二级) 编程题 1.数组指定部分逆序重放 题目描述 将一个数组中的前k项按逆序重新存放。 例如,将数组8,6,5,4,1前3项逆序重放得到5,6,8,4,1。 输入 输入为两行ÿ…...
【Wifi】Wifi架构介绍
Wifi架构介绍 本文基于Android介绍其Wifi架构。Wifi是许多操作系统提供的重要功能之一,特别是越来越多的车载系统wifi是其必备功能。为啥wifi是必备功能? 一方面是传统的上网(现在有些车载使用DCM模块管理网络),另一方…...
攻防世界数据逆向 2023
https://adworld.xctf.org.cn/contest/list?rwNmOdr1697354606875 目录 请求数据参数加密 cookie加密 响应数据解密 代码 请求数据参数加密 我们可以根据请求的关键字qmze1yzvhyzcyyjr获取到对应的加密地方 可以看到使用了函数_0x1dc70进行了加密 cookie加密 该步骤需…...
分布式链路追踪如何跨线程
背景 我们希望实现全链路信息,但是代码中一般都会异步的线程处理。 解决思路 我们可以对以前的 Runable 和 Callable 进行增强。 可以使用 ali 已经存在的实现方式。 TransmittableThreadLocal (TTL) 解决异步执行时上下文传递的问题 核心的实现思路如下&#…...
怎样在线修剪音频文件了?【免费,无须注册】
怎样在线修剪音频文件了? 推荐一个免费网址,且不用任何注册,直接可以使用 https://mp3cut.net/cn/ 上传音频文件, 拖动前后滚动条,对音频文件进行修剪。 修剪完成,可以保存如下格式 enjoy!! 作者简介…...
iMeta框架使用方法
📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…...
视频编辑软件 Premiere Pro 2024 macv24.0中文版 (pr2024)
Premiere Pro 2024 mac编辑任何现代格式的素材,从8K到虚拟现实。广泛的原生文件支持和简单的代理工作流程可以轻松使用您的媒体,即使在移动工作站上也是如此。提供针对任何屏幕或平台优化的内容比以往任何时候都快。 Premiere Pro 2024 Mac版软件介绍 视…...
C/C++:双向队列的实现
/** * * Althor:Hacker Hao * Create:2023.10.11 * */#include <bits/stdc.h> using namespace std; #define MAXSIZE 200 typedef struct Deque {int front; //头int rear; //尾int num; //队列中的元素数量int arr[MAXSIZE]; //队列中存储的数字 };Deque…...
MySQL逻辑架构
文章目录 逻辑架构剖析1. 连接层2. 服务层3. 引擎层4. 存储层 SQL执行流程1. MySQL中的 SQL执行流程(理论)2. MySQL8中的 SQL 执行流程(实践)确认profiling 是否开启多次执行相同SQL查询查看profiles查看profile 3. SQL语法顺序 数…...
python爬虫练手项目之获取某地企业名录
因为很多网站都增加了登录验证,所以需要添加一段利用cookies跳过登陆验证码的操作 import pandas as pd import requests from lxml import etree # 通过Chrome浏览器F12来获取cookies,agent,headers cookies {ssxmod_itna2:eqfx0DgQGQ0QGDC…...
Python —— 接口自动化(1)
1、接口测试的基础概述 1、接口测试的方式 1、主流的工具类型 - jmeter,postman,apifox,fastapi,apipost.... 2、公开的自动化平台 - metersphere,yapi.... 3、公司内部自研平台 - 4、全面使用代码自己去完成框架搭建,项目实战.... 不论是平台还是工具࿰…...
【MySQL】关于MySQL升级到8.0版本的实践方案
关于MySQL升级到8.0版本的实践方案 关于数据库版本升级,一直都是热议话题,对于升级的缘由各家也有所不同,有业务驱动的,有DBA自发驱动的,有规划导向也有方向指引的……抛开各种原因,当升级这个决定落下来的时候,对于DBA手头的几百几千套数据库来说,就好比是一场动物大…...
【Python-Django】基于TF-IDF算法的医疗推荐系统复现过程
复现步骤 step1: 修改原templates路径,删除,将setting.py中的路径置空 step2: 注册app python manage.py startapp [app名称]在app目录下创建static和templates目录 step3: 将项目中的资源文化进行拷贝 step4&#…...
车辆车型识别系统python+TensorFlow+Django网页界面+算法模型
一、介绍 车辆车型识别系统。本系统使用Python作为主要开发编程语言,通过TensorFlow搭建算法模型网络对收集到的多种车辆车型图片数据集进行训练,最后得到一个识别精度较高的模型文件。并基于该模型搭建Django框架的WEB网页端可视化操作界面。实现用户上…...
小程序如何设置各种时间参数
在小程序管理员后台->基本设置处,可以设置各种时间。例如待支付提醒时间、待支付取消时间、自动发货时间、自动收货时间、自动评价时间等等。下面具体解释一下各个时间的意思。 1. 待支付提醒时间:在用户下单后,如果一段时间内没有完成支付…...
CSS变量 var()的用法
写在前面 这里介绍一下开发中常用的css变量var(),它可以实现样式的动态设置,使用方法主要分为全局使用和局部使用两种。 如何定义CSS变量var() 在CSS文件中,变量需要使用 – 作为前缀来定义,后面跟上变量名和值,如&a…...
设计模式——21. 中介者模式
1. 说明 中介者模式(Mediator Pattern)是一种行为设计模式,它允许对象之间通过一个中介者对象进行通信,而不是直接相互引用。这种模式有助于减少对象之间的直接关联,从而提高系统的可维护性和松耦合性。中介者模式将对象之间的交互集中在一个中介者对象中,该对象负责协调…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
