欢迎光临
我们一直在努力

大数据BI工具的移动端应用开发指南

大数据BI工具的移动端应用开发指南:从需求到上线的全流程实践

在数字经济时代,数据是企业的核心资产,但仅有数据还不够——企业需要让数据“动起来”,让决策层、业务人员随时随地能获取 insights。这正是大数据BI(商业智能)工具移动端应用的核心价值:打破时间与空间限制,让数据决策从“办公室”延伸到“机场、门店、会议室”。

比如:

  • 销售总监在出差途中,能通过手机实时查看区域销售额的 hourly 变化,快速调整促销策略;
  • 运营经理在门店调研时,能钻取“到店用户留存率”的明细数据,当场优化活动方案;
  • 财务主管在周末收到“月度成本超支预警”,点击通知就能查看成本结构的可视化分析。

本文将从需求分析、技术选型、核心功能实现、性能优化到上线运维,手把手教你搭建一个实用的大数据BI移动端应用。无论你是前端开发者想切入BI领域,还是BI团队想扩展移动端能力,都能找到可落地的实践方案。

一、第一步:需求分析——明确移动端的核心边界

在动手写代码前,必须先回答一个问题:移动端BI的核心价值是什么?

答案是:用“轻量化、场景化、即时性”弥补Web端BI的不足。因此,移动端的需求设计需遵循“核心功能优先、非必要功能舍弃”的原则,避免照搬Web端的复杂逻辑(比如复杂的报表建模)。

1.1 核心功能需求:聚焦“看、查、警”

移动端BI的功能应围绕“快速获取数据价值”设计,核心模块包括:

(1)数据可视化:适配移动端的“小屏体验”
  • 图表类型选择:优先支持“高信息密度+易读性”的图表,比如折线图(趋势)、柱状图(对比)、饼图(占比)、指标卡(关键数字);避免Web端的“复杂仪表板”(比如多图表嵌套)。
  • 交互设计:
    • 双指缩放:查看图表细节(比如某周的销售额);
    • 点击钻取:从“月度销售额”钻取到“周销售额→日销售额→具体订单”;
    • tooltip 提示:手指 hover 时显示“数值+维度说明”(比如“2023-10:12万 → 产品A贡献60%”);
    • 图表导出:支持保存为图片或PDF(方便分享到微信/邮件)。
(2)数据查询:用“场景化”替代“自助化”

Web端BI的“自助查询”(比如拖拽字段生成SQL)在移动端并不适用——小屏操作成本高。因此,移动端的查询需预定义场景:

  • 常用查询模板:比如“今日实时订单量”“本月区域销售排名”“最近7天用户留存率”;
  • 快捷筛选:支持“时间(近7天/近30天)、维度(产品/区域)”的快速切换;
  • 模糊搜索:比如搜索“产品A”,自动关联所有包含“产品A”的报表。
(3)预警通知:让数据“主动找用户”

移动端的核心优势是“即时性”,因此预警功能是差异化竞争力:

  • 预警类型:阈值预警(比如销售额<10万)、趋势预警(比如环比下降>20%)、异常值预警(比如某产品销量突然暴涨);
  • 推送策略:
    • 优先级:重要预警(比如“成本超支”)用弹窗+声音,次要预警(比如“库存预警”)用小红点;
    • 内容:避免敏感数据,仅显示“预警类型+报表ID”(比如“【警告】本月成本超支15%,点击查看详情”);
  • 处理流程:用户点击预警→跳转到对应报表→显示“预警原因分析”(比如“成本超支源于原材料价格上涨25%”)。
(4)权限管理:从“功能权限”到“数据权限”

BI工具的核心风险是“数据泄露”,因此移动端的权限需做到细粒度:

  • 角色权限:比如“销售总监”能看所有区域的销售额,“区域经理”只能看自己区域的;
  • 数据行级权限:比如“业务员”只能看自己负责的客户数据;
  • 操作权限:比如“查看”“编辑”“导出”的区分(普通员工只能查看,管理员能编辑)。

1.2 非功能需求:移动端的“生存底线”

  • 性能需求:
    • 页面加载时间≤2秒(从点击到显示图表);
    • 离线支持:无网络时能查看“最近7天的缓存数据”;
  • 安全需求:
    • 传输加密:所有接口用HTTPS,敏感数据用Protobuf代替JSON;
    • 本地加密:敏感数据(比如用户Token、报表ID)存到Keychain(iOS)/Keystore(Android);
  • 兼容性需求:
    • 系统版本:支持iOS 14+、Android 10+(覆盖90%以上用户);
    • 屏幕适配:支持iPhone SE(小屏)到iPhone 15 Pro Max(大屏)的适配。

二、第二步:技术选型——从框架到数据层的决策逻辑

移动端BI的技术选型需平衡开发效率、性能、扩展性三个维度。以下是关键环节的选型逻辑:

2.1 移动端框架:原生 vs 跨平台 vs 混合开发

方案技术栈优势劣势适用场景
原生开发 iOS(Swift)、Android(Kotlin) 性能最优、系统适配性好 开发成本高(双端维护)、迭代慢 对性能要求极高(比如实时图表渲染)
跨平台开发 Flutter、React Native 一套代码跑双端、开发效率高 复杂交互的性能略逊于原生 需要快速迭代、双端功能一致的项目
混合开发 Cordova、Ionic 复用Web端BI代码、成本最低 性能最差、用户体验接近Web 已有Web BI系统,快速适配移动端

推荐选型: 如果团队有 Flutter 经验,优先选Flutter——它的“自绘引擎”(Skia)能保证图表渲染的性能,且生态成熟(比如syncfusion_flutter_charts支持20+图表类型)。

2.2 数据层与后端:聚焦“高效、实时、安全”

(1)数据接口:GraphQL 优于 RESTful

移动端的核心痛点是“数据传输量”——小屏不需要Web端的“全量数据”。GraphQL的“按需取数”特性完美解决这个问题:

  • 比如,Web端返回“销售额、成本、利润、毛利率”4个字段,移动端只需“销售额、利润”,用GraphQL可直接指定字段,减少50%的数据量。
  • 示例GraphQL查询:query GetSalesData($month: String!) {
    sales(month: $month) {
    date # 仅取日期
    totalSales # 仅取销售额
    profit # 仅取利润
    }
    }
(2)数据缓存:本地数据库+Redis 组合
  • 本地缓存:用Realm(跨平台)或SQLite(原生)存储常用报表数据,过期时间设为“1小时”(平衡实时性与性能);
  • 后端缓存:用Redis存储“高频查询数据”(比如“今日实时订单量”),减少数据库压力。
(3)可视化引擎:选“开箱即用”的组件库
  • Flutter:syncfusion_flutter_charts(功能全,支持钻取、tooltip、导出)、fl_chart(轻量,适合简单图表);
  • iOS:Charts(开源,社区活跃);
  • Android:MPAndroidChart(功能强大,支持动态数据更新)。

2.3 推送与消息:可靠的“预警通道”

  • 推送服务:国内选极光推送(支持iOS/Android/小程序),国际选Firebase Cloud Messaging(FCM);
  • 消息队列:用Kafka或RabbitMQ处理预警事件,确保“不丢消息”(比如“成本超支”的预警必须100%推送到用户)。

三、第三步:核心功能实现——代码实践

以下以Flutter + GraphQL + Syncfusion Charts为例,实现“销售报表可视化”与“预警通知”功能。

3.1 环境搭建:Flutter 项目初始化

  • 安装Flutter SDK(参考Flutter 官网);
  • 创建项目:flutter create sales_bi_app;
  • 添加依赖(pubspec.yaml):dependencies:
    flutter:
    sdk: flutter
    syncfusion_flutter_charts: ^25.1.39 # 可视化组件
    graphql_flutter: ^5.1.2 # GraphQL 客户端
    flutter_secure_storage: ^9.0.0 # 本地安全存储
    hive: ^2.2.3 # 本地数据库(轻量替代Realm)
    hive_flutter: ^1.1.0
  • 3.2 核心功能1:移动端图表渲染(以折线图为例)

    我们用syncfusion_flutter_charts实现一个“月度销售额趋势图”,支持双指缩放、点击钻取。

    (1)定义数据模型

    // sales_model.dart
    class SalesData {
    final String date; // 日期(比如“10-01”)
    final double amount; // 销售额

    SalesData(this.date, this.amount);
    }

    (2)编写GraphQL查询

    用graphql_flutter请求后端数据:

    // sales_repository.dart
    import 'package:graphql_flutter/graphql_flutter.dart';
    import 'package:sales_bi_app/models/sales_model.dart';

    class SalesRepository {
    final GraphQLClient client;

    SalesRepository({required this.client});

    // 获取月度销售额数据
    Future<List<SalesData>> getMonthlySales(String month) async {
    const String query = r'''
    query GetMonthlySales(
    $month: String!) {
    monthlySales(month:
    $month) {
    date
    amount
    }
    }
    '''
    ;

    final QueryOptions options = QueryOptions(
    document: gql(query),
    variables: {'month': month},
    );

    final QueryResult result = await client.query(options);

    if (result.hasException) {
    throw Exception(result.exception.toString());
    }

    // 将JSON转成数据模型
    return (result.data!['monthlySales'] as List)
    .map((e) => SalesData(e['date'], e['amount'].toDouble()))
    .toList();
    }
    }

    (3)封装图表组件

    // sales_chart.dart
    import 'package:flutter/material.dart';
    import 'package:syncfusion_flutter_charts/charts.dart';
    import 'package:sales_bi_app/models/sales_model.dart';

    class SalesLineChart extends StatelessWidget {
    final List<SalesData> data;

    const SalesLineChart({super.key, required this.data});


    Widget build(BuildContext context) {
    return SfCartesianChart(
    // 图表标题
    title: ChartTitle(text: '月度销售额趋势'),
    // X轴(日期)
    primaryXAxis: CategoryAxis(
    labelRotation: 45, // 旋转标签避免重叠
    title: AxisTitle(text: '日期'),
    ),
    // Y轴(销售额)
    primaryYAxis: NumericAxis(
    title: AxisTitle(text: '销售额(万元)'),
    numberFormat: NumberFormat.currency(symbol: '¥'), // 格式化显示“¥”
    ),
    // 折线图数据
    series: <LineSeries<SalesData, String>>[
    LineSeries<SalesData, String>(
    dataSource: data,
    xValueMapper: (SalesData sales, _) => sales.date,
    yValueMapper: (SalesData sales, _) => sales.amount,
    color: Colors.blue,
    width: 2,
    // 标记点(显示每个日期的销售额)
    markerSettings: const MarkerSettings(isVisible: true),
    // tooltip(点击时显示详情)
    tooltipMapper: (SalesData sales, _) =>
    '日期:${sales.date}\\n销售额:¥${sales.amount.toStringAsFixed(2)}',
    ),
    ],
    // 交互功能:双指缩放、点击钻取
    zoomPanBehavior: ZoomPanBehavior(
    enablePinching: true, // 双指缩放
    enablePanning: true, // 拖动
    ),
    // 点击事件:钻取到日销售额明细
    onChartTouchInteractionUp: (ChartTouchInteractionArgs args) {
    if (args.position == null) return;
    // 获取点击的坐标对应的日期
    final ChartPointDetails details =
    chartController.chartPointInfo(
    args.position!,
    chartController.chartSeries[0]
    );
    if (details.dataPointIndex == null) return;
    final SalesData selected = data[details.dataPointIndex!];
    // 跳转到明细页面
    Navigator.push(
    context,
    MaterialPageRoute(
    builder: (context) => DailySalesDetailPage(date: selected.date),
    ),
    );
    },
    );
    }
    }

    3.3 核心功能2:预警通知实现

    预警功能的核心是“后端触发→推送服务→移动端处理”,以下是Flutter中的实现步骤:

    (1)集成推送服务(以极光推送为例)
  • 注册极光推送账号,创建应用,获取AppKey;
  • 添加依赖:jpush_flutter: ^6.2.11;
  • 初始化推送(main.dart):import 'package:jpush_flutter/jpush_flutter.dart';

    void main() async {
    WidgetsFlutterBinding.ensureInitialized();
    // 初始化极光推送
    final JPush jpush = JPush();
    await jpush.setup(
    appKey: '你的极光AppKey',
    channel: 'channel',
    production: false, // 测试环境
    );
    // 监听推送通知
    jpush.addEventHandler(
    onReceiveNotification: (Map<String, dynamic> message) async {
    print('收到推送:$message');
    // 处理推送:显示弹窗或跳转到报表
    final String reportId = message['extras']['reportId']; // 后端传递的报表ID
    Navigator.push(
    context,
    MaterialPageRoute(
    builder: (context) => ReportDetailPage(reportId: reportId),
    ),
    );
    },
    );
    runApp(const MyApp());
    }

  • (2)后端预警逻辑(以Python Flask为例)

    后端需监控数据阈值,触发预警后推送到极光:

    # app.py
    from flask import Flask
    from jpush import JPushClient # 极光Python SDK

    app = Flask(__name__)
    jpush = JPushClient(app_key='你的极光AppKey', master_secret='你的MasterSecret')

    # 模拟监控销售额阈值
    def check_sales_threshold(sales_amount):
    if sales_amount < 100000: # 10万阈值
    # 推送预警通知
    jpush.push().set_platform('android', 'ios').set_audience('all').set_notification(
    alert='【警告】今日销售额低于10万',
    ios=IosNotification(
    sound='default',
    extras={'reportId': 'sales_20231001'} # 报表ID
    ),
    android=AndroidNotification(
    sound='default',
    extras={'reportId': 'sales_20231001'}
    )
    ).send()

    # 示例接口:接收实时销售额
    @app.post('/api/sales/real-time')
    def real_time_sales():
    data = request.get_json()
    sales_amount = data['amount']
    check_sales_threshold(sales_amount)
    return {'code': 0, 'msg': 'success'}

    3.4 核心功能3:离线支持

    移动端常遇到“无网络”场景(比如地铁、偏远地区),因此离线缓存是必备功能。我们用hive实现“常用报表的本地缓存”。

    (1)初始化Hive

    // main.dart
    import 'package:hive_flutter/hive_flutter.dart';
    import 'package:sales_bi_app/models/sales_model.dart';

    void main() async {
    await Hive.initFlutter();
    // 注册SalesData的适配器(用于序列化)
    Hive.registerAdapter(SalesDataAdapter());
    await Hive.openBox<SalesData>('salesBox'); // 打开名为“salesBox”的数据库
    runApp(const MyApp());
    }

    (2)缓存逻辑实现

    // sales_repository.dart
    import 'package:hive/hive.dart';
    import 'package:sales_bi_app/models/sales_model.dart';

    class SalesRepository {
    final GraphQLClient client;
    final Box<SalesData> salesBox;

    SalesRepository({required this.client, required this.salesBox});

    Future<List<SalesData>> getMonthlySales(String month) async {
    // 先从缓存读取
    final List<SalesData>? cachedData = salesBox.get(month);
    if (cachedData != null && !_isCacheExpired(month)) {
    return cachedData;
    }

    // 缓存过期,请求后端
    final List<SalesData> remoteData = await _fetchFromRemote(month);
    // 存入缓存(键为month,值为数据)
    await salesBox.put(month, remoteData);
    return remoteData;
    }

    // 判断缓存是否过期(比如超过1小时)
    bool _isCacheExpired(String month) {
    final DateTime? lastUpdated = salesBox.get(month)?.lastUpdated;
    if (lastUpdated == null) return true;
    return DateTime.now().difference(lastUpdated).inHours > 1;
    }

    // 从后端获取数据(同之前的实现)
    Future<List<SalesData>> _fetchFromRemote(String month) async { ... }
    }

    四、第三步:性能与安全——移动端BI的“生命线”

    即使功能再完善,性能差、安全漏洞也会让用户弃用你的应用。以下是关键优化点:

    4.1 性能优化:解决“加载慢、渲染卡”

    (1)数据层面优化
    • 数据压缩:用Protobuf代替JSON(数据大小减少60%以上);
    • 懒加载:滚动到图表区域时再加载数据(用Flutter的VisibilityDetector组件);
    • 增量同步:仅同步“新增/修改的数据”(比如今日新增的销售额),而非全量同步。
    (2)渲染层面优化
    • 避免频繁重绘:用const修饰不变的组件(比如图表标题),减少Widget重建;
    • 局部刷新:用ValueNotifier或Bloc更新图表数据,而非重建整个页面;
    • 图表虚拟化:如果有100+个数据点,只渲染“当前视口内的点”(syncfusion_flutter_charts支持enableVirtualization属性)。

    4.2 安全优化:防止“数据泄露”

    (1)传输安全
    • 所有接口用HTTPS,禁用HTTP;
    • 用“证书钉扎”(Certificate Pinning)防止中间人攻击(MITM)——比如Flutter用dio的DioCertificatePinning插件。
    (2)存储安全
    • 敏感数据(比如用户Token、报表ID)存到flutter_secure_storage(iOS的Keychain、Android的Keystore);
    • 本地数据库(Hive/Realm)用AES加密(比如hive的encrypted选项)。
    (3)权限安全
    • 后端需验证“用户权限”:比如请求“区域销售额”时,后端要检查用户是否属于该区域;
    • 移动端需“最小权限原则”:比如不请求“通讯录、相机”等无关权限。

    五、第四步:项目实战——从零搭建“销售报表”移动端App

    我们以“销售报表”为例,完整走一遍开发流程:

    5.1 需求定义

    • 核心功能:查看月度销售额趋势、按区域钻取、销售额低于10万预警;
    • 目标用户:销售总监、区域经理;
    • 非功能需求:加载时间≤2秒、支持iOS 14+和Android 10+。

    5.2 技术选型

    • 移动端框架:Flutter;
    • 数据接口:GraphQL;
    • 可视化组件:syncfusion_flutter_charts;
    • 推送服务:极光推送;
    • 本地缓存:Hive + flutter_secure_storage。

    5.3 开发流程

  • 搭建项目:用flutter create sales_bi_app创建项目,添加依赖;
  • 编写数据模型:定义SalesData、RegionSalesData;
  • 实现GraphQL客户端:用graphql_flutter请求后端数据;
  • 封装图表组件:实现月度销售额折线图、区域销售额柱状图;
  • 集成推送服务:用极光推送实现预警功能;
  • 添加离线支持:用Hive缓存常用报表;
  • 测试:用flutter test做单元测试,用flutter driver做UI测试。
  • 5.4 上线准备

    • iOS:
    • 注册苹果开发者账号($99/年);
    • 用Xcode打包IPA,上传到App Store Connect;
    • 等待审核(1-3天)。
    • Android:
    • 注册Google Play开发者账号($25一次性);
    • 用Android Studio打包APK/AAB;
    • 上传到Google Play或国内应用市场(华为、小米)。

    六、第五步:测试与运维——确保应用稳定

    6.1 测试要点

    • 功能测试:验证图表渲染、钻取、预警的正确性;
    • 性能测试:用flutter run –profile查看帧率(目标≥60fps);
    • 兼容性测试:在iPhone 12(小屏)、iPhone 15 Pro Max(大屏)、小米13(Android)上测试;
    • 安全测试:用Charles抓包,验证数据是否加密;用iMazing查看本地存储,验证敏感数据是否加密。

    6.2 运维要点

    • 性能监控:用Firebase Performance Monitoring查看“页面加载时间”“网络请求时间”;
    • 错误监控:用Sentry或Firebase Crashlytics收集Crash日志;
    • 用户反馈:用flutter_dialogflow集成“智能客服”,收集用户建议。

    七、未来趋势:AI与低代码重塑移动端BI

    移动端BI的下一个爆发点是**“智能化+平民化”**:

  • AI赋能:用大语言模型(LLM)生成“自然语言报表解读”(比如“本月销售额下降10%,主要原因是产品B的销量下降20%”);
  • 低代码配置:让业务人员通过“拖拽”配置移动端报表,无需开发者参与;
  • 多端协同:移动端修改报表,Web端同步更新;Web端创建的查询模板,移动端自动同步。
  • 八、结语:给开发者的3条建议

  • 聚焦场景,而非功能:移动端BI不需要“大而全”,只需要“解决用户的具体问题”;
  • 优先优化用户体验:小屏的交互设计比功能更重要——比如按钮大小≥44x44pt(符合iOS Human Interface Guidelines);
  • 持续迭代:通过用户反馈优化功能,比如“用户反馈预警太多”,可以增加“预警开关”让用户自定义。
  • 最后的话: 大数据BI的移动端开发,本质是“用技术解决业务的痛点”。与其追求“最先进的框架”,不如先想清楚“用户最需要什么”——毕竟,能帮用户“快速拿到数据 insights”的应用,才是好的移动端BI工具。

    如果你在开发中遇到问题,欢迎在评论区交流——让我们一起让数据决策更“移动”!

    工具与资源推荐

    • 可视化组件:syncfusion_flutter_charts(Flutter)、Charts(iOS)、MPAndroidChart(Android);
    • 推送服务:极光推送(国内)、Firebase Cloud Messaging(国际);
    • 性能监控:Firebase Performance Monitoring、Umeng;
    • 安全工具:flutter_secure_storage(本地加密)、dio(证书钉扎)。

    附录:Mermaid流程图

    (1)预警通知流程

    用户

    后端API

    移动端App

    极光推送

    消息队列

    后端监控系统

    用户

    后端API

    移动端App

    极光推送

    消息队列

    后端监控系统

    #mermaid-svg-0jSNSDLeHRsTe0KO{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0jSNSDLeHRsTe0KO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0jSNSDLeHRsTe0KO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0jSNSDLeHRsTe0KO .error-icon{fill:#552222;}#mermaid-svg-0jSNSDLeHRsTe0KO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0jSNSDLeHRsTe0KO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0jSNSDLeHRsTe0KO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0jSNSDLeHRsTe0KO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0jSNSDLeHRsTe0KO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0jSNSDLeHRsTe0KO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0jSNSDLeHRsTe0KO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0jSNSDLeHRsTe0KO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0jSNSDLeHRsTe0KO .marker.cross{stroke:#333333;}#mermaid-svg-0jSNSDLeHRsTe0KO svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0jSNSDLeHRsTe0KO p{margin:0;}#mermaid-svg-0jSNSDLeHRsTe0KO .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-0jSNSDLeHRsTe0KO text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-0jSNSDLeHRsTe0KO .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-0jSNSDLeHRsTe0KO .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-0jSNSDLeHRsTe0KO .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-0jSNSDLeHRsTe0KO .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-0jSNSDLeHRsTe0KO #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-0jSNSDLeHRsTe0KO .sequenceNumber{fill:white;}#mermaid-svg-0jSNSDLeHRsTe0KO #sequencenumber{fill:#333;}#mermaid-svg-0jSNSDLeHRsTe0KO #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-0jSNSDLeHRsTe0KO .messageText{fill:#333;stroke:none;}#mermaid-svg-0jSNSDLeHRsTe0KO .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-0jSNSDLeHRsTe0KO .labelText,#mermaid-svg-0jSNSDLeHRsTe0KO .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-0jSNSDLeHRsTe0KO .loopText,#mermaid-svg-0jSNSDLeHRsTe0KO .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-0jSNSDLeHRsTe0KO .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-0jSNSDLeHRsTe0KO .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-0jSNSDLeHRsTe0KO .noteText,#mermaid-svg-0jSNSDLeHRsTe0KO .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-0jSNSDLeHRsTe0KO .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-0jSNSDLeHRsTe0KO .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-0jSNSDLeHRsTe0KO .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-0jSNSDLeHRsTe0KO .actorPopupMenu{position:absolute;}#mermaid-svg-0jSNSDLeHRsTe0KO .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-0jSNSDLeHRsTe0KO .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-0jSNSDLeHRsTe0KO .actor-man circle,#mermaid-svg-0jSNSDLeHRsTe0KO line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-0jSNSDLeHRsTe0KO :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    触发“销售额<10万”预警

    转发预警事件

    推送预警通知(含报表ID)

    请求报表详情(报表ID)

    返回报表数据

    显示报表+预警分析

    (2)离线缓存流程

    渲染错误: Mermaid 渲染失败: Parse error on line 9: …据 B->>否: 显示缓存数据 ———————^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got '1'

    赞(0)
    未经允许不得转载:171主机测评 » 大数据BI工具的移动端应用开发指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址