<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>工具与工程化 on 码上生长 - 探索个人成长的无限可能</title>
    <link>https://dstweihao.cn/categories/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/</link>
    <description>Recent content in 工具与工程化 on 码上生长 - 探索个人成长的无限可能</description>
    <generator>Hugo -- 0.144.2</generator>
    <language>zh</language>
    <lastBuildDate>Mon, 17 Nov 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://dstweihao.cn/categories/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>办公电脑不允许安装个人微信，应该怎么办？</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/%E6%8E%92%E5%9D%91%E8%AE%B0%E5%BD%95/%E5%8A%9E%E5%85%AC%E7%94%B5%E8%84%91%E4%B8%8D%E5%85%81%E8%AE%B8%E5%AE%89%E8%A3%85%E4%B8%AA%E4%BA%BA%E5%BE%AE%E4%BF%A1%E5%BA%94%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E/</link>
      <pubDate>Mon, 17 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/%E6%8E%92%E5%9D%91%E8%AE%B0%E5%BD%95/%E5%8A%9E%E5%85%AC%E7%94%B5%E8%84%91%E4%B8%8D%E5%85%81%E8%AE%B8%E5%AE%89%E8%A3%85%E4%B8%AA%E4%BA%BA%E5%BE%AE%E4%BF%A1%E5%BA%94%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;有些公司是禁止办公电脑任意安装软件的，只能安装公司 IT 部门严格筛选的软件，有些公司甚至是不允许安装个人微信的。&lt;/p&gt;
&lt;p&gt;那如果我真的要使用个人微信，就要安装了，应该怎么办呢？&lt;/p&gt;
&lt;h2 id=&#34;方案一向日葵远程控制软件&#34;&gt;方案一：向日葵远程控制软件&lt;/h2&gt;
&lt;p&gt;如果办公电脑不允许安装个人微信，但是办公电脑有向日葵远程控制软件，那么就可以通过远程到办公的第二台电脑或者自己家里的电脑来解决问题。&lt;/p&gt;
&lt;p&gt;这没有什么好说的，但是就我的验证而言，效果真的不太理想。&lt;/p&gt;
&lt;p&gt;因为向日葵远程控制软件现在好像取消了画质设置，以前还是可以选择高清的，现在要交钱了，导致效果很差，画面一直都很糊，还时不时卡掉，简直没法用。&lt;/p&gt;
&lt;h2 id=&#34;方案一向日葵远程控制软件-1&#34;&gt;方案一：向日葵远程控制软件&lt;/h2&gt;
&lt;p&gt;如果办公电脑不允许安装个人微信，但是，办公电脑有向日葵远程控制软件，那么，就可以通过远程到办公的第二台电脑或者自己家里的电脑来解决问题。这个没有什么好说的，但是，就我的验证而言，效果真的不太理想，因为向日葵远程控制软件现在好像砍掉画质设置了，以前还是可以选择高清的，现在要交钱了，导致效果很差，画面一直都很糊，还时不时卡掉，简直没法用。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202511171614578.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;方案二夜神模拟器&#34;&gt;方案二：夜神模拟器&lt;/h2&gt;
&lt;p&gt;如果通过手机模拟器，比如夜神模拟器来实现的话，也就是说，只能安装手机版的个人微信，那么就和个人手机使用产生冲突。&lt;/p&gt;
&lt;p&gt;夜神模拟器登录了，个人手机就要下线，这个说实话不是很方便，所以，这个方案，是能够实现，但是效果不佳。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202511151746911.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;方案三通过pc虚拟机实现&#34;&gt;方案三：通过PC虚拟机实现&lt;/h2&gt;
&lt;p&gt;通过 Oracle VM VirtualBox 软件，下载 Ubuntu 操作系统，然后就可以在里面安装个人微信了。&lt;/p&gt;
&lt;p&gt;因为在虚拟机中，软件安装受限问题已经没有了，说实话，这个效果还是很不错的。&lt;/p&gt;
&lt;p&gt;如果你设置到位，比如关闭自动锁屏，调整好窗口，那么当成一台无限制的 PC 电脑来使用，完全问题不大，更不用说是安装个人微信了。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202511151752379.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202511151744906.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;
&lt;p&gt;说实话，这篇文章看起来好像很水的样子，但是核心的点其实是，遇到一些不可能的问题，怎么去分析和拆解，并解决掉。&lt;/p&gt;
&lt;p&gt;首先，当然要知道公司禁止办公电脑安装个人微信的目的是什么，一方面是避免敏感资料外发，另一方面可能是担心员工划水吧。&lt;/p&gt;
&lt;p&gt;在知晓这个目的之下，然后呢，不去安装盗版软件、不去外发公司敏感资料等等。&lt;/p&gt;
&lt;p&gt;在遵守规则的前提之下，怎么灵活处理遇到的问题，达成自己的目的，这个才是最关键的。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="前言">前言</h2>
<p>有些公司是禁止办公电脑任意安装软件的，只能安装公司 IT 部门严格筛选的软件，有些公司甚至是不允许安装个人微信的。</p>
<p>那如果我真的要使用个人微信，就要安装了，应该怎么办呢？</p>
<h2 id="方案一向日葵远程控制软件">方案一：向日葵远程控制软件</h2>
<p>如果办公电脑不允许安装个人微信，但是办公电脑有向日葵远程控制软件，那么就可以通过远程到办公的第二台电脑或者自己家里的电脑来解决问题。</p>
<p>这没有什么好说的，但是就我的验证而言，效果真的不太理想。</p>
<p>因为向日葵远程控制软件现在好像取消了画质设置，以前还是可以选择高清的，现在要交钱了，导致效果很差，画面一直都很糊，还时不时卡掉，简直没法用。</p>
<h2 id="方案一向日葵远程控制软件-1">方案一：向日葵远程控制软件</h2>
<p>如果办公电脑不允许安装个人微信，但是，办公电脑有向日葵远程控制软件，那么，就可以通过远程到办公的第二台电脑或者自己家里的电脑来解决问题。这个没有什么好说的，但是，就我的验证而言，效果真的不太理想，因为向日葵远程控制软件现在好像砍掉画质设置了，以前还是可以选择高清的，现在要交钱了，导致效果很差，画面一直都很糊，还时不时卡掉，简直没法用。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202511171614578.png"></p>
<h2 id="方案二夜神模拟器">方案二：夜神模拟器</h2>
<p>如果通过手机模拟器，比如夜神模拟器来实现的话，也就是说，只能安装手机版的个人微信，那么就和个人手机使用产生冲突。</p>
<p>夜神模拟器登录了，个人手机就要下线，这个说实话不是很方便，所以，这个方案，是能够实现，但是效果不佳。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202511151746911.png"></p>
<h2 id="方案三通过pc虚拟机实现">方案三：通过PC虚拟机实现</h2>
<p>通过 Oracle VM VirtualBox 软件，下载 Ubuntu 操作系统，然后就可以在里面安装个人微信了。</p>
<p>因为在虚拟机中，软件安装受限问题已经没有了，说实话，这个效果还是很不错的。</p>
<p>如果你设置到位，比如关闭自动锁屏，调整好窗口，那么当成一台无限制的 PC 电脑来使用，完全问题不大，更不用说是安装个人微信了。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202511151752379.png"></p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202511151744906.png"></p>
<h2 id="总结">总结</h2>
<p>说实话，这篇文章看起来好像很水的样子，但是核心的点其实是，遇到一些不可能的问题，怎么去分析和拆解，并解决掉。</p>
<p>首先，当然要知道公司禁止办公电脑安装个人微信的目的是什么，一方面是避免敏感资料外发，另一方面可能是担心员工划水吧。</p>
<p>在知晓这个目的之下，然后呢，不去安装盗版软件、不去外发公司敏感资料等等。</p>
<p>在遵守规则的前提之下，怎么灵活处理遇到的问题，达成自己的目的，这个才是最关键的。</p>
]]></content:encoded>
    </item>
    <item>
      <title>SEO 优化工具介绍与实操说明</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/%E5%BB%BA%E7%AB%99%E4%B8%8E%E8%BF%90%E8%90%A5/seo-%E4%BC%98%E5%8C%96%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%BB%8D%E4%B8%8E%E5%AE%9E%E6%93%8D%E8%AF%B4%E6%98%8E/</link>
      <pubDate>Wed, 10 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/%E5%BB%BA%E7%AB%99%E4%B8%8E%E8%BF%90%E8%90%A5/seo-%E4%BC%98%E5%8C%96%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%BB%8D%E4%B8%8E%E5%AE%9E%E6%93%8D%E8%AF%B4%E6%98%8E/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509101320607.jpeg&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;1-前言&#34;&gt;1. 前言&lt;/h1&gt;
&lt;p&gt;在之前的文章《ToB 官网 SEO 工作总结：认知转变、工具实操与排名/收录优化思路》中，曾提及部分 SEO 优化检测工具，但未展开说明。&lt;/p&gt;
&lt;p&gt;本次将结合个人使用经验，以本人博客网站（https://dstweihao.cn）为例，简单介绍常用 SEO 工具的核心用法。&lt;/p&gt;
&lt;h1 id=&#34;2-百度统计&#34;&gt;2. 百度统计&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;官网地址：https://tongji.baidu.com/web5/welcome/login&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;对我而言，百度统计的核心作用是统计网站访问量、受访页面排行、搜索词排行等基础数据。其余功能比如转化分析、地区分布更适合 ToC 场景，现阶段使用需求较低。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509091748125.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;这里补充一个使用小插曲：&lt;/p&gt;
&lt;p&gt;曾遇到登录百度统计后，主页持续报错且刷新无效的问题。&lt;/p&gt;
&lt;p&gt;排查后发现是电脑安装的 AdGuard 广告拦截工具对该网站进行了拦截，其他网站无此问题。&lt;/p&gt;
&lt;p&gt;最快捷的解决方式是暂时关闭 AdGuard 即可正常使用。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509091754292.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;3-百度搜索资源平台&#34;&gt;3. 百度搜索资源平台&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;官网地址：https://ziyuan.baidu.com/keywords/index&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;百度搜索资源平台不仅有丰富的 SEO 学习资料，从工具层面看，其核心价值在于帮我解决了“官网关键词排名未知”的痛点。&lt;/p&gt;
&lt;p&gt;比如想知道博客网站在百度搜索“项目管理”时的具体排名，也就是第几页、第几行。&lt;/p&gt;
&lt;p&gt;以“项目管理”关键词为例，百度搜索结果中，除百度百科的专有名词解释页外，排名靠前的是知乎文章《什么是项目管理？五大流程是什么》。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509091800113.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;实际上，SEO 优化的核心目标之一，就是让含目标关键词的页面（网站首页、文章页或产品说明页)排名靠前。&lt;/p&gt;
&lt;p&gt;通过平台内的“流量与关键词”页面，可直接查看特定关键词下网站的实时排名。&lt;/p&gt;
&lt;p&gt;例如关键词“toolbarstate_v5.11 意思 -广告 -推广”在百度搜索中排名第九，实际检索也能确认其处于第一页第九位。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509100854932.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509100855746.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;4-站长之家&#34;&gt;4. 站长之家&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;官网地址：https://seo.chinaz.com&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;站长之家的 SEO 工具功能丰富，目前我主要用它两个核心功能。&lt;/p&gt;
&lt;p&gt;第一是快速查询网站在各搜索引擎的收录量，直观了解网站内容被检索的范围。&lt;/p&gt;
&lt;p&gt;第二是利用“TDK 改写”功能优化网站标题、关键词与描述，帮助百度爬虫更精准识别页面核心信息，提升排名潜力。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509100901457.png&#34;&gt; &lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509100902171.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;5-ubersuggest网站-seo-问题检测&#34;&gt;5. Ubersuggest：网站 SEO 问题检测&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;官网地址：https://neilpatel.com/cn/ubersuggest&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;以我的博客网站（dstweihao.cn）为例，Ubersuggest 支持全网站审核。它会抓取所有页面进行深度分析，定位 SEO 问题。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202508291630605.png&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509101320607.jpeg"></p>
<h1 id="1-前言">1. 前言</h1>
<p>在之前的文章《ToB 官网 SEO 工作总结：认知转变、工具实操与排名/收录优化思路》中，曾提及部分 SEO 优化检测工具，但未展开说明。</p>
<p>本次将结合个人使用经验，以本人博客网站（https://dstweihao.cn）为例，简单介绍常用 SEO 工具的核心用法。</p>
<h1 id="2-百度统计">2. 百度统计</h1>
<blockquote>
<p>官网地址：https://tongji.baidu.com/web5/welcome/login</p></blockquote>
<p>对我而言，百度统计的核心作用是统计网站访问量、受访页面排行、搜索词排行等基础数据。其余功能比如转化分析、地区分布更适合 ToC 场景，现阶段使用需求较低。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509091748125.png"></p>
<p>这里补充一个使用小插曲：</p>
<p>曾遇到登录百度统计后，主页持续报错且刷新无效的问题。</p>
<p>排查后发现是电脑安装的 AdGuard 广告拦截工具对该网站进行了拦截，其他网站无此问题。</p>
<p>最快捷的解决方式是暂时关闭 AdGuard 即可正常使用。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509091754292.png"></p>
<h1 id="3-百度搜索资源平台">3. 百度搜索资源平台</h1>
<blockquote>
<p>官网地址：https://ziyuan.baidu.com/keywords/index</p></blockquote>
<p>百度搜索资源平台不仅有丰富的 SEO 学习资料，从工具层面看，其核心价值在于帮我解决了“官网关键词排名未知”的痛点。</p>
<p>比如想知道博客网站在百度搜索“项目管理”时的具体排名，也就是第几页、第几行。</p>
<p>以“项目管理”关键词为例，百度搜索结果中，除百度百科的专有名词解释页外，排名靠前的是知乎文章《什么是项目管理？五大流程是什么》。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509091800113.png"></p>
<p>实际上，SEO 优化的核心目标之一，就是让含目标关键词的页面（网站首页、文章页或产品说明页)排名靠前。</p>
<p>通过平台内的“流量与关键词”页面，可直接查看特定关键词下网站的实时排名。</p>
<p>例如关键词“toolbarstate_v5.11 意思 -广告 -推广”在百度搜索中排名第九，实际检索也能确认其处于第一页第九位。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509100854932.png"></p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509100855746.png"></p>
<h1 id="4-站长之家">4. 站长之家</h1>
<blockquote>
<p>官网地址：https://seo.chinaz.com</p></blockquote>
<p>站长之家的 SEO 工具功能丰富，目前我主要用它两个核心功能。</p>
<p>第一是快速查询网站在各搜索引擎的收录量，直观了解网站内容被检索的范围。</p>
<p>第二是利用“TDK 改写”功能优化网站标题、关键词与描述，帮助百度爬虫更精准识别页面核心信息，提升排名潜力。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509100901457.png"> <img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509100902171.png"></p>
<h1 id="5-ubersuggest网站-seo-问题检测">5. Ubersuggest：网站 SEO 问题检测</h1>
<blockquote>
<p>官网地址：https://neilpatel.com/cn/ubersuggest</p></blockquote>
<p>以我的博客网站（dstweihao.cn）为例，Ubersuggest 支持全网站审核。它会抓取所有页面进行深度分析，定位 SEO 问题。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202508291630605.png"></p>
<p>某次检测共抓取 627 个页面，发现 1492 个 SEO 问题，涵盖“内容字数不足”“元描述重复”“缺少 H1 标签”等常见问题。</p>
<p>工具会按问题类型归类，标注涉事页面数量，同时同步提供问题解释与具体修复方案，实操性较强。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202508291650455.png"></p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202508291642628.png"></p>
<h1 id="6-seoquake-插件实时-seo-问题检测">6. SEOquake 插件：实时 SEO 问题检测</h1>
<blockquote>
<p>官网地址：https://www.seoquake.com</p></blockquote>
<p>SEOquake 是免费浏览器插件，支持 Chrome、Firefox、Edge 等主流浏览器，使用便捷。</p>
<p>它能实时检测当前页面的 SEO 问题，包括页面基础分析、移动兼容性、站点合规性等。</p>
<p>只需根据反馈的问题提示逐一修正即可，适合日常页面优化自查。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509100932929.png"></p>
<h1 id="7-url-提取器批量获取网站页面链接">7. URL 提取器：批量获取网站页面链接</h1>
<blockquote>
<p>官网地址：https://www.urltoany.com/zh/url-extractor</p></blockquote>
<p>当怀疑百度爬虫未及时抓取网站新增页面、部分页面未被收录，或担心爬虫遗漏页面时，可手动将链接提交至搜索引擎平台。</p>
<p>而批量获取网站所有页面链接，就需要用到 URL 提取器。</p>
<p>以我的博客为例，通过该工具可快速获取 <a href="https://dstweihao.cn">https://dstweihao.cn</a> 的全部 URL，本次检测共提取 417 个页面链接。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509100949376.png"></p>
<h1 id="8-网址批量提交收录工具">8. 网址批量提交收录工具</h1>
<blockquote>
<p>官网地址：https://www.openurl.cn/urlsubmission.html</p></blockquote>
<p>用 URL 提取器获取 417 个页面链接后，可通过该批量提交工具将链接快速提交至百度。相比手动逐个提交更高效，大幅节省操作时间。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509100955553.png"></p>
<h1 id="9-ahrefs-失效链接检查死链检测与处理">9. Ahrefs 失效链接检查：死链检测与处理</h1>
<blockquote>
<p>官网地址：https://ahrefs.com/zh/broken-link-checker</p></blockquote>
<p>百度搜索资源平台提供“死链提交”功能。</p>
<p>死链即网站内无效的 URL，如果不及时处理，会影响百度爬虫对网页数据的抓取。</p>
<p>爬虫如果频繁发现死链，可能判定网站维护不足、质量较低，进而减少抓取频次，最终影响收录与排名。</p>
<p>通过 Ahrefs 失效链接检查工具，可快速检测网站内是否存在死链。</p>
<p>如果发现死链，只需将对应的 URL 提交至百度搜索资源平台即可完成处理。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509101005132.png"></p>
<h1 id="10-browseo网页快照获取工具">10. Browseo：网页快照获取工具</h1>
<blockquote>
<p>官网地址：https://www.browseo.net</p></blockquote>
<p>有时需要对比“页面实际呈现内容”与“百度爬虫抓取内容”是否一致，以此判断页面是否存在抓取问题，这就需要获取网页快照。</p>
<p>百度搜索资源平台的“抓取诊断”功能可实现此需求，但每周仅提供 70 次使用机会。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509101009903.png"></p>
<p>通常 70 次足够日常使用，如果需求超出限额，可借助 Browseo 补充获取网页快照，操作逻辑与“抓取诊断”类似。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509101011040.png"></p>
<h1 id="11-总结">11. 总结</h1>
<p>以上是我现阶段使用过的 SEO 优化工具，由于仍处于 SEO 学习初期，内容可能存在不够全面的地方，仅作为阶段性学习经验分享。</p>
<p>后续随着实操深入，会持续补充更多工具用法与优化思路。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202509101320871.jpeg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>《百度 SEO 优化指南》大纲</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/%E5%BB%BA%E7%AB%99%E4%B8%8E%E8%BF%90%E8%90%A5/%E7%99%BE%E5%BA%A6-seo-%E4%BC%98%E5%8C%96%E6%8C%87%E5%8D%97%E5%A4%A7%E7%BA%B2/</link>
      <pubDate>Sat, 30 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/%E5%BB%BA%E7%AB%99%E4%B8%8E%E8%BF%90%E8%90%A5/%E7%99%BE%E5%BA%A6-seo-%E4%BC%98%E5%8C%96%E6%8C%87%E5%8D%97%E5%A4%A7%E7%BA%B2/</guid>
      <description>&lt;p&gt;百度SEO优化指南&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;百度搜索引擎工作原理（抓取、索引、排名逻辑）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网站开发技术选型分析&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hugo 个人博客搭建&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;基于 Nuxt3 开发 SaaS 平台官网&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网站嵌入百度统计代码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;百度统计基本使用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;百度站长工具（百度搜索资源平台）的基本使用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;死链以及已收录快照的解决方案&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网站嵌入百度站长工具统计代码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ubersuggest 工具的基本使用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SEOquake插件的基本使用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;已反馈的SEO问题分析&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如何提高收录量&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为什么收录量不高，但是排名很靠前&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;收入量为什么骤降&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GEO（AI SEO）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;百度-seo-优化指南优化大纲升级版&#34;&gt;《百度 SEO 优化指南》优化大纲（升级版）&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;核心优化逻辑&lt;/strong&gt;：从 “理论框架” 转向 “问题解决型框架”，每章明确 “解决什么痛点”，补充 “案例 + 避坑 + 工具 / 模板”，让不同阶段学习者都能精准对标。&lt;/p&gt;
&lt;h2 id=&#34;第一部分-基础准备seo-认知与技术选型解决-入门怕走偏选技术瞎猜-痛点&#34;&gt;第一部分 基础准备：SEO 认知与技术选型（解决 “入门怕走偏、选技术瞎猜” 痛点）&lt;/h2&gt;
&lt;h3 id=&#34;第-1-章-百度-seo-核心认知新手入门不踩坑&#34;&gt;第 1 章 百度 SEO 核心认知（新手入门不踩坑）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;本章痛点&lt;/strong&gt;：搞不懂搜索引擎逻辑，优化全靠 “凭感觉”，新站常因基础认知错走弯路&lt;/p&gt;
&lt;p&gt;1.1 百度搜索引擎工作原理（抓取、索引、排名逻辑）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;具象化拆解：以 “新博客文章” 为例，还原从 “百度蜘蛛发现→抓取→索引→首页排名” 的 3 个关键节点（附流程图）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;避坑指南：3 种常见抓取失败场景（robots 误拦截、服务器响应＞3 秒、内容重复度＞80%）及 1 步解决方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新手必知：百度 “移动端优先索引” 规则对收录的影响（避免只做 PC 端优化）&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>百度SEO优化指南</p>
<ol>
<li>
<p>百度搜索引擎工作原理（抓取、索引、排名逻辑）</p>
</li>
<li>
<p>网站开发技术选型分析</p>
</li>
<li>
<p>Hugo 个人博客搭建</p>
</li>
<li>
<p>基于 Nuxt3 开发 SaaS 平台官网</p>
</li>
<li>
<p>网站嵌入百度统计代码</p>
</li>
<li>
<p>百度统计基本使用</p>
</li>
<li>
<p>百度站长工具（百度搜索资源平台）的基本使用</p>
</li>
<li>
<p>死链以及已收录快照的解决方案</p>
</li>
<li>
<p>网站嵌入百度站长工具统计代码</p>
</li>
<li>
<p>Ubersuggest 工具的基本使用</p>
</li>
<li>
<p>SEOquake插件的基本使用</p>
</li>
<li>
<p>已反馈的SEO问题分析</p>
</li>
<li>
<p>如何提高收录量</p>
</li>
<li>
<p>为什么收录量不高，但是排名很靠前</p>
</li>
<li>
<p>收入量为什么骤降</p>
</li>
<li>
<p>GEO（AI SEO）</p>
</li>
</ol>
<h1 id="百度-seo-优化指南优化大纲升级版">《百度 SEO 优化指南》优化大纲（升级版）</h1>
<p><strong>核心优化逻辑</strong>：从 “理论框架” 转向 “问题解决型框架”，每章明确 “解决什么痛点”，补充 “案例 + 避坑 + 工具 / 模板”，让不同阶段学习者都能精准对标。</p>
<h2 id="第一部分-基础准备seo-认知与技术选型解决-入门怕走偏选技术瞎猜-痛点">第一部分 基础准备：SEO 认知与技术选型（解决 “入门怕走偏、选技术瞎猜” 痛点）</h2>
<h3 id="第-1-章-百度-seo-核心认知新手入门不踩坑">第 1 章 百度 SEO 核心认知（新手入门不踩坑）</h3>
<p><strong>本章痛点</strong>：搞不懂搜索引擎逻辑，优化全靠 “凭感觉”，新站常因基础认知错走弯路</p>
<p>1.1 百度搜索引擎工作原理（抓取、索引、排名逻辑）</p>
<ul>
<li>
<p>具象化拆解：以 “新博客文章” 为例，还原从 “百度蜘蛛发现→抓取→索引→首页排名” 的 3 个关键节点（附流程图）</p>
</li>
<li>
<p>避坑指南：3 种常见抓取失败场景（robots 误拦截、服务器响应＞3 秒、内容重复度＞80%）及 1 步解决方法</p>
</li>
<li>
<p>新手必知：百度 “移动端优先索引” 规则对收录的影响（避免只做 PC 端优化）</p>
</li>
</ul>
<p>1.2 SEO 与网站技术的关联（技术选错，后期优化白费）</p>
<ul>
<li>
<p>真实案例：某 SaaS 官网用纯前端（CSR）开发，6 个月未被百度收录的整改过程（附前后收录数据对比）</p>
</li>
<li>
<p>关键结论：技术选型前必问的 3 个问题（是否支持 SSR/SSG？能否自定义 URL 结构？是否易生成站点地图？）</p>
</li>
</ul>
<h3 id="第-2-章-seo-友好型技术选型分析选对技术省一半力">第 2 章 SEO 友好型技术选型分析（选对技术省一半力）</h3>
<p><strong>本章痛点</strong>：不知道 “个人博客 / 企业官网” 该用什么技术，担心 “技术不匹配导致优化难”</p>
<p>2.1 网站开发技术对比（静态 / 动态技术对 SEO 的优劣势）</p>
<ul>
<li>
<p>可视化对比表：静态技术（Hugo/Gatsby）vs 动态技术（WordPress/ThinkPHP）的 “SEO 友好度、维护成本、加载速度、适配场景” 对比（附数据：如 Hugo 页面加载速度比 WordPress 快 60%）</p>
</li>
<li>
<p>适配建议：流量低、内容固定（如个人博客 / 资讯站）选静态；需频繁更新、有交互功能（如电商 / 会员站）选动态</p>
</li>
</ul>
<p>2.2 不同场景的技术适配（个人博客 vs SaaS 官网的技术需求差异）</p>
<ul>
<li>
<p>个人博客场景：推荐 Hugo 的 4 个核心原因（加载快 = 收录快、自带站点地图、支持 Markdown 易做内容优化、无需复杂服务器）</p>
</li>
<li>
<p>SaaS 官网场景：选 Nuxt3 的关键理由（SSR 解决纯前端抓取难题、支持多端适配、产品页易做差异化 SEO 布局）</p>
</li>
<li>
<p>配套资源：各技术栈的 “SEO 基础配置模板”（如 Hugo 的 URL 规则模板、Nuxt3 的 meta 标签配置模板）</p>
</li>
</ul>
<h2 id="第二部分-实践搭建seo-友好型网站开发解决-会搭站但不会优化搭好站没收录-痛点">第二部分 实践搭建：SEO 友好型网站开发（解决 “会搭站但不会优化、搭好站没收录” 痛点）</h2>
<h3 id="第-3-章-hugo-个人博客搭建seo-优化版新手-1-小时落地">第 3 章 Hugo 个人博客搭建（SEO 优化版）（新手 1 小时落地）</h3>
<p><strong>本章痛点</strong>：搭好博客却 “百度搜不到”，不知道 URL、标签等细节没优化</p>
<p>3.1 Hugo 搭建核心步骤（含 URL 结构、站点地图配置）</p>
<ul>
<li>
<p>step-by-step 实操：从 “安装 Hugo→创建站点→配置主题→部署上线” 的 5 步截图指引（推荐免费主题：PaperMod，自带 SEO 基础配置）</p>
</li>
<li>
<p>SEO 关键配置：URL 结构优化（推荐 “域名 / 分类 / 文章标题”，避免 “数字 ID / 随机字符串”，附配置代码）、站点地图自动生成与百度提交方法</p>
</li>
</ul>
<p>3.2 博客搭建中的 SEO 细节（这些细节决定收录速度）</p>
<ul>
<li>
<p>必做优化点：</p>
</li>
<li>
<p>标题标签：H1 仅用在文章标题，分类页用 H2，避免一篇内容多个 H1（附错误 / 正确案例）</p>
</li>
<li>
<p>锚文本：内链锚文本不重复（如 “SEO 工具” vs “好用的百度 SEO 工具”），指向高相关页面（如文章中提 “关键词挖掘”，链接到关键词工具文章）</p>
</li>
<li>
<p>图片 ALT 属性：含 “关键词 + 场景”（如 “北京 SEO 优化流程图” 而非 “图片 1”）</p>
</li>
<li>
<p>实操作业：搭建后自查 3 个核心点（URL 结构、H 标签层级、图片 ALT），附自查表</p>
</li>
</ul>
<h3 id="第-4-章-基于-nuxt3-开发-saas-平台官网企业级优化">第 4 章 基于 Nuxt3 开发 SaaS 平台官网（企业级优化）</h3>
<p><strong>本章痛点</strong>：SaaS 官网产品页多、内容相似，易被判定 “重复内容”，收录率低</p>
<p>4.1 Nuxt3 的 SEO 优势（服务端渲染对抓取的支持）</p>
<ul>
<li>
<p>对比数据：同内容下，Nuxt3（SSR）vs Vue3（CSR）的百度收录速度差异（15 天监测：SSR 页面收录率 85%，CSR 仅 12%）</p>
</li>
<li>
<p>关键配置：Nuxt3 中 “动态 meta 标签” 设置（不同产品页自动生成差异化标题 / 描述，附代码示例）、“预渲染” 功能开启步骤（提升抓取效率）</p>
</li>
</ul>
<p>4.2 SaaS 官网关键页面优化（聚焦高转化页面）</p>
<ul>
<li>
<p>核心页面清单：首页（承载品牌词）、产品详情页（核心功能关键词）、解决方案页（行业场景关键词）、博客页（长尾词引流）</p>
</li>
<li>
<p>优化模板：</p>
</li>
<li>
<p>产品详情页标题：“产品名 + 核心功能 + 行业”（如 “XXCRM 系统_客户管理自动化_中小企业专用”）</p>
</li>
<li>
<p>内容布局：前 300 字含 2 个核心词 + 1 个客户痛点（如 “XXCRM 解决中小企业‘客户跟进乱、成交率低’问题，支持自动同步客户数据”）</p>
</li>
<li>
<p>避坑提示：避免不同产品页 “仅换图片 / 参数，核心描述重复”，附内容差异化判断标准（重复度＜50%）</p>
</li>
</ul>
<h2 id="第三部分-数据追踪百度官方工具配置与使用解决-优化后不知道效果数据不会用-痛点">第三部分 数据追踪：百度官方工具配置与使用（解决 “优化后不知道效果、数据不会用” 痛点）</h2>
<h3 id="第-5-章-百度统计工具应用数据驱动优化不做-无用功">第 5 章 百度统计工具应用（数据驱动优化，不做 “无用功”）</h3>
<p><strong>本章痛点</strong>：只会看 “访问量”，不会用数据找优化方向，转化低却不知道原因</p>
<p>5.1 网站嵌入百度统计代码（不同技术栈的嵌入方法）</p>
<ul>
<li>
<p>分场景教程：</p>
</li>
<li>
<p>Hugo：修改主题配置文件（config.toml）嵌入代码（附完整代码片段）</p>
</li>
<li>
<p>Nuxt3：通过 “plugins” 集成，实现全页面追踪（含路由切换追踪配置）</p>
</li>
<li>
<p>WordPress：用 “百度统计” 插件一键安装（避免手动改代码出错）</p>
</li>
<li>
<p>验证技巧：嵌入后 10 分钟，通过 “百度统计 - 实时访客” 确认是否生效（附截图指引）</p>
</li>
</ul>
<p>5.2 百度统计核心功能（重点看这 3 个数据，其余可忽略）</p>
<ul>
<li>
<p>流量来源分析：区分 “搜索流量（SEO 效果）”“直接流量（品牌认知）”“referral 流量（外链效果）”，找出核心流量渠道（如搜索流量占比低，需加强关键词优化）</p>
</li>
<li>
<p>页面热力分析：通过 “点击热力图” 优化按钮位置 / 颜色（案例：某 SaaS 官网将 “免费试用” 按钮从右侧移到中部，点击量提升 40%）</p>
</li>
<li>
<p>转化追踪：以 “表单提交（如申请试用）” 为例，配置转化目标（附步骤截图），计算 “SEO 流量转化率”（转化率＜2% 需优化落地页）</p>
</li>
</ul>
<h3 id="第-6-章-百度搜索资源平台站长工具操作收录--排名急救站">第 6 章 百度搜索资源平台（站长工具）操作（收录 / 排名急救站）</h3>
<p><strong>本章痛点</strong>：收录慢、索引量骤降，不知道怎么 “主动干预”</p>
<p>6.1 网站验证与百度统计代码关联（一次操作，双工具互通）</p>
<ul>
<li>
<p>3 种验证方式对比：</p>
</li>
<li>
<p>HTML 标签验证：最快（复制标签到网站首页头部，10 分钟生效），适合新手</p>
</li>
<li>
<p>文件验证：需上传文件到服务器，适合有技术基础的用户</p>
</li>
<li>
<p>DNS 验证：长期有效，适合域名解析在自己手上的用户</p>
</li>
<li>
<p>关联价值：搜索资源平台可直接查看 “百度统计的流量数据”，无需切换工具，快速定位 “收录降 vs 流量降” 的关系</p>
</li>
</ul>
<p>6.2 核心功能使用（4 个高频操作，解决 80% 收录问题）</p>
<ul>
<li>
<p>索引量查询：区分 “总索引量” vs “有效索引量”（有效索引量低 = 内容质量 / 相关性差，附优化方向）</p>
</li>
<li>
<p>手动提交：新页面用 “实时提交”（24 小时内收录概率提升 60%），批量页面用 “站点地图提交”（每周更新 1 次）</p>
</li>
<li>
<p>robots 配置：用 “可视化工具” 生成 robots 文件（避免手动写代码出错），禁止抓取 “后台页面、登录页、重复内容页”（附 robots 模板）</p>
</li>
<li>
<p>异常提醒：开启 “索引量骤降、抓取异常、违规提醒” 的邮件 / 短信通知（第一时间发现问题，避免延误整改）</p>
</li>
</ul>
<h2 id="第四部分-辅助工具第三方-seo-工具实战解决-关键词找不准竞品看不懂-痛点">第四部分 辅助工具：第三方 SEO 工具实战（解决 “关键词找不准、竞品看不懂” 痛点）</h2>
<h3 id="第-7-章-ubersuggest-工具深度应用高效挖词--抄竞品">第 7 章 Ubersuggest 工具深度应用（高效挖词 + 抄竞品）</h3>
<p><strong>本章痛点</strong>：关键词没思路，不知道竞品靠什么词引流，盲目做词导致排名上不去</p>
<p>7.1 关键词挖掘与竞争度分析（找 “低竞争高转化” 词）</p>
<ul>
<li>实操步骤：</li>
</ul>
<ol>
<li>
<p>输入核心词（如 “北京 SEO 优化”），选择 “中国 - 百度” 地域</p>
</li>
<li>
<p>筛选维度：搜索量 100-500（中小流量，竞争低）、竞争度＜0.5（Ubersuggest 内置评分，越低越好）、CPC＞1 元（转化意向高）</p>
</li>
<li>
<p>组合技巧：用 “地域 + 行业 + 需求” 组合长尾词（如 “北京朝阳 SaaS 官网 SEO 优化”“北京中小企业 SEO 关键词挖掘”）</p>
</li>
</ol>
<ul>
<li>工具替代：若 Ubersuggest 付费，可用 “5118 免费版”“爱站网关键词工具” 替代（附操作差异点）</li>
</ul>
<p>7.2 竞品 SEO 策略拆解（抄作业但不违规）</p>
<ul>
<li>
<p>关键数据：</p>
</li>
<li>
<p>竞品 “top 流量词”：看对方靠什么词排名（如竞品 “XXSEO 公司” 的 top 词是 “北京 SEO 公司排名”，可跟进布局）</p>
</li>
<li>
<p>竞品 “外链来源”：筛选 “域名权重≥3、与行业相关” 的外链（如竞品从 “SEO 论坛” 获链，可去同平台发原创内容换链）</p>
</li>
<li>
<p>竞品 “页面优化”：分析其标题结构（如是否含 “地域 + 服务”）、内容长度（优质竞品内容多在 1500 字以上，含案例 / 数据）</p>
</li>
</ul>
<h3 id="第-8-章-seoquake-插件实战发布前自查避免低级错误">第 8 章 SEOquake 插件实战（发布前自查，避免低级错误）</h3>
<p><strong>本章痛点</strong>：内容发布后才发现 “关键词堆砌、外链低质”，改后影响收录</p>
<p>8.1 浏览器插件安装与基础设置（1 分钟搞定）</p>
<ul>
<li>
<p>安装步骤：Chrome/Firefox 浏览器→应用商店搜索 “SEOquake”→安装后启用，在 “设置 - 搜索引擎” 勾选 “百度”（默认是谷歌，需调整）</p>
</li>
<li>
<p>必开功能：关键词密度、内链数、外链数（区分 “nofollow/dofollow”）、百度权重（参考值，避免过度依赖）</p>
</li>
</ul>
<p>8.2 实时 SEO 数据查看（发布前必查 3 项）</p>
<ul>
<li>
<p>关键词密度：核心词密度 2%-5%（过高易被判定堆砌，如 “北京 SEO” 在 500 字内容中出现＞25 次即危险），用插件实时调整</p>
</li>
<li>
<p>内链配置：单页面内链 3-5 个，指向 “高权重页面（如首页）” 或 “相关内容页（如提‘死链处理’，链接到死链章节）”</p>
</li>
<li>
<p>外链检查：避免链接到 “域名权重＜2、有违规记录” 的网站（插件可显示外链域名权重）</p>
</li>
<li>
<p>配套工具：《页面 SEO 发布前自查表》（含密度、内链、标题长度等 8 项指标，可打印复用）</p>
</li>
</ul>
<h2 id="第五部分-问题诊断seo-常见问题解决方案解决-遇到问题不会修反馈没回音-痛点">第五部分 问题诊断：SEO 常见问题解决方案（解决 “遇到问题不会修、反馈没回音” 痛点）</h2>
<h3 id="第-9-章-收录与排名问题破解急救指南72-小时出结果">第 9 章 收录与排名问题破解（急救指南，72 小时出结果）</h3>
<p><strong>本章痛点</strong>：收录量上不去、排名忽高忽低、突然骤降，不知道从哪下手解决</p>
<p>9.1 如何提升百度收录量（主动 + 被动双管齐下）</p>
<ul>
<li>
<p>主动方法：百度搜索资源平台 “实时提交”（新页面 24 小时内提交）+“站点地图每周更新”，附提交后收录率提升的案例（某博客从 “提交后 3 天收录” 到 “1 天收录”）</p>
</li>
<li>
<p>被动方法：提升内容 “稀缺性”（如 “行业数据 + 实操案例” 组合，如 “2025 年北京 SEO 行业报告 + 3 个中小企业优化案例”）、增加 “内链推荐”（从首页 / 分类页给新页面加链接）</p>
</li>
</ul>
<p>9.2 收录量低但排名靠前的原因分析（不用盲目追求 “高收录”，精准更重要）</p>
<ul>
<li>
<p>核心逻辑：关键词 “精准度”＞收录量，如 “深圳南山亲子摄影工作室”（搜索量 50，竞争低，转化高）比 “摄影工作室”（搜索量 5000，竞争高，转化低）更易排名</p>
</li>
<li>
<p>优化方向：聚焦 “长尾精准词”（含地域 / 场景 / 需求），减少 “泛词” 内容，附 “长尾词布局模板”</p>
</li>
</ul>
<p>9.3 收录量骤降的应急处理（72 小时步骤）</p>
<ul>
<li>
<p>第一步：排查违规（用 “百度搜索资源平台 - 违规查询” 查是否有 “内容违规 / 外链违规”，附排查截图）</p>
</li>
<li>
<p>第二步：提交反馈（若未违规，通过 “反馈中心 - 索引量问题” 提交申诉，附 “索引量变化截图 + 整改说明” 模板）</p>
</li>
<li>
<p>第三步：补充优质内容（72 小时内发布 2-3 篇高价值文，如 “行业干货 + 用户案例”，提升站点活跃度）</p>
</li>
</ul>
<h3 id="第-10-章-网站异常问题解决小问题不拖成大麻烦">第 10 章 网站异常问题解决（小问题不拖成大麻烦）</h3>
<p>10.1 死链检测与处理（不处理会拉低整体权重）</p>
<ul>
<li>
<p>工具推荐：</p>
</li>
<li>
<p>免费工具：百度搜索资源平台 “死链检测”（适合查站内死链）、Xenu Link Sleuth（批量检测，支持导出死链列表）</p>
</li>
<li>
<p>付费工具：Ahrefs（适合查外链中的死链）</p>
</li>
<li>
<p>处理步骤：检测死链→生成死链文件（格式要求：TXT，每行 1 个死链 URL）→提交百度死链平台→3-7 天后查看处理结果（附提交截图）</p>
</li>
<li>
<p>避坑提示：删除页面前先做 “301 重定向”（如旧文章删除，重定向到相关新文章），避免直接删页导致死链</p>
</li>
</ul>
<p>10.2 已反馈 SEO 问题的跟进技巧（提高反馈成功率）</p>
<ul>
<li>
<p>证据准备：反馈时需附 3 类材料（问题截图：标注 “时间 + 数据变化”，如 “2025.8.1-8.3 索引量从 500→100”；操作记录：如近期是否改 URL / 删内容；行业参考：如竞品同期索引量是否正常）</p>
</li>
<li>
<p>沟通话术：避免 “我的收录怎么降了？”，改用 “我的网站 XX 日期后索引量从 XX 降至 XX，已排查 robots / 违规 / 服务器，未发现问题，附截图，麻烦帮忙分析原因，谢谢！”</p>
</li>
<li>
<p>跟进周期：反馈后 3-5 天查看 “反馈进度”，未回复可补充 “新证据”（如新增优质内容后的收录变化）</p>
</li>
</ul>
<h2 id="第六部分-进阶趋势ai-驱动的-seo-新方向解决-跟不上-ai-趋势geo-优化没思路-痛点">第六部分 进阶趋势：AI 驱动的 SEO 新方向（解决 “跟不上 AI 趋势、GEO 优化没思路” 痛点）</h2>
<h3 id="第-11-章-geoai-seo实践抓住地域化--ai-红利">第 11 章 GEO（AI SEO）实践（抓住地域化 + AI 红利）</h3>
<p><strong>本章痛点</strong>：不知道 AI 怎么落地 SEO，本地业务（如餐饮 / 家政）不知道怎么靠 GEO 拿精准流量</p>
<p>11.1 GEO SEO 概念与应用场景（地域化是 “精准流量密码”）</p>
<ul>
<li>
<p>核心逻辑：通过 “地域词 + 需求词” 锁定本地用户，如 “杭州西湖附近观景酒店”“成都宽窄巷子必吃小吃”</p>
</li>
<li>
<p>行业案例：</p>
</li>
<li>
<p>餐饮行业：某火锅店通过 “XX 区火锅外卖配送”“XX 路 24 小时火锅” 等词，本地搜索流量提升 50%</p>
</li>
<li>
<p>SaaS 行业：某 CRM 厂商针对 “北京中小企业 CRM”“上海 SaaS 客户管理系统” 做 GEO 优化，转化率比 “全国 CRM” 高 3 倍</p>
</li>
<li>
<p>实操步骤：GEO 优化 3 步走（布局地域关键词→完善地图 POI 信息→发布本地场景内容），附 “百度地图商家标注” 步骤</p>
</li>
</ul>
<p>11.2 AI 在 SEO 中的落地（高效不违规）</p>
<ul>
<li>
<p>AI 生成内容优化：用 AI（如 ChatGPT / 文心一言）生成 “行业问答 / 教程” 初稿，人工补充 “真实案例 + 数据”（修改率≥30%，避免纯 AI 内容被判定低质），附 “AI 内容优化前后对比案例”</p>
</li>
<li>
<p>智能关键词规划：用 “百度 AI 关键词规划师”+“ChatGPT” 生成 “地域 + 行业 + 需求” 三维关键词表（如 “北京 + SEO + 中小企业”“上海 + SaaS + 客户管理”）</p>
</li>
<li>
<p>合规要点：AI 内容需满足 “原创性”（用 “百度原创保护平台” 检测）、“准确性”（数据 / 案例真实，避免 AI 生成虚假信息），附 “AI 内容合规检测工具清单”</p>
</li>
</ul>
<h2 id="附录配套资源包让优化更高效">附录：配套资源包（让优化更高效）</h2>
<ol>
<li>
<p>工具清单：百度 SEO 必备工具（官方工具 / 第三方工具 / AI 工具），标注 “免费 / 付费”“适用场景”“操作链接”</p>
</li>
<li>
<p>代码模板：Hugo URL 配置模板、Nuxt3 meta 标签模板、robots 文件模板、Schema 结构化数据模板（如 FAQ 类型）</p>
</li>
<li>
<p>检查表：《页面 SEO 发布前自查表》《收录问题排查表》《GEO 优化检查表》</p>
</li>
<li>
<p>案例库：10 个不同场景（个人博客 / SaaS 官网 / 本地餐饮）的 SEO 成功案例（含优化前数据、操作步骤、优化后效果）</p>
</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>ToB 官网 SEO 工作总结：认知转变、工具实操与排名 / 收录优化思路</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/%E5%BB%BA%E7%AB%99%E4%B8%8E%E8%BF%90%E8%90%A5/tob-%E5%AE%98%E7%BD%91-seo-%E5%B7%A5%E4%BD%9C%E6%80%BB%E7%BB%93%E8%AE%A4%E7%9F%A5%E8%BD%AC%E5%8F%98%E5%B7%A5%E5%85%B7%E5%AE%9E%E6%93%8D%E4%B8%8E%E6%8E%92%E5%90%8D--%E6%94%B6%E5%BD%95%E4%BC%98%E5%8C%96%E6%80%9D%E8%B7%AF/</link>
      <pubDate>Sat, 30 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/%E5%BB%BA%E7%AB%99%E4%B8%8E%E8%BF%90%E8%90%A5/tob-%E5%AE%98%E7%BD%91-seo-%E5%B7%A5%E4%BD%9C%E6%80%BB%E7%BB%93%E8%AE%A4%E7%9F%A5%E8%BD%AC%E5%8F%98%E5%B7%A5%E5%85%B7%E5%AE%9E%E6%93%8D%E4%B8%8E%E6%8E%92%E5%90%8D--%E6%94%B6%E5%BD%95%E4%BC%98%E5%8C%96%E6%80%9D%E8%B7%AF/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202508301515762.jpeg&#34;&gt;&lt;/p&gt;
&lt;p&gt;这段时间，在 SEO 优化上投入了一些时间，重点完成了几项工作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;明确 SEO 优化的重要性&lt;/li&gt;
&lt;li&gt;使用 Ubersuggest 工具和 SEOquake 插件检测官网 SEO 存在的问题&lt;/li&gt;
&lt;li&gt;分析部分公司官网百度收录量高的原因&lt;/li&gt;
&lt;li&gt;研究关键词下公司官网排名的查询方法&lt;/li&gt;
&lt;li&gt;总结 SEO 优化工作的收获&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;1--重新认识-seo-优化的重要性&#34;&gt;1 . 重新认识 SEO 优化的重要性&lt;/h1&gt;
&lt;p&gt;最开始我并不重视官网 SEO 优化，因为负责的是 ToB 产品。&lt;/p&gt;
&lt;p&gt;ToB 产品的特性，在之前的《ToB 华为销售法观后感》等文章中提到过：它面向企业 / 公司，不像 ToC 产品面向普通消费者 —— ToC 产品可通过营销手段，对个人精准投放、施加情绪影响，进而促成交易。&lt;/p&gt;
&lt;p&gt;但 ToB 产品面向的是团队而非个人，这类营销手段的影响微乎其微，所以我曾认为，就算把官网 SEO 优化做得再好，也不会有特别大的收获。&lt;/p&gt;
&lt;p&gt;可现在时代节奏快、市场竞争激烈，&lt;strong&gt;“酒香也怕巷子深”。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;甚至有些质量欠佳的产品，仅凭出色的营销就能赚得盆满钵满 —— 但这本质是 “杀鸡取卵”，属于一次性交易。&lt;/p&gt;
&lt;p&gt;即便最终消费者醒悟、商家 “塌房”，但已经赚了一波，对他们而言显然不亏。&lt;/p&gt;
&lt;p&gt;互联网本就没有记忆，大不了等风头过去，再提升产品质量，树立 “改邪归正” 的形象，仿佛 “放下屠刀，立地成佛”。&lt;/p&gt;
&lt;p&gt;但如果产品质量过硬，再配上优质营销，就是 “超级放大器”，竞争力会非常强。在我看来，产品质量与营销密不可分，用树苗比喻再合适不过：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;产品质量是树根，营销是化肥。树根长势好，才能支撑树木开枝散叶；如果树根品质过差，化肥只会加速它的枯萎。即便树根优质，如果不施化肥，生长就全看天意 —— 能否下雨、是否出太阳都是变数，长成大树只能靠时间慢慢熬。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;只有树根健壮，再配上到位的施肥浇水，树木才能快速生长，直到长成参天大树，届时用不用化肥反而不那么重要了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以，产品营销就从最基础的官网优化做起。&lt;/p&gt;
&lt;p&gt;没人会拒绝 “投入少、收益大” 的事，官网 SEO 优化正是如此。&lt;/p&gt;
&lt;p&gt;虽然它无法像 ToC 产品那样获取大量流量，但只要做好了，官网就能 24 小时挂在网上，且排名靠前 —— 这相当于免费广告，何乐而不为？&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202508301515762.jpeg"></p>
<p>这段时间，在 SEO 优化上投入了一些时间，重点完成了几项工作：</p>
<ol>
<li>明确 SEO 优化的重要性</li>
<li>使用 Ubersuggest 工具和 SEOquake 插件检测官网 SEO 存在的问题</li>
<li>分析部分公司官网百度收录量高的原因</li>
<li>研究关键词下公司官网排名的查询方法</li>
<li>总结 SEO 优化工作的收获</li>
</ol>
<h1 id="1--重新认识-seo-优化的重要性">1 . 重新认识 SEO 优化的重要性</h1>
<p>最开始我并不重视官网 SEO 优化，因为负责的是 ToB 产品。</p>
<p>ToB 产品的特性，在之前的《ToB 华为销售法观后感》等文章中提到过：它面向企业 / 公司，不像 ToC 产品面向普通消费者 —— ToC 产品可通过营销手段，对个人精准投放、施加情绪影响，进而促成交易。</p>
<p>但 ToB 产品面向的是团队而非个人，这类营销手段的影响微乎其微，所以我曾认为，就算把官网 SEO 优化做得再好，也不会有特别大的收获。</p>
<p>可现在时代节奏快、市场竞争激烈，<strong>“酒香也怕巷子深”。</strong></p>
<p>甚至有些质量欠佳的产品，仅凭出色的营销就能赚得盆满钵满 —— 但这本质是 “杀鸡取卵”，属于一次性交易。</p>
<p>即便最终消费者醒悟、商家 “塌房”，但已经赚了一波，对他们而言显然不亏。</p>
<p>互联网本就没有记忆，大不了等风头过去，再提升产品质量，树立 “改邪归正” 的形象，仿佛 “放下屠刀，立地成佛”。</p>
<p>但如果产品质量过硬，再配上优质营销，就是 “超级放大器”，竞争力会非常强。在我看来，产品质量与营销密不可分，用树苗比喻再合适不过：</p>
<p><strong>产品质量是树根，营销是化肥。树根长势好，才能支撑树木开枝散叶；如果树根品质过差，化肥只会加速它的枯萎。即便树根优质，如果不施化肥，生长就全看天意 —— 能否下雨、是否出太阳都是变数，长成大树只能靠时间慢慢熬。</strong></p>
<p><strong>只有树根健壮，再配上到位的施肥浇水，树木才能快速生长，直到长成参天大树，届时用不用化肥反而不那么重要了。</strong></p>
<p>所以，产品营销就从最基础的官网优化做起。</p>
<p>没人会拒绝 “投入少、收益大” 的事，官网 SEO 优化正是如此。</p>
<p>虽然它无法像 ToC 产品那样获取大量流量，但只要做好了，官网就能 24 小时挂在网上，且排名靠前 —— 这相当于免费广告，何乐而不为？</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202508301515947.jpeg"></p>
<h1 id="2-用工具检测官网-seo-问题">2. 用工具检测官网 SEO 问题</h1>
<p>因此，我开始着手官网 SEO 优化，但一开始完全不清楚切入点，也不知道该做什么，只知道核心目标是 <strong>“让官网在百度搜索中排名靠前”</strong>，只要能达成这个目标就行。</p>
<p>刚接触 SEO 优化时，我心里很没底，完全不知道该怎么做。</p>
<p>下班回家看了几个教学视频，感觉作用不大。</p>
<p>后来突然觉得，或许官网该频繁更新文章（比如按一周一篇的频率），吸引百度爬虫频繁抓取数据 —— 这样收录量上去了，访问量自然也会提升。</p>
<p>不过这个想法比较主观，暂时没验证。</p>
<p>但文章要挂在官网上，就得言之有物，不能瞎编乱造。所以我暂时没深入研究 “发文章” 的问题，而是优先找工具检测官网现存问题 —— 先解决这个更紧迫的需求，应该更合适。</p>
<p>最直接的办法就是找市面上的 SEO 检测工具，通过工具找出官网的 SEO 问题。</p>
<p>我在网上找了很久，却没发现百度相关的 SEO 检测工具，这真的有点无奈。</p>
<p>虽然百度有 “百度统计”“百度搜索资源平台”，能分析和展示官网的访问量、关键词排名、百度爬虫情况，但始终觉得没满足我的需求。</p>
<p><strong>我想要的是一款能全面检测、分析官网的 SEO 工具，把所有问题都暴露出来，这样就能针对性解决问题，做好 SEO 优化。</strong></p>
<p>无奈之下，只能大海捞针般在网上反复查找和验证。</p>
<p>网上多数 SEO 工具源自国外，基于谷歌爬虫规则设计，与百度爬虫机制并不完全一致。</p>
<p>但我只能 “死马当活马医”—— 即便爬虫机制不同，SEO 优化的底层逻辑应该相通，至少能有个参考方向。</p>
<p>就这样，我用了 Ubersuggest 工具。</p>
<p>它能全面检测网站，比如识别页面字数不足、元描述重复、页面加载速度过慢等问题，对现阶段还是 SEO 小白的我来说，已经足够用了。</p>
<p>不过这个工具需要买月卡，一个月 12 美元，好在我不用天天用 —— 修复完问题后基本就闲置了。</p>
<p>但麻烦的是，购买需要 VISA 信用卡，我之前没办理过，一下就卡住了。</p>
<p>本来就不知道 SEO 优化下一步该做什么，现在眼看 “胜利的曙光” 就在眼前，却被 VISA 信用卡难住了。</p>
<p>我不甘心放弃，转念一想：“机智如我，不如去某宝看看？” 没想到还真有卖 Ubersuggest 共享账号的，立刻买了一个月，确实方便不少。</p>
<p>但 Ubersuggest 毕竟基于谷歌爬虫设计，为了确保检测全面性，我打算再找其他工具，后来发现了免费的 SEOquake 插件。</p>
<p>看了它的检测报告，发现同样基于谷歌爬虫设计，但分析得很有道理，比如 “描述内容不能过短”“图片要补充 ALT 说明” 等 —— 它相当于对 Ubersuggest 的检测结果做了补充。</p>
<p>我的想法是 “多一个工具，就能尽可能覆盖所有问题”。</p>
<p>至此，我终于明确了工作方向：修复 Ubersuggest 和 SEOquake 检测出的官网问题。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202508301522512.jpeg"></p>
<h1 id="3-分析高收录量官网的共性">3. 分析高收录量官网的共性</h1>
<p>接着，我开始分析排名靠前的公司官网，想看看它们有什么共同点、为什么能排名靠前，并和自家产品官网做对比。</p>
<p>我发现有些公司官网有大量产品说明文档，百度收录量能达到上万个链接，这真的让我很惊讶 —— 再看自家官网，收录量才 30 个，对比之下差距实在太大。</p>
<p>深入分析后才明白，关键在于产品帮助手册：这些公司的帮助手册内容丰富，且基于 Vitepress 这类文档框架搭建。</p>
<p>这类框架的特点是，用 Markdown 编写内容后，能生成可轻松部署的静态 HTML 页面 —— 这对 SEO 优化非常有利，因为爬虫本就重点抓取 HTML 页面的数据。</p>
<p>但我部门产品官网的文档都是通过后端接口获取的，对爬虫来说，这类页面相当于空白，没有可抓取的内容，自然不利于收录。</p>
<p>于是我想到：可以基于 Vitepress 框架，把各平台的帮助文档整合起来，挂到官网域名下，方便百度爬虫抓取页面。</p>
<p>这算是我的第二个核心任务。</p>
<p>需要说明的是，<strong>收录量不等于访问量，但能提高曝光度。</strong></p>
<p>用户可能不会点击，但随着时间推移，看到该官网的概率会越来越大。</p>
<p>久而久之，用户或许会疑惑 “怎么总看到这家公司”，进而默认其产品不会太差。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202508301518473.jpeg"></p>
<h1 id="4-关键词排名的查询方法">4. 关键词排名的查询方法</h1>
<p>为什么要知道 “关键词下公司官网排第几”？这其实涉及工作量化的问题 ——SEO 优化如何体现成效？</p>
<p>如果领导问 “你做了什么工作，达成了什么目的”，总不能只说 “我做了 SEO 优化，排名靠前了”。</p>
<p>要是领导追问 “具体排第几？提升了多少？”，答不上来就很被动。</p>
<p>所以，在动手做 SEO 优化前，需要先明确 “现状”：目标关键词下，官网当前排名是多少？</p>
<p>我之前找了很多工具、查了不少资料，一直不知道怎么获取准确排名。</p>
<p>自己手动在百度搜索，翻了几十页都没找到官网，特别疑惑。</p>
<p>后来重新尝试百度搜索资源平台（原百度站长工具），才算摸清了门路 —— 平台里就有关键词排名数据。</p>
<p>只是之前试过一次，发现数据和实际排名有出入就没再信任，其实排名本就会动态变化，工具数据大体上是准确的，现在总算解决了这个问题。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202508301518525.png"></p>
<h1 id="5-seo-优化工作的收获">5. SEO 优化工作的收获</h1>
<p>从最初觉得 SEO 优化不重要，到后来意识到其重要性却无从下手，再到现在发现 SEO 优化其实并不简单：它看似没什么技术含量，实则有很多 “不摆在台面上” 的知识要学，想做好真的不容易。</p>
<p>我只能告诉自己：先做起来再说。不会、不懂都没关系，先结合自己的想法和仅有的知识去实践，遇到问题就分析问题、解决问题，再逐步深入。<strong>如果总想一步到位，觉得不够完美就不行动，那永远只能原地踏步。</strong></p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202508301516111.jpeg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>SEO 术语通俗易懂版本</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/%E5%BB%BA%E7%AB%99%E4%B8%8E%E8%BF%90%E8%90%A5/seo-%E6%9C%AF%E8%AF%AD%E9%80%9A%E4%BF%97%E6%98%93%E6%87%82%E7%89%88%E6%9C%AC/</link>
      <pubDate>Fri, 29 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/%E5%BB%BA%E7%AB%99%E4%B8%8E%E8%BF%90%E8%90%A5/seo-%E6%9C%AF%E8%AF%AD%E9%80%9A%E4%BF%97%E6%98%93%E6%87%82%E7%89%88%E6%9C%AC/</guid>
      <description>&lt;h1 id=&#34;收入量&#34;&gt;收入量&lt;/h1&gt;
&lt;p&gt;收录量不是等于访问量，但是可以提高曝光度，从而带来访问量增多的可能性。&lt;/p&gt;
&lt;h1 id=&#34;网站tdk&#34;&gt;网站TDK&lt;/h1&gt;
&lt;p&gt;在SEO中，网站的TDK指的是标题、描述和关键词的缩写，这三个元素对于网站来说至关重要。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;标题：就是浏览器窗口，鼠标悬浮显示的文本，当然是表示网站的主题了。&lt;/li&gt;
&lt;li&gt;描述：就是百度搜索结果页面，网站标题下面的那一段描述文本内容，对网站详细的介绍。&lt;/li&gt;
&lt;li&gt;关键词：就是网站主要的内容有哪些？可以概括为哪些词？可以理解为标签。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果要用生活中常见的例子来说明，打个比方就是，有一家湘菜快餐店，分解成TDK格式的话：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;标题：湘菜小炒&lt;/li&gt;
&lt;li&gt;描述：湘菜小炒传承优良湘菜风格，用料新鲜，现做现炒，吃饱吃好，卫生符合国家食品安全标准，是打工人的不二选择。&lt;/li&gt;
&lt;li&gt;关键词：湘菜、现炒、吃得饱。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;标题、关键词、描述，这三个部分要做好，但是做好这三部分之前，是要想清楚，自己的网站定位是什么，关键词是哪个？&lt;/p&gt;
&lt;p&gt;比如你是云计算解决方案商，那关键词可能是“云平台”、比如你是工商业储能行业解决方案提供商，那么关键词可能是“工商业储能”等等。&lt;/p&gt;
&lt;h1 id=&#34;长尾关键词&#34;&gt;长尾关键词&lt;/h1&gt;
&lt;h1 id=&#34;关键词排名&#34;&gt;关键词排名&lt;/h1&gt;
&lt;p&gt;怎么知道这个网站在这个关键词下排名是多少？&lt;/p&gt;
&lt;h1 id=&#34;死链&#34;&gt;死链&lt;/h1&gt;</description>
      <content:encoded><![CDATA[<h1 id="收入量">收入量</h1>
<p>收录量不是等于访问量，但是可以提高曝光度，从而带来访问量增多的可能性。</p>
<h1 id="网站tdk">网站TDK</h1>
<p>在SEO中，网站的TDK指的是标题、描述和关键词的缩写，这三个元素对于网站来说至关重要。</p>
<ol>
<li>标题：就是浏览器窗口，鼠标悬浮显示的文本，当然是表示网站的主题了。</li>
<li>描述：就是百度搜索结果页面，网站标题下面的那一段描述文本内容，对网站详细的介绍。</li>
<li>关键词：就是网站主要的内容有哪些？可以概括为哪些词？可以理解为标签。</li>
</ol>
<p>如果要用生活中常见的例子来说明，打个比方就是，有一家湘菜快餐店，分解成TDK格式的话：</p>
<ol>
<li>标题：湘菜小炒</li>
<li>描述：湘菜小炒传承优良湘菜风格，用料新鲜，现做现炒，吃饱吃好，卫生符合国家食品安全标准，是打工人的不二选择。</li>
<li>关键词：湘菜、现炒、吃得饱。</li>
</ol>
<p>标题、关键词、描述，这三个部分要做好，但是做好这三部分之前，是要想清楚，自己的网站定位是什么，关键词是哪个？</p>
<p>比如你是云计算解决方案商，那关键词可能是“云平台”、比如你是工商业储能行业解决方案提供商，那么关键词可能是“工商业储能”等等。</p>
<h1 id="长尾关键词">长尾关键词</h1>
<h1 id="关键词排名">关键词排名</h1>
<p>怎么知道这个网站在这个关键词下排名是多少？</p>
<h1 id="死链">死链</h1>
]]></content:encoded>
    </item>
    <item>
      <title>基于 DataEase 的企业数据分析实践</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/%E5%BB%BA%E7%AB%99%E4%B8%8E%E8%BF%90%E8%90%A5/%E5%9F%BA%E4%BA%8E-dataease-%E7%9A%84%E4%BC%81%E4%B8%9A%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%AE%9E%E8%B7%B5/</link>
      <pubDate>Mon, 03 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/%E5%BB%BA%E7%AB%99%E4%B8%8E%E8%BF%90%E8%90%A5/%E5%9F%BA%E4%BA%8E-dataease-%E7%9A%84%E4%BC%81%E4%B8%9A%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%AE%9E%E8%B7%B5/</guid>
      <description>&lt;h1 id=&#34;1-前言&#34;&gt;1. 前言&lt;/h1&gt;
&lt;p&gt;在上一篇《基于 Selenium 实现的必应企业信息抓取工具》中，成功实现了对企业信息的批量抓取与导出。接下来，将对这些数据进行深入分析，包括地区分布、所属行业、规模大小等维度。其中，最直接的需求是统计每个省份的企业数量，并通过地图可视化直观展示。经过对 Tableau、FineReport 等数据分析工具的调研，发现 DataEase 不仅功能强大，而且开源免费，非常适合需求。虽然 DataEase 有详细的帮助文档，但在实际使用过程中记录一些细节仍然非常有帮助。以下将通过示例数据来验证各个流程。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202503031737977.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;2-下载&#34;&gt;2. 下载&lt;/h1&gt;
&lt;p&gt;DataEase 的下载与安装非常便捷，通过&lt;a href=&#34;https://www.fit2cloud.com/dataease/index.html&#34;&gt;DataEase 官方网站&lt;/a&gt;直接下载安装包。官网上提供了桌面版和服务器版的安装包，可以根据自身需求选择合适的版本进行安装。&lt;/p&gt;
&lt;h1 id=&#34;3-数据源&#34;&gt;3. 数据源&lt;/h1&gt;
&lt;p&gt;在开始数据分析之前，首先需要创建数据源。数据源是连接 DataEase 与数据存储的桥梁，通过配置数据源，可以将各类数据引入到 DataEase 中进行分析。DataEase 支持多种数据源类型，包括 OLTP、OLAP、数据仓库、数据湖、数据文件和 API 接口等，能够满足不同场景下的数据接入需求。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202503031658592.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;4-数据集&#34;&gt;4. 数据集&lt;/h1&gt;
&lt;p&gt;完成数据源配置后，接下来需要创建数据集。数据集是对数据源中的数据进行组织和管理的逻辑单元。在创建数据集时，DataEase 会根据表格中的数据类型自动对字段进行分类。如果表格中的值是数值类型，则默认归类到指标处，方便后续的分析与计算。&lt;/p&gt;
&lt;p&gt;此外，DataEase 还支持新建计算字段，用于对表格中的数据进行进一步处理。例如，在示例数据中，如果需要计算一个名为“年龄收入效率”的指标，其公式为：年龄收入效率 = 工资 / 年龄。可以在字段表达式中写入以下 SQL 表达式，并进行校验：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-mysql&#34; data-lang=&#34;mysql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;CASE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;WHEN&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;年龄&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;THEN&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ELSE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;工资&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;年龄&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;END&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过新建计算字段，可以灵活地对数据进行加工和转换，满足各种复杂的分析需求。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202503041715704.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;5-仪表板&#34;&gt;5. 仪表板&lt;/h1&gt;
&lt;p&gt;DataEase 的仪表板功能非常强大，支持多种图表类型和查询功能。在应用场景中，主要利用仪表板对表格数据进行可视化展示。&lt;/p&gt;
&lt;h2 id=&#34;51-地区分布&#34;&gt;5.1 地区分布&lt;/h2&gt;
&lt;p&gt;首先创建了一个仪表板来展示用户的地区分布情况。通过拖动地图组件到仪表板中，并选择省份作为维度，记录数作为指标，即可直观地展示每个省份的用户数量。在地图的标签设置中，可以根据需求选择是否显示省份名称、统计字数等信息，以便更好地呈现数据。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202503031703583.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;在标签处可以对地图显示进行设置，比如是否显示省份名称，是否显示统计字数等等。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202503031705258.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;52-城市数排名&#34;&gt;5.2 城市数排名&lt;/h2&gt;
&lt;p&gt;接下来，通过创建一个新的仪表板来展示城市的排名情况。在维度处选择城市，指标处选择记录数，并在记录数处设置排序，即可生成城市用户数量的排名图表。通过这种方式，可以清晰地了解哪些城市的用户数量较多，为后续的分析提供依据。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h1 id="1-前言">1. 前言</h1>
<p>在上一篇《基于 Selenium 实现的必应企业信息抓取工具》中，成功实现了对企业信息的批量抓取与导出。接下来，将对这些数据进行深入分析，包括地区分布、所属行业、规模大小等维度。其中，最直接的需求是统计每个省份的企业数量，并通过地图可视化直观展示。经过对 Tableau、FineReport 等数据分析工具的调研，发现 DataEase 不仅功能强大，而且开源免费，非常适合需求。虽然 DataEase 有详细的帮助文档，但在实际使用过程中记录一些细节仍然非常有帮助。以下将通过示例数据来验证各个流程。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202503031737977.png"></p>
<h1 id="2-下载">2. 下载</h1>
<p>DataEase 的下载与安装非常便捷，通过<a href="https://www.fit2cloud.com/dataease/index.html">DataEase 官方网站</a>直接下载安装包。官网上提供了桌面版和服务器版的安装包，可以根据自身需求选择合适的版本进行安装。</p>
<h1 id="3-数据源">3. 数据源</h1>
<p>在开始数据分析之前，首先需要创建数据源。数据源是连接 DataEase 与数据存储的桥梁，通过配置数据源，可以将各类数据引入到 DataEase 中进行分析。DataEase 支持多种数据源类型，包括 OLTP、OLAP、数据仓库、数据湖、数据文件和 API 接口等，能够满足不同场景下的数据接入需求。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202503031658592.png"></p>
<h1 id="4-数据集">4. 数据集</h1>
<p>完成数据源配置后，接下来需要创建数据集。数据集是对数据源中的数据进行组织和管理的逻辑单元。在创建数据集时，DataEase 会根据表格中的数据类型自动对字段进行分类。如果表格中的值是数值类型，则默认归类到指标处，方便后续的分析与计算。</p>
<p>此外，DataEase 还支持新建计算字段，用于对表格中的数据进行进一步处理。例如，在示例数据中，如果需要计算一个名为“年龄收入效率”的指标，其公式为：年龄收入效率 = 工资 / 年龄。可以在字段表达式中写入以下 SQL 表达式，并进行校验：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-mysql" data-lang="mysql"><span class="line"><span class="cl"><span class="k">CASE</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">WHEN</span><span class="w"> </span><span class="p">[</span><span class="err">年龄</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">THEN</span><span class="w"> </span><span class="no">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">ELSE</span><span class="w"> </span><span class="p">([</span><span class="err">工资</span><span class="p">]</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">[</span><span class="err">年龄</span><span class="p">])</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">END</span><span class="w">
</span></span></span></code></pre></div><p>通过新建计算字段，可以灵活地对数据进行加工和转换，满足各种复杂的分析需求。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202503041715704.png"></p>
<h1 id="5-仪表板">5. 仪表板</h1>
<p>DataEase 的仪表板功能非常强大，支持多种图表类型和查询功能。在应用场景中，主要利用仪表板对表格数据进行可视化展示。</p>
<h2 id="51-地区分布">5.1 地区分布</h2>
<p>首先创建了一个仪表板来展示用户的地区分布情况。通过拖动地图组件到仪表板中，并选择省份作为维度，记录数作为指标，即可直观地展示每个省份的用户数量。在地图的标签设置中，可以根据需求选择是否显示省份名称、统计字数等信息，以便更好地呈现数据。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202503031703583.png"></p>
<p>在标签处可以对地图显示进行设置，比如是否显示省份名称，是否显示统计字数等等。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202503031705258.png"></p>
<h2 id="52-城市数排名">5.2 城市数排名</h2>
<p>接下来，通过创建一个新的仪表板来展示城市的排名情况。在维度处选择城市，指标处选择记录数，并在记录数处设置排序，即可生成城市用户数量的排名图表。通过这种方式，可以清晰地了解哪些城市的用户数量较多，为后续的分析提供依据。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202503031718198.png"></p>
<h2 id="53-年龄收入效率">5.3 年龄收入效率</h2>
<p>最后，利用仪表板展示“年龄收入效率”的分析结果。在维度处选择姓名，指标处选择“年龄收入效率”，并设置排序，即可生成相应的图表。通过该图表，可以直观地比较不同用户的年龄收入效率。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202503031719037.png"></p>
<h1 id="6-最后">6. 最后</h1>
<p>经过实际使用，DataEase 的操作非常简单，交互体验良好。对于当前的工作需求，DataEase 提供的功能已经足够强大。未来，计划进一步接入数据库，并尝试利用 AI 技术生成更复杂的数据分析结果，以提升数据分析的效率和深度。</p>
<p>DataEase 作为一款开源的数据可视化分析工具，不仅功能丰富，而且易于上手，非常适合广大用户进行数据可视化分析。希望本文的实践分享能够为大家提供一些参考和帮助。</p>
]]></content:encoded>
    </item>
    <item>
      <title>AgileTC测试用例管理平台的基本使用</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/agiletc%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</link>
      <pubDate>Wed, 21 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/agiletc%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</guid>
      <description>&lt;h1 id=&#34;1-背景&#34;&gt;1. 背景&lt;/h1&gt;
&lt;p&gt;使用企业微信在线文档对测试用例进行管理，存在以下问题，比如新建版本，每次都要设置下执行测试用例那一栏，要提供通过、失败、阻塞等选项，操作异常繁琐，比如版本管理问题，多个版本之后，想要追溯老版本测试了哪些功能，很难进行筛选，比如测试用例越来越多，文档打开慢的问题等等。&lt;/p&gt;
&lt;h1 id=&#34;2-调研&#34;&gt;2. 调研&lt;/h1&gt;
&lt;p&gt;为了解决以上问题，调研了市面上的一些平台，发现有些平台功能过多，有些平台需要付费，现阶段，显然不太合适，然后发现了&lt;code&gt;AgileTC&lt;/code&gt;，它是一套敏捷的测试用例管理平台，以脑图方式编辑可快速上手，有以下几个优势：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;可新建多个用例集，用例可以设置优先级；&lt;/li&gt;
&lt;li&gt;可基于用例集，创建执行测试任务，并且可跟进优先级筛选进行测试；&lt;/li&gt;
&lt;li&gt;版本管理问题，多个版本管理不会有问题，创建执行测试任务就是一个版本，比如&lt;code&gt;V1.0&lt;/code&gt;研发自测，就是一条执行测试任务；&lt;/li&gt;
&lt;li&gt;可搜索快速定位到要查看的功能模块，并且其他功能模块收起；&lt;/li&gt;
&lt;li&gt;可以设置前置条件、执行步骤、预期结果标签；&lt;/li&gt;
&lt;li&gt;左侧有菜单，可快速查看其他项目；&lt;/li&gt;
&lt;li&gt;离开当前页，可以自动保存；&lt;/li&gt;
&lt;li&gt;学习成本很低，而且是开源免费的；&lt;/li&gt;
&lt;li&gt;可以导出执行测试结果为&lt;code&gt;xmind&lt;/code&gt;文件，用于项目提测时，给到测试组。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基于以上原因，计划使用&lt;code&gt;AgileTC&lt;/code&gt;系统，在线管理各项目的测试用例。&lt;/p&gt;
&lt;h1 id=&#34;3-基本使用&#34;&gt;3. 基本使用&lt;/h1&gt;
&lt;h2 id=&#34;31-准备环境&#34;&gt;3.1 准备环境&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. mac/linux/windows
1. java 1.8
1. mysql 服务端
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;32-下载&#34;&gt;3.2 下载&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/didi/AgileTC.git
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;33-create-database-case_manager&#34;&gt;3.3 create database case_manager&lt;/h2&gt;
&lt;p&gt;使用命令 &lt;code&gt;create database case_manager&lt;/code&gt;在 MySQL Workbench 中创建依赖数据库。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202408201504509.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;34-运行-case-serversql-脚本内容&#34;&gt;3.4 运行 case-server.sql 脚本内容&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;拷贝 &lt;code&gt;./AgileTC/case-server/sql/case-server.sql&lt;/code&gt; 文件内容，在 MySQL Workbench 中运行。&lt;/li&gt;
&lt;li&gt;双击 &lt;code&gt;case_manager&lt;/code&gt; ，选中当前依赖数据库。&lt;/li&gt;
&lt;li&gt;点击闪电图标执行。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202408201504879.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;35-修改-application-devproperties-文件&#34;&gt;3.5 修改 application-dev.properties 文件&lt;/h2&gt;
&lt;p&gt;修改 &lt;code&gt;./AgileTC/case-server/src/main/resources/application-dev.properties&lt;/code&gt; 文件，如下所示：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;spring.datasource.url=jdbc:mysql://localhost:3306/case_manager?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=12345678
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;36-运行命令-mvn-spring-bootrun&#34;&gt;3.6 运行命令 mvn spring-boot:run&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在&lt;code&gt;case-server&lt;/code&gt;目录下执行命令&lt;code&gt;mvn spring-boot:run&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;使用浏览器打开 &lt;code&gt;http://localhost:8094/case/caseList/1&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202408201504409.png&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h1 id="1-背景">1. 背景</h1>
<p>使用企业微信在线文档对测试用例进行管理，存在以下问题，比如新建版本，每次都要设置下执行测试用例那一栏，要提供通过、失败、阻塞等选项，操作异常繁琐，比如版本管理问题，多个版本之后，想要追溯老版本测试了哪些功能，很难进行筛选，比如测试用例越来越多，文档打开慢的问题等等。</p>
<h1 id="2-调研">2. 调研</h1>
<p>为了解决以上问题，调研了市面上的一些平台，发现有些平台功能过多，有些平台需要付费，现阶段，显然不太合适，然后发现了<code>AgileTC</code>，它是一套敏捷的测试用例管理平台，以脑图方式编辑可快速上手，有以下几个优势：</p>
<ol>
<li>可新建多个用例集，用例可以设置优先级；</li>
<li>可基于用例集，创建执行测试任务，并且可跟进优先级筛选进行测试；</li>
<li>版本管理问题，多个版本管理不会有问题，创建执行测试任务就是一个版本，比如<code>V1.0</code>研发自测，就是一条执行测试任务；</li>
<li>可搜索快速定位到要查看的功能模块，并且其他功能模块收起；</li>
<li>可以设置前置条件、执行步骤、预期结果标签；</li>
<li>左侧有菜单，可快速查看其他项目；</li>
<li>离开当前页，可以自动保存；</li>
<li>学习成本很低，而且是开源免费的；</li>
<li>可以导出执行测试结果为<code>xmind</code>文件，用于项目提测时，给到测试组。</li>
</ol>
<p>基于以上原因，计划使用<code>AgileTC</code>系统，在线管理各项目的测试用例。</p>
<h1 id="3-基本使用">3. 基本使用</h1>
<h2 id="31-准备环境">3.1 准备环境</h2>
<pre tabindex="0"><code>1. mac/linux/windows
1. java 1.8
1. mysql 服务端
</code></pre><h2 id="32-下载">3.2 下载</h2>
<pre tabindex="0"><code>git clone https://github.com/didi/AgileTC.git
</code></pre><h2 id="33-create-database-case_manager">3.3 create database case_manager</h2>
<p>使用命令 <code>create database case_manager</code>在 MySQL Workbench 中创建依赖数据库。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202408201504509.png"></p>
<h2 id="34-运行-case-serversql-脚本内容">3.4 运行 case-server.sql 脚本内容</h2>
<ol>
<li>拷贝 <code>./AgileTC/case-server/sql/case-server.sql</code> 文件内容，在 MySQL Workbench 中运行。</li>
<li>双击 <code>case_manager</code> ，选中当前依赖数据库。</li>
<li>点击闪电图标执行。</li>
</ol>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202408201504879.png"></p>
<h2 id="35-修改-application-devproperties-文件">3.5 修改 application-dev.properties 文件</h2>
<p>修改 <code>./AgileTC/case-server/src/main/resources/application-dev.properties</code> 文件，如下所示：</p>
<pre tabindex="0"><code>spring.datasource.url=jdbc:mysql://localhost:3306/case_manager?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=12345678
</code></pre><h2 id="36-运行命令-mvn-spring-bootrun">3.6 运行命令 mvn spring-boot:run</h2>
<ol>
<li>在<code>case-server</code>目录下执行命令<code>mvn spring-boot:run</code>。</li>
<li>使用浏览器打开 <code>http://localhost:8094/case/caseList/1</code>。</li>
</ol>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202408201504409.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Sentry的基本使用</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/sentry%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</link>
      <pubDate>Sun, 18 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/sentry%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</guid>
      <description>&lt;h2 id=&#34;1-系统简介&#34;&gt;1. 系统简介&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Sentry&lt;/code&gt;是一个开源的监控系统，可以收集项目中的异常信息，便于开发人员第一时间发现问题，定位问题，解决问题。当前文档基于&lt;code&gt;Sentry 23.11.2&lt;/code&gt;进行说明。&lt;/p&gt;
&lt;h2 id=&#34;2-系统搭建&#34;&gt;2. 系统搭建&lt;/h2&gt;
&lt;p&gt;虽然&lt;code&gt;Sentry&lt;/code&gt;官方提供了在线系统，但是因为需要翻墙，加上如果是公司项目，考虑到安全问题，还是倾向于私有化部署，在&lt;code&gt;Github&lt;/code&gt;上有一个开源项目用于部署&lt;code&gt;Sentry&lt;/code&gt;，可以使用该项目进行部署：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/getsentry/onpremise.git
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;因为这个项目涉及很多后端的技术知识，&lt;code&gt;Sentry&lt;/code&gt;搭建最好是后端人员来做，然后部署到服务器上面去。&lt;/p&gt;
&lt;h2 id=&#34;3-创建项目&#34;&gt;3. 创建项目&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Sentry&lt;/code&gt;搭建成功，部署到服务器，比如当前&lt;code&gt;Sentry&lt;/code&gt;在线系统为&lt;code&gt;https://123.11.22.133&lt;/code&gt;，使用账号&lt;code&gt;test001&lt;/code&gt;登录，一开始默认是英文显示，如果想要切换为中文，只需要在左上角的&lt;code&gt;User settings&lt;/code&gt;里的&lt;code&gt;Language&lt;/code&gt;选项选择&lt;code&gt;Simplified Chinese&lt;/code&gt;即可，然后创建项目，其他平台同理，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051429752.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;4-vue3项目引入sentry&#34;&gt;4. Vue3项目引入Sentry&lt;/h2&gt;
&lt;p&gt;项目创建完成后，会跳转至 &lt;code&gt;Vue SDK&lt;/code&gt; 配置的说明文档，默认勾选三个监控模块，并且提供&lt;code&gt;Vue3&lt;/code&gt;和&lt;code&gt;Vue2&lt;/code&gt;版本的引入方式，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051456521.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;三个监控模块的简单功能说明，如下所示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Error Monitoring：&lt;/strong&gt; 自动报告项目错误和异常。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance Monitoring：&lt;/strong&gt; 通过性能监控，&lt;code&gt;Sentry&lt;/code&gt;跟踪你的软件性能，测量吞吐量和延迟等指标，并显示错误对多个系统的影响。&lt;code&gt;Sentry&lt;/code&gt;捕获由事务和&lt;code&gt;span&lt;/code&gt;组成的分布式跟踪，这些跟踪测量单个服务以及这些服务中的单个操作。在分布式跟踪中了解更多关于我们的模型的信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session Replay：&lt;/strong&gt; 会话重播通过像视频一样重现用户浏览器在错误发生前、发生中、发生后的情况，帮助你更快地找到错误或延迟问题的根本原因。受浏览器开发者工具的启发，你可以在一个组合的&lt;code&gt;UI&lt;/code&gt;中回放应用程序的&lt;code&gt;DOM&lt;/code&gt;状态，并查看关键的用户交互，如鼠标点击、滚动、网络请求和控制台条目。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;首先，我们需要依照文档进行配置，安装依赖&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Using&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;npm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;npm&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;save&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;@sentry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;vue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Using&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;yarn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;yarn&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;@sentry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;vue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后，在&lt;code&gt;main.ts&lt;/code&gt;里引入&lt;code&gt;Sentry.init()&lt;/code&gt;，如下所示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createApp&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;vue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createRouter&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;vue-router&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;@sentry/vue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createApp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;router&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createRouter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;dsn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://examplePublicKey@o0.ingest.sentry.io/0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;integrations&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;browserTracingIntegration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;router&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replayIntegration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Set tracesSampleRate to 1.0 to capture 100%
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// of transactions for tracing.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// We recommend adjusting this value in production
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;tracesSampleRate&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;1.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;tracePropagationTargets&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sr&#34;&gt;/^https:\/\/yourserver\.io\/api/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Capture Replay for 10% of all sessions,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// plus for 100% of sessions with an error
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;replaysSessionSampleRate&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;0.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;replaysOnErrorSampleRate&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;1.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;use&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;router&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mount&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;#app&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此时，只要项目在本地运行或部署至线上，打开项目，然后打开浏览器控制台，查看&lt;code&gt;Network&lt;/code&gt;列表，会发现很多类似这样的请求，并没有报错，这就意味着当前已经正常上报到&lt;code&gt;Sentry&lt;/code&gt;系统了，如下所示：&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="1-系统简介">1. 系统简介</h2>
<p><code>Sentry</code>是一个开源的监控系统，可以收集项目中的异常信息，便于开发人员第一时间发现问题，定位问题，解决问题。当前文档基于<code>Sentry 23.11.2</code>进行说明。</p>
<h2 id="2-系统搭建">2. 系统搭建</h2>
<p>虽然<code>Sentry</code>官方提供了在线系统，但是因为需要翻墙，加上如果是公司项目，考虑到安全问题，还是倾向于私有化部署，在<code>Github</code>上有一个开源项目用于部署<code>Sentry</code>，可以使用该项目进行部署：</p>
<pre tabindex="0"><code>git clone https://github.com/getsentry/onpremise.git
</code></pre><p>因为这个项目涉及很多后端的技术知识，<code>Sentry</code>搭建最好是后端人员来做，然后部署到服务器上面去。</p>
<h2 id="3-创建项目">3. 创建项目</h2>
<p><code>Sentry</code>搭建成功，部署到服务器，比如当前<code>Sentry</code>在线系统为<code>https://123.11.22.133</code>，使用账号<code>test001</code>登录，一开始默认是英文显示，如果想要切换为中文，只需要在左上角的<code>User settings</code>里的<code>Language</code>选项选择<code>Simplified Chinese</code>即可，然后创建项目，其他平台同理，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051429752.png"></p>
<h2 id="4-vue3项目引入sentry">4. Vue3项目引入Sentry</h2>
<p>项目创建完成后，会跳转至 <code>Vue SDK</code> 配置的说明文档，默认勾选三个监控模块，并且提供<code>Vue3</code>和<code>Vue2</code>版本的引入方式，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051456521.png"></p>
<p>三个监控模块的简单功能说明，如下所示：</p>
<ul>
<li><strong>Error Monitoring：</strong> 自动报告项目错误和异常。</li>
<li><strong>Performance Monitoring：</strong> 通过性能监控，<code>Sentry</code>跟踪你的软件性能，测量吞吐量和延迟等指标，并显示错误对多个系统的影响。<code>Sentry</code>捕获由事务和<code>span</code>组成的分布式跟踪，这些跟踪测量单个服务以及这些服务中的单个操作。在分布式跟踪中了解更多关于我们的模型的信息。</li>
<li><strong>Session Replay：</strong> 会话重播通过像视频一样重现用户浏览器在错误发生前、发生中、发生后的情况，帮助你更快地找到错误或延迟问题的根本原因。受浏览器开发者工具的启发，你可以在一个组合的<code>UI</code>中回放应用程序的<code>DOM</code>状态，并查看关键的用户交互，如鼠标点击、滚动、网络请求和控制台条目。</li>
</ul>
<p>首先，我们需要依照文档进行配置，安装依赖</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="err">#</span> <span class="nx">Using</span> <span class="nx">npm</span>
</span></span><span class="line"><span class="cl"><span class="nx">npm</span> <span class="nx">install</span> <span class="o">--</span><span class="nx">save</span> <span class="kd">@sentry</span><span class="o">/</span><span class="nx">vue</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">#</span> <span class="nx">Using</span> <span class="nx">yarn</span>
</span></span><span class="line"><span class="cl"><span class="nx">yarn</span> <span class="nx">add</span> <span class="kd">@sentry</span><span class="o">/</span><span class="nx">vue</span>
</span></span></code></pre></div><p>然后，在<code>main.ts</code>里引入<code>Sentry.init()</code>，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">createApp</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;vue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">createRouter</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;vue-router&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="o">*</span> <span class="kr">as</span> <span class="nx">Sentry</span> <span class="kr">from</span> <span class="s2">&#34;@sentry/vue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">createApp</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">router</span> <span class="o">=</span> <span class="nx">createRouter</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Sentry</span><span class="p">.</span><span class="nx">init</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">app</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">dsn</span><span class="o">:</span> <span class="s2">&#34;https://examplePublicKey@o0.ingest.sentry.io/0&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">integrations</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Sentry</span><span class="p">.</span><span class="nx">browserTracingIntegration</span><span class="p">({</span> <span class="nx">router</span> <span class="p">}),</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Sentry</span><span class="p">.</span><span class="nx">replayIntegration</span><span class="p">(),</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Set tracesSampleRate to 1.0 to capture 100%
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="c1">// of transactions for tracing.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="c1">// We recommend adjusting this value in production
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">tracesSampleRate</span>: <span class="kt">1.0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">tracePropagationTargets</span><span class="o">:</span> <span class="p">[</span><span class="s2">&#34;localhost&#34;</span><span class="p">,</span> <span class="sr">/^https:\/\/yourserver\.io\/api/</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Capture Replay for 10% of all sessions,
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="c1">// plus for 100% of sessions with an error
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">replaysSessionSampleRate</span>: <span class="kt">0.1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">replaysOnErrorSampleRate</span>: <span class="kt">1.0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">router</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">mount</span><span class="p">(</span><span class="s2">&#34;#app&#34;</span><span class="p">);</span>
</span></span></code></pre></div><p>此时，只要项目在本地运行或部署至线上，打开项目，然后打开浏览器控制台，查看<code>Network</code>列表，会发现很多类似这样的请求，并没有报错，这就意味着当前已经正常上报到<code>Sentry</code>系统了，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="err">/api/6/envelope/?sentry_key=485eee5b72d4758f53483e6ee56c43ed&amp;sentry_version=7&amp;sentry_client=sentry.javascript.vue%2F7.85.0</span>
</span></span></code></pre></div><h2 id="5-异常报错示例">5. 异常报错示例</h2>
<p>为了真实验证<code>Sentry</code>的功能，现以一个真实场景来演示，在项目中添加一个按钮，然后设置点击事件之后，触发打印<code>console</code>，<code>sentryTest</code>并未定义，所以会报错，代码如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vue" data-lang="vue"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">el-button</span> <span class="nt">@click</span><span class="s">=&#34;sentryClicked&#34;</span><span class="p">&gt;</span><span class="na">Sentry测试</span><span class="err">&lt;/</span><span class="na">el</span><span class="nt">-button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">setup</span> <span class="na">lang</span><span class="o">=</span><span class="s">&#34;ts&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">defineComponent</span><span class="p">,</span> <span class="nx">ref</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;vue&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">sentryClicked</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;sentryClicked: &#39;</span><span class="p">,</span> <span class="nx">sentryTest</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>在项目页面，我们可以看到，在浏览器控制台，确实有报错信息生成，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051530416.png"></p>
<p>然后，我们到<code>Sentry</code>在线系统查看，确实有收到报错信息，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051533294.png"></p>
<p>里面指明了报错原因是 <code>sentryTest is not defined</code> ，然后还提交了用户的<code>IP</code>、浏览器版本以及版本号、平台系统等等信息，便于分析异常错误。还可以使用<code>Session Replay</code>重现用户浏览器在错误发生前、发生中、发生后的情况，如下所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051538755.png"></p>
<h2 id="6-上传sourcemap文件">6. 上传SourceMap文件</h2>
<p>通常<code>Sentry</code>在线系统上面的信息，也是可以排查解决<code>BUG</code>的，比如<code>sentryTest is not defined</code>，我们只需要在项目中搜索<code>sentryTest</code>就可以定位到代码报错的位置，但是如果是一些比较通用的，或者信息比较含糊的，是没办法精准定位代码位置的，这个时候，就可能有想法了，怎么让才能在<code>Sentry</code>在线系统看到，到底是执行到哪一步的时候，报错了呢？</p>
<p>这就是本节所需要实现功能，这就需要 <code>SourceMap</code> 文件，什么是 <code>SourceMap</code> 文件呢？</p>
<p>因为使用<code>Vite</code>打包之后，所有代码都压缩在一起，很难从中定位到异常代码的位置，<code>Sentry</code>通过<code>.map</code>文件中的映射关系将编译后的代码行映射回源代码行，从而提供准确的错误定位信息。可以帮助开发人员更轻松地理解和修复生产环境中的错误。</p>
<p>首先，需要在<code>Vue3</code>项目的 <code>vite.config.ts</code> 里进行设置，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">defineConfig</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">build</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sourcemap</span>: <span class="kt">true</span><span class="p">,</span> <span class="c1">// Source map generation must be turned on
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">})</span>
</span></span></code></pre></div><p>然后运行 <code>npm run build</code> 命令，在生成的 <code>dist/assets/</code>里就会发现后缀为<code>.map</code>的文件，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051551198.png"></p>
<p>然后我们需要把<code>.map</code>文件上传到 <code>Sentry</code> 在线系统。</p>
<h3 id="61-通过sentry-wizard自动上传至sentry推荐">6.1 通过sentry-wizard自动上传至Sentry【推荐】</h3>
<p>在官方提供的<code> Configure Vue SDK</code>页面中已经推荐使用<code>sentry-wizard</code>来自动上传<code>SourceMap</code>至<code>Sentry</code>，具体实现步骤如下所示：</p>
<ol>
<li>
<p>安装依赖</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">npx</span> <span class="err">@</span><span class="nx">sentry</span><span class="o">/</span><span class="nx">wizard</span><span class="err">@</span><span class="nx">latest</span> <span class="o">-</span><span class="nx">i</span> <span class="nx">sourcemaps</span>
</span></span></code></pre></div></li>
<li>
<p>会在终端生成很多提示，提示信息都很清晰，依次选择即可，分别有：</p>
<ol>
<li>Do you want to continue anyway? <code>(Yes)</code></li>
<li>Are you using Sentry SaaS or self-hosted Sentry? <code>(Self-hosted/on-premise/single-tenant)</code></li>
<li>Please enter the URL of your self-hosted Sentry instance.  <code>(https://123.11.22.133)</code></li>
<li>Do you already have a Sentry account?  <code>(Yes)</code></li>
<li>Select your Sentry project.  <code>(test)</code></li>
<li>Which framework, bundler or build tool are you using? <code>（Vite）</code></li>
<li>The @sentry/vite-plugin package is already installed.  <code>(Yes)</code></li>
<li>Updated @sentry/vite-plugin with NPM.</li>
<li>Added the Sentry Vite plugin to vite.config.ts and enabled.</li>
<li>Added auth token to .env.sentry-build-plugin</li>
<li>Added .env.sentry-build-plugin to .gitignore.</li>
<li>Are you using a CI/CD tool to build and deploy your application?  <code>(No)</code></li>
</ol>
</li>
<li>
<p>然后我们会看到<code>vite.config.ts</code>里<code>@sentry/vite-plugin</code>插件的配置，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">sentryVitePlugin</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">&#34;@sentry/vite-plugin&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">defineConfig</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">plugins</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sentryVitePlugin</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">      <span class="nx">org</span><span class="o">:</span> <span class="s2">&#34;sentry&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">project</span><span class="o">:</span> <span class="s2">&#34;project-template-vue&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">url</span><span class="o">:</span> <span class="s2">&#34;https://123.11.22.133&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">})],</span>
</span></span></code></pre></div><p>此时需注意，因在设置<code>self-hosted Sentry</code>时，输入的是<code>https://123.11.22.133</code>，但是<code>sentry-wizard</code>自动在<code>vite.config.ts</code>中生成填写的url值为<code>https://123.11.22.133/</code>，需要去掉<code>/</code>，避免运行<code>npm run build</code>时报错：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">error</span><span class="o">:</span> <span class="nx">Two</span> <span class="nx">different</span> <span class="nx">url</span> <span class="nx">values</span> <span class="nx">supplied</span><span class="o">:</span> <span class="sb">`https://123.11.22.133`</span> <span class="p">(</span><span class="nx">from</span> <span class="nx">token</span><span class="p">),</span> <span class="sb">`https://123.11.22.133/`</span><span class="p">.</span>
</span></span></code></pre></div></li>
<li>
<p>在源码目录下，还自动生成了文件<code>.env.sentry-build-plugin</code>，并且<code>.gitignore.</code>里进行忽略。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051652090.png"></p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051656775.png"></p>
</li>
<li>
<p>运行<code>npm run build</code>打包上传，如下所示，当上传<code>SourceMap</code>完成之后，会有相应详细的信息进行说明。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051712511.png"></p>
</li>
<li>
<p>通过在<code>Sentry</code>上面查看项目的<code>SourceMap</code>页面，查看<code>Releases</code>的值为<code>a8b55844dbd5417cefcc00231df0b7df59fec973</code>，来确定本次上传的版本，如下图所示，已经上次成功。</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051720507.png"></p>
</li>
<li>
<p>验证 <code>sentryTest is not defined</code>异常报错示例，我们可以看到在异常详情页，会直接定位到源码报错的位置，如下所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051900928.png"></p>
</li>
</ol>
<h3 id="62-通过sentry-cli上传至sentry">6.2 通过Sentry Cli上传至Sentry</h3>
<p>登录<code>Sentry</code>在线系统，以<code>mac</code>环境为例，在终端输入如下：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="err">#</span> <span class="nx">mac</span>
</span></span><span class="line"><span class="cl"><span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="o">--</span><span class="nx">url</span> <span class="nx">http</span><span class="o">:</span><span class="c1">//123.11.22.133:211/login
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="err">#</span> <span class="nx">windows</span><span class="p">,</span> <span class="nx">在</span> <span class="nx">node_modules</span> <span class="nx">里找到</span> <span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span><span class="p">.</span><span class="nx">exe</span><span class="err">，</span><span class="nx">右键Copy</span> <span class="nx">Path</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="o">~</span><span class="err">\</span><span class="nx">node_modules</span><span class="err">\@</span><span class="nx">sentry</span><span class="err">\</span><span class="nx">cli</span><span class="o">-</span><span class="nx">win32</span><span class="o">-</span><span class="nx">x64</span><span class="err">\</span><span class="nx">bin</span><span class="err">\</span><span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span><span class="p">.</span><span class="nx">exe</span> <span class="o">--</span><span class="nx">url</span> <span class="nx">https</span><span class="o">:</span><span class="c1">//123.11.22.133:211/ login
</span></span></span></code></pre></div><p>然后会提示输入<code>token</code>，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">dstweihao</span><span class="err">@</span><span class="nx">weihao</span><span class="o">-</span><span class="nx">mac</span><span class="o">-</span><span class="nx">mini</span> <span class="nx">vue</span> <span class="o">%</span> <span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="o">--</span><span class="nx">url</span> <span class="nx">http</span><span class="o">:</span><span class="c1">//123.11.22.133:211/ login
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">This</span> <span class="nx">helps</span> <span class="nx">you</span> <span class="nx">signing</span> <span class="k">in</span> <span class="nx">your</span> <span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="kd">with</span> <span class="nx">an</span> <span class="nx">authentication</span> <span class="nx">token</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="nx">If</span> <span class="nx">you</span> <span class="k">do</span> <span class="nx">not</span> <span class="nx">yet</span> <span class="nx">have</span> <span class="nx">a</span> <span class="nx">token</span> <span class="nx">ready</span> <span class="nx">we</span> <span class="nx">can</span> <span class="nx">bring</span> <span class="nx">up</span> <span class="nx">a</span> <span class="nx">browser</span> <span class="k">for</span> <span class="nx">you</span>
</span></span><span class="line"><span class="cl"><span class="nx">to</span> <span class="nx">create</span> <span class="nx">a</span> <span class="nx">token</span> <span class="nx">now</span><span class="p">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Sentry</span> <span class="nx">server</span><span class="o">:</span> <span class="mf">123.11</span><span class="p">.</span><span class="mf">22.133</span>
</span></span><span class="line"><span class="cl"><span class="nx">Open</span> <span class="nx">browser</span> <span class="nx">now</span><span class="o">?</span> <span class="p">[</span><span class="nx">y</span><span class="o">/</span><span class="nx">n</span><span class="p">]</span> <span class="nx">n</span>
</span></span><span class="line"><span class="cl"><span class="nx">Enter</span> <span class="nx">your</span> <span class="nx">token</span><span class="o">:</span> 
</span></span></code></pre></div><p><code>token</code>是在<code>Sentry</code>在线系统生成的，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051934070.png"></p>
<p>这时，只要复制<code>token</code>到终端，就可以完成登录流程了，如下所示，就是成功登录了<code>Sentry</code>在线系统：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">Enter</span> <span class="nx">your</span> <span class="nx">token</span><span class="o">:</span> <span class="mf">104e37</span><span class="nx">d1d6b8ac962205719ef8380981ecbaaf587c166566c7df20372d0d72de</span>
</span></span><span class="line"><span class="cl"><span class="nx">Valid</span> <span class="nx">token</span> <span class="k">for</span> <span class="nx">user</span> <span class="nx">test001</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Stored</span> <span class="nx">token</span> <span class="k">in</span> <span class="err">/Users/weihao/.sentryclirc</span>
</span></span><span class="line"><span class="cl"><span class="nx">dstweihao</span><span class="err">@</span><span class="nx">weihao</span><span class="o">-</span><span class="nx">mac</span><span class="o">-</span><span class="nx">mini</span> <span class="nx">vue</span> <span class="o">%</span> 
</span></span></code></pre></div><ol>
<li>
<p>上传<code>SourceMap</code>到<code>Sentry</code>在线系统，登录成功之后，就需要将SourceMap文件上传到<code>Sentry</code>在线系统，首先，需要在项目里新建一个<code>.sentryclirc</code>文件，里面的内容，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">defaults</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">url</span><span class="o">=</span><span class="nx">http</span><span class="o">:</span><span class="c1">//123.11.22.133:211/
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">org</span><span class="o">=</span><span class="nx">sentry</span>
</span></span><span class="line"><span class="cl"><span class="nx">project</span><span class="o">=</span><span class="nx">test</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">auth</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">token</span><span class="o">=</span><span class="mf">104e37</span><span class="nx">d1d6b8ac962205719ef8380981ecbaaf587c166566c7df20372d0d72de</span>
</span></span></code></pre></div><p>然后使用以下命令：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="nx">releases</span> <span class="o">-</span><span class="nx">o</span> <span class="nx">sentry</span> <span class="o">-</span><span class="nx">p</span> <span class="nx">test</span> <span class="nx">files</span> <span class="nx">test</span><span class="err">@</span><span class="mf">1.0</span><span class="p">.</span><span class="mi">0</span> <span class="nx">upload</span><span class="o">-</span><span class="nx">sourcemaps</span> <span class="s1">&#39;./dist/assets/&#39;</span> <span class="o">--</span><span class="nx">url</span><span class="o">-</span><span class="nx">prefix</span> <span class="s1">&#39;~/test/js&#39;</span>
</span></span></code></pre></div><p>这里需要对该命令一些参数说明一下：</p>
<p><code>sentry</code>：组织名</p>
<p><code>test</code>：项目名</p>
<p><code>1.0.0</code>：版本号，需和main.ts里的<code>release: 'test@1.0.0'</code>一致。</p>
<p><code>./dist/assets/</code>：项目打包生成的<code>dist</code>里<code>.map</code>文件所在目录</p>
<p><code>~/test/js</code>：如果部署在服务器上面，不是部署在主目录，而是在<code>test</code>文件夹下面，那就需要加上</p>
<p>在终端显示如下，就表示已经上传成功：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Found</span> <span class="mi">2</span> <span class="nx">release</span> <span class="nx">files</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Analyzing</span> <span class="mi">2</span> <span class="nx">sources</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Analyzing</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.47</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Rewriting</span> <span class="nx">sources</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Rewriting</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.534</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Adding</span> <span class="nx">source</span> <span class="nx">map</span> <span class="nx">references</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Bundling</span> <span class="nx">files</span> <span class="k">for</span> <span class="nx">upload</span><span class="p">...</span> <span class="o">~</span><span class="err">/test/js/index-o3HPk7Oz.js.map</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Bundling</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.855</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Optimizing</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.017</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Uploading</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">12.873</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Uploaded</span> <span class="nx">release</span> <span class="nx">files</span> <span class="nx">to</span> <span class="nx">Sentry</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Processing</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.129</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">File</span> <span class="nx">upload</span> <span class="nx">complete</span> <span class="p">(</span><span class="nx">processing</span> <span class="nx">pending</span> <span class="nx">on</span> <span class="nx">server</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Source</span> <span class="nx">Map</span> <span class="nx">Upload</span> <span class="nx">Report</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Minified</span> <span class="nx">Scripts</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/index-o3HPk7Oz.js (sourcemap at index-o3HPk7Oz.js.map)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Source</span> <span class="nx">Maps</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/index-o3HPk7Oz.js.map</span>
</span></span></code></pre></div><p>此时，我们可以在<code>Sentry</code>在线系统上面查看到上传的<code>sourcemap</code>文件，如下图所示：</p>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202312051953880.png"></p>
</li>
</ol>
<h2 id="7-其他">7. 其他</h2>
<ol>
<li>中英文切换：设置 —  账户 —  详细信息 —  账户详情 — 语言 — Simplified Chinese</li>
<li>时区设置：设置 —  账户 —  详细信息 —  账户详情 —  时区 —  Shanghai</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>解决SonarQube中Vue项目中deep选择器报错的问题</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/%E8%A7%A3%E5%86%B3sonarqube%E4%B8%ADvue%E9%A1%B9%E7%9B%AE%E4%B8%ADdeep%E9%80%89%E6%8B%A9%E5%99%A8%E6%8A%A5%E9%94%99%E7%9A%84%E9%97%AE%E9%A2%98/</link>
      <pubDate>Fri, 19 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/%E8%A7%A3%E5%86%B3sonarqube%E4%B8%ADvue%E9%A1%B9%E7%9B%AE%E4%B8%ADdeep%E9%80%89%E6%8B%A9%E5%99%A8%E6%8A%A5%E9%94%99%E7%9A%84%E9%97%AE%E9%A2%98/</guid>
      <description>&lt;h1 id=&#34;1-前言&#34;&gt;1. 前言&lt;/h1&gt;
&lt;p&gt;当使用SonarQube对Vue项目进行代码质量审查时，可能会遭遇因Vue特有的&lt;code&gt;deep&lt;/code&gt;选择器（旨在实现样式深度穿透）而触发的错误或警告。由于SonarQube默认并不识别这一Vue特有的语法，这些错误报告可能会成为审查过程中的干扰项。为了优化审查体验，并专注于更实际的代码质量问题，我们可以通过自定义SonarQube的质量配置文件来忽略这些针对&lt;code&gt;deep&lt;/code&gt;选择器的错误。&lt;/p&gt;
&lt;p&gt;以下是具体的操作步骤，基于SonarQube的通用界面和&lt;a href=&#34;https://community.sonarsource.com/t/how-to-include-a-pseudo-class-selector-in-sonar-rules-deep-vue/79689&#34;&gt;《How to include a pseudo class selector in Sonar rules (deep - Vue)》&lt;/a&gt;社区讨论中的指导。&lt;/p&gt;
&lt;h1 id=&#34;2-创建自定义css质量配置文件&#34;&gt;2. 创建自定义CSS质量配置文件&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;登录到SonarQube的Web界面。&lt;/li&gt;
&lt;li&gt;导航到&lt;strong&gt;Quality Profiles&lt;/strong&gt;页面。&lt;/li&gt;
&lt;li&gt;点击页面上的&lt;strong&gt;Create&lt;/strong&gt;按钮，选择&lt;strong&gt;Copy an existing quality profile&lt;/strong&gt;作为创建方式。&lt;/li&gt;
&lt;li&gt;在弹出的对话框中，设置以下选项：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Language&lt;/strong&gt;：选择&lt;code&gt;CSS&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profile to copy&lt;/strong&gt;：选择&lt;code&gt;Sonar Way&lt;/code&gt;作为基础配置文件，因为它包含了SonarQube推荐的CSS最佳实践。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;：输入自定义配置文件的名称，例如&lt;code&gt;CustomVueCSS&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;Create&lt;/strong&gt;完成配置文件的创建。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655180.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;3-设置自定义配置文件为默认&#34;&gt;3. 设置自定义配置文件为默认&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;回到&lt;strong&gt;Quality Profiles&lt;/strong&gt;页面，在CSS语言下，你应该能看到刚才创建的&lt;code&gt;CustomVueCSS&lt;/code&gt;配置文件。&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;CustomVueCSS&lt;/code&gt;配置文件旁的&lt;strong&gt;Actions&lt;/strong&gt;列中，点击&lt;strong&gt;Set as Default&lt;/strong&gt;按钮，将其设置为默认的质量配置文件。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655441.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;4-修改配置文件以忽略deep选择器&#34;&gt;4. 修改配置文件以忽略deep选择器&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在&lt;strong&gt;Quality Profiles&lt;/strong&gt;页面，找到并点击刚设置为默认的&lt;code&gt;CustomVueCSS&lt;/code&gt;配置文件名称，进入配置文件的详细设置页面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在该页面中，找到并定位到&lt;strong&gt;Pseudo-class selectors should be valid&lt;/strong&gt;这条规则。
&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655374.png&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击这条规则，定位到&lt;strong&gt;Quality Profiles&lt;/strong&gt;，点击&lt;code&gt;CustomVueCSS&lt;/code&gt;配置文件名称右侧的&lt;strong&gt;Change&lt;/strong&gt;按钮，进入规则的详细配置界面。
&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655488.png&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在&lt;strong&gt;ignorePseudoClasses&lt;/strong&gt;字段中，添加&lt;code&gt;deep&lt;/code&gt;作为要忽略的伪类选择器。这样，SonarQube在检查CSS代码时将不再报告&lt;code&gt;deep&lt;/code&gt;选择器为无效或错误。
&lt;img loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655343.png&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击&lt;strong&gt;Save&lt;/strong&gt;按钮保存更改。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <content:encoded><![CDATA[<h1 id="1-前言">1. 前言</h1>
<p>当使用SonarQube对Vue项目进行代码质量审查时，可能会遭遇因Vue特有的<code>deep</code>选择器（旨在实现样式深度穿透）而触发的错误或警告。由于SonarQube默认并不识别这一Vue特有的语法，这些错误报告可能会成为审查过程中的干扰项。为了优化审查体验，并专注于更实际的代码质量问题，我们可以通过自定义SonarQube的质量配置文件来忽略这些针对<code>deep</code>选择器的错误。</p>
<p>以下是具体的操作步骤，基于SonarQube的通用界面和<a href="https://community.sonarsource.com/t/how-to-include-a-pseudo-class-selector-in-sonar-rules-deep-vue/79689">《How to include a pseudo class selector in Sonar rules (deep - Vue)》</a>社区讨论中的指导。</p>
<h1 id="2-创建自定义css质量配置文件">2. 创建自定义CSS质量配置文件</h1>
<ol>
<li>登录到SonarQube的Web界面。</li>
<li>导航到<strong>Quality Profiles</strong>页面。</li>
<li>点击页面上的<strong>Create</strong>按钮，选择<strong>Copy an existing quality profile</strong>作为创建方式。</li>
<li>在弹出的对话框中，设置以下选项：
<ul>
<li><strong>Language</strong>：选择<code>CSS</code>。</li>
<li><strong>Profile to copy</strong>：选择<code>Sonar Way</code>作为基础配置文件，因为它包含了SonarQube推荐的CSS最佳实践。</li>
<li><strong>Name</strong>：输入自定义配置文件的名称，例如<code>CustomVueCSS</code>。</li>
</ul>
</li>
<li>点击<strong>Create</strong>完成配置文件的创建。</li>
</ol>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655180.png"></p>
<h1 id="3-设置自定义配置文件为默认">3. 设置自定义配置文件为默认</h1>
<ol>
<li>回到<strong>Quality Profiles</strong>页面，在CSS语言下，你应该能看到刚才创建的<code>CustomVueCSS</code>配置文件。</li>
<li>在<code>CustomVueCSS</code>配置文件旁的<strong>Actions</strong>列中，点击<strong>Set as Default</strong>按钮，将其设置为默认的质量配置文件。</li>
</ol>
<p><img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655441.png"></p>
<h1 id="4-修改配置文件以忽略deep选择器">4. 修改配置文件以忽略deep选择器</h1>
<ol>
<li>
<p>在<strong>Quality Profiles</strong>页面，找到并点击刚设置为默认的<code>CustomVueCSS</code>配置文件名称，进入配置文件的详细设置页面。</p>
</li>
<li>
<p>在该页面中，找到并定位到<strong>Pseudo-class selectors should be valid</strong>这条规则。
<img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655374.png"></p>
</li>
<li>
<p>点击这条规则，定位到<strong>Quality Profiles</strong>，点击<code>CustomVueCSS</code>配置文件名称右侧的<strong>Change</strong>按钮，进入规则的详细配置界面。
<img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655488.png"></p>
</li>
<li>
<p>在<strong>ignorePseudoClasses</strong>字段中，添加<code>deep</code>作为要忽略的伪类选择器。这样，SonarQube在检查CSS代码时将不再报告<code>deep</code>选择器为无效或错误。
<img loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/202407191655343.png"></p>
</li>
<li>
<p>点击<strong>Save</strong>按钮保存更改。</p>
</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>前端异常监控系统Sentry的基本使用（2021）</title>
      <link>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/%E5%89%8D%E7%AB%AF%E5%BC%82%E5%B8%B8%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9Fsentry%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A82021/</link>
      <pubDate>Thu, 09 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://dstweihao.cn/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96/devops%E4%B8%8E%E5%B7%A5%E5%85%B7/%E5%89%8D%E7%AB%AF%E5%BC%82%E5%B8%B8%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9Fsentry%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A82021/</guid>
      <description>&lt;h3 id=&#34;一系统简介&#34;&gt;一、系统简介&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Sentry&lt;/code&gt;是一个开源的监控系统，可以收集项目中的异常信息，便于开发人员第一时间发现问题，定位问题，解决问题。&lt;/p&gt;
&lt;h3 id=&#34;二系统搭建&#34;&gt;二、系统搭建&lt;/h3&gt;
&lt;p&gt;虽然&lt;code&gt;Sentry&lt;/code&gt;官方提供了在线系统，但是因为需要翻墙，加上如果是公司项目，考虑到安全问题，还是倾向于私有化部署，在&lt;code&gt;Github&lt;/code&gt;上有一个开源项目用于部署&lt;code&gt;Sentry&lt;/code&gt;，可以使用该项目进行部署：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/getsentry/onpremise.git
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;因为这个项目涉及很多后端的技术知识，&lt;code&gt;Sentry&lt;/code&gt;搭建最好是后端人员来做，然后部署到服务器上面去。&lt;/p&gt;
&lt;h3 id=&#34;三创建项目&#34;&gt;三、创建项目&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Sentry&lt;/code&gt;搭建成功，部署到服务器，比如当前&lt;code&gt;Sentry&lt;/code&gt;在线系统为&lt;code&gt;https://123.11.22.133:211&lt;/code&gt;，使用账号&lt;code&gt;test001&lt;/code&gt;登录，一开始默认是英文显示，如果想要切换为中文，只需要在左上角的&lt;code&gt;User settings&lt;/code&gt;里的&lt;code&gt;Language&lt;/code&gt;选项选择&lt;code&gt;Simplified Chinese&lt;/code&gt;即可，然后创建项目，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;1&#34; loading=&#34;lazy&#34; src=&#34;https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/1.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;四vue项目引入sentry&#34;&gt;四、Vue项目引入Sentry&lt;/h3&gt;
&lt;p&gt;项目创建完成后，会跳转至&lt;code&gt;Vue&lt;/code&gt;配置的说明文档，主要是&lt;code&gt;Vue&lt;/code&gt;项目如何引入&lt;code&gt;Sentry&lt;/code&gt;的一些内容，内容如下所示：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装依赖&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Using&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;yarn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;yarn&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sentry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;vue&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sentry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tracing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Using&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;npm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;npm&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;save&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sentry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;vue&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sentry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tracing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在&lt;code&gt;main.js&lt;/code&gt;里引入&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Vue&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;vue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;@sentry/vue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Integrations&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;@sentry/tracing&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;Vue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;dsn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http://cd7f733c2e1e4641bdeb11ba0811d9aa@123.11.22.133:211/12&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;integrations&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Integrations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;BrowserTracing&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Set tracesSampleRate to 1.0 to capture 100%
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// of transactions for performance monitoring.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// We recommend adjusting this value in production
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;tracesSampleRate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// 上报console异常信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;logErrors&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;此时，只要项目正常部署在线上，打开项目，然后打开浏览器控制台，查看&lt;code&gt;Network&lt;/code&gt;列表，会发现很多类似这样的请求，并没有报错，这就意味着当前已经正常上报到Sentry系统了，如下所示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sentry_key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cd7f733c2e1e4641bdeb11ba0811d9aa&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sentry_version&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;五异常报错示例&#34;&gt;五、异常报错示例&lt;/h3&gt;
&lt;p&gt;为了真实验证&lt;code&gt;Sentry&lt;/code&gt;的功能，现以一个真实场景来演示，在项目中添加一个按钮，然后设置点击事件之后，触发打印&lt;code&gt;console&lt;/code&gt;，&lt;code&gt;sentryTest&lt;/code&gt;并未定义，所以会报错，代码如下所示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;el&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;click&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sentryClicked&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Sentry测试&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/el-button&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/template&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;default&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;methods&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;sentryClicked&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;sentryClicked: &amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;sentryTest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在项目页面，我们可以看到，在浏览器控制台，确实有报错信息生成，如下图所示：&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h3 id="一系统简介">一、系统简介</h3>
<p><code>Sentry</code>是一个开源的监控系统，可以收集项目中的异常信息，便于开发人员第一时间发现问题，定位问题，解决问题。</p>
<h3 id="二系统搭建">二、系统搭建</h3>
<p>虽然<code>Sentry</code>官方提供了在线系统，但是因为需要翻墙，加上如果是公司项目，考虑到安全问题，还是倾向于私有化部署，在<code>Github</code>上有一个开源项目用于部署<code>Sentry</code>，可以使用该项目进行部署：</p>
<pre tabindex="0"><code>git clone https://github.com/getsentry/onpremise.git
</code></pre><p>因为这个项目涉及很多后端的技术知识，<code>Sentry</code>搭建最好是后端人员来做，然后部署到服务器上面去。</p>
<h3 id="三创建项目">三、创建项目</h3>
<p><code>Sentry</code>搭建成功，部署到服务器，比如当前<code>Sentry</code>在线系统为<code>https://123.11.22.133:211</code>，使用账号<code>test001</code>登录，一开始默认是英文显示，如果想要切换为中文，只需要在左上角的<code>User settings</code>里的<code>Language</code>选项选择<code>Simplified Chinese</code>即可，然后创建项目，如下图所示：</p>
<p><img alt="1" loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/1.png"></p>
<h3 id="四vue项目引入sentry">四、Vue项目引入Sentry</h3>
<p>项目创建完成后，会跳转至<code>Vue</code>配置的说明文档，主要是<code>Vue</code>项目如何引入<code>Sentry</code>的一些内容，内容如下所示：</p>
<ol>
<li>
<p>安装依赖</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="err">#</span> <span class="nx">Using</span> <span class="nx">yarn</span>
</span></span><span class="line"><span class="cl"><span class="nx">yarn</span> <span class="nx">add</span> <span class="err">@</span><span class="nx">sentry</span><span class="o">/</span><span class="nx">vue</span> <span class="err">@</span><span class="nx">sentry</span><span class="o">/</span><span class="nx">tracing</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">#</span> <span class="nx">Using</span> <span class="nx">npm</span>
</span></span><span class="line"><span class="cl"><span class="nx">npm</span> <span class="nx">install</span> <span class="o">--</span><span class="nx">save</span> <span class="err">@</span><span class="nx">sentry</span><span class="o">/</span><span class="nx">vue</span> <span class="err">@</span><span class="nx">sentry</span><span class="o">/</span><span class="nx">tracing</span>
</span></span></code></pre></div></li>
<li>
<p>在<code>main.js</code>里引入</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Vue</span> <span class="nx">from</span> <span class="s2">&#34;vue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="o">*</span> <span class="nx">as</span> <span class="nx">Sentry</span> <span class="nx">from</span> <span class="s2">&#34;@sentry/vue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">Integrations</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;@sentry/tracing&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Sentry</span><span class="p">.</span><span class="nx">init</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Vue</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">dsn</span><span class="o">:</span> <span class="s2">&#34;http://cd7f733c2e1e4641bdeb11ba0811d9aa@123.11.22.133:211/12&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">integrations</span><span class="o">:</span> <span class="p">[</span><span class="k">new</span> <span class="nx">Integrations</span><span class="p">.</span><span class="nx">BrowserTracing</span><span class="p">()],</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Set tracesSampleRate to 1.0 to capture 100%
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="c1">// of transactions for performance monitoring.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="c1">// We recommend adjusting this value in production
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">tracesSampleRate</span><span class="o">:</span> <span class="mf">1.0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// 上报console异常信息
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nx">logErrors</span><span class="o">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div></li>
</ol>
<p>此时，只要项目正常部署在线上，打开项目，然后打开浏览器控制台，查看<code>Network</code>列表，会发现很多类似这样的请求，并没有报错，这就意味着当前已经正常上报到Sentry系统了，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="o">?</span><span class="nx">sentry_key</span><span class="o">=</span><span class="nx">cd7f733c2e1e4641bdeb11ba0811d9aa</span><span class="o">&amp;</span><span class="nx">sentry_version</span><span class="o">=</span><span class="mi">7</span>
</span></span></code></pre></div><h3 id="五异常报错示例">五、异常报错示例</h3>
<p>为了真实验证<code>Sentry</code>的功能，现以一个真实场景来演示，在项目中添加一个按钮，然后设置点击事件之后，触发打印<code>console</code>，<code>sentryTest</code>并未定义，所以会报错，代码如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">template</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="o">&lt;</span><span class="nx">el</span><span class="o">-</span><span class="nx">button</span> <span class="err">@</span><span class="nx">click</span><span class="o">=</span><span class="s2">&#34;sentryClicked&#34;</span><span class="o">&gt;</span><span class="nx">Sentry测试</span><span class="o">&lt;</span><span class="err">/el-button&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="err">/template&gt;</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">methods</span><span class="o">:</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sentryClicked</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;sentryClicked: &#39;</span><span class="p">,</span> <span class="nx">sentryTest</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="err">/script&gt;</span>
</span></span></code></pre></div><p>在项目页面，我们可以看到，在浏览器控制台，确实有报错信息生成，如下图所示：</p>
<p><img alt="2" loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/2.png"></p>
<p>然后，我们到<code>Sentry</code>在线系统查看，确实有收到报错信息，如下图所示：</p>
<p><img alt="3" loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/3.png"></p>
<p>里面指明了报错原因是<code>sentryTest is not defined</code>，然后还提交了用户的<code>IP</code>、浏览器版本以及版本号、平台系统等等信息，便于分析异常错误。</p>
<h3 id="六上传sourcemap文件">六、上传SourceMap文件</h3>
<p>通常<code>Sentry</code>在线系统上面的信息，也是可以排查解决<code>BUG</code>的，比如<code>sentryTest is not defined</code>，我们只需要在项目中搜索<code>sentryTest</code>就可以定位到代码报错的位置，但是如果是一些比较通用的，或者信息比较含糊的，是没办法精准定位代码位置的，这个时候，就可能有想法了，怎么让才能在<code>Sentry</code>在线系统看到，到底是执行到哪一步的时候，报错了呢？</p>
<p>这就是本节所需要实现功能，这就需要<code>SourceMap</code>文件，什么是<code>SourceMap</code>文件呢？</p>
<p>因为使用<code>webpack</code>打包之后，所有代码都压缩在一起，很难从中定位到异常代码的位置，而<code>SourceMap</code>就是源码，有了它，就可以定位到具体位置，所以需要提供<code>SourceMap</code>文件到<code>Sentry</code>在线系统。</p>
<p>首先，需要将<code>vue</code>项目下<code>config/index.js</code>里的<code>productionSourceMap</code>设置为<code>true</code>，然后运行<code>npm run build</code>命令，在生成的<code>dist/static/js</code>里就会发现很多后缀为<code>.map</code>的文件，如下图所示：</p>
<p><img alt="4" loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/4.png"></p>
<p>然后我们需要把<code>.map</code>文件上传到<code>Sentry</code>在线系统，具体步骤如下：</p>
<ol>
<li>
<p>登录<code>Sentry</code>在线系统，在终端输入如下：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="o">--</span><span class="nx">url</span> <span class="nx">http</span><span class="o">:</span><span class="c1">//123.11.22.133:211/ login
</span></span></span></code></pre></div><p>然后会提示输入<code>token</code>，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">dstweihao</span><span class="err">@</span><span class="nx">weihao</span><span class="o">-</span><span class="nx">mac</span><span class="o">-</span><span class="nx">mini</span> <span class="nx">vue</span> <span class="o">%</span> <span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="o">--</span><span class="nx">url</span> <span class="nx">http</span><span class="o">:</span><span class="c1">//123.11.22.133:211/ login
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">This</span> <span class="nx">helps</span> <span class="nx">you</span> <span class="nx">signing</span> <span class="k">in</span> <span class="nx">your</span> <span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="kd">with</span> <span class="nx">an</span> <span class="nx">authentication</span> <span class="nx">token</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="nx">If</span> <span class="nx">you</span> <span class="k">do</span> <span class="nx">not</span> <span class="nx">yet</span> <span class="nx">have</span> <span class="nx">a</span> <span class="nx">token</span> <span class="nx">ready</span> <span class="nx">we</span> <span class="nx">can</span> <span class="nx">bring</span> <span class="nx">up</span> <span class="nx">a</span> <span class="nx">browser</span> <span class="k">for</span> <span class="nx">you</span>
</span></span><span class="line"><span class="cl"><span class="nx">to</span> <span class="nx">create</span> <span class="nx">a</span> <span class="nx">token</span> <span class="nx">now</span><span class="p">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Sentry</span> <span class="nx">server</span><span class="o">:</span> <span class="mf">123.11</span><span class="p">.</span><span class="mf">22.133</span>
</span></span><span class="line"><span class="cl"><span class="nx">Open</span> <span class="nx">browser</span> <span class="nx">now</span><span class="o">?</span> <span class="p">[</span><span class="nx">y</span><span class="o">/</span><span class="nx">n</span><span class="p">]</span> <span class="nx">n</span>
</span></span><span class="line"><span class="cl"><span class="nx">Enter</span> <span class="nx">your</span> <span class="nx">token</span><span class="o">:</span> 
</span></span></code></pre></div><p><code>token</code>是在<code>Sentry</code>在线系统生成的，如下图所示：</p>
<p><img alt="5" loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/5.png"></p>
<p>这时，只要复制<code>token</code>到终端，就可以完成登录流程了，如下所示，就是成功登录了<code>Sentry</code>在线系统：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">Enter</span> <span class="nx">your</span> <span class="nx">token</span><span class="o">:</span> <span class="mf">4e6488262</span><span class="nx">fb849ef93c6217ac8bc8e9a2d635572eb584fa3b69b859e0edc5104</span>
</span></span><span class="line"><span class="cl"><span class="nx">Valid</span> <span class="nx">token</span> <span class="k">for</span> <span class="nx">user</span> <span class="nx">test001</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Stored</span> <span class="nx">token</span> <span class="k">in</span> <span class="err">/Users/weihao/.sentryclirc</span>
</span></span><span class="line"><span class="cl"><span class="nx">dstweihao</span><span class="err">@</span><span class="nx">weihao</span><span class="o">-</span><span class="nx">mac</span><span class="o">-</span><span class="nx">mini</span> <span class="nx">vue</span> <span class="o">%</span> 
</span></span></code></pre></div></li>
<li>
<p>上传<code>SourceMap</code>到<code>Sentry</code>在线系统</p>
<p>登录成功之后，就需要将SourceMap文件上传到Sentry在线系统，首先，需要在项目里新建一个<code>.sentryclirc</code>文件，里面的内容，如下所示：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">defaults</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">url</span><span class="o">=</span><span class="nx">http</span><span class="o">:</span><span class="c1">//123.11.22.133:211/
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">org</span><span class="o">=</span><span class="nx">dst</span>
</span></span><span class="line"><span class="cl"><span class="nx">project</span><span class="o">=</span><span class="nx">test</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">auth</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">token</span><span class="o">=</span><span class="mf">4e6488262</span><span class="nx">fb849ef93c6217ac8bc8e9a2d635572eb584fa3b69b859e0edc5104</span>
</span></span></code></pre></div><p>然后使用以下命令：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="nx">releases</span> <span class="o">-</span><span class="nx">o</span> <span class="nx">dst</span> <span class="o">-</span><span class="nx">p</span> <span class="nx">test</span> <span class="nx">files</span> <span class="nx">test</span><span class="err">@</span><span class="mf">1.0</span><span class="p">.</span><span class="mi">0</span> <span class="nx">upload</span><span class="o">-</span><span class="nx">sourcemaps</span> <span class="s1">&#39;./dist/static/js/&#39;</span> <span class="o">--</span><span class="nx">url</span><span class="o">-</span><span class="nx">prefix</span> <span class="s1">&#39;~/test/js&#39;</span> 
</span></span></code></pre></div><p>这里需要对该命令一些参数说明一下：</p>
<p><code>dst</code>：组织名</p>
<p><code>test</code>：项目名</p>
<p><code>1.0.0</code>：版本号，需和main.js里的<code>release: 'test@1.0.0'</code>一致</p>
<p><code>./dist/static/js/</code>：项目打包生成的<code>dist</code>里<code>.map</code>文件所在目录</p>
<p><code>~/test/js</code>：如果部署在服务器上面，不是部署在主目录，而是在test文件夹下面，那就需要加上</p>
<p>在终端显示如下，就表示已经上传成功：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">dstweihao</span><span class="err">@</span><span class="nx">weihao</span><span class="o">-</span><span class="nx">mac</span><span class="o">-</span><span class="nx">mini</span> <span class="nx">vue</span> <span class="o">%</span> <span class="nx">sentry</span><span class="o">-</span><span class="nx">cli</span> <span class="nx">releases</span> <span class="o">-</span><span class="nx">o</span> <span class="nx">dst</span> <span class="o">-</span><span class="nx">p</span> <span class="nx">test</span> <span class="nx">files</span> <span class="mf">1.0</span><span class="p">.</span><span class="mi">0</span> <span class="nx">upload</span><span class="o">-</span><span class="nx">sourcemaps</span> <span class="s1">&#39;./dist/static/js/&#39;</span> <span class="o">--</span><span class="nx">url</span><span class="o">-</span><span class="nx">prefix</span> <span class="s1">&#39;~/test/js&#39;</span> 
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Found</span> <span class="mi">20</span> <span class="nx">release</span> <span class="nx">files</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Analyzing</span> <span class="mi">20</span> <span class="nx">sources</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Analyzing</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.238</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Rewriting</span> <span class="nx">sources</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Rewriting</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.252</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Adding</span> <span class="nx">source</span> <span class="nx">map</span> <span class="nx">references</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Bundling</span> <span class="nx">files</span> <span class="k">for</span> <span class="nx">upload</span><span class="p">...</span> <span class="o">~</span><span class="err">/test/js/vendor.331b4cf7bdabb46a7655.js.map</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Bundling</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.373</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Optimizing</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.01</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Uploading</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.337</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Uploaded</span> <span class="nx">release</span> <span class="nx">files</span> <span class="nx">to</span> <span class="nx">Sentry</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">Processing</span> <span class="nx">completed</span> <span class="k">in</span> <span class="mf">0.114</span><span class="nx">s</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nx">File</span> <span class="nx">upload</span> <span class="nx">complete</span> <span class="p">(</span><span class="nx">processing</span> <span class="nx">pending</span> <span class="nx">on</span> <span class="nx">server</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Source</span> <span class="nx">Map</span> <span class="nx">Upload</span> <span class="nx">Report</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Minified</span> <span class="nx">Scripts</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/0.5578cfbb7e2e6688ddf5.js (sourcemap at 0.5578cfbb7e2e6688ddf5.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/1.08ce936a2efe46fada3a.js (sourcemap at 1.08ce936a2efe46fada3a.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/2.21a7baf07c2e2f7e0e2e.js (sourcemap at 2.21a7baf07c2e2f7e0e2e.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/3.31b60f7af161be6ebdd9.js (sourcemap at 3.31b60f7af161be6ebdd9.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/4.fb6e7da7da26fad2df3a.js (sourcemap at 4.fb6e7da7da26fad2df3a.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/5.ee4c344db81fc2458f9c.js (sourcemap at 5.ee4c344db81fc2458f9c.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/6.9079b1090416a666a327.js (sourcemap at 6.9079b1090416a666a327.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/app.ad01bb777553f9efe703.js (sourcemap at app.ad01bb777553f9efe703.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/manifest.380384094e7763635655.js (sourcemap at manifest.380384094e7763635655.js.map)</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/vendor.331b4cf7bdabb46a7655.js (sourcemap at vendor.331b4cf7bdabb46a7655.js.map)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Source</span> <span class="nx">Maps</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/0.5578cfbb7e2e6688ddf5.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/1.08ce936a2efe46fada3a.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/2.21a7baf07c2e2f7e0e2e.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/3.31b60f7af161be6ebdd9.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/4.fb6e7da7da26fad2df3a.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/5.ee4c344db81fc2458f9c.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/6.9079b1090416a666a327.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/app.ad01bb777553f9efe703.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/manifest.380384094e7763635655.js.map</span>
</span></span><span class="line"><span class="cl">    <span class="o">~</span><span class="err">/test/js/vendor.331b4cf7bdabb46a7655.js.map</span>
</span></span><span class="line"><span class="cl"><span class="nx">zlgweihao</span><span class="err">@</span><span class="nx">zlgweihao</span><span class="o">-</span><span class="nx">mac</span><span class="o">-</span><span class="nx">mini</span> <span class="nx">vue</span> <span class="o">%</span> 
</span></span></code></pre></div><p>此时，我们可以在Sentry在线系统上面查看到上传的sourcemap文件，如下图所示：</p>
</li>
</ol>
<p><img alt="6" loading="lazy" src="https://dstweihao-1300388255.cos.ap-guangzhou.myqcloud.com/images/6.png"></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
