ASP.NET Core SignalR案例:导入英汉词典

Ecdict

  1. 下载词典文件stardict.7z,解压,stardict.csv是一个CSV格式的文本文件,文件的第一行是表头,除第一行外,其他每行文本是一个单词的相关信息,用逗号分隔的就是各个列的值。
  2. 英汉词典ECDICT中导入单词到数据库。
  3. T_WordItems:Id(主键)、Word(单词)、Phonetic(音标)、Definition(英文解释),Translation(中文翻译)

https://github.com/skywind3000/ECDICTicon-default.png?t=O83Ahttps://github.com/skywind3000/ECDICT

实现

  1. ImportExecutor中注入IHubContext<ImportDictHub>等服务。
  2. 暂时用字符串Split解析CSV,或者用更专业的库。
  3. 用SqlBulkCopy 进行分批快速导入:

Program.cs

builder.Services.AddSignalR();

string[] urls = new[] { "http://localhost:5173" };
builder.Services.AddCors(options =>
    options.AddDefaultPolicy(builder => builder.WithOrigins(urls)
    .AllowAnyMethod().AllowAnyHeader().AllowCredentials()));

builder.Services.AddScoped<ImportExecutor>();

app.MapHub<ImportHub>("/ImportHub");

ImportExecutor.cs

public class ImportExecutor
{
    private readonly IHubContext<ImportHub> hubContext;

    public ImportExecutor(IHubContext<ImportHub> hubContext)
    {
        this.hubContext = hubContext;
    }

    public async Task ExecuteAsync(string connectionId)
    {
        string[] lines = await File.ReadAllLinesAsync(@"F:\Demo\stardict\stardict.csv");
        int totalCount = lines.Length - 1;
        string connStr = "Data Source=.;Initial Catalog=demo;Integrated Security=SSPI;TrustServerCertificate=true";
        SqlBulkCopy bulkCopy = new SqlBulkCopy(connStr);
        bulkCopy.DestinationTableName = "T_WordItems";
        bulkCopy.ColumnMappings.Add("Word", "Word");
        bulkCopy.ColumnMappings.Add("Phonetic", "Phonetic");
        bulkCopy.ColumnMappings.Add("Definition", "Definition");
        bulkCopy.ColumnMappings.Add("Translation", "Translation");
        int counter = 0;

        using DataTable dataTable = new DataTable();
        dataTable.Columns.Add("Word");
        dataTable.Columns.Add("Phonetic");
        dataTable.Columns.Add("Definition");
        dataTable.Columns.Add("Translation");
        foreach (var item in lines)
        {
            string[] str = item.Split(',');
            string word = str[0];
            string? phonetic = str[1];
            string? definition = str[2];
            string? translation = str[3];
            DataRow row = dataTable.NewRow();
            row["Word"] = word;
            row["Phonetic"] = phonetic;
            row["Definition"] = definition;
            row["Translation"] = translation;
            dataTable.Rows.Add(row);
            counter++;
            Console.WriteLine($"已加载{counter}");
            if (dataTable.Rows.Count == 100)
            {
                await bulkCopy.WriteToServerAsync(dataTable);
                dataTable.Clear();
            }
            await hubContext.Clients.Client(connectionId).SendAsync("ImportProgress",totalCount,counter);
        }
        await bulkCopy.WriteToServerAsync(dataTable);
        await hubContext.Clients.Client(connectionId).SendAsync("ImportProgress", totalCount, counter);
    }
}

ImportEcdict.cs

public class ImportHub : Hub
{
    private readonly ImportExecutor importExecutor;

    public ImportHub(ImportExecutor importExecutor)
    {
        this.importExecutor = importExecutor;
    }

    public Task ImportEcdict()
    {
        _ = importExecutor.ExecuteAsync(this.Context.ConnectionId);
        return Task.CompletedTask;
    }
}

Vue

<template>
  <div>
    <input type="button" value="导入" v-on:click="importEcdict">
    <progress :value="state.importedCount" :max="state.totalCount"></progress>
    <span>{{ state.importedCount }},{{ state.totalCount }}
      {{ ((state.importedCount / state.totalCount)*100).toFixed(2)}}%</span>
  </div>
</template>

<script>
import { reactive, onMounted } from 'vue';
import * as signalR from '@microsoft/signalr';
import axios from 'axios';

let connection;
export default {
  name: 'Login',
  setup() {
    //创建响应式对象
    const state = reactive({ importedCount: 0, totalCount: 0 });

    onMounted(async function () {
      startConn()
    })

    //SignalR连接
    const startConn = async function () {
      const transport = signalR.HttpTransportType.WebSockets;
      const options = { skipNegotiation: true, transport: transport };
      connection = new signalR.HubConnectionBuilder()
        .withUrl('https://localhost:7222/ImportHub', options)
        .withAutomaticReconnect().build();
      try {
        await connection.start();
      } catch (err) {
        alert(err);
        return;
      }
      //接收消息
      connection.on('ImportProgress', (totalCount, counter) => {//监听服务器端发送过来的信息
        state.importedCount = counter;
        state.totalCount = totalCount
      });
    }
    //导入
    const importEcdict = async function (e) {
      await connection.invoke("ImportEcdict");
      // alert("启动导入")
    }


    //返回响应式对象和方法
    return { state, importEcdict };
  }
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968398.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

元宵佳节,我的创作纪念日:技术之路的回顾与展望

今天是元宵节&#xff0c;一个象征着团圆与美好的节日。巧合的是&#xff0c;今天也是我作为技术博客博主的创作纪念日。在这个特别的日子里&#xff0c;我想和大家分享我的创作故事&#xff0c;回顾初心、总结收获、展望未来&#xff0c;同时也希望能为正在技术道路上探索的你…

python实现常见数学概率分布

常见正态分布 1.贝塔分布1.1 概率密度函数1.2参数对分布形状的影响1.3 应用场景1.4 python实现 2. 帕累托分布&#xff08;80/20法则&#xff09;3. 正态分布&#xff08;高斯分布&#xff09;3.1 正态分布对应性质3.2 正态分布对应图像![在这里插入图片描述](https://i-blog.c…

本地生活案例列表案例

1.实现导航跳转 2.设置标题内容并创建编译模式 3.获取并且渲染商铺列表数据 获取数据 渲染页面 4.实现初步上拉加载效果 4.1配置loading效果 4.3配置上拉触底距离&#xff0c;并且使页码值自增加1&#xff0c;获取更多数据 节流处理 5.判断数据是否加载完毕 当没有后续数据了…

.NET版Word处理控件Aspose.Words教程:使用 C# 删除 Word 中的空白页

Word 文档中的空白页会使其看起来不专业并扰乱流程。用户会遇到需要删除 Word 中的空白页的情况&#xff0c;但手动删除它们需要时间和精力。在这篇博文中&#xff0c;我们将探讨如何使用 C# 删除 Word 中的空白页。 本文涵盖以下主题&#xff1a; C# 库用于删除 Word 中的空…

Unity崩溃后信息结合符号表来查看问题

目录 SO文件符号表对调试和分析的重要性调试方面分析方面 错误数据安装Logcat解释符号表设置符号文件路径生成解析 相关参考 SO文件 so 文件&#xff08;Shared Object File&#xff0c;共享目标文件&#xff09;和符号表紧密相关&#xff0c;它们在程序的运行、调试和分析过程…

mapbox进阶,添加绘图扩展插件,裁剪线

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图扩…

DeepSeek:从入门到精通

在人工智能飞速发展的今天&#xff0c;DeepSeek作为一款备受瞩目的AI工具&#xff0c;正以其强大的功能和开源理念改变着我们的生活和工作方式。本文将带你深入了解DeepSeek&#xff0c;从基础入门到进阶应用&#xff0c;助你快速掌握这一前沿工具。 文末有详细资料可下载 文末…

【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面

【清晰教程】本地部署DeepSeek-r1模型-CSDN博客 目录 安装Docker 配置&检查 Open WebUI 部署Open WebUI 安装Docker 完成本地DeepSeek-r1的部署后【清晰教程】本地部署DeepSeek-r1模型-CSDN博客&#xff0c;通过Docker为本地DeepSeek-r1部署WebUI界面。 访问Docker官…

八、OSG学习笔记-

前一章节&#xff1a; 七、OSG学习笔记-碰撞检测-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145558132?spm1001.2014.3001.5501 一、了解OSG图元加载显示流程 本章节代码&#xff1a; OsgStudy/wids CuiQingCheng/OsgStudy - 码云 - 开源中国https:…

[笔记] 汇编杂记(持续更新)

文章目录 前言举例解释函数的序言函数的调用栈数据的传递 总结 前言 举例解释 // Type your code here, or load an example. int square(int num) {return num * num; }int sub(int num1, int num2) {return num1 - num2; }int add(int num1, int num2) {return num1 num2;…

在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.20.2

文章目录 1. 安装 nvm&#xff08;如果还没有安装的话&#xff09;2. 加载 nvm 配置3. 列出特定系列的 Node.js 版本&#xff08;远程&#xff09;&#xff1a;4. 安装 Node.js 16.20.25. 使用指定版本的 Node.js6. 验证安装 在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.…

物联网水质监测系统设计与实现/基于STM32的水产养殖云监控系统设计

背景 随着物联网技术的飞速发展&#xff0c;各行各业都在逐步实现智能化管理&#xff0c;水质监测系统作为环境监测中的一个重要环节&#xff0c;近年来备受关注。如何高效、精准地监测水质&#xff0c;尤其是在远程无法到达的地方&#xff0c;成为了一个迫切需要解决的问题。…

SAP Smartforms 货币和数量字段设置参考及格式,消息号是SSFCOMPOSER601

SAP Smartforms 货币和数量字段设置参考及格式&#xff0c;消息号是SSFCOMPOSER601 在开发SAP Smartforms 时&#xff0c;会遇到设置打印的货币字段或数量字段在打印预览时无法显示报错&#xff08;消息号是SSFCOMPOSER601&#xff0c;提示参考字段IS_DATA-GESME在表格中未知&…

Hbuildx开发的小程序,运行到微信开发者工具后,显示空白报错Pages not been registered yet,解决方法

问题描述&#xff1a; Hbuildx开发的小程序&#xff0c;运行到 微信开发者工具后&#xff0c;显示空白 报错Pages not been registered yet 解决方法&#xff1a; 1.检查报错的这个pages页面 &#xff0c;实际是否存在。 2.路由文件中是否定义了该pages页面。 3.路由文件中…

稀疏计算的软硬件协同:FPGA有力推动硬件发展

稀疏计算协同&#xff1a;FPGA驱动进步 ©作者|wcychuiyuw 来源|神州问学 引言 在当今科技飞速发展的时代&#xff0c;端侧算力的重要性日益凸显&#xff0c;其中 ASIC (专用集成电路) 和 SoC 架构 (System on Chips) 成为端侧算力不可或缺的重要组成部分。它们以其独特的…

Cell子刊《Patterns》最新综述:大语言模型Attention Heads的可解释性研究

自从大语言模型&#xff08;LLMs&#xff09;在各种任务中展现出卓越性能以来&#xff0c;其内部机制的解读已经成为领域内的热门话题。尽管许多研究人员从各个方面做出了尝试并得到了一些结论&#xff0c;但现阶段仍缺乏一个全面的视角来对现有成果进行系统化的归纳与总结。 为…

【Java八股文】01-Java基础面试篇

【Java八股文】01-Java基础面试篇 概念Java特点Java为什么跨平台JVM、JDK、JRE关系 面向对象什么是面向对象&#xff0c;什么是封装继承多态&#xff1f;多态体现的方面面向对象设计原则重载重写的区别抽象类和实体类区别Java抽象类和接口的区别抽象类可以被实例化吗 深拷贝浅拷…

亚信安全正式接入DeepSeek

亚信安全致力于“数据驱动、AI原生”战略&#xff0c;早在2024年5月&#xff0c;推出了“信立方”安全大模型、安全MaaS平台和一系列安全智能体&#xff0c;为网络安全运营、网络安全检测提供AI技术能力。自2024年12月DeepSeek-V3发布以来&#xff0c;亚信安全人工智能实验室利…

Flutter 的 Widget Key 提议大调整?深入聊一聊 Key 的作用

Flutter 的 Widget Key 提议大调整&#xff1f;深入聊一聊 Key 的作用 在 Flutter 里&#xff0c;Key 对象存在的目的主要是区分和维持 Widget 的状态&#xff0c;它是控件在渲染树里的「复用」标识之一&#xff0c;这一点在之前的《深入 Flutter 和 Compose 在 UI 渲染刷新时…

Vulhub靶机 openfire(CVE-2023-32315)(渗透测试详解)

一、开启vulhub环境 docker-compose up -d 启动 docker ps 查看开放的端口 二、访问靶机IP 9090端口 1、利用bp&#xff0c;抓取当前页面的包&#xff0c;并修改get请求如下 /setup/setup-s/%u002e%u002e/%u002e%u002e/user-groups.jsp 获取到JSESSIONID和csrf的值 2、拿到…