Flutter屏幕管理插件fmscreen的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter屏幕管理插件fmscreen的使用

描述

FMScreen 是一个用于实体或人名筛查的服务器。它可以与拒绝名单(如BIS实体名单)进行匹配。

特性

  • 使用Levenshtein距离进行模糊术语匹配。
  • 将查询项与单个列表项进行分割匹配。
  • 模糊查询匹配考虑术语相似性、术语顺序和术语重要性(IDF)。
  • 完美匹配模式禁用模糊匹配以减少某些情况下的误报。
  • 接受拉丁字符、汉字、片假名等字符。
  • 对繁体和简化汉字进行规范化,使匹配不敏感于字符简化。
  • 对法律实体类型的拼写变体进行规范化,如“Limitd”和“Ltd.”,使匹配不敏感于法律实体类型的拼写变体。
  • 白名单查询避免筛查自己的公司及其后续误报。
  • 结果缓存以提高时间性能。
  • Web服务器接受单独查询,适用于交互式UI。
  • Web服务器并行处理批量查询,适用于批处理应用。
  • 文本规范化API获取名称的全局标识符。
  • 聚合/扩散匹配到拒绝名单上的项目。
  • 其他功能。

使用

获取公共拒绝名单(可选)

dart bin/fetchdl.dart 

这将从美国政府的综合筛查名单(https://www.trade.gov/consolidated-screening-list)和日本经济产业省的外国最终用户名单(https://www.meti.go.jp/policy/anpo/law05.html#user-list)获取名单。

当前,这些名单包含以下列表:

  • Capta List (CAP) - 财政部
  • Denied Persons List (DPL) - 工业安全局
  • Entity List (EL) - 工业安全局
  • 外国制裁逃避者(FSE) - 财政部
  • ITAR Debarred (DTC) - 国务院
  • 军事最终用户(MEU)名单 - 工业安全局
  • 非SDN中国军工综合体公司名单(CMIC) - 财政部
  • 非SDN菜单式制裁名单(MBS) - 财政部
  • 非扩散制裁(ISN) - 国务院
  • 部门制裁识别名单(SSI) - 财政部
  • 特别指定国民(SDN) - 财政部
  • 未验证名单(UVL) - 工业安全局
  • 外国最终用户名单(EUL) - 日本经济产业省

编译Web服务器

dart compile exe -v bin/server.dart -o bin/server

注意:JIT模式由于某些原因无法工作。参见dart-lang/sdk#50082。

启动Web服务器

bin/server

使用模糊选项筛查名称

dart bin/screen.dart -v '888'

输出结果:

{
  "queryStatus": {
    "serverId": 1,
    "start": "2022-12-04T02:30:36.701136Z",
    "durationInMilliseconds": 20,
    "inputString": "888",
    "rawQuery": "888",
    "letType": "none",
    "terms": ["888"],
    "perfectMatching": false,
    "queryScore": 0.8011840705289173,
    "queryFallenBack": false,
    "databaseVersion": "2022-12-04T01:25:18.000Z",
    "message": ""
  },
  "detectedItems": [
    {
      "itemId": "EUL321_1670117118000",
      "matchedNames": [
        {"entry": "KOREA RUNGRA 888 TRADING CO.", "score": 0.8011840705289173},
        {"entry": "RUNGRA 888 GENERAL TRADING CORP (綾羅888貿易総会社)", "score": 0.8011840705289173},
        {"entry": "KOREA RUNGRA-888 TRADING CORPORATION (朝鮮綾羅888貿易会社)", "score": 0.8011840705289173}
      ],
      "listCode": "EUL",
      "body": {
        "source": "Foreigh End User List (EUL) - Ministry of Economy, Trade and Industry, Japan",
        "No.": "321",
        "Country or Region": "北朝鮮\nNorth Korea",
        "Company or Organization": "Korea Rungra-888 Trading Corporation\n(朝鮮綾羅888貿易会社)",
        "Also Known As": "・Korea Rungra 888 Trading Co.\n・Korea Rungra-888 Muyeg Hisa\n・Rungra 888 General Trading Corp\n(綾羅888貿易総会社)",
        "Type of WMD": "生物、化学、ミサイル、核\nB,C,M,N"
      }
    }
  ]
}

等效的Web API:

http ':8080/?c=0&v=1&q=888'

c=0 表示暂时禁用结果缓存。

使用完美匹配筛查名称

dart bin/screen.dart '"abc"' '"def"'

输出结果:

{
  "queryStatus": {
    "serverId": 0,
    "start": "2022-12-04T02:29:40.073848Z",
    "durationInMilliseconds": 3,
    "inputString": "abc",
    "rawQuery": "ABC",
    "letType": "none",
    "terms": ["ABC"],
    "perfectMatching": true,
    "queryScore": 1.0,
    "queryFallenBack": false,
    "databaseVersion": "2022-12-04T01:25:18.000Z",
    "message": ""
  },
  "detectedItems": [
    {
      "itemId": "CONS7898_1670117118000",
      "matchedNames": [{"entry": "ABC LLC", "score": 1.0}],
      "listCode": "SDN"
    },
    {
      "itemId": "CONS14939_1670117118000",
      "matchedNames": [{"entry": "ABC LLC", "score": 1.0}],
      "listCode": "SSI"
    }
  ]
}

等效的Web API:

http ':8080/?c=0' 'Content-type:application/json; charset=utf-8' '[]="abc"' '[]="def"'

使用内部项目ID获取详细信息

dart bin/screen.dart -b CONS3524_1670117118000

输出结果:

{
  "source": "Nonproliferation Sanctions (ISN) - State Department",
  "programs": ["E.O. 13382"],
  "name": "Defense Industries Organization",
  "federal_register_notice": "Vol. 72, No. 63, 04/03/07",
  "start_date": "2007-03-30",
  "source_list_url": "https://www.state.gov/key-topics-bureau-of-international-security-and-nonproliferation/nonproliferation-sanctions/",
  "alt_names": ["Defence Industries Organisation", "DIO", "Saseman Sanaje Defa", "Sazemane Sanaye Def", "Sasadja"],
  "source_information_url": "https://www.state.gov/key-topics-bureau-of-international-security-and-nonproliferation/nonproliferation-sanctions/",
  "id": "44048d5165eca98c9556e3e64bed51a0213cc6c94d8ce9caae3d280d",
  "country": "IR"
}

等效的Web API:

http ':8080/body/CONS3524_1670117118000'

运行样本批处理

ls batch
queries.csv
dart bin/batchwb.dart -i batch/queries.csv
...
ls batch
queries.csv
queries_results.csv

queries.csv 应该只有一列,每行包含一个要筛查的名称。实际上,第二列及以后的列被视为注释。

刷新服务器

dart bin/screen.dart --restart

等效的Web API。(仅限本地访问)

http ':8080/restart'

这将使服务器重新加载数据库,重新读取配置和设置,并清除结果缓存。当拒绝名单更新或配置/设置修改时,这非常有用。

获取规范化文本作为名称的全局标识符

dart bin/screen.dart -n 'abc'

输出结果:

ABC

等效的Web API:

http ':8080/normalize?q=abc'

请注意,来自此服务器的匹配名称将以相同的方式进行规范化。

许可证

在AGPL-3.0或更高版本下发布。查看LICENSE文件。

如果您需要不同的许可证,请联系我。


示例代码

以下是使用 fmscreen 插件的基本示例代码:

import 'dart:convert';
import 'package:fmscreen/fmscreen.dart';

void main(List<String> args) async {
  // 初始化筛选器
  final screener = Screener();
  await screener.init();

  // 筛查名称
  final result = await screener.screen('abc');

  // 将结果转换为JSON对象
  final resultJsonObject = result.toJson();
  final jsonEncorder = JsonEncoder.withIndent('  ');
  final resultJsonString = jsonEncorder.convert(resultJsonObject);
  print(resultJsonString);

  // 停止服务器
  await screener.stopServers();
}

更多关于Flutter屏幕管理插件fmscreen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter屏幕管理插件fmscreen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用fmscreen插件进行屏幕管理的示例代码。请注意,fmscreen并非一个广为人知的官方或广泛使用的Flutter插件,因此以下示例假设它类似于其他屏幕管理插件(例如providergetflutter_bloc),用于管理屏幕导航和状态。如果fmscreen有特定的API或方法,请查阅其官方文档进行调整。

假设fmscreen提供了一些基本的屏幕管理功能,如打开新屏幕、关闭屏幕和传递数据等,以下是一个简单的使用示例:

1. 添加依赖

首先,确保在pubspec.yaml文件中添加了fmscreen依赖(注意:如果fmscreen是一个真实存在的插件,这里的名称应该替换为实际的插件名)。

dependencies:
  flutter:
    sdk: flutter
  fmscreen: ^x.y.z  # 替换为实际的版本号

2. 导入插件

在你的Dart文件中导入fmscreen插件。

import 'package:fmscreen/fmscreen.dart';

3. 配置MaterialApp和屏幕管理

使用FmScreen包装你的MaterialApp,并设置初始屏幕。

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FmScreen(
      initialScreen: HomeScreen(),
      child: MaterialApp(
        home: Scaffold(
          body: Center(
            child: Text('Initial Screen'),
          ),
        ),
      ),
    );
  }
}

4. 定义屏幕

定义一些简单的屏幕,例如HomeScreenDetailScreen

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Screen'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 打开新屏幕,并传递数据
            FmScreen.of(context).push(
              MaterialPageRoute(
                builder: (context) => DetailScreen(data: 'Hello from Home Screen!'),
              ),
            );
          },
          child: Text('Go to Detail Screen'),
        ),
      ),
    );
  }
}

class DetailScreen extends StatelessWidget {
  final String data;

  DetailScreen({required this.data});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Detail Screen'),
      ),
      body: Center(
        child: Text(data),
      ),
    );
  }
}

5. 处理返回事件(可选)

如果需要处理返回事件,比如从DetailScreen返回HomeScreen,可以使用Navigator.pop方法。在DetailScreen上添加一个返回按钮:

class DetailScreen extends StatelessWidget {
  final String data;

  DetailScreen({required this.data});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Detail Screen'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(data),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                Navigator.pop(context); // 返回上一个屏幕
              },
              child: Text('Go Back'),
            ),
          ],
        ),
      ),
    );
  }
}

注意

  • 上述代码是一个假设性的示例,因为fmscreen并非一个真实存在的广泛使用的插件。如果fmscreen确实存在,请参考其官方文档了解具体的API和使用方法。
  • 如果fmscreen不存在或无法满足需求,可以考虑使用其他流行的Flutter屏幕管理插件,如providergetflutter_bloc等。

希望这个示例能帮助你理解如何在Flutter中进行屏幕管理。如果有任何进一步的问题或需要关于其他插件的帮助,请随时提问!

回到顶部