当前位置: 首页 > news >正文

企业部署Power BI 报表服务器,在第三方系统嵌套该报表服务器,并实现单点登录

简介

Power BI Report Server 简称PBIRS,中文名"Power BI 报表服务器"

微软的文档:Power BI 报表服务器文档 - Power BI | Microsoft Learn

借用官网的介绍:

  • Power BI 报表服务器类似于 SQL Server Reporting Services 和 Power BI 联机服务,
  • Power BI 报表服务器也可托管 Power BI 报表 (.pbix)、Excel 文件和分页报表 (.rdl)。
  • Power BI 报表服务器是本地服务器。
  • Power BI 报表服务器功能是 Reporting Services 的超集:Reporting Services 可执行的所有操作均可由 Power BI 报表服务器执行,后者还支持 Power BI 报表。

想要实现的功能:

  • 私有化部署Power BI报表服务器
  • 本地开发PBI报表之后,直接部署到服务器
  • 在第三方系统嵌套报表服务器,并实现单点登录

安装

准备一台服务器:

  • CPU:4vCPUs
  • 内存:8GiB
  • 硬盘:100G
  • 镜像: Windows Server 2022 数据中心版 64位 中文_40GB/深圳市伊登软件有限公司

远程登录到服务器,安装软件:

  1. SQL2022-SSEI-Dev:微软数据库 SQL
  2. SSMS-Setup-CHS:微软数据库管理工具
  3. PowerBIReportServer:PBI 报表服务器
  4. 安装 IIS 证书:启用 https
  5. VisualStudioSetup: Visual Studio 开发工具,用于自定义Form登录

安装 SQL Server

  • 下载文件:SQL Server 下载 | Microsoft

  • 双击下载好的exe文件

  • 选择自定义安装

  • 选择安装位置,默认即可

  • 等待安装过程

  • 安装完成之后,出现这个页面,选择【安装】-【全新 SQL Server 独立安装或向现有安装添加功能】

  • 版本:指定可用版本【Developer】-【下一步】

  • 许可条款:【勾选】-【下一步】

  • Microsoft 更新:【不勾选】-【下一步】

  • 适用于 SQL Server 的Azure 扩展:【不勾选】-【下一步】

  • 功能选择:勾选【数据库引擎服务】-【下一步】

  • 实例配置:【默认实例】-【下一步】

  • 服务器配置:直接【下一步】

  • 数据库引擎配置:身份验证模式选择【混合模式】-【设置sa账号密码】-【添加当前用户】-【下一步】

  • 准备安装:直接【下一步】

  • 安装进度

  • 安装完成:点击【关闭】

安装 SSMS

下载地址:下载 SQL Server Management Studio (SSMS) | Microsoft Learn

可以直接按下图进入下载地址

  • 运行exe文件进行安装:【选择安装位置】-【安装】

  • 安装进度

  • 安装完成

安装 PBIRS

下载地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=105943&culture=zh-cn&country=cn

选择下载的程序:【PowerBIReportServer.exe]

  • 运行 PowerBIReportServer.exe 文件:【安装 Power BI 报表服务器】

  • 【选择安装版本】-【下一步】

  • 【勾选许可条款】-【下一步】

  • 直接【下一步】

  • 【指定安装位置】-【下一步】

  • 安装进度

  • 安装完成

安装 IIS 证书

:::color4 开启https,需要满足以下条件,:

  1. 需要购买证书
  2. 服务器导入证书
  3. 需要购买域名
  4. 需要将域名与服务器的ID地址做域名解析
  5. 在 web 服务部署证书

:::

本地下载证书

  • 在本地下载已经授权好的证书,这里使用的是在华为云购买的证书

  • 将下载好的 IIS 证书传到服务器上

服务器上安装证书

  • 在服务器上 Win+R 打开运行,输入mmc

  • 控制台

  • 【文件】-【添加管理单元】

  • 选择【证书】-【添加】

  • 设置证书管理单元:【计算机账户】-【下一步】

  • 选择计算机:【本地计算机】-【下一步】

  • 证书管理单元添加完成:【确定】

  • 在左侧找到【个人】右键选择【所有任务】-【导入】

  • 证书导入向导

  • 选择证书

  • 要选择所有文件,才能在指定文件夹下显示证书

  • 选择 pfx 文件-【打开】

  • 打开txt格式的密钥文件,复制文件内容到密码-【下一步】

  • 证书存储:选择【根据证书类型,自动选择证书存储】-【下一步】

  • 完成导入

  • 导入成功

安装 Visual Studio

:::info 安装 Visual Studio 是为了自定义Form登录,如果不需要修改登录,可以不用安装这个

:::

  • 下载地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具

  • 运行VisualStudioSetup.exe准备安装程序

  • 什么都不需要选,直接点【安装】-【继续】

  • 安装进度

  • 安装完成

配置

配置 PBIRS

  • 打开 PBIRS 配置管理

  • 报表服务器连接配置

  • web 服务 URL:【选择HTTPS 证书】-【应用】

:::color4 如果没有证书,可以不用选择 https 证书,但如果不启用https,就无法实现使用 iframe 嵌入

:::

  • 数据库:【更改数据库连接】

  • 操作:【创建新的报表服务器数据库】-【下一步】

  • 数据库服务器:【直接下一步】

  • 数据库:【直接下一步】

  • 凭据:【直接下一步】

  • 摘要:【直接下一步】

  • 数据库配置完成

web 门户 URL:【应用】,点击url 地址即可访问报表服务器了

服务器访问效果:不需要登录

外网通过ID地址访问,并上传一个pbi文件

:::color4 需要用服务器的账号密码登录

:::

外网采用https访问,并在线预览pbi文件

:::color4 需要用服务器的账号密码登录
注意使用 https 需要先做域名解析

:::

使用 SSMS 连接报表服务器

  • 连接报表服务器

:::color4 如果使用了自定义 form 登录,报表服务器就连不上了

:::

  • 修改报表服务器的CustomHeaders 删掉X-Frame-Options

:::color4 这里很重要,如果这里没有设置,最后面在使用 iframe 嵌套的时候会提示

a frame because it set 'X-Frame-Options' to 'sameorigin

:::

修改前

<CustomHeaders> <Header> <Name>X-Frame-Options</Name> <Pattern>(?(?=((?![?]).)*api.*|.*rs:embed=true.*|.*rc:toolbar=false.*)(^((?!(.+)((\/api)|(\/(.+)(rs:embed=true|rc:toolbar=false)))).*$))|(^(?!(http|https):\/\/([^\/]+)((\/powerbi.*$)|(.*OpType=Calendar.*)))))</Pattern> <Value>SAMEORIGIN</Value> </Header> <Header> <Name>X-Content-Type-Options</Name> <Pattern>.*((\.js$)|(\.css$)|(\.html$))</Pattern> <Value>nosniff</Value> </Header> 
</CustomHeaders>

修改后

<CustomHeaders><Header><Name>X-Content-Type-Options</Name><Pattern>.*((\.js$)|(\.css$)|(\.html$))</Pattern><Value>nosniff</Value></Header></CustomHeaders>

嵌入

使用 iFrame 嵌入报表

 

将报表服务器嵌套到内部系统

<template><iframe class="h-[87vh]" src="https://xxx/Reports/powerbi/SPC?rs:embed=true&iframe"></iframe>
</template>

:::color4 如果需要嵌套,pbi报表名字最好不要用中文,不然嵌套的url 就是这样

https://.../Reports/powerbi/SPC%E5%AE%9E%E9%AA%8C%E9%A1%B9%E7%9B%AE?rs:embed=true

:::

  • 在访问嵌套页面的时候,会有一个登录窗口

  • 登录之后的效果

自定义 Form 登录

:::info 因为Power BI 报表服务器不支持单点登录,为了解决这个登录问题,所以需要自定义 Form 登录

:::

  • 在服务器上先创建一个 PBI 的管理账号

  • 停止PBIRS

  • 下载Form自定义登录demo,源文件在GitHub上,链接:https://github.com/Microsoft/Reporting-Services/tree/master/CustomSecuritySample。

  • 用Visual Studio打开项目文件 CustomSecuritySample.sln 提示需要额外的组件,点击安装

  • 安装组件

  • 安装进度

  • 安装完成之后,在打开项目,修改Logon.aspx代码
<%@ Page Language="C#" CodeBehind="Logon.aspx.cs" AutoEventWireup="false" Inherits="Microsoft.Samples.ReportingServices.CustomSecurity.Logon, Microsoft.Samples.ReportingServices.CustomSecurity" Culture="auto" UICulture="auto" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title>SQL Server 2016 Reporting Services Samples</title><meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1" /><meta name="CODE_LANGUAGE" content="C#" /><meta name="vs_defaultClientScript" content="JavaScript" /><meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5" /><style>body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;background-color: #f4f4f9;margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;}form {background: #ffffff;border-radius: 8px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);width: 400px;padding: 20px;text-align: center;}h1 {font-size: 24px;color: #333333;margin-bottom: 20px;}.form-group {display: flex;flex-direction: row;align-items: center;margin-bottom: 15px;}.form-label {font-size: 14px;font-weight: bold;color: #555555;margin-right: 10px;white-space: nowrap;}.form-control {width: calc(100% - 80px); /* Adjust the width to fit next to the label */padding: 10px;margin-top: 5px;border: 1px solid #cccccc;border-radius: 4px;font-size: 14px;}.btn {width: 100%;padding: 10px;font-size: 14px;font-weight: bold;color: #ffffff;border: none;border-radius: 4px;cursor: pointer;transition: background-color 0.3s ease;}.btn-primary {background-color: #0078d4;}.btn-primary:hover {background-color: #005fa1;}.btn-success {background-color: #2ecc71;}.btn-success:hover {background-color: #27ae60;}.message {margin-top: 20px;font-size: 14px;color: #e74c3c;text-align: left;}</style>
</head>
<body><form id="Form1" runat="server"><h1>SQL Server Reporting Services Sample</h1><!-- 用户名 --><div class="form-group"><asp:Label ID="LblUser" runat="server" CssClass="form-label" Text="账号:" meta:resourcekey="LblUserResource1" /><asp:TextBox ID="TxtUser" runat="server" CssClass="form-control" TabIndex="1" meta:resourcekey="TxtUserResource1" /></div><!-- 密码 --><div class="form-group"><asp:Label ID="LblPwd" runat="server" CssClass="form-label" Text="密码:" meta:resourcekey="LblPwdResource1" /><asp:TextBox ID="TxtPwd" runat="server" TextMode="Password" CssClass="form-control" TabIndex="2" meta:resourcekey="TxtPwdResource1" /></div><!-- 登录按钮 --><asp:Button ID="BtnLogon" runat="server" CssClass="btn btn-primary" Text="登录" TabIndex="3" meta:resourcekey="BtnLogonResource1" /><!-- 注册按钮 --><asp:Button ID="BtnRegister" runat="server" CssClass="btn btn-success" Text="注册" TabIndex="4" meta:resourcekey="BtnRegisterResource1" /><!-- 消息提示 --><asp:Label ID="lblMessage" runat="server" CssClass="message" meta:resourcekey="lblMessageResource1" /></form>
</body>
</html>

修改Logon.axps.cs代码

#region
// Copyright (c) 2016 Microsoft Corporation. All Rights Reserved.
// Licensed under the MIT License (MIT)
/*============================================================================File:     Logon.aspx.csSummary:  The code-behind for a logon page that supports FormsAuthentication in a custom security extension    
--------------------------------------------------------------------This file is part of Microsoft SQL Server Code Samples.This source code is intended only as a supplement to MicrosoftDevelopment Tools and/or on-line documentation. See these othermaterials for detailed information regarding Microsoft code samples.THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR APARTICULAR PURPOSE.
===========================================================================*/
#endregionusing System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Security.Cryptography;
using System.Web.Security;
using Microsoft.ReportingServices.Interfaces;
using Microsoft.Samples.ReportingServices.CustomSecurity.App_LocalResources;
using System.Globalization;namespace Microsoft.Samples.ReportingServices.CustomSecurity
{public class Logon : System.Web.UI.Page{protected System.Web.UI.WebControls.Label LblUser;protected System.Web.UI.WebControls.TextBox TxtPwd;protected System.Web.UI.WebControls.TextBox TxtUser;protected System.Web.UI.WebControls.Button BtnRegister;protected System.Web.UI.WebControls.Button BtnLogon;protected System.Web.UI.WebControls.Label lblMessage;protected System.Web.UI.WebControls.Label Label1;protected System.Web.UI.WebControls.Label LblPwd;// 定义 isIframeRequest 为类级别字段private bool isIframeRequest;private void Page_Load(object sender, System.EventArgs e){var request = HttpContext.Current.Request;string referer = request.UrlReferrer?.ToString();bool isEmpty = !string.IsNullOrEmpty(referer);isIframeRequest = isEmpty && referer.Contains("iframe"); // 判断是否存在关键字,根据实际调整if (isEmpty){LblUser.Visible = false;TxtUser.Visible = false;LblPwd.Visible = false;TxtPwd.Visible = false;BtnRegister.Visible = false;}}#region Web Form Designer generated codeoverride protected void OnInit(EventArgs e){InitializeComponent();base.OnInit(e);}private void InitializeComponent(){this.BtnLogon.Click += new System.EventHandler(this.ServerBtnLogon_Click);this.BtnRegister.Click += new System.EventHandler(this.BtnRegister_Click);this.Load += new System.EventHandler(this.Page_Load);}#endregion[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]private void BtnRegister_Click(object sender,System.EventArgs e){string salt = AuthenticationUtilities.CreateSalt(5);string passwordHash =AuthenticationUtilities.CreatePasswordHash(TxtPwd.Text, salt);if (AuthenticationUtilities.ValidateUserName(TxtUser.Text)){try{AuthenticationUtilities.StoreAccountDetails(TxtUser.Text, passwordHash, salt);}catch (Exception ex){lblMessage.Text = string.Format(CultureInfo.InvariantCulture, ex.Message);}}else{lblMessage.Text = string.Format(CultureInfo.InvariantCulture,Logon_aspx.UserNameError);}}[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]private void ServerBtnLogon_Click(object sender, System.EventArgs e){if (isIframeRequest){// 自定义重定向,使用固定账号登录HandleIframeLogin();}else{// 默认重定向,使用账号密码登录HandleRegularLogin();}}private void HandleIframeLogin(){// 统一使用默认账号登录FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,                              // 版本号"PBI",                          // 用户名DateTime.Now,                   // 创建时间DateTime.Now.AddMinutes(30),    // 过期时间false,                          // 是否持久化string.Empty,                   // 用户数据FormsAuthentication.FormsCookiePath);// 加密票据string encryptedTicket = FormsAuthentication.Encrypt(ticket);// 创建 CookieHttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket){HttpOnly = true,Secure = true,                  // 必须通过 HTTPS 传输SameSite = SameSiteMode.None    // 设置 SameSite 属性};// 添加 Cookie 到响应Response.Cookies.Add(authCookie);// 获取默认的重定向路径string defaultRedirectPath = FormsAuthentication.GetRedirectUrl("PBI", false);// 在默认路径前加上域名string fullRedirectUrl = $"https://pbi.xxx.com{defaultRedirectPath}";// 使用完整的 URL 进行重定向Response.Redirect(fullRedirectUrl);}private void HandleRegularLogin(){bool passwordVerified = false;try{passwordVerified = AuthenticationUtilities.VerifyPassword(TxtUser.Text, TxtPwd.Text);if (passwordVerified){FormsAuthentication.RedirectFromLoginPage(TxtUser.Text, false);}else{Response.Redirect("logon.aspx");}}catch (Exception ex){lblMessage.Text = string.Format(CultureInfo.InvariantCulture, ex.Message);return;}if (passwordVerified){// 用户已认证lblMessage.Text = string.Format(CultureInfo.InvariantCulture, Logon_aspx.LoginSuccess);BtnRegister.Enabled = false;}else{lblMessage.Text = string.Format(CultureInfo.InvariantCulture, Logon_aspx.InvalidUsernamePassword);}}}
}

  • 生成解决方案

  • 在项目目录下找到CustomSecuritySample\bin\Debug\Configure.ps1文件,点击右键编辑

  • 在第33行,把刚才前面创建的 PBI 账号添加进去,然后再点击上面的运行按钮, 运行正确情况下面的是绿色字体显示结果

  • 重新启动服务器报表

  • 在去访问报表服务器的时候,就使用的是自定义 Form 登录了

直接访问地址需要账号密码登录

在其他系统嵌入 iframe 不需要账号密码,直接登录

  • 点击【登录】,效果完美

总结

Power BI 报表服务器私有部署,并嵌入到内部系统总结:

  1. 准备一台云服务器

  2. 在云服务器上安装应用服务

  3. 需要一个域名和https证书

  4. 将域名和报表服务器的IP地址做域名解析

  5. 报表服务器需要启用https证书

  6. 使用 SSMS 连接上Reporting Services(报表服务器)

  7. 在高级里面修改CustomHeaders

  8. 将报表服务器的认证由 AD 改成 Form

  9. 修改 Form 自定义登录 demo 代码

    1. 美化登录页面
    2. 修改登录逻辑,区分是直接访问,还是 iframe 嵌入
  10. 在内部系统的前端采用 iframe 进行嵌套

相关文章:

企业部署Power BI 报表服务器,在第三方系统嵌套该报表服务器,并实现单点登录

简介 Power BI Report Server 简称PBIRS&#xff0c;中文名"Power BI 报表服务器" 微软的文档&#xff1a;Power BI 报表服务器文档 - Power BI | Microsoft Learn 借用官网的介绍&#xff1a; Power BI 报表服务器类似于 SQL Server Reporting Services 和 Power BI…...

Leetcode 2845 题解

还是要把自己做题的思路写出来的&#xff0c;但是结果可能还是得去观摩一下题解&#xff0c;无论是大佬写的题解还是leetcode官方写的题解&#xff0c;看完题解后再去反思才能有收获&#xff0c;即使下次遇见一样的题不见得能写出来&#xff0c;但有思路比没思路更重要。 今天写…...

前端基础之《Vue(12)—插件封装》

一、插件封装 1、在Vue生态中&#xff0c;除了Vue本身&#xff0c;其它所有的与Vue相关的第三方包&#xff0c;都是插件 例子&#xff1a; import VueRouter form vue-router Vue.use(VueRouter) // 注册插件 2、如何封装Vue插件 &#xff08;1&#xff09;第一种写法 const…...

arcpy列表函数的应用(2)

arcpy.ListRasters() 该函数用于列出指定工作空间中的所有栅格数据集。 语法&#xff1a; python arcpy.ListRasters(wild_cardNone, raster_typeNone)• wild_card&#xff1a;用于筛选栅格数据集名称的通配符。 • raster_type&#xff1a;用于筛选栅格数据集的类型&…...

智能电网第7期 | 断网不断控:电力监控网络高可靠通信解决方案

随着智能电网建设加速推进&#xff0c;电力监控系统的可靠性已成为保障电网安全运行的核心要素。在变电站、配电房等关键场景中&#xff0c;网络中断可能导致监控失效、故障扩大等严重后果。当前电力通信网络面临的主要挑战包括&#xff1a; 网络脆弱性&#xff1a;单一链路故障…...

Nacos简介—2.Nacos的原理简介

大纲 1.Nacos集群模式的数据写入存储与读取问题 2.基于Distro协议在启动后的运行规则 3.基于Distro协议在处理服务实例注册时的写路由 4.由于写路由造成的数据分片以及随机读问题 5.写路由 数据分区 读路由的CP方案分析 6.基于Distro协议的定时同步机制 7.基于Distro协…...

offset voltage of Comparator

静态失调电压&#xff08;static offset voltage&#xff09; 主要影响因素&#xff1a;μCox(载流子传输速率和栅氧层电容的的乘积)、阈值电压。 静态失配方差与器件尺寸成反比&#xff0c;可以增大关键对mos管的尺寸 动态失调电压&#xff08;dynamic offset voltage&…...

Spring-Ai-McpSever从外到内

MCP是什么 Model Context Protocol (MCP) 是一个开放协议&#xff0c;它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能。无论你是构建 AI 驱动的 IDE、改善 chat 交互&#xff0c;还是构建自定义的 AI 工作流&#xff0c;MCP 提供了一种标准化的方式&#xff0c;将 LL…...

Vue多地址代理端口调用

第一种方法 config.ts文件 配置多条代理服务端口 如下所示:proxy: {/app: {// 其他的端口target: http://125.124.5.117:12877/,changeOrigin: true}/api: {//默认的端口// http://192.168.31.53:5173/target: http://192.168.31.199:18777/,changeOrigin: true,rewrite: pat…...

Android APP 热修复原理

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ dexElements Android 的 ClassLoader&#xff08;如 PathClassLoader、DexClassLoader&#xff09;内部结构如下&#xff1a; BaseDexClassLoader└── pat…...

一些有关ffmpeg 使用(1)

1 解封装流程 1.1 什么解封装 封装的逆向操作&#xff1a;封装是把音频流、视频流、字幕流等不同成分按一定规则组合成视频文件&#xff08;如 MP4、FLV &#xff09;&#xff0c;复用器负责此过程。解封装则相反&#xff0c;是用解复用器&#xff08;针对 MP4、FLV 等格式有…...

Postman-win64-7.2.2 安装教程(Windows 64位详细步骤)

1. 下载安装包 Postman-win64-7.2.2-Setup.exe下载链接&#xff1a;https://pan.quark.cn/s/6b48480d95d5 2. 运行安装程序 双击下载的 .exe 文件&#xff0c;启动安装向导。 若系统提示权限确认&#xff0c;点击 “是” 允许安装。 3. 安装向导设置 选择安装选项&#xff0…...

C语言实现贪心算法

一、贪心算法核心思想 特征&#xff1a;在每一步选择中都采取当前状态下最优&#xff08;局部最优&#xff09;的选择&#xff0c;从而希望导致全局最优解 适用场景&#xff1a;需要满足贪心选择性质和最优子结构性质 二、经典贪心算法示例 1. 活动选择问题 目标&#xff1a…...

Linux 服务如何使用 curl 利用 HTTP Get 请求传入 SQL 语句修改数据库表内容和结构

本文是博主在部署项目时发现的一个小技巧&#xff0c;项目部署在 Linux 虚拟机上&#xff0c;数据库被设置了写权限&#xff0c;作为开发只能使用程序对数据库做增删改查&#xff0c;但是在开发测试阶段会出现很多问题&#xff0c;权限的问题大大降低了开发效率&#xff0c;所以…...

Java对象转换的多种实现方式

Java对象转换的多种实现方式 在Java开发中&#xff0c;对象转换是一个常见的需求。特别是在不同层次间传递数据时&#xff0c;通常需要将一个对象转换为另一个对象。虽然JSON序列化/反序列化是一种常见的方法&#xff0c;但在某些场景下可能并不是最佳选择。本文将总结几种常见…...

详解 LeetCode 第 242 题 - 有效的字母组

目录 题目描述 解题思路 代码分析 步骤说明 图解原理 优势分析 小结 码题目&#xff1a;LeetCode 242. 有效的字母组 题目描述 给定两个字符串 s 和 t&#xff0c;请判断是否为字母组&#xff08;Anagram&#xff09;。 如果 t 是通过打乱 s 的字符并重新排列所得到的…...

【滑动窗口+哈希表/数组记录】Leetcode 3. 无重复字符的最长子串

题目要求 给定一个字符串 s&#xff0c;找出其中不含有重复字符的最长子串的长度。 子字符串是字符串中连续非空字符序列。 示例 1 输入&#xff1a;s "abcabcbb" 输出&#xff1a;3 解释&#xff1a;无重复字符的最长子串是 "abc"&#xff0c;长度为…...

springmvc-拦截器

目录 一&#xff0c;拦截器的职责 二&#xff0c;拦截器的应用场景 三&#xff0c;拦截器的工作原理 拦截器在Spring MVC请求处理流程中的位置&#xff1a; 四&#xff0c;使用拦截器 一 &#xff0c;编写拦截类&#xff0c;实现HandlerInterceptor接口&#xff0c;重写方…...

【Agent】LangManus深度解析:AI自动化框架的对比与langgraph原理

LangManus深度解析&#xff1a;AI自动化框架的技术演进与实践 本文将带你深入探索LangManus这一AI自动化框架的核心技术与其基于langgraph的实现原理&#xff0c;并与OpenManus进行全面对比&#xff0c;助你掌握多智能体系统的前沿技术。 本文3万字&#xff0c;没有时间的话可以…...

【FreeRTOS】事件标志组

文章目录 1 简介1.1事件标志1.2事件组 2事件标志组API2.1创建动态创建静态创建 2.2 删除事件标志组2.3 等待事件标志位2.4 设置事件标志位在任务中在中断中 2.5 清除事件标志位在任务中在中断中 2.6 获取事件组中的事件标志位在任务中在中断中 2.7 函数xEventGroupSync 3 事件标…...

如何通过电路测量运放的增益带宽积(GBP)和压摆率(SR)

一、增益带宽积&#xff08;GBP&#xff09;的测量 定义&#xff1a;增益带宽积是运算放大器的开环增益下降到直流增益的 ​&#xff08;即 - 3dB&#xff09;时对应的频率与该频率下增益的乘积&#xff0c;数学表达式为&#xff1a; 其中 A0​ 是直流开环增益&#xff0c;f0​…...

SAP接口超时:对 FOR ALL ENTRIES IN 的优化

SAP接口超时 经分析要10多分钟以上才出结果&#xff0c;且是这个语句耗时较长&#xff1a; SELECTaufnrmatnrbdmnglgortmeinschargFROM resbINTO CORRESPONDING FIELDS OF TABLE lt_lylcddxhFOR ALL ENTRIES IN lt_lylcddWHERE aufnr IN r_aufnr发现RESB有420万条记录&#xf…...

ElementUi的Dropdown下拉菜单的详细介绍及使用

Dropdown是 ElementUI 中用于创建下拉菜单项的一个组件&#xff0c;通常el-dropdown-item 包裹在 el-dropdown 组件中使用。以下从功能特性(一些属性及方法)、使用和高级功能(高亮显示&#xff0c;滚动&#xff0c;额外传参数)三个方面进行详细介绍。 一、功能特性 1.触发方式…...

C++类模板编程练习(从基础到进阶)

一、基础模板类设计 泛型盒子&#xff08;Box&#xff09; 实现一个 Box 类模板&#xff0c;存储任意类型的值&#xff0c;并提供获取/修改方法。 Box<int> intBox(42); cout << intBox.get(); // 输出 42 intBox.set(100);类型转换器&#xff08;Converter&…...

基于物联网的智能家居安全防护系统设计

资料下载地址&#xff1a;基于物联网的智能家居安全防护系统仿真&#xff08;仿真代码&#xff09; 目录 一、功能介绍 二、仿真图 三、程序 一、功能介绍 1.单片机和app、OneNet云平台通过wifi进行通信 2.马达模拟家里的用电设备&#xff0c;可通过按键开关 3.可检测用电量…...

android jatpack Compose 多数据源依赖处理:从状态管理到精准更新的架构设计

Android Compose 多接口数据依赖管理&#xff1a;ViewModel 状态共享最佳实践 &#x1f4cc; 问题背景 在 Jetpack Compose 开发中&#xff0c;经常遇到以下场景&#xff1a; 页面由多个独立接口数据组成&#xff08;如 Part1、Part2&#xff09;Part2 的某些 UI 需要依赖 P…...

非序列实现MEMS聚焦功能

zemax非序列模式下有MEMS,但是没有对应的代码。无法修改成自己需要的功能 以下是实现MEMS聚焦功能: #include <windows.h> #include <cmath> #include <stdio.h> #include <string.h> #include <algorithm> #undef max #undef min#define D…...

基于Java,SpringBoot,Vue,HTML宠物相亲配对婚恋系统设计

摘要 基于Java、SpringBoot、Vue和HTML的宠物相亲配对系统设计旨在为宠物主人打造一个高效、智能的宠物社交与配对平台。系统采用前后端分离架构&#xff0c;前端基于Vue.js框架结合HTML/CSS/JavaScript构建动态交互界面&#xff0c;实现宠物信息展示、用户社交互动等功能&…...

AI大模型学习十二:‌尝鲜ubuntu 25.04 桌面版私有化sealos cloud + devbox+minio对象存储测试和漫长修改之路

一、说明 前面已经安装完成&#xff0c;这里我们测试对象存储 AI大模型学习十一&#xff1a;‌尝鲜ubuntu 25.04 桌面版私有化sealos cloud devboxminio&#xff0c;实战运行成功-CSDN博客https://blog.csdn.net/jiangkp/article/details/147424823?spm1011.2415.3001.5331 二…...

身份与访问管理(IAM):零信任架构下的认证授权技术与实战

身份与访问管理&#xff08;IAM&#xff09;&#xff1a;零信任架构下的认证授权技术与实战 在网络安全防御体系中&#xff0c;身份与访问管理&#xff08;Identity and Access Management, IAM&#xff09;是守护数字资产的“数字门禁系统”。随着远程办公和多云架构的普及&a…...

潮了 低配电脑6G显存生成60秒AI视频 本地部署/一键包/云算力部署/批量生成

最近发现了一个让人眼前一亮的工具——FramePack&#xff0c;它能用一块普通的6GB显存笔记本GPU&#xff0c;生成60秒电影级的高清视频画面&#xff0c;效果堪称炸裂&#xff01;那么我们就把他本地部署起来玩一玩、下载离线一键整合包&#xff0c;或者是用云算力快速上手。接下…...

高防IP+CDN组合:电商大促的“双保险”防护方案

引言 电商大促期间&#xff0c;平台流量呈爆发式增长&#xff0c;既要应对瞬时激增的访问量&#xff0c;又要防范黑客趁机发起的DDoS攻击、恶意爬虫等威胁。单一防护手段往往难以兼顾性能与安全&#xff0c;而高防IPCDN组合通过“流量清洗加速分发”的双重机制&#xff0c;为电…...

“IAmMusicFont.com“:将音乐变成视觉

很高兴向大家介绍——IAmMusicFont.com&#xff0c;这是一个专为音乐爱好者和设计师打造的在线字体生成器&#xff0c;灵感源自Playboi Carti 2025年专辑《MUSIC》&#xff08;又称"I Am Music"&#xff09;的标志性封面设计。 什么是"I am music font"&a…...

C++入门(下)

本文为个人学习笔记&#xff0c;如有错误欢迎批评指正&#xff0c;如有侵权&#xff0c;请联系删除。 今日名言&#xff1a; 好运只是个副产品&#xff0c;只有当你不带任何私心杂念&#xff0c;单纯的去做事情时&#xff0c;他才会降临。 上一篇文章我们讲了C入门的一部分内容…...

ubuntu22.04 命令行修改静态ip

传统interfaces文件配置&#xff08;适用于旧版&#xff09;即便我们已经在桌面上配置了固定ip 这里也可以修改 ‌编辑配置文件‌ 修改/etc/network/interfaces&#xff08;需安装net-tools&#xff09;&#xff1a; # interfaces(5) file used by ifup(8) and ifdown(8) # In…...

Ubuntu18.04配置C++环境和Qt环境

Ubuntu18.04配置C环境和Qt环境 1、前言3.2 安装其他库3.3 查看有没有安装成功3.4测试C环境 4、配置Qt环境4.1 安装相关的库4.2 测试 5、总结 1、前言 记录一下Ubuntu18.04配置C环境和Qt环境的过程&#xff0c;方便自己日后回顾&#xff0c;也可以给有需要的人提供帮助。 # 2…...

深度学习--自然语言处理统计语言与神经语言模型

文章目录 前言一、语言转换方法1、数据预处理2、特征提取3、模型输入4、模型推理 二、语言模型1、统计语言模型1) 机器学习词向量转换2&#xff09;解释&#xff1a;3) 统计语言模型存在的问题 2、神经语言模型1&#xff09;one—hot编码2&#xff09;解决维度灾难3&#xff09…...

linux ptrace 图文详解(七) gdb、strace跟踪系统调用

目录 一、gdb/strace 跟踪程序系统调用 二、实现原理 三、代码实现 四、总结 &#xff08;代码&#xff1a;linux 6.3.1&#xff0c;架构&#xff1a;arm64&#xff09; One look is worth a thousand words. —— Tess Flanders 相关链接&#xff1a; linux ptrace 图…...

Feign接口调用失败降级机制

是的&#xff0c;通过 FallbackFactory 实现的降级逻辑在 Feign 接口调用失败时会被触发&#xff0c;但需要注意以下关键点以确保降级生效&#xff1a; 一、代码有效性分析 降级逻辑是否生效&#xff1f; • 是的&#xff0c;当 Feign 调用 BaseServiceFeign 接口的 updateMoni…...

系统架构-安全架构设计

概述 对于信息系统来说&#xff0c;威胁有&#xff1a;物理环境&#xff08;最基础&#xff09;、通信链路、网络系统、操作系统、应用系统、管理系统 物理安全&#xff1a;系统所用设备的威胁&#xff0c;如自然灾害、电源故障通信链路安全&#xff1a;在传输线路上安装窃听…...

python实现简单的UI交互

文章目录 1. 基础打印 覆盖同一行2. 多行动画效果3. 彩色文本&#xff08;Windows/macOS/Linux&#xff09;4. 输入交互5. 异步输入与非阻塞显示6. 高级控制台 UI 库 可以通过控制台打印实现简单的「伪UI交互」&#xff0c;尤其适合展示进度、动态文本或轻量级状态反馈。以下是…...

高频面试题:如何保证数据库和es数据一致性

背景 在实际项目开发中&#xff0c;我们经常将MySQL作为业务数据库&#xff0c;ES作为查询数据库&#xff0c;用来实现读写分离&#xff0c;缓解MySQL数据库的查询压力&#xff0c;应对海量数据的复杂查询&#xff0c;这其中有一个很重要的问题&#xff0c;就是如何实现MySQL数…...

CS001-7-hbao

HBAO https://zhuanlan.zhihu.com/p/348467142 HBAO(屏幕空间的环境光遮蔽) - 知乎 (zhihu.com) [摸着原神学图形]HBAO实现与优化 - 知乎 (zhihu.com) https://zhuanlan.zhihu.com/p/367793439 Global Illumination_Horizon-Based Ambient Occlusion(HBAO)-CSDN博客 这个解…...

使用npm install或cnpm install报错解决

1.从git上拉了一个新vue项目npm install 报错如下 解决办法&#xff1a; 清除npm缓存 npm cache clean -force 2.阿里云镜像证书过期&#xff0c;报错如下 解决办法&#xff1a; 更换阿里云镜像地址 #原来的地址是&#xff1a;https://registry.npm.taobao.org/ cnpm confi…...

Electron Forge【实战】阿里百炼大模型 —— AI 聊天

获取 apiKey 登录并开通阿里云百炼 https://bailian.console.aliyun.com/#/home 新人有半年免费的使用福利&#xff0c;在模型详情中&#xff0c;可以查看剩余的免费额度 https://bailian.console.aliyun.com/?tabmodel#/model-market/detail/qwen-turbo 在下方链接中创建 ap…...

Vue3实现高仿word自定义颜色选择器组件(支持 v-model)

目录 Vue3实现高仿word自定义颜色选择器组件&#xff08;支持 v-model&#xff09;需求分析大致效果需求功能实现所需技术从UI哪里拿到主题颜色标准色进行子主组件的v-model实现子组件布局实现子组件样式实现子组件全部代码&#xff1a;父组件调用方式完结 Vue3实现高仿word自定…...

.NET中,const和readonly区别

在.NET中&#xff0c;const和readonly都用于定义不可变的值&#xff0c;但它们在行为和使用场景上有显著区别。以下是两者的详细对比&#xff1a; 初始化时机 • const ◦ 编译时常量&#xff0c;必须在声明时赋值。 ◦ 值在编译时确定&#xff0c;并被直接嵌入到IL代码中&…...

力扣-206.反转链表

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 class Solution { public:ListNode* reverseList(ListNode* head) {//头插法ListNode *p head;headnullptr;ListNode *temp nullptr;while (p! nullptr){tempp;pp->next;tem…...

五一去荣昌吃卤鹅?基于Java和天地图的寻找荣昌卤鹅店实践

目录 前言 1、卤鹅哥与甲亢哥的爆火事件 2、荣昌卤鹅产业的空间分布 3、使用Java 和天地图进行产业挖掘 一、地名检索简介 1、地名检索功能 2、地名检索API介绍 二、荣昌卤鹅检索实践 1、数据获取流程 2、天地图API请求构建 3、参数构建及调用 4、结果生成及本地保存…...

力扣-160.相交链表

题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返…...