• 自动秒收录
  • 软件:1973
  • 资讯:57811|
  • 收录网站:279872|

IT精英团

基于位置变化的市县弹出引导切换

基于位置变化的市县弹出引导切换

浏览次数:
评论次数:
编辑: 阳煦
信息来源: ITPUB
更新日期: 2022-09-08 21:22:53
摘要

目录1.背景2.模型方案产出3.总结01背景58App业务中有城市和县域两个首页,两者中间有一个过渡选择页,用户通过点击该页面下的条目内容可以切换到对应条目的首页;比如:点击“北京”会跳转到北京(市)

  • 正文开始
  • 相关阅读
  • 推荐作品

记录

1.背景

2.模型方案产出

3.总结

01

背景

58App业务有市县两个首页,中间有过渡选择页面。用户可以通过点击该页面下的词条内容切换到相应词条的首页;比如点击“北京”会跳转到北京(市)首页,点击“大兴”会跳转到大兴(县)首页。

, 34, 34);font-family: -apple-system, "system-ui", "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.544px;background-color: rgb(255, 255, 255);line-height: 2em;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;'>除了用户直接通过上述提及的选择页切换城市和县域外,58App内还有另一种切换首页的方式——基于位置变化的弹窗式引导切换。当用户的定位城市及县域与当前选择的城市或县域有差异时,此时App会主动弹出一个窗,提示用户将首页切换到当前定位的城市首页或者是县域首页。

具体引导切换到城市首页还是县域首页,是通过服务端下发开关配置进行控制的。需要注意的是,App同时只能存在一个首页,当位置变化后,切换到城市首页和县域首页的可能性都存在,如果服务端将这两种开关同时打开的话,势必会造成客户端弹窗引导切换冲突的问题。

当用户所处的位置在某市下的某县时,APP此时出现了弹窗冲突:

如何避免上述弹窗引导切换时发生冲突呢?

一开始,弹窗是这样处理的:

产品方面

  1. 通过产品经理人工分析总结可能存在引导切换城市和县域的场景(弹窗);

  2. 同时靠人力分析每个场景(弹窗)之间存在的冲突情况;

  3. 运营在下发不同配置开关引导首页切换分发流量时,思考是否会产生冲突(多个弹窗)。

打开指定开关引导特定场景首页切换;同样,关闭开关暂时阻断特定场景的切换。

开发方面

  1. 程序开发者通过产品经理总结的多场景分别进行处理;

  2. 程序开发者针对产品经理分析出的场景冲突进行解决。

  3. 每个场景对应各自的开关配置,每个开关对应不同的逻辑处理、对应各自的弹窗、对应各自的文案;

开发者此时在不停地解决QA反馈的弹窗冲突;因为产品经理也没有想到会出现“这样和那样”的场景冲突!!!

上述方案人为把控点多,场景错综复杂,人为干预每个环节出错率很高,同时对开关的配置也没有纠错和验证能力;除此,客户端处理的场景很多,解决的必要问题就一个,但是非必要问题很多。开发侧一直处于被动执行的情形,此时补的逻辑越多、错的地方就更多。以为是一个简单的弹窗需求,结果变成处理花式弹窗冲突的大坑。

引导切换场景中到底有多少场景是冲突的?整个引导过程中又有多少种切换场景呢? 这个问题此时很难有人说得具体。

针对如此难解问题,作者思考做了一套模型:模型完整地罗列了一张58App中所有基于位置变化后城市与县域互相切换的场景表;更直观的是,此模型直接表达出了所有切换场景间存在的冲突项。


02

模型方案产出

2.1 模型方案产出

知道了上述的需求背景和开发痛点后,首先把方案设计要解决的问题和事项加以罗列:

  1. 如何全面产出城市和县域首页互相切换存在的各种场景;

  2. 如何分析得出上述各种场景可能存在的冲突项;

  3. 最终通过分析出的①场景和②冲突项,合理制定一套高效准确无冲突的开关配置协议,满足产品运营需求。

模型思考设计:

  1. 使用面向对象思维,将城市和县域两个实体分别用两种变量表示。

  2. 两种不同的变量切换其实是一种交换关系,交换包括与自己交换和与非己交换。

  3. 城市和县域本身存在上下级关系,涉及到下级的交换时要考虑上级是否也存在交换关系。

  4. 用变量表示出所有的交换项,这些变量交换项便是带有上下级关系的全部切换场景。

  5. 分析上述全部变量交换项,找出存在包含与被包含的交换项,出现包含关系的两个交换项则认为存在冲突关联——互斥的事件即不会同时发生——有交集才会有冲突

  6. 通过步骤4和5的结果,确定开关配置协议(用于控制不同场景下的切换弹窗)。

模型的思路可以用简单的几个关键词表达:变量、交换(切换)、上下级、交集(冲突)

具体模型推演:

  1. 城市用变量X表示,县域用变量Y表示。

  2. 城市与城市的交换表示为:X->X’,城市与县域的交换表示为:X->Y;县域与县域的交换表示为:Y->Y’,县域与城市的交换表示为:Y->X

  3. 城市属于上级,用单个X变量表示即可;县域属于城市下级,单纯的变量Y在这里表示县域不再充分,这里在原来县域变量Y前面加上城市变量X来表示带有所属关系的县域XY更准确。

  4. 加入上下级关系后,城市与己因为没有下级关系,所以互相交换还是用X->X’ 表示;城市与县域的交换则需要考虑目标县域是否与当前城市相同与否的情况,相同用X->XY表示,不同则用X->X’Y表示。同理,县域与己的交换也要考虑目标县域是否与当前县域所在的城市相同与否的情况,相同用XY->XY’ 表示,不同则用XY->X’Y’ 表示;县域与城市的交换考虑的则是目标城市是否与当前县域所在的城市相同与否的情况,相同用XY->X表示,不同则用X’Y->X表示。整张关系表如下:

  5. 上述交换项中可以看出:城市切换时,存在X->X’被X->X’Y包含的情况(X->X’ ∩ X->X’Y = X->X’);县域切换时,存在XY->XY’包含XY->X的情况(XY->XY’ ∩ XY->X = XY->X),XY->X’Y’包含XY->X’ 的情况(XY->X’Y’ ∩ XY->X’ = XY->X’)。

  6. 步骤4中的结果一共有7个交换项,这7项中又包含步骤5中的3个关联交集;也就是说,考虑关联交集(冲突)后,能够同时存在的交换项个数最多是4个(因为其它3个与这4个有冲突)。

协议开关配置:

如此,协议开关配置时变得很简单了,只要按模型校验逻辑即可。

方案详解:

  1. 服务端下发开关配置协议时,从全量派发改为按需下发,原来要下发7个全场景,现在只按引流需求下发。7种引导场景,择需下发;选择时如果出现冲突,模型算法可以提示和排除冲突(开关最多下发不会超过4个)。

  2. 客户端处理弹窗逻辑时,不再考虑弹窗冲突的问题,逻辑仅体现在选择和定位的城市或县域信息不一致的处理上。原来要为7个配置开关设置7个逻辑弹窗,引入模型后,只需处理4个逻辑,也就是推演步骤2中的四种场景,即选择的城市或县域和定位的城市或县域的两两组合。假设,用户选择了X市首页,当前定位在X’市,这时候只需遍历下发的开关中是否存在“引导从城市切换到其他城市首页”的开关即可;如果有,则弹窗;否则,不弹窗。弹窗文案同时可以模板化——“当前浏览的是X市(县),是否切换到X’Y县(市)”。

经过这样的模型算法,其实已经筛选了服务端存在冲突的协议开关;同时,客户端也会将多种场景经过定位数据筛选最终匹配到最多一种开关设置的场景。

通过以上设计思路演进和步骤实现,最终产出的模型可以完整、高效、准确、无冲突地解决城市与县域互相切换的开关配置问题。

使用本方案,只需一套标准模型算法即可解决多种场景下的错综弹窗问题,多场景问题得到了归一处理。解决了服务端下发协议考虑冲突的难题;同时,减轻了客户端处理多个场景的逻辑负担。


03

总结

总结

  1. 通过模型,产出了城市与县域互相切换的场景表;又通过模型算法,计算出了这些场景表中存在的冲突项;最后,通过服务端下发排除了冲突项后的场景开关配置,可以准确控制App弹窗引导切换城市和县域首页。

  2. 比传统人工分析会具有理论价值意义,且更具备系统性,逻辑简单,产生的结果更全面准确,排除了人为分析出错的可能,减少了客户端对多种情况的弹窗和逻辑判断处理负担,客户端弹窗逻辑维护成本低,分析出的冲突关系也更具完善性和精准性。

  3. 这套理论模型基本可以应用到一切带有上下级关系互换位置的逻辑分析和处理,理论应用场景广泛。

标签:县域 城市 场景
基于iframe的微前端框架——青田
« 上一篇 2022-09-08
springboot集成docsify实现可移植文档
下一篇 » 2022-09-09
  • 如何在Ubuntu中保留文件系统并备份当前开发板镜像
    0阅读 0条评论 个赞
    在Ubuntu保留文件系统或者说备份当前开发板镜像的需求在不断增加。比如Ubuntu文件系统需要安装库文件的话直接使用apt-get工具就可以下载,但由于需要下载的核心板较多,比较费时间,这时需要将安……
  • 国产核心板全志T507助力消防系统升级
    0阅读 0条评论 个赞
    9月16日下午,位于湖南长沙市区内的中国电信大楼发生火灾,建筑高度218米,现场浓烟滚滚,数十层楼体燃烧剧烈。消防救援人员赶到现场后很快将火势控制住,目前大楼火势已被扑灭,所幸未发现人员伤亡。湖南电信……
  • 教大家如何处理Spring Boot易流中的用户和群体!
    0阅读 0条评论 个赞
    1.准备工作2.用户操作2.1添加用户2.2修改用户2.3删除用户2.4查询用户3.组操作3.1添加组3.2修改组3.3删除组3.4查询组4.查看表详情虽然说我们在实际开发中,……
  • 从PG15开始WAL压缩优化
    0阅读 0条评论 个赞
    PG15传闻中的超级令人激动的功能大多数跳票了,年初我也写过一个关于PG15新功能跳票的文章。PG15BETA已经发出几个月了,似乎PG15里令人激动人心的功能不多,不过从长长的新功能列表里,……
  • 深入了解美团叶子发射器开源方案
    0阅读 0条评论 个赞
    大家好,我是树哥。之前我们有聊过「如何设计一个分布式ID发号器」,其中有讲过4种解决方案,分别是:UUID类雪花算法数据库自增主键Redis原子自增美团以第2、3种解决方案为基础,开发出……
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
  • [设计模式] Java设计模式-工厂模式
    3阅读 0条评论 个赞
    目录【设计模式】Java设计模式-工厂模式简介1、普通工厂(SimpleFactory)模式①、定义类②、定义简单的工厂类③、实例2、抽象工厂(AbstractFactory)模式①、定义类②、……
  • 谈谈动态线程池的9个场景(改进版)
    0阅读 0条评论 个赞
    大家好,我是小马哥。线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。……
  • c#异步高级————通道[1]
    0阅读 0条评论 个赞
    前言该系列为异步编程的进阶篇,其实也不能这么讲。世界上本没有进阶篇,只能说是高级篇(高级篇不能说多高级,是对底层的封装的意思),只要是加深理解都是进阶。本章先介绍一下channel。正文下面没什么好说……
  • 深入理解Redis数据结构-字典
    0阅读 0条评论 个赞
    字典,又称为符号表、关联数组或映射,是一种用于保存键值对的抽象数据结构。在字典中,一个键可以和一个值进行关联,这些关联的键和值称为键值对。键值对中键是唯一的,我们可以根据键key通过映射查找或者更新对……
  • smile——Java机器学习引擎
    2阅读 0条评论 个赞
    资源https://haifengl.github.io/https://github.com/haifengl/smile介绍Smile(统计机器智能和学习引擎)是一个基于Java和Scala的快速……
  • 关于这个能见度的例子 网上95%的文章都是错的!
    0阅读 0条评论 个赞
    你好,我是坤哥上周我在查阅资料时无意中搜到一篇解释volatile用法的博文,这篇博文排得很靠前,不过很遗憾,虽然结论是对的,但分析过程完全错误,而且我发现网上很多文章都用这个例子来解释vola……
  • SQL Server复制:事务发布
    0阅读 0条评论 个赞
    一、背景在复制的运用场景中,事务发布是使用最为广泛的,我遇到这样一个场景:在Task数据库中有Basic与Group两个表,需要提供这两个表的部分字段给其它程序读取放入缓存,程序需要比较及时的获取……
  • 如何保持Mysql和Redis数据一致
    0阅读 0条评论 个赞
    先阐明一下Mysql和Redis的关系:Mysql是数据库,用来持久化数据,一定程度上保证数据的可靠性;Redis是用来当缓存,用来提升数据访问的性能。关于如何保证Mysql和Redis中的数据一致(……
  • SQL Server 2005分区模板和实例
    0阅读 0条评论 个赞
    一、场景这一段时间使用SQLServer2005对几个系统进行表分区,这几个系统都有一些特点,比如数据库某张表持续增长,给数据库带来了很大的压力。现在假如提供一台新的服务器,那么我们应该如何规划……
  • Linux环境程序如何运行?
    0阅读 0条评论 个赞
    .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
  • 数据库发展史1-传统数据库
    0阅读 0条评论 个赞
    1946年,美国宾夕法尼亚大学诞生了人类第一台电子计算机--ENIAC(ElectronicNumericalIntegratorAndComputer,即电子数字积分计算机),这个占地170……
  • Python条件语句的用法
    0阅读 0条评论 个赞
    python条件语句使用if表达式,难度不高,需要注意的是嵌套用法,以及如何设置对应的条件。if条件判断语句python语句是按固定顺序执行的,先执行前面的语句,再执行后面的语句。如果你像要程……
  • 大促销活动如何抵御高流量DDoS攻击?
    0阅读 0条评论 个赞
    大促活动如何抵御大流量DDoS攻击?每一次活动大促带来的迅猛流量,对技术人而言都是一次严峻考验。如果在活动期间遭受黑产恶意DDoS攻击,无疑是雪上加霜。电商的特性是业务常态下通常不会遭受大流量DD……
  • 订单超时案例的RabbitMQ实现
    0阅读 0条评论 个赞
    前言#人间清醒目录前言业务场景JUC(DelayQueue)方案DelayQueue简介JUCDelayQueue实现订单超时案例代码案例代码RedisKey过期事件方案简介RabbitKey……
  • 构建docker镜像库(1):用注册表构建本地镜像库
    0阅读 0条评论 个赞
    目录一.系统环境二.前言三.使用registry搭建私有镜像仓库3.1环境介绍3.2k8smaster节点配置镜像仓库3.3k8sworker1节点配置从私有仓库上传和拉取镜像3.3.1上传镜……
  • 当老板让我从Java8升级到Java11时
    4阅读 0条评论 个赞
    老板让我把一个项目从Java8迁移到Java11,我该怎么办呢?最简单的办法,当然是直接强行升级,遇到一个错就改一个错,别看它low,但是对于一个小型且非核心的项目来说,已经足够了。当然,……
  • Java内存区(运行时数据区)简介
    0阅读 0条评论 个赞
    Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8和之前的版本略有不同。下图是JDK1.8对JVM做的改动,把方法区的具体实现----元空……
  • 在头脑中扎根泛型的思想3354深刻理解泛型
    0阅读 0条评论 个赞
    1.前言往往一些刚接触C#编程的初学者,对于泛型的认识就是直接跳到对泛型集合的使用上,虽然微软为我们提供了很多内置的泛型类型,但是如果我们只是片面的了解调用方式,这会导致我们对泛型盲目的使用。至于为什……
  • 这三个特点让G1取代CMS!
    0阅读 0条评论 个赞
    大家好,我是树哥。之前我们聊过CMS回收器,但那时候我们说CMS回收器已经落伍了,现在应该是用G1回收器的时候了。那么G1回收器到底有什么魔力,它比CMS回收器相比强在哪里呢?今天……
  • 如何在C#程序中注入恶意DLL?
    6阅读 0条评论 个赞
    一:背景前段时间在训练营上课的时候就有朋友提到一个问题,为什么Windbg附加到C#程序后,程序就处于中断状态了?它到底是如何实现的?其实简而言之就是线程的远程注入,这一篇就展开说一下。二:……
最近发布资讯
更多