Flutter屏幕管理插件fmscreen的使用
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
更多关于Flutter屏幕管理插件fmscreen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter中使用fmscreen
插件进行屏幕管理的示例代码。请注意,fmscreen
并非一个广为人知的官方或广泛使用的Flutter插件,因此以下示例假设它类似于其他屏幕管理插件(例如provider
、get
或flutter_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. 定义屏幕
定义一些简单的屏幕,例如HomeScreen
和DetailScreen
。
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屏幕管理插件,如provider
、get
、flutter_bloc
等。
希望这个示例能帮助你理解如何在Flutter中进行屏幕管理。如果有任何进一步的问题或需要关于其他插件的帮助,请随时提问!