基于 NATS 的法检司数据流转系统

  1. 打开 NATS 官方下载页面
  2. 找到最新版本,下载 nats-server.exe(Windows 版本)
  3. nats-server.exe 放到任意文件夹(如 C:\nats\

2️⃣ 启动 NATS 服务器

如果你是 手动下载的 nats-server.exe

powershell

复制

cd C:\nats\
nats-server.exe

默认情况下,NATS 服务器会监听 localhost:4222 端口。

已完成:Windows 下启动 NATS 服务器

import json
from jsonschema import validate, ValidationError

# 法院数据格式
court_schema = {
    "type": "object",
    "properties": {
        "case_id": {"type": "string"},
        "judge": {"type": "string"},
        "status": {"type": "string"},
        "verdict": {"type": "string"}
    },
    "required": ["case_id", "judge", "status"]
}

# 检察院数据格式
procuratorate_schema = {
    "type": "object",
    "properties": {
        "case_id": {"type": "string"},
        "prosecutor": {"type": "string"},
        "charges": {"type": "string"},
        "evidence": {"type": "array"}
    },
    "required": ["case_id", "prosecutor", "charges"]
}

# 司法部门数据格式
justice_schema = {
    "type": "object",
    "properties": {
        "case_id": {"type": "string"},
        "offender": {"type": "string"},
        "rehabilitation_status": {"type": "string"}
    },
    "required": ["case_id", "offender", "rehabilitation_status"]
}

# 数据验证函数
def validate_data(data, schema):
    try:
        validate(instance=data, schema=schema)
        return True
    except ValidationError as e:
        print(f"数据验证失败: {e.message}")
        return False

import asyncio
from nats.aio.client import Client as NATS

# 连接 NATS 服务器
async def connect_nats():
    nc = NATS()
    await nc.connect("nats://localhost:4222")
    return nc

async def publish_data(nc, subject, data):
    """ 发送数据到 NATS """
    message = json.dumps(data)
    await nc.publish(subject, message.encode())
    print(f"📤 已发送数据到 {subject}: {data}")

async def subscribe_data(nc, subject, schema):
    """ 订阅特定主题的数据 """
    async def message_handler(msg):
        data = json.loads(msg.data.decode())
        print(f"📥 收到数据 ({subject}): {data}")

        if validate_data(data, schema):
            print(f"✅ 数据有效,存入 {subject} 数据库")
        else:
            print(f"❌ 数据无效,丢弃")

    await nc.subscribe(subject, cb=message_handler)

def transform_data(source_data, target_type):
    """ 转换数据格式 """
    if target_type == "court":
        return {
            "case_id": source_data["case_id"],
            "judge": source_data.get("judge", "未知"),
            "status": source_data.get("status", "进行中"),
            "verdict": source_data.get("verdict", "未判决")
        }

    elif target_type == "procuratorate":
        return {
            "case_id": source_data["case_id"],
            "prosecutor": source_data.get("prosecutor", "未知"),
            "charges": source_data.get("charges", "未指控"),
            "evidence": source_data.get("evidence", [])
        }

    elif target_type == "justice":
        return {
            "case_id": source_data["case_id"],
            "offender": source_data.get("offender", "未知"),
            "rehabilitation_status": source_data.get("rehabilitation_status", "未恢复")
        }

    else:
        raise ValueError("未知的数据类型")


async def main():
    nc = await connect_nats()

    # 订阅不同的数据流
    await subscribe_data(nc, "court", court_schema)
    await subscribe_data(nc, "procuratorate", procuratorate_schema)
    await subscribe_data(nc, "justice", justice_schema)

    # 模拟发送不同数据
    court_data = transform_data({"case_id": "C123", "judge": "张三", "status": "受理中"}, "court")
    procuratorate_data = transform_data({"case_id": "C123", "prosecutor": "李四", "charges": "盗窃"}, "procuratorate")
    justice_data = transform_data({"case_id": "C123", "offender": "王五", "rehabilitation_status": "完成"}, "justice")

    await publish_data(nc, "court", court_data)
    await publish_data(nc, "procuratorate", procuratorate_data)
    await publish_data(nc, "justice", justice_data)

    # 运行一段时间,等待接收消息
    await asyncio.sleep(5)

    await nc.close()

# 启动
if __name__ == "__main__":
    asyncio.run(main())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MC数据局

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值