Chrome浏览器的跨域设置----包含新老版本两种设置_谷歌浏览器跨域设置-CSDN博客

mikel阅读(216)

来源: Chrome浏览器的跨域设置—-包含新老版本两种设置_谷歌浏览器跨域设置-CSDN博客

注意:此方案仅适用于windows系统哦!!!
这是一篇姗姗来迟的文章,一直在使用,但是一直没时间做一下总结,今天抽空就分享给大家,操作很简单,耐心跟着操作一下。

做前后端分离的开发的时候,出于一些原因往往需要将浏览器设置成支持跨域的模式,而且chrome浏览器支持可跨域的设置,但是新版本的chrome浏览器提高了跨域设置的门槛,原来的方法不再适用了。其实网上也有很多大神总结的chrome跨域设置教程,都是差不多。

个人开发中的使用习惯
下载好谷歌浏览器以后,快捷方式我会复制两份放在桌面上,这时候两个是一模一样的,我会将其中一个重命名(我是跨域的命名为 dev),另外一个正常命名,然后在对命名为“dev”的浏览器打开方式进行寡跨域设置,这样我们就会拥有一个正常的浏览器,一个跨域的浏览器啦~

 

老版本Chrome浏览器(版本号49之前的跨域设置)
1、右键点击谷歌浏览器,选择属性

2、 在目标输入框尾部加上 –disable-web-security

注意:这里 –disable-web-security 前面有一个空格

 

3.点击应用和确定后关闭属性页面,并打开chrome浏览器。如果浏览器出现提示“你使用的是不受支持的命令标记 –disable-web-security”,那么说明配置成功。

新版浏览器跨域设置(版本号49之后的跨域设置)
1、在电脑上新建一个目录(任意位置) 例如 C:\MyChromeDevUserData

2、右键点击谷歌浏览器,选择属性;

3、在目标输入框尾部加上 –disable-web-security –user-data-dir=C:\MyChromeDevUserData

注意:

1.两个 — 前面都是有空格的哦~

2. 如果目标地址原先有引号,那么 –disable-web-security –user-data-dir=C:\MyChromeDevUserData 要加在引号外面。

 

4、点击应用和确定后关闭属性页面,并打开chrome浏览器。

再次打开chrome,发现有“–disable-web-security”相关的提示,说明chrome就能正常跨域工作了。

————————————————
版权声明:本文为CSDN博主「前端菜菜DayDayUp」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_48594833/article/details/124345191

windows10同步时间出错,终于找到解决办法了!_w32time windows time-CSDN博客

mikel阅读(114)

来源: windows10同步时间出错,终于找到解决办法了!_w32time windows time-CSDN博客

Windows同步Internet时间出错的解决方法
系统时间老是同步不正确,百度半天找到了一个可行的方法,贴出来

附上我的成功截图

分割线

操纵步骤
管理员身份启动 cmd 然后依次输入以下命令 不放心最后有我输入的截图,上面有说明每一步的作用
net stop w32time
w32tm /unregister
w32tm /register
net start w32time
w32tm /resync /nowait

最后关闭CMD 然后重新更新时间就能更新成功了
之前百度看到了改时间校准的地址
我也是改过地址,发现都没用,最后用这种方式的时候,然后更新时间的地址不是默认的时候更新也失败了,吧地址改成默认的在更新就成功了,也不太清楚原理是啥,不过还好最后时间终于校准了。
最后附上默认校准地址

time.windows.com
————————————————
版权声明:本文为CSDN博主「既见君子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44624742/article/details/104688940

ASP.NET Core WebApi 集成 MCP 协议完全指南 - 扫地僧2015 - 博客园

mikel阅读(140)

来源: ASP.NET Core WebApi 集成 MCP 协议完全指南 – 扫地僧2015 – 博客园

前言

Model Context Protocol (MCP) 是一个标准化协议,让 AI 客户端(如 Claude、ChatGPT 等)能够通过统一的接口调用你的 API。本文将详细介绍如何在 ASP.NET Core WebApi 项目中集成 MCP 支持,实现 AI 与你的服务无缝对接。

什么是 MCP?

MCP(Model Context Protocol)是一个开放协议,旨在标准化 AI 应用与外部工具、数据源之间的通信方式。通过 MCP,你的 API 可以:

  • 被 AI 助手自动发现和调用
  • 提供标准化的工具描述和参数定义
  • 支持多种传输模式(HTTP、Stdio)
  • 实现安全的认证和授权

核心特性

本项目实现了以下功能:

  • ✅ 使用官方 ModelContextProtocol.AspNetCore SDK
  • ✅ 通过 [McpServerTool] 特性快速定义工具
  • ✅ 自动参数绑定和 JSON Schema 生成
  • ✅ 支持 HTTP 和 Stdio 双传输模式
  • ✅ 基于 Token 的认证和授权
  • ✅ 与现有 WebApi 完美共存

快速开始

第一步:安装 NuGet 包

dotnet add package ModelContextProtocol.AspNetCore --version 0.4.0-preview.3

第二步:配置 MCP 服务

在 Program.cs 中添加 MCP 配置:

using ModelContextProtocol.Server;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

// 添加 MCP 服务器(支持 HTTP 和 Stdio 双模式)
builder.Services
    .AddMcpServer(options =>
    {
        options.ServerInfo = new ModelContextProtocol.Protocol.Implementation
        {
            Name = "Weather API",
            Version = "1.0.0"
        };
    })
    .WithHttpTransport()           // HTTP 模式:用于 Web 客户端
    .WithStdioServerTransport()    // Stdio 模式:用于 Kiro IDE 等本地工具
    .WithToolsFromAssembly();

var app = builder.Build();

// 添加认证中间件(可选)
app.UseMiddleware<McpAuthenticationMiddleware>();

app.UseAuthorization();
app.MapControllers();

// 映射 MCP 端点
app.MapMcp("/mcp");

app.Run();

第三步:定义 MCP 工具

创建 Tools/WeatherTools.cs

using System.ComponentModel;
using ModelContextProtocol.Server;

[McpServerToolType]
public static class WeatherTools
{
    [McpServerTool]
    [Description("Get weather forecast for the next 5 days")]
    public static IEnumerable<WeatherForecast> GetWeatherForecast()
    {
        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        }).ToArray();
    }

    [McpServerTool]
    [Description("Get current weather for a specific city")]
    public static WeatherForecast GetWeatherByCity(
        [Description("The name of the city")] string city)
    {
        var rng = new Random();
        return new WeatherForecast
        {
            Date = DateOnly.FromDateTime(DateTime.Now),
            TemperatureC = rng.Next(-20, 55),
            Summary = $"Weather in {city}: {Summaries[rng.Next(Summaries.Length)]}"
        };
    }

    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild",
        "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };
}

第四步:配置认证(可选)

在 appsettings.json 中配置:

{
  "McpAuth": {
    "Enabled": true,
    "ValidTokens": ["your-secret-token-here"]
  }
}

开发环境可以禁用认证(appsettings.Development.json):

{
  "McpAuth": {
    "Enabled": false
  }
}

第五步:运行和测试

dotnet run

应用启动后,可以访问:

  • Swagger UIhttp://localhost:5000/swagger
  • WebApihttp://localhost:5000/weatherforecast
  • MCP 端点http://localhost:5000/mcp

传输模式详解

HTTP 模式

适用于 Web 应用、Claude Desktop、远程访问等场景。

测试示例

# 列出所有工具
curl -X POST http://localhost:5000/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

# 调用工具
curl -X POST http://localhost:5000/mcp \
  -H "Authorization: Bearer your-secret-token-here" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc":"2.0",
    "id":2,
    "method":"tools/call",
    "params":{
      "name":"GetWeatherForecast",
      "arguments":{}
    }
  }'

Claude Desktop 配置

编辑配置文件(Windows: %APPDATA%\Claude\claude_desktop_config.json):

{
  "mcpServers": {
    "weather-api": {
      "url": "http://localhost:5000/mcp",
      "headers": {
        "Authorization": "Bearer your-secret-token-here"
      }
    }
  }
}

Stdio 模式

适用于 Kiro IDE、本地命令行工具等场景,无需网络端口。

Kiro IDE 配置

编辑 .kiro/settings/mcp.json

{
  "mcpServers": {
    "weather-api": {
      "command": "dotnet",
      "args": ["run", "--project", "path/to/NetCoreApiMcpDemo.csproj"],
      "env": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

模式对比

特性 HTTP 模式 Stdio 模式
传输方式 HTTP POST 标准输入/输出
适用场景 Web 应用、远程访问 本地工具、IDE 集成
认证 HTTP Header 环境变量/配置
网络 需要网络端口 无需网络
性能 网络开销 进程间通信,更快

认证和授权

实现认证中间件

创建 Middleware/McpAuthenticationMiddleware.cs

public class McpAuthenticationMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IConfiguration _configuration;
    private readonly ILogger<McpAuthenticationMiddleware> _logger;

    public McpAuthenticationMiddleware(
        RequestDelegate next,
        IConfiguration configuration,
        ILogger<McpAuthenticationMiddleware> logger)
    {
        _next = next;
        _configuration = configuration;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 只对 MCP 端点进行认证
        if (!context.Request.Path.StartsWithSegments("/mcp"))
        {
            await _next(context);
            return;
        }

        // 检查是否启用认证
        var authEnabled = _configuration.GetValue<bool>("McpAuth:Enabled");
        if (!authEnabled)
        {
            await _next(context);
            return;
        }

        // 验证 Token
        var authHeader = context.Request.Headers["Authorization"].FirstOrDefault();
        if (string.IsNullOrEmpty(authHeader) || !authHeader.StartsWith("Bearer "))
        {
            context.Response.StatusCode = 401;
            await context.Response.WriteAsJsonAsync(new { error = "Unauthorized" });
            return;
        }

        var token = authHeader.Substring("Bearer ".Length).Trim();
        var validTokens = _configuration.GetSection("McpAuth:ValidTokens").Get<string[]>();

        if (validTokens == null || !validTokens.Contains(token))
        {
            context.Response.StatusCode = 401;
            await context.Response.WriteAsJsonAsync(new { error = "Invalid token" });
            return;
        }

        await _next(context);
    }
}

安全最佳实践

  1. 使用强 Token:至少 32 字符的随机字符串
  2. 定期轮换:定期更换 Token
  3. 使用 HTTPS:生产环境必须使用 HTTPS
  4. 环境隔离:开发和生产使用不同的 Token
  5. 日志安全:不要在日志中记录完整 Token

客户端集成示例

C# 客户端

using ModelContextProtocol;
using ModelContextProtocol.Client;

var transport = new HttpClientTransport(new HttpClientTransportOptions
{
    BaseUrl = new Uri("http://localhost:5000/mcp"),
    Headers = new Dictionary<string, string>
    {
        ["Authorization"] = "Bearer your-secret-token-here"
    }
});

var client = await McpClient.CreateAsync(transport);

await client.InitializeAsync(new InitializeParams
{
    ProtocolVersion = "2025-06-18",
    ClientInfo = new Implementation
    {
        Name = "MyApp",
        Version = "1.0.0"
    }
});

// 列出工具
var tools = await client.ListToolsAsync();

// 调用工具
var result = await client.CallToolAsync(
    "GetWeatherForecast",
    new Dictionary<string, object?>()
);

JavaScript/Vue 客户端

<script setup>
import { ref } from 'vue';

const weather = ref('');
const MCP_URL = 'http://localhost:5000/mcp';
const TOKEN = 'your-secret-token-here';

const callMcp = async (method, params = {}) => {
  const response = await fetch(MCP_URL, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${TOKEN}`,
    },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: Date.now(),
      method,
      params,
    }),
  });
  return response.json();
};

const getWeather = async () => {
  const data = await callMcp('tools/call', {
    name: 'GetWeatherForecast',
    arguments: {},
  });
  weather.value = data.result.content[0].text;
};
</script>

MCP Tools 最佳实践

让 AI 更准确地使用你的工具是成功的关键。以下是经过实践验证的最佳实践。

核心原则

AI 通过以下信息决定是否使用你的工具:

  1. 工具名称 – 清晰、描述性
  2. Description – 详细的功能说明
  3. 参数描述 – 明确的参数用途
  4. 使用场景 – 何时应该使用这个工具

1. 使用清晰的命名

// ❌ 不好 - 名称模糊
[McpServerTool]
public static string Get() { }

// ✅ 好 - 动词开头,描述清晰
[McpServerTool]
public static string GetWeatherForecast() { }

// ✅ 更好 - 包含具体信息
[McpServerTool]
public static string GetWeatherForecastForNextDays() { }

命名建议:

  • 使用动词开头:Get, Search, Calculate, Compare, Analyze
  • 包含操作对象:Weather, Temperature, Forecast
  • 避免缩写和简称
  • 使用 PascalCase

2. 编写详细的 Description(最重要!)

这是最关键的部分!AI 主要通过 Description 判断是否使用工具。

// ❌ 不好 - 太简短
[Description("Get weather")]

// ⚠️ 一般 - 有基本信息但不够
[Description("Get weather forecast for the next 5 days")]

// ✅ 好 - 包含详细信息和使用场景
[Description(@"Get detailed weather forecast for the next several days including temperature, weather conditions, and trends.

Use this tool when users ask about:
- Future weather (tomorrow, next week, upcoming days)
- Weather predictions or forecasts
- Planning activities based on weather
- Temperature trends

Examples of user queries:
- 'What's the weather forecast for the next 5 days?'
- 'Will it rain this week?'
- 'What's the temperature trend?'")]

Description 应该包含:

  1. 功能说明 – 工具做什么
  2. 使用场景 – 何时使用(”Use this tool when…”)
  3. 示例查询 – 用户可能的提问方式
  4. 支持的功能 – 特殊能力或限制

3. 详细的参数描述

[McpServerTool]
public static string GetWeatherByCity(
    // ❌ 不好
    [Description("city")] string city,

    // ✅ 好
    [Description("The name of the city in English or Chinese (e.g., 'Beijing', '北京', 'Shanghai', 'New York')")]
    string city,

    // ✅ 更好 - 包含默认值说明
    [Description("Number of days to forecast (1-7 days). Default is 5 days if not specified.")]
    int days = 5
)

参数描述应该包含:

  • 参数的用途
  • 支持的格式或值范围
  • 示例值
  • 默认值(如果有)

4. 返回格式化、易读的结果

// ❌ 不好 - 返回原始对象
public static WeatherForecast GetWeather(string city)
{
    return new WeatherForecast { ... };
}

// ✅ 好 - 返回格式化的文本
public static string GetWeather(string city)
{
    var weather = GetWeatherData(city);

    return $@"🌍 Current Weather in {city}
📅 Date: {weather.Date:yyyy-MM-dd}
🌡️ Temperature: {weather.TemperatureC}°C ({weather.TemperatureF}°F)
☁️ Conditions: {weather.Summary}
⏰ Updated: {DateTime.Now:HH:mm:ss}";
}

5. 完整示例:查询工具

[McpServerTool]
[Description(@"Get detailed weather forecast for the next several days including temperature, weather conditions, and trends.

Use this tool when users ask about:
- Future weather (tomorrow, next week, upcoming days)
- Weather predictions or forecasts
- Planning activities based on weather
- Temperature trends
- Weather conditions for travel planning

Examples of user queries:
- 'What's the weather forecast for the next 5 days?'
- 'Will it rain this week?'
- 'What's the temperature trend?'
- 'Should I bring a jacket tomorrow?'
- '未来几天天气怎么样?'
- '这周会下雨吗?'")]
public static string GetWeatherForecast(
    [Description("Number of days to forecast (1-7 days). Default is 5 days if not specified.")]
    int days = 5)
{
    var forecasts = GenerateForecasts(days);

    var result = new StringBuilder();
    result.AppendLine($"🌤️ Weather Forecast for Next {days} Days");
    result.AppendLine();

    foreach (var forecast in forecasts)
    {
        result.AppendLine($"📅 {forecast.Date:yyyy-MM-dd (ddd)}");
        result.AppendLine($"   🌡️ Temperature: {forecast.TemperatureC}°C ({forecast.TemperatureF}°F)");
        result.AppendLine($"   ☁️ Conditions: {forecast.Summary}");
        result.AppendLine();
    }

    return result.ToString();
}

6. 完整示例:比较工具

[McpServerTool]
[Description(@"Compare weather conditions between two cities to help with travel decisions or general comparison.

Use this tool when users want to:
- Compare weather between cities
- Decide which city has better weather
- Plan travel between cities
- Compare temperatures
- Choose destination based on weather

Examples of user queries:
- 'Compare weather between Beijing and Shanghai'
- 'Which city is warmer, Tokyo or Seoul?'
- 'Weather difference between New York and London'
- '北京和上海哪个城市天气更好?'
- '东京和首尔哪里更暖和?'")]
public static string CompareWeatherBetweenCities(
    [Description("First city name (English or Chinese)")] string city1,
    [Description("Second city name (English or Chinese)")] string city2)
{
    var weather1 = GetWeatherData(city1);
    var weather2 = GetWeatherData(city2);

    return $@"🌍 Weather Comparison

📍 {city1}:
   🌡️ Temperature: {weather1.TemperatureC}°C
   ☁️ Conditions: {weather1.Summary}

📍 {city2}:
   🌡️ Temperature: {weather2.TemperatureC}°C
   ☁️ Conditions: {weather2.Summary}

📊 Difference: {Math.Abs(weather1.TemperatureC - weather2.TemperatureC)}°C
{(weather1.TemperatureC > weather2.TemperatureC ? $"🔥 {city1} is warmer" : $"🔥 {city2} is warmer")}";
}

7. Description 模板

基础模板:

[Description(@"[简短功能说明]

Use this tool when users ask about:
- [使用场景1]
- [使用场景2]
- [使用场景3]

Examples of user queries:
- '[示例问题1]'
- '[示例问题2]'
- '[示例问题3]'")]

完整模板:

[Description(@"[详细功能说明,包括返回的数据类型和格式]

Use this tool when users want to:
- [使用场景1]
- [使用场景2]
- [使用场景3]

Supports:
- [支持的功能1]
- [支持的功能2]

Examples of user queries:
- '[英文示例1]'
- '[英文示例2]'
- '[中文示例1]'
- '[中文示例2]'

Note: [特殊说明或限制]")]

8. 优化检查清单

在发布工具前,检查以下项目:

高级特性

依赖注入支持

工具方法可以注入服务:

[McpServerTool]
[Description("Get weather with logging")]
public static string GetWeatherWithLogging(
    ILogger<WeatherTools> logger,
    IWeatherService weatherService,
    string city)
{
    logger.LogInformation("Getting weather for {City}", city);
    return weatherService.GetWeather(city);
}

添加 Prompts

[McpServerPromptType]
public static class WeatherPrompts
{
    [McpServerPrompt]
    [Description("Creates a prompt to help plan outdoor activities based on weather")]
    public static ChatMessage PlanOutdoorActivity(
        [Description("The city name")] string city,
        [Description("The activity type")] string activity)
    {
        return new ChatMessage(
            ChatRole.User,
            $@"I want to plan a {activity} activity in {city}.
            Please check the weather forecast and suggest the best day and time.
            Consider temperature, conditions, and provide detailed recommendations."
        );
    }
}

复杂参数类型

SDK 自动支持:

  • 基本类型:stringintbooldouble 等
  • 复杂对象:自动序列化/反序列化
  • 可选参数:使用默认值
  • 数组和集合

故障排除

工具未被发现

检查项:

  • 类是否有 [McpServerToolType] 特性
  • 方法是否有 [McpServerTool] 特性
  • 类是否是静态的
  • 是否重启了应用

认证失败

检查项:

  • Token 是否正确
  • appsettings.json 中 Enabled 设置
  • Authorization header 格式
  • 环境配置(Development vs Production)

CORS 问题

在 Program.cs 中添加 CORS 支持:

builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowMcpClients", policy =>
    {
        policy.WithOrigins("http://localhost:3000")
              .AllowAnyHeader()
              .AllowAnyMethod();
    });
});

app.UseCors("AllowMcpClients");

项目结构

NetCoreApiMcpDemo/
├── Controllers/
│   └── WeatherForecastController.cs  # 标准 WebApi 控制器
├── Tools/
│   └── WeatherTools.cs                # MCP 工具定义
├── Middleware/
│   └── McpAuthenticationMiddleware.cs # 认证中间件
├── Program.cs                          # 应用配置
├── appsettings.json                    # 配置文件
└── appsettings.Development.json        # 开发配置

为什么选择官方 SDK?

  1. 代码更少:无需自定义特性和提供者
  2. 更可靠:官方维护和更新
  3. 更强大:自动 Schema、DI 支持
  4. 更标准:完全符合 MCP 规范
  5. 更易维护:无需维护自定义代码

总结

通过本文,我们学习了如何在 ASP.NET Core WebApi 中集成 MCP 协议支持。使用官方 SDK,只需几行代码就能让你的 API 被 AI 客户端调用。MCP 协议的标准化特性,让 AI 应用与后端服务的集成变得前所未有的简单。

参考资源

源码地址

完整示例代码请访问:[GitHub 仓库地址]


如果本文对你有帮助,欢迎点赞、收藏、关注!有任何问题欢迎在评论区讨论。

DeepSeek-OCR 如何使用?分步教程指南

mikel阅读(363)

来源: DeepSeek-OCR 如何使用?分步教程指南

DeepSeek-OCR 是一个用于光学字符识别(OCR)的强大工具,它可以将图像和 PDF 文档转换为结构化文本。本教程将一步步指导你如何安装、配置和使用 DeepSeek-OCR。

开源项目地址:https://github.com/deepseek-ai/DeepSeek-OCR/tree/main

DeepSeek-OCR 如何使用

 

第一步:环境准备

系统要求

  • 操作系统:Linux/Windows/macOS
  • Python 版本:3.12.9
  • CUDA 版本:11.8 或更高
  • PyTorch 版本:2.6.0

 

硬件要求

  • 推荐 GPU:A100-40G 或同等性能显卡
  • 内存:至少 16GB RAM
  • 存储空间:至少 10GB 可用空间

 

第二步:下载和克隆项目

克隆 GitHub 仓库

git clone https://github.com/deepseek-ai/DeepSeek-OCR.git
cd DeepSeek-OCR

 

查看项目结构项目包含以下主要文件:

  • DeepSeek-OCR-master/ – 主要代码目录
  • assets/ – 资源文件
  • requirements.txt – 依赖包列表
  • README.md – 项目说明文档
DeepSeek-OCR 如何使用

 

第三步:环境配置

创建 Conda 环境

conda create -n deepseek-ocr python=3.12.9 -y
conda activate deepseek-ocr

 

安装 PyTorch

pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu118

 

安装 vLLM(推荐)

# 下载并安装vLLM-0.8.5 whl文件
pip install vllm-0.8.5+cu118-cp38-abi3-manylinux1_x86_64.whl

 

安装其他依赖

pip install -r requirements.txt
pip install flash-attn==2.7.3 --no-build-isolation

 

第四步:模型下载和配置

自动下载模型

当你首次运行 DeepSeek-OCR 时,模型会自动从 Hugging Face 下载:

model_name = 'deepseek-ai/DeepSeek-OCR'

 

配置文件设置

编辑配置文件 DeepSeek-OCR-master/DeepSeek-OCR-vllm/config.py

  • 设置输入路径(INPUT_PATH)
  • 设置输出路径(OUTPUT_PATH)
  • 调整其他相关参数

 

第五步:使用方法详解

使用 vLLM 进行推理(推荐)

方法一:处理单张图像

cd DeepSeek-OCR-master/DeepSeek-OCR-vllm
python run_dpsk_ocr_image.py

 

方法二:处理 PDF 文档

python run_dpsk_ocr_pdf.py

注:处理 PDF 时可达到约 2500tokens/s 的速度(在 A100-40G 上)

 

方法三:批量评估

python run_dpsk_ocr_eval_batch.py

 

使用 Transformers 进行推理

创建 Python 脚本

from transformers import AutoModel, AutoTokenizer
import torch
import os

# 设置GPU
os.environ["CUDA_VISIBLE_DEVICES"] = '0'

# 加载模型和分词器
model_name = 'deepseek-ai/DeepSeek-OCR'
tokenizer = AutoTokenizer.from_pretrained(
    model_name, 
    trust_remote_code=True
)

model = AutoModel.from_pretrained(
    model_name,
    _attn_implementation='flash_attention_2',
    trust_remote_code=True,
    use_safetensors=True
)

# 设置模型参数
model = model.eval().cuda().to(torch.bfloat16)

# 定义提示词和图像路径
prompt = "<image><|grounding|>Convert the document to markdown."
image_file = 'your_image.jpg'
output_path = 'your/output/dir'

# 执行推理
res = model.infer(
    tokenizer,
    prompt=prompt,
    image_file=image_file,
    output_path=output_path,
    base_size=1024,
    image_size=640,
    crop_mode=True,
    save_results=True,
    test_compress=True
)

 

或使用现成脚本

cd DeepSeek-OCR-master/DeepSeek-OCR-hf
python run_dpsk_ocr.py

 

第六步:支持的模式和配置

原生分辨率模式

  • Tiny: 512×512 (64 个视觉 tokens)
  • Small: 640×640 (100 个视觉 tokens)
  • Base: 1024×1024 (256 个视觉 tokens)
  • Large: 1280×1280 (400 个视觉 tokens)

 

动态分辨率模式

  • Gundam: n×640×640 + 1×1024×1024

 

第七步:提示词模板常用提示词

# 文档转换
prompt = "<image>\n<|grounding|>Convert the document to markdown."

# 普通OCR
prompt = "<image>\n<|grounding|>OCR this image."

# 无布局OCR
prompt = "<image>\nFree OCR."

# 图表解析
prompt = "<image>\nParse the figure."

# 详细描述
prompt = "<image>\nDescribe this image in detail."

# 定位特定内容
prompt = "<image>\nLocate <|ref|>目标文字<|/ref|> in the image."

 

第八步:常见问题解决

安装问题如果遇到 vLLM 安装错误:

vllm 0.8.5+cu118 requires transformers>=4.51.1

这是正常现象,不会影响使用。

 

内存不足

  • 降低 batch_size
  • 使用较小的分辨率模式
  • 关闭不必要的程序

 

GPU 显存不足

  • 使用量化模型
  • 减少并发处理数量
  • 调整图像尺寸

 

第九步:性能优化建议

硬件优化

  • 使用高性能 GPU(如 A100、H100)
  • 确保足够的显存
  • 使用 SSD 存储以提高 I/O 速度

 

软件优化

  • 使用 vLLM 而非 Transformers 获得更好性能
  • 开启 Flash Attention 2
  • 根据任务选择合适的分辨率模式

 

总结

DeepSeek-OCR 是一个功能强大的 OCR 工具,通过本教程的分步指导,你应该能够:

  1. 成功安装和配置环境
  2. 掌握基本使用方法
  3. 了解不同的推理模式
  4. 解决常见问题
  5. 优化性能表现

如果你遇到任何问题,可以参考 GitHub 仓库的 Issues 部分或查看官方文档。

AI Agent在CRM与ERP系统中的集成方法及应用实证-云社区-华为云

mikel阅读(125)

来源: AI Agent在CRM与ERP系统中的集成方法及应用实证-云社区-华为云

AI Agent 工作流集成:与业务系统协作的实现方式

随着大型语言模型(LLM)与多模态模型的发展,AI Agent 不再只是独立的对话机器人,而成为可感知、可行动、可编排的智能执行体。将其有效地集成入企业级业务系统,是推动智能化办公、自动化处理和个性化服务的关键。

本文将系统性地探讨 AI Agent 如何与现有业务系统集成,涵盖工作流设计、系统架构、关键模块开发以及集成案例,并附带代码实现。

image.png

1. AI Agent 系统集成的背景与需求

1.1 为什么需要将 AI Agent 与业务系统集成?

  • 业务驱动:自动处理工单、客户服务、报告生成、风险预警等任务。
  • 智能增强:赋能原有系统,实现更智能的决策辅助与流程自动化。
  • 成本效率:减少人工干预,提升运行效率,降低服务成本。

1.2 常见的业务系统类型

  • CRM(客户关系管理系统)
  • ERP(企业资源计划系统)
  • 工单系统(如 Jira、Zendesk)
  • 数据仓库与BI平台(如 Snowflake、Tableau)
  • API服务(如第三方支付、邮件系统)

2. AI Agent 工作流的架构设计

2.1 总体架构图

用户指令 → LLM/Agent → 工作流引擎(LangGraph)→ 调用业务系统 API → 返回结果/触发操作

2.2 模块划分

  • 自然语言理解层(LLM)
  • Agent 执行策略层(如 ReAct, MRKL, Plan-and-Execute)
  • 工作流控制器(如 LangGraph, LangChain Expression Language)
  • 系统 API 适配器
  • 日志监控与安全机制

3. 工作流实现:LangGraph + OpenAI Function Calling 示例

我们通过 LangGraph 构建一个简单的 AI Agent 流程,实现对 CRM 系统的客户信息查询和更新。

3.1 环境准备

pip install langgraph openai requests

3.2 CRM 模拟 API

# mock_crm_api.py
import time

DB = {
    "Alice": {"email": "alice@example.com", "status": "active"},
    "Bob": {"email": "bob@example.com", "status": "inactive"}
}

def get_customer_info(name):
    time.sleep(0.5)
    return DB.get(name, None)

def update_customer_status(name, status):
    if name in DB:
        DB[name]["status"] = status
        return {"success": True}
    return {"success": False}

3.3 构建 LangGraph 工作流

from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolExecutor
from langchain.agents import tool
from openai import OpenAI
from mock_crm_api import get_customer_info, update_customer_status

# 工具定义
@tool
def get_customer(name: str) -> str:
    """获取客户信息"""
    data = get_customer_info(name)
    return str(data) if data else "未找到用户"

@tool
def change_status(name: str, status: str) -> str:
    """更新客户状态"""
    result = update_customer_status(name, status)
    return "更新成功" if result["success"] else "更新失败"

tools = [get_customer, change_status]
tool_executor = ToolExecutor(tools)

# LLM Agent 回调函数
def call_llm_agent(state):
    user_input = state["input"]
    tool_result = tool_executor.invoke({"input": user_input})
    return {"output": tool_result["output"]}

# 构建状态机
workflow = StateGraph()
workflow.add_node("run_agent", call_llm_agent)
workflow.set_entry_point("run_agent")
workflow.set_finish_point("run_agent")

app = workflow.compile()

3.4 测试示例

result = app.invoke({"input": "请把 Alice 的状态更新为 inactive"})
print(result["output"])

4. 与真实业务系统的对接方法

4.1 API 适配层的设计

class CRMAdapter:
    def __init__(self, base_url, token):
        self.base_url = base_url
        self.token = token

    def get_user(self, name):
        return requests.get(f"{self.base_url}/user?name={name}",
                            headers={"Authorization": f"Bearer {self.token}"})

    def update_user(self, name, status):
        return requests.post(f"{self.base_url}/user/update",
                             json={"name": name, "status": status},
                             headers={"Authorization": f"Bearer {self.token}"})

4.2 身份验证与权限控制

  • 支持 OAuth2 或 API Key 鉴权
  • Agent 权限角色隔离(只读、可写、审计员)
  • 请求日志全量记录(用于审计和追责)

5. 案例分享:智能工单处理 Agent 集成

5.1 背景场景

客户提交 IT 故障工单,Agent 自动分析问题、查询知识库、生成处理建议并填入 Jira 工单系统。

5.2 Agent 流程描述

  1. 识别问题关键词
  2. 调用知识库 API 查找类似问题
  3. 汇总建议
  4. 生成 Jira 工单内容
  5. 通过 API 提交

5.3 工作流调用示意

{
  "task": "创建工单",
  "summary": "用户无法连接 VPN",
  "priority": "High",
  "component": "Network",
  "recommendation": "请检查用户本地网络与认证配置"
}

6. 持续集成与部署建议

6.1 推荐的开发与部署方式

  • 使用 FastAPI 封装 Agent API
  • 结合 Docker + CI/CD(如 GitHub Actions) 实现自动部署
  • 与监控平台(如 Prometheus + Grafana)联动,监控任务流成功率与异常日志

6.2 安全与审计

  • 设置 Rate Limiting,防止滥用
  • 记录每次调用的 LLM Input/Output 以供追踪
  • 接入企业日志审计系统

7. 总结与展望

将 AI Agent 集成入业务系统,关键在于三方面:

  • 明确流程结构:拆分 Agent 任务,定义工具边界
  • 连接外部系统:通过 API 抽象与权限控制对接业务逻辑
  • 可控可追溯:具备日志记录、权限管理和调试能力

未来,结合多模态输入(语音、图像)、AutoGPT 自动任务分解和企业大模型私有化部署,AI Agent 的业务协作能力将更强、落地更深。

DeploySharp开源发布:让C#部署深度学习模型更加简单 - 椒颜皮皮虾 - 博客园

mikel阅读(241)

来源: DeploySharp开源发布:让C#部署深度学习模型更加简单 – 椒颜皮皮虾 – 博客园

1. 简介

DeploySharp 是一个专为 C# 开发者设计的跨平台模型部署框架,提供从模型加载、配置管理到推理执行的端到端解决方案。其核心架构采用模块化命名空间设计,显著降低了 C# 生态中深度学习模型的集成复杂度,

1. 架构设计与功能分层

  • 根命名空间 DeploySharp 作为统一入口,集成模型加载、推理执行等核心功能
  • 通过子命名空间(如 DeploySharp.Engine)实现模块化分层设计
  • 关键类采用泛型设计,支持图像处理/分类/检测等多任务标准数据交互

2. 多引擎支持与扩展能力

  • 原生支持 OpenVINO(通过OpenVinoSharp)、ONNX Runtime 推理引擎
  • 支持 YOLOv5-v12全系列模型、Anomaly及其他主流模型部署

3. 跨平台运行时支持

  • 兼容 .NET Framework 4.8 及 .NET 6/7/8/9
  • 深度集成 .NET 运行时生态(NuGet 包管理)

4. 高性能推理能力

  • 异步推理支持(System.Threading.Tasks
  • 支持单张/批量图片推理模式
  • 丰富的预处理(ImageSharp/OpenCvSharp)和后处理操作

5. 开发者支持体系

  • 中英双语代码注释与技术文档
  • log4net 分级日志系统(错误/警告/调试)
  • 提供可视化结果展示方案
  • 提供完善的示例代码库

该项目开源遵循 Apache License 2.0 协议,开发者可通过 QQ 群、微信公众号等渠道获取支持。未来版本计划扩展 TensorRT 支持并优化现有引擎的异构计算能力。

项目链接:

https://github.com/guojin-yan/DeploySharp.git

2. 模型支持列表

Model Name Model Type OpenVINO ONNX Runtime TensorRT
YOLOv5 Detection ing…
YOLOv5 Segmentation ing…
YOLOv6 Detection ing…
YOLOv7 Detection ing…
YOLOv8 Detection ing…
YOLOv8 Segmentation ing…
YOLOv8 Pose ing…
YOLOv8 Oriented Bounding Boxes ing…
YOLOv9 Detection ing…
YOLOv9 Segmentation ing…
YOLOv10 Detection ing…
YOLOv11 Detection ing…
YOLOv11 Segmentation ing…
YOLOv11 Pose ing…
YOLOv11 Oriented Bounding Boxes ing…
YOLOv12 Detection ing…
Anomalib Segmentation ing…

3. NuGet Package

3.1 Core Managed Libraries

Package Description Link
JYPPX.DeploySharp DeploySharp API core libraries https://www.nuget.org/packages/JYPPX.DeploySharp/

3.2 Native Runtime Libraries

Package Description Link
JYPPX.DeploySharp.ImageSharp An assembly that uses ImageSharp as an image processing tool. https://www.nuget.org/packages/JYPPX.DeploySharp.ImageSharp/
JYPPX.DeploySharp.OpenCvSharp An assembly that uses OpenCvSharp as an image processing tool. https://www.nuget.org/packages/JYPPX.DeploySharp.OpenCvSharp/

4. 如何安装

4.1 获取方式

大家可以直接在NuGet Gallery官网上进行查找使用:

image-20251002125042083

或者在Visual Studio的NuGet程序包中进行查找安装:

image-20251002125313962

4.2 NuGet Package组合使用方式

DeploySharp包含了OpenCvSharp、ImageSharp等图像处理方式,同时支持OpenVINO、ONNX Runtime模型部署引擎,因此用户可以根据自己需求自行组合,并安装对应的NuGet Package即可开箱使用。以下总结了常用的一些使用情况的NuGet Package安装场景:

  • OpenVINO推理+OpenCvSharp图像处理
JYPPX.DeploySharp
JYPPX.DeploySharp.OpenCvSharp

OpenVINO.runtime.win
OpenCvSharp4.runtime.win 
  • OpenVINO推理+ImageSharp图像处理
JYPPX.DeploySharp
JYPPX.DeploySharp.ImageSharp

OpenVINO.runtime.win
  • ONNX Runtime推理+OpenCvSharp图像处理
JYPPX.DeploySharp
JYPPX.DeploySharp.OpenCvSharp

OpenCvSharp4.runtime.win 
  • ONNX Runtime推理+ImageSharp图像处理
JYPPX.DeploySharp
JYPPX.DeploySharp.OpenCvSharp
  • ONNX Runtime(OpenVINO加速)推理+ImageSharp图像处理
JYPPX.DeploySharp
JYPPX.DeploySharp.ImageSharp

Intel.ML.OnnxRuntime.OpenVino
  • ONNX Runtime(DML加速)推理+ImageSharp图像处理
JYPPX.DeploySharp
JYPPX.DeploySharp.ImageSharp

Microsoft.ML.OnnxRuntime.DirectML
  • ONNX Runtime(CUDA加速)推理+ImageSharp图像处理
JYPPX.DeploySharp
JYPPX.DeploySharp.ImageSharp

Microsoft.ML.OnnxRuntime.DirectML

由于使用CUDA对ONNX Runtime加速受GPU设备型号以及软件版本影响,因此需要按照ONNX Runtime官方提供的版本对应关系进行下载使用,其中ONNX Runtime与CUDA、cuDNN对应关系请参考一下以下链接:

https://runtime.onnx.org.cn/docs/execution-providers/CUDA-ExecutionProvider.html#requirements

以上所列出的使用方式均可以通过NuGet Package一键安装,同样的,ONNX Runtime还支持更多加速方式,但需要用户自己进行代码构建,其构建流程与方式,参考官方教程即可,链接为:

https://runtime.onnx.org.cn/docs/execution-providers/

5. 开始使用

如果你不知道如何使用,通过下面代码简单了解使用方法。

5.1 ImageSharp图像处理

using DeploySharp.Data;
using DeploySharp.Engine;
using DeploySharp.Model;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using System;

namespace DeploySharp.ImageSharp.Demo
{
    public class YOLOv5DetDemo
    {
        public static void Run()
        {
            // 模型和测试图片可以前往QQ群(945057948)下载
            // 将下面的模型路径替换为你自己的模型路径
            string modelPath = @"E:\Model\Yolo\yolov5s.onnx";
            // 将下面的图片路径替换为你自己的图片路径
            string imagePath = @"E:\Data\image\bus.jpg";
            Yolov5DetConfig config = new Yolov5DetConfig(modelPath);
            //config.SetTargetInferenceBackend(InferenceBackend.OnnxRuntime);
            Yolov5DetModel model = new Yolov5DetModel(config);
            var img = Image.Load(imagePath);
            var result = model.Predict(img);
            model.ModelInferenceProfiler.PrintAllRecords();
            var resultImg = Visualize.DrawDetResult(result, img as Image<Rgb24>, new VisualizeOptions(1.0f));
            resultImg.Save(@$"./result_{ModelType.YOLOv5Det.ToString()}.jpg");
        }
    }
}

5.2 OpenCvSharp图像处理

using OpenCvSharp;
using System.Diagnostics;
using DeploySharp.Model;
using DeploySharp.Data;
using DeploySharp.Engine;
using DeploySharp;
using System.Net.Http.Headers;

namespace DeploySharp.OpenCvSharp.Demo
{
    public class YOLOv5DetDemo
    {
        public static void Run()
        {
            // 模型和测试图片可以前往QQ群(945057948)下载
            // 将下面的模型路径替换为你自己的模型路径
            string modelPath = @"E:\Model\Yolo\yolov5s.onnx";
            // 将下面的图片路径替换为你自己的图片路径
            string imagePath = @"E:\Data\image\bus.jpg";
            Yolov5DetConfig config = new Yolov5DetConfig(modelPath);
            config.SetTargetInferenceBackend(InferenceBackend.OnnxRuntime);
            Yolov5DetModel model = new Yolov5DetModel(config);
            Mat img = Cv2.ImRead(imagePath);
            var result = model.Predict(img);
            model.ModelInferenceProfiler.PrintAllRecords();
            var resultImg = Visualize.DrawDetResult(result, img, new VisualizeOptions(1.0f));
            Cv2.ImShow("image", resultImg);
            Cv2.WaitKey();
        }
    }
}

6.应用案例

获取更多应用案例请参考:

image-20251002124851175

后续会推出更多的应用案例使用介绍,敬请关注。

7. API文档

如果想了解更多信息,可以参阅:DeploySharp API Documented

image-20251002124938166

8. 贡献

如果您对DeploySharp在C#使用感兴趣,有兴趣对开源社区做出自己的贡献,欢迎加入我们,一起开发DeploySharp

如果你对该项目有一些想法或改进思路,欢迎联系我们,指导下我们的工作。

9. 许可证书

本项目的发布受Apache 2.0 license许可认证。

最后如果各位开发者在使用中有任何问题,欢迎大家与我联系。

image-20250224211044113

Win11共享打印0x0000bc4,三步解决共享难题 - AganTee - 博客园

mikel阅读(174)

来源: Win11共享打印0x0000bc4,三步解决共享难题 – AganTee – 博客园

在多人办公场景中,共享打印机能大幅提升效率,但Win11系统常因驱动、网络或权限问题出现错误,其中Win11共享打印0x0000bc4最为常见。这个错误通常提示找不到打印机,本文将给大家分享三种解决方法,帮你恢复打印机共享功能。

一、检查共享设置与网络配置

Win11共享打印0x0000bc4可先从基础设置错误,多数情况是网络或权限配置遗漏导致。

2.1 启用共享基础功能

  1. 设置网络配置文件:
    打开「设置→网络和Internet→高级网络设置」,将当前网络设为「专用」,公用网络会阻止打印机共享;

4c94a041425adf44bc1114bf541628cc.png

  1. 开启共享权限:
    进入「控制面板→网络和共享中心→更改高级共享设置」,勾选「启用网络发现」和「启用文件和打印机共享」,保存设置后重启电脑。

 

2.2 手动添加共享打印机

若系统自动搜索不到共享打印机,可通过IP地址直连:

  1. 在连接打印机的主机上,按 Win+R 输入 cmd,执行 ipconfig 获取IPv4地址;
  2. 在客户端电脑按 Win+R 输入 \\192.168.1.100,回车后找到共享打印机图标,右键「连接」

735c2cdf225729ed82801ee9df201651.png

 

二、修改组策略与服务配置

如果基础设置没问题,Win11共享打印0x0000bc4的原因可能是系统策略限制或服务异常,需要通过组策略编辑器调整。

3.1 配置RPC连接

  1. 按 Win+R 输入 gpedit.msc 打开组策略编辑器;
  2. 依次展开「计算机配置→管理模板→打印机」,双击「配置RPC连接设置」;
  3. 选择「已启用」,在「RPC连接设置」中勾选「命名管道上的RPC」,保存后重启

d9e1c3815f10e22dbf5f887082786bb7.png

3.2 修复Print Spooler服务

  1. 按 Win+R 输入 services.msc,找到「Print Spooler」服务;
  2. 若状态为「已停止」,右键选择「启动」,并将启动类型设为「自动」;
  3. 重启服务后,删除 C:\Windows\System32\spool\PRINTERS 路径下的临时文件,清除打印队列冲突。

5e4321ac80b05b2392461daf16baab89.png

家庭版Win11用户:组策略编辑器默认不可用,可通过「设置→Windows更新」安装累积更新,或手动导入注册表修复RPC配置。

三、驱动修复工具

这个打印机驱动修复管家是个驱动修复工具,可以执行「诊断-修复-驱动匹配」的流程服务。能够进行驱动匹配和故障排查。工具内置驱动库,覆盖惠普、佳能、联想等主流品牌,支持自动识别打印机型号并匹配稳定驱动。界面设计简洁,可通过一键式操作完成从扫描到修复的全过程。

针对Win11共享打印0x0000bc4错误,可以重点检测三类问题:

  • 驱动状态:扫描驱动是否过期、损坏或与Win11不兼容;
  • 共享配置:检查文件和打印机共享功能是否启用;
  • 服务状态:监测Print Spooler等关键服务是否正常运行

34e3964c26f24f01b2900e26c6547ab3.png

修复完成后需重启电脑,重新添加共享打印机。若问题仍存在,可尝试「手动安装模式」,从驱动库中选择历史版本驱动,部分老旧打印机可能需要降级驱动以适配Win11。

四、总结与注意事项

解决Win11共享打印0x0000bc4的关键在于分层排查,需注意:

  • 驱动匹配:老旧打印机优先选择Win10兼容驱动,避免最新版驱动与Win11冲突;
  • 隐私安全:在线工具处理敏感文件时,优先使用本地软件,防止隐私泄露
  • 权限管理:共享主机需为管理员账户,客户端添加时输入正确的主机用户名和密码。

硬盘突然坏掉,我花了半个月才把数据救回来…(附数据恢复工具) - 程序设计实验室 - 博客园

mikel阅读(145)

来源: 硬盘突然坏掉,我花了半个月才把数据救回来…(附数据恢复工具) – 程序设计实验室 – 博客园

硬盘突然坏掉,我花了半个月才把数据救回来…(附数据恢复工具)

前言#

上次说到我的硬盘坏了,真的是当头一棒。😅

因为平时很多工作资料都在这块盘里,数据恢复的过程持续了小半个月,堪称一场心理和体力的双重折磨。

好在最后,大部分文件都救回来了。虽然过程非常花时间,但至少没有全军覆没。🤣

这次经历也算是给我自己上了一课,顺便整理成笔记,分享一下过程和心得。

👉 如果你正好也需要相关工具,我已经整理好了本次用到的软件清单,可以在公众号 「曦远Life」 后台回复 「数据恢复」 获取。

工具的两种思路#

在接触数据恢复工具之前,我总结了一下它们大致有两种工作模式:

  1. 扫描 MFT(Master File Table)
    • 优点:能保留目录结构、文件名,恢复出来的文件比较“原汁原味”。
    • 缺点:如果 MFT 本身损坏严重,可能丢失部分文件,或者文件内容不完整。
  2. 扫描数据块(Raw Scan)
    • 优点:能尽可能多地找回文件内容。
    • 缺点:失去目录结构和文件名,恢复出来一大堆 file0001.jpgfile0002.doc,后期整理会非常痛苦。

大部分恢复软件都是这两种思路的结合,实际使用时需要灵活选择。

👉 我这次用到的工具(DMDE、OSFMount、FinalData 等)都整理在一起了,获取方式:在公众号 「曦远Life」 后台回复 「数据恢复」

关于 NTFS#

NTFS(New Technology File System)是 Windows 系统常用的文件系统,它的优点是:

  • 支持大文件和大容量分区
  • 有权限控制、安全日志
  • 目录和文件的元信息都存储在 MFT(Master File Table) 里

核心要点:MFT 是 NTFS 的总目录表。

如果 MFT 受损,文件系统就像失忆了一样,文件还在,但找不到入口。

MFT介绍#

MFT 记录了每一个文件的:

  • 文件名
  • 路径
  • 大小
  • 时间戳(创建/修改/访问时间)
  • 文件数据所在的位置

所以,当我们做「基于 MFT 的扫描」时,本质上就是在想办法读取这张总目录表。

一旦这张表坏了,就只能退而求其次,去“数据块级别”扫描了。

我这次的思路#

这次我走的是 「先保护现场,再尝试修复」 的思路。

  1. 对分区做镜像
    • 用 DMDE 给损坏的分区做了完整镜像(img 格式)。
    • 原因:避免在原盘上直接操作,防止二次损坏。
  2. 挂载镜像
    • 使用 OSFMount 将镜像挂载为虚拟磁盘分区,方便后续操作。
  3. 文件系统检查
    • 执行 chkdsk /f /r X:
    • /f 修复错误,/r 尝试恢复坏扇区。
    • 过程中系统自动生成了一些 found.000 文件夹,里面是修复时捡回来的“孤立文件”。
  4. 扫描与恢复
    • 使用 FinalData 对挂载盘进行深度扫描。
    • 部分文件恢复成功,保留了文件名和目录结构;部分则散落在 found.000 里,需要人工整理。

成果#

恢复结果:大部分文件都找回来了!

遗憾点:有一部分目录结构和文件名乱了,需要大量时间手动分类、重命名。

总结感受:能把关键文件救回来就算赢了,剩下就是慢工出细活。

小结#

这次经历让我深刻认识到

  • 一定要重视 数据安全
  • 重要数据要 多地备份:本地 + NAS + 多种不同云存储。
  • 不要依赖单一云存储,服务商也可能出问题。

接下来,我也打算升级我的 NAS,把数据安全短板补齐,做到真正的有备无患。

数据无价,别等丢了才后悔!

Vue 配置中解决 CORS 跨域问题【亲测,跨坑!】 - 淡定=淡定 - 博客园

mikel阅读(151)

来源: Vue 配置中解决 CORS 跨域问题【亲测,跨坑!】 – 淡定=淡定 – 博客园

看了网上很多资料,很多不全,只是针对部分场景。请看到最后:

一、CORS 跨域问题解决
1.1、前言

如果你后端使用的是微服务项目,通过配置网关可以很好的解决跨域问题;

如果你使用 SpringBoot + Vue 来写项目,可以在 Controller 上加 @CrossOrigin 来解决跨域,但是一旦你在后端配置了拦截器(比如通过 HandlerInterceptor 配置登录拦截器),那么此时再解决跨域这个问题就很困难了.

Ps:在网上搜索 “Spring Boot 拦截器跨域问题解决” 会有大把大把的办法,但亲测没一个能用…

实际上,可以从 Vue 的角度来解决这个问题,只需要在 Vue 中进行如下配置即可.

1.2、解决办法
a)修改统一配置的 axios 实例
在 Vue 脚手架中,按照标准开发,一般会创建一个 utils 文件夹,里面创建一个 request.js 文件来统一封装 axios.

这里我们修改 axios 实例中的 baseURL 如下:

//构建统一 axios 实例
const instance = axios.create({
baseURL: “/api”,
timeout: 5000
});
Ps:不要管为什么,你先配置!修改的这些配置将来都不会影响你的原有的操作!

b)修改 config 文件夹下的 index.js 文件
在 Vue2 中,config 目录下有一个 index.js 文件.

添加如下配置

‘/api’: {
target: ‘http://localhost:8010’, //目标 url
changeOrigin: true, //是否跨域
pathRewrite: {
‘^/api’: ” //其中 /api 等价于前面的目标地址
}
}
c)完成
配置完了以后,一定要重启前端项目,重新 npm run dev !!

通过以上配置,后端也就无需担忧跨域问题了~
一般情况下,到这就OK了!But,不稳定,过一会又失效了@_@-,总结一下解决方案:

step 1:

修改 config 文件夹下的 index.js 文件
在 Vue2 中,config 目录下有一个 index.js 文件.

 

添加如下红色框里的配置 :

step 2:

修改 config 文件夹下的 dev.env.js 文件:
增加红框里的内容

Step 3:

在实际引入 axios使用的 js 文件里,增加一行:

如下调用:

axios.post(XXXX),then(……,这里的XXX不需要写要访问的服务端http地址了,也不需要写”/api”即可

 step 4:

重新启动 :

npm run dev

.NET 生态洞察:NuGet 下载量 Top 100 包深度解析

mikel阅读(253)

来源: .NET 生态洞察:NuGet 下载量 Top 100 包深度解析

在 .NET 开发中,NuGet 已经成为开发者管理依赖的标配工具。无论是后端 API、微服务,还是桌面应用,很多功能都不必自己重写——直接引用成熟的 NuGet 包即可。

本文整理了 下载量排名前 100 的 NuGet 社区包,并结合实际应用场景分析,让你快速了解哪些库最受欢迎,以及它们的典型用途。

数据来源:NuGet 包下载排行


🔹 JSON & 序列化

  • • Newtonsoft.Json:最流行的 JSON 序列化/反序列化库(虽然 .NET Core 内置 System.Text.Json,但很多项目仍使用它)。
  • • Newtonsoft.Json.Bson:支持 BSON(二进制 JSON)格式的序列化。

🔹 日志 Logging

  • • Serilog:结构化日志库,支持 JSON 输出和多种 sink。
  • • Serilog.Sinks.Console / Serilog.Sinks.File / Serilog.Sinks.Debug:输出到控制台、文件或 Visual Studio 调试窗口。
  • • Serilog.Extensions.Logging / Serilog.Extensions.Hosting:与 .NET Host 和 Microsoft.Extensions.Logging 集成。
  • • Serilog.Settings.Configuration:支持 appsettings.json 配置。
  • • Serilog.Formatting.Compact:压缩 JSON 日志格式。
  • • Serilog.AspNetCoreASP.NET Core 集成。
  • • Serilog.Sinks.PeriodicBatching:支持批量写入日志。

🔹 云服务 SDK

  • • AWSSDK.Core:AWS SDK 核心库。
  • • AWSSDK.S3:操作 Amazon S3。
  • • AWSSDK.SecurityToken:STS 认证(临时凭证)。
  • • AWSSDK.SQS:Amazon 队列服务。
  • • AWSSDK.Lambda:调用 AWS Lambda。

🔹 弹性与容错

  • • Polly:弹性策略库(重试、断路器、超时)。
  • • Polly.Core:核心功能。
  • • Polly.Extensions.Http:专为 HttpClient 提供策略扩展。

🔹 gRPC 生态

  • • Google.Protobuf:Protocol Buffers 序列化。
  • • Grpc.Core.Api / Grpc.Net.Client / Grpc.Net.ClientFactory:核心 API 与客户端。
  • • Grpc.Net.Common:共享组件。
  • • Grpc.Tools:编译 .proto 文件。
  • • Grpc.AspNetCore.Server:在 ASP.NET Core 上搭建 gRPC 服务。

🔹 API 文档 & Swagger

  • • Swashbuckle.AspNetCore.SwaggerGen:生成 Swagger 文档。
  • • Swashbuckle.AspNetCore.Swagger / Swashbuckle.AspNetCore:核心包与集合包。
  • • Swashbuckle.AspNetCore.SwaggerUI:可视化 UI。
  • • Swashbuckle.AspNetCore.Annotations:Swagger 注解支持。

🔹 测试相关

  • • xUnit 系列xunitxunit.corexunit.runner.visualstudioxunit.extensibility.corexunit.extensibility.executionxunit.assertxunit.analyzersxunit.abstractions
  • • Moq:Mock 框架。
  • • FluentAssertions:断言库,语法自然。
  • • NUnit / NUnit3TestAdapter:另一种测试框架及 VS 集成。
  • • Coverlet.Collector:代码覆盖率统计。

🔹 数据库 & ORM

  • • StackExchange.Redis:Redis 客户端。
  • • NpgSQL / NpgSQL.EntityFrameworkCore.PostgreSQL:PostgreSQL 驱动及 EF Core Provider。
  • • Dapper:轻量 ORM。
  • • RabbitMQ.Client:消息队列客户端。
  • • MongoDB.Driver / MongoDB.Bson:MongoDB 驱动及 BSON 类型支持。
  • • SQLitePCLRaw.Core:SQLite 驱动。
  • • DocumentFormat.OpenXml:操作 Word/Excel 等 Office 文档。

🔹 OpenTelemetry(可观测性)

  • • OpenTelemetry.Api / OpenTelemetry.Api.ProviderBuilderExtensions:核心 API 与扩展。
  • • OpenTelemetry / OpenTelemetry.Extensions.Hosting:完整 SDK 与 IHost 集成。
  • • OpenTelemetry.Instrumentation.AspNetCore / OpenTelemetry.Instrumentation.Http:ASP.NET Core 与 HTTP 监控。
  • • OpenTelemetry.Exporter.OpenTelemetryProtocol:OTLP 协议导出器。

🔹 实用工具库

  • • Humanizer.Core:字符串/日期/数字人性化显示(如 “2 days ago”)。
  • • FluentValidation / FluentValidation.DependencyInjectionExtensions:验证框架及 DI 集成。
  • • AutoMapper:对象映射工具。
  • • MediatR / MediatR.Contracts:CQRS 与中介者模式。
  • • Autofac:IoC 容器。
  • • YamlDotNet / CsvHelper:YAML 与 CSV 解析。
  • • DnsClient:DNS 查询。
  • • System.Linq.Async:异步 LINQ 扩展。
  • • RestSharp:HTTP 客户端。
  • • System.Reactive:响应式扩展。
  • • JetBrains.Annotations:代码注解。
  • • Hangfire.Core:后台任务调度。
  • • NJsonSchema:JSON Schema 支持。
  • • SixLabors.ImageSharp / SixLabors.Fonts:图像处理与字体渲染。
  • • SharpCompress / SharpZipLib / ZstdSharp.Port:压缩与解压缩库。
  • • BouncyCastle.Cryptography / Portable.BouncyCastle:加密库。
  • • SSH.NET:SSH 客户端。
  • • log4net:老牌日志库。
  • • HtmlAgilityPack:HTML 解析与操作。

🔹 其他精选库

  • • Pipelines.Sockets.Unofficial:高性能 Socket 库。
  • • Mono.TextTemplating:T4 模板。
  • • Google.Apis 系列:OAuth2 与 API 客户端。
  • • EO.WebBrowser:基于 Chromium 的浏览器控件(商用)。
  • • Fare:正则表达式生成字符串。
  • • Namotion.Reflection:增强反射功能。
  • • SFA.Core.ServiceModel:WCF 相关库。

🔹 总结

这些 NuGet 包覆盖了 序列化、日志、云 SDK、容错、gRPC、API 文档、测试、数据库、可观测性及实用工具 等各类常用场景,是 .NET 开发者最常依赖的生态组成部分。

合理利用这些成熟的库,可以显著提升开发效率和项目稳定性,让你专注于业务逻辑,而不是重复造轮子。

 

··············  END  ··············