小X通m3u8视频流AES加密分析

最近有空研究了下小X通的视频协议,下面记录下研究过程

首先我们要了解下m3u8是什么

m3u8基础

首先我们需要了解什么时HLS,所谓HLS(HTTP Live Streaming)是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。而m3u8是HLS协议的一部分,但是在直播,视频网站等用处很广泛。

HLS协议规定,视频的封装格式是TS(Transport Stream),除了TS视频文件本身,还定义了用来控制播放的M3U8文件(文本文件)。HLS协议的工作原理是把整个视频流分割成一个个小的TS格式视频文件来传输,在开始一个流媒体会话时,客户端会先下载一个包含TS文件URL地址的M3U8文件(相当于一个播放列表),给客户端用于下载TS文件。这样可以让用户更方便的选择视频节点播放,给用户更好的体验,其次提供了加密方式,可以更好的保护视频不被窃取。

下面是m3u8的一个基本字段

#EXTM3U:M3U8文件头,必须放在第一行。
EXT-X-MEDIA-SEQUENCE :第一个TS分片的序列号,一般情况下是0,但是在直播场景下,这个序列号标识直播段的起始位置; #EXT-X-MEDIA-SEQUENCE:0。
#EXT-X-TARGETDURATION:每个分片TS的最大的时长; #EXT-X-TARGETDURATION:10 ,表示每个分片的最大时长是10秒。
#EXT-X-ALLOW-CACHE:是否允许cache,#EXT-X-ALLOW-CACHE:YES 、#EXT-X-ALLOW-CACHE:NO,默认情况下是YES。
#EXT-X-ENDLIST:M3U8文件结束符。
#EXTINF:extra info,分片TS的信息,如时长,带宽等;一般情况下是 #EXTINF:,[] 后面可以跟其他的信息,逗号之前是当前分片的TS时长。分片时长要小于 #EXT-X-TARGETDURATION 定义的值。
#EXT-X-VERSION:M3U8版本号。
#EXT-X-DISCONTINUITY:该标签表明其前一个切片与下一个切片之间存在中断。
#EXT-X-PLAYLIST-TYPE :表明流媒体类型。
#EXT-X-KEY:是否加密解析。例如:#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/video.key?token=xxx" 加密算法是AES-128,密钥通过请求 https://example.com/video.key?token=xxx 来获取,密钥请求回来以后存储在本地,并用于解密后续下载的TS视频文件。</code></pre> 
   <h3 style="">请求流程</h3> 
   <ol start="1"> 
    <li style="margin-left:1.4em;list-style-type:decimal;text-indent:0;"><p>客户端发起对m3u8的请求,服务器在校验完成后会下载m3u8文件到本地。</p></li> 
   </ol> 
   <ol start="2"> 
    <li style="margin-left:1.4em;list-style-type:decimal;text-indent:0;"><p>客户端解析m3u8文件,在#EXT-X-KEY中找到密钥key地址,并访问拿到加密的密钥key。</p></li> 
   </ol> 
   <ol start="3"> 
    <li style="margin-left:1.4em;list-style-type:decimal;text-indent:0;"><p>客户端解析m3u8文件拿到分割文件的大小和对应ts文件地址,并访问拿到视频流。</p></li> 
   </ol> 
   <ol start="4"> 
    <li style="margin-left:1.4em;list-style-type:decimal;text-indent:0;"><p>客户端使用拿到的key地址和#EXT-X-KEY中对应的加密算法对视频流进行解密,播放视频。</p></li> 
   </ol> 
   <p style="text-indent:1.4em;">所以我们看到这里真正重要的就几个部分,首先一定要找到m3u8文件的链接地址,然后从中找到#EXTINF和#EXT-X-KEY两个字段</p> 
   <ul> 
    <li style="margin-left:2.8em;list-style-type:circle;text-indent:0;"><p>#EXTIN字段中我们可以拿到ts协议流的分段大小信息,和视频流下载链接信息,并且可以通过start和end参数得到视频的最终大小</p></li> 
   </ul> 
   <ul> 
    <li style="margin-left:2.8em;list-style-type:circle;text-indent:0;"><p>#EXT-X-KEY字段中我们可以拿到ts视频是否加密,如果加密可以拿到对应的加密方式和加密key地址。</p></li> 
   </ul> 
   <ul> 
    <li style="margin-left:2.8em;list-style-type:circle;text-indent:0;"><p>最后用得到的key和VI对ts文件使用openssl解密即可。</p></li> 
   </ul> 
   <h2 style="">实战分析</h2> 
   <p style="text-indent:1.4em;">了解了HLS的加密过程下面我们对小X通进行一个分析,首先我们通过抓包拿到了这个m3u8的链接地址,前面做了很多校验,但是不属于这个视频加解密分析范畴,这里不做分析。拿到以后我们可以对字段进行分析。如下图:</p> 
   <div class="kdocs-line-container" style="display:flex;"> 
    <div class="kdocs-img" style="flex-direction:column;max-width:100%;display:flex;width:1253px;justify-content:center;align-items:center;height:auto;"> 
     <div class="kdocs-img" style="padding-top:42.537907%;height:0;"> <a href="http://img.e-com-net.com/image/info8/a909161ea5124a3f9abac09f4de63247.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a909161ea5124a3f9abac09f4de63247.jpg" style="margin-left:;display:block;width:1253px;margin-top:-42.537907%;height:auto;;border:1px solid black;" width="650" height="276" alt="小X通m3u8视频流AES加密分析_第1张图片"></a> 
     </div> 
    </div> 
   </div> 
   <p style="">下面对m3u8进行分析,我们可以得到如下信息:</p> 
   <ul> 
    <li style="margin-left:1.4em;list-style-type:disc;text-indent:0;"><p>#EXTIN中我们可以发现文件的分割大小,然后到最后可以看到文件的最终大小为141809727</p></li> 
   </ul> 
   <pre class="kdocs-plaintext"><code class="language-plaintext">v.f421220_0.ts?start=0&end=603679&type=mpegts
v.f421220_0.ts?start=141595968&end=141809727&type=mpegts</code></pre> 
   <ul> 
    <li style="margin-left:1.4em;list-style-type:disc;text-indent:0;"><p>#EXT-X-KEY中我们可以发现文件的加密方式为AES-128的加密方式,对应得到下载key链接,并知道加密IV为0.</p></li> 
   </ul> 
   <p style="text-indent:1.4em;">首先访问key地址,发现报错,提示缺少uid。</p> 
   <div class="kdocs-line-container" style="display:flex;"> 
    <div class="kdocs-img" style="flex-direction:column;max-width:100%;display:flex;width:788px;justify-content:center;align-items:center;height:auto;"> 
     <div class="kdocs-img" style="padding-top:12.817259%;height:0;"> <a href="http://img.e-com-net.com/image/info8/61e060b5f6b54c458c5deae17050983f.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/61e060b5f6b54c458c5deae17050983f.png" style="margin-left:;display:block;width:788px;margin-top:-12.817259%;height:auto;;border:1px solid black;" width="788" height="101" alt="小X通m3u8视频流AES加密分析_第2张图片"></a> 
     </div> 
    </div> 
   </div> 
   <p style="text-indent:1.4em;">可以看到这里需要校验对应的uid,js代码中也可以看到,那通过自有验证抓取uid。</p> 
   <div class="kdocs-line-container" style="display:flex;"> 
    <div class="kdocs-img" style="flex-direction:column;max-width:100%;display:flex;width:1318px;justify-content:center;align-items:center;height:auto;"> 
     <div class="kdocs-img" style="padding-top:27.996965%;height:0;"> <a href="http://img.e-com-net.com/image/info8/4263c5def9154d4cbbab622ae2c03827.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/4263c5def9154d4cbbab622ae2c03827.jpg" style="margin-left:;display:block;width:1318px;margin-top:-27.996965%;height:auto;;border:1px solid black;" width="650" height="182" alt="小X通m3u8视频流AES加密分析_第3张图片"></a> 
     </div> 
    </div> 
   </div> 
   <p style="text-indent:1.4em;">通过得到的uid信息得到对应的key文件</p> 
   <div class="kdocs-line-container" style="display:flex;"> 
    <div class="kdocs-img" style="flex-direction:column;max-width:100%;display:flex;width:1231px;justify-content:center;align-items:center;height:auto;"> 
     <div class="kdocs-img" style="padding-top:46.872463%;height:0;"> <a href="http://img.e-com-net.com/image/info8/0af540f2f4c945fa8660fb1638d5522a.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/0af540f2f4c945fa8660fb1638d5522a.jpg" style="margin-left:;display:block;width:1231px;margin-top:-46.872463%;height:auto;;border:1px solid black;" width="650" height="305" alt="小X通m3u8视频流AES加密分析_第4张图片"></a> 
     </div> 
    </div> 
   </div> 
   <p style=""></p> 
   <p style="">然后拼接拿到整个是视频流</p> 
   <pre class="kdocs-plaintext"><code class="language-plaintext">https://encrypt-k-vod.xet.tech/*****/****/drm/v.f421220_0.ts?start=0&end=141809727&type=mpegts&sign=*****&t=***&us=***</code></pre> 
   <p style="">使用openssl解密</p> 
   <pre class="kdocs-plaintext"><code class="language-plaintext">openssl aes-128-cbc -d -in 001.ts -out 001_dec.ts  -iv 00000000000000000000000000000000 -K ********************************</code></pre> 
   <div class="kdocs-line-container" style="display:flex;"> 
    <div class="kdocs-img" style="flex-direction:column;max-width:100%;display:flex;width:1209px;justify-content:center;align-items:center;height:auto;"> 
     <div class="kdocs-img" style="padding-top:12.158809%;height:0;"> <a href="http://img.e-com-net.com/image/info8/73cafc41ebb149ec96618dc1caf71a71.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/73cafc41ebb149ec96618dc1caf71a71.jpg" style="margin-left:;display:block;width:1209px;margin-top:-12.158809%;height:auto;" width="650" height="79"></a> 
     </div> 
    </div> 
   </div> 
   <p style="">但是发现报错,解密失败。哈哈我猜也不会这么简单</p> 
   <h3 style="">报错分析</h3> 
   <p style="">既然报错了,那由可能是这个几个地方存在问题</p> 
   <ol start="1"> 
    <li style="margin-left:2.8em;list-style-type:lower-alpha;text-indent:0;"><p>选择的加密工具openssl工具解密出错</p></li> 
   </ol> 
   <ol start="2"> 
    <li style="margin-left:2.8em;list-style-type:lower-alpha;text-indent:0;"><p>加密所用的key或IV出错</p></li> 
   </ol> 
   <ol start="3"> 
    <li style="margin-left:2.8em;list-style-type:lower-alpha;text-indent:0;"><p>视频原始文件出错</p></li> 
   </ol> 
   <p style="">具体分析尝试三个点可以发现</p> 
   <ol start="1"> 
    <li style="margin-left:2.8em;list-style-type:lower-alpha;text-indent:0;"><p>我尝试了自己使用AES加密文件后使用openssl解密,发现没有问题,证明不是openssl的问题</p></li> 
   </ol> 
   <ol start="2"> 
    <li style="margin-left:2.8em;list-style-type:lower-alpha;text-indent:0;"><p>视频文件在页面可以播放,证明不是视频的问题</p></li> 
   </ol> 
   <p style="">那么问题就出在key或iv上了,继续分析。如果我是写系统的人,为了加密视频通常会选择如下方式:</p> 
   <ol start="1"> 
    <li style="margin-left:2.8em;list-style-type:lower-alpha;text-indent:0;"><p>对key的二次加密,再来解密视频</p></li> 
   </ol> 
   <ol start="2"> 
    <li style="margin-left:2.8em;list-style-type:lower-alpha;text-indent:0;"><p>实现一个自己的加密解密算法,来解密视频</p></li> 
   </ol> 
   <p style="text-indent:1.4em;">逻辑推导一下可以看到对key的二次加密最简单快速,且最终可以调用公共的解密库执行,如果自己实现难度高而且bug多,估计多数不会选择。</p> 
   <p style="text-indent:1.4em;">那么我们从二次解密出发,首先再js中找关键字encrypted关键字,找到如下关键点:</p> 
   <div class="kdocs-line-container" style="display:flex;"> 
    <div class="kdocs-img" style="flex-direction:column;max-width:100%;display:flex;width:1100px;justify-content:center;align-items:center;height:auto;"> 
     <div class="kdocs-img" style="padding-top:31.818182%;height:0;"> <a href="http://img.e-com-net.com/image/info8/10d603e9639e4045a431e449022a86ff.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/10d603e9639e4045a431e449022a86ff.jpg" style="margin-left:;display:block;width:1100px;margin-top:-31.818182%;height:auto;;border:1px solid black;" width="650" height="207" alt="小X通m3u8视频流AES加密分析_第5张图片"></a> 
     </div> 
    </div> 
   </div> 
   <p style="text-indent:1.4em;">替换js并打印log尽然发现数组数据正好16位,可能是key文件</p> 
   <div class="kdocs-line-container" style="display:flex;"> 
    <div class="kdocs-img" style="flex-direction:column;max-width:100%;display:flex;width:939px;justify-content:center;align-items:center;height:auto;"> 
     <div class="kdocs-img" style="padding-top:51.4377%;height:0;"> <a href="http://img.e-com-net.com/image/info8/b7f146a87a6d4d388cd8c8d962bb4c88.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/b7f146a87a6d4d388cd8c8d962bb4c88.jpg" style="margin-left:;display:block;width:939px;margin-top:-51.4377%;height:auto;;border:1px solid black;" width="650" height="334" alt="小X通m3u8视频流AES加密分析_第6张图片"></a> 
     </div> 
    </div> 
   </div> 
   <p style=""></p> 
   <p style="">但是抓到的是十进制数据,转换为十六进制</p> 
   <pre class="kdocs-plaintext"><code class="language-plaintext">printf '%x\n' 84 43 *******</code></pre> 
   <p style="">然后用得到的十六进制key进行解密操作</p> 
   <pre class="kdocs-plaintext"><code class="language-plaintext">openssl aes-128-cbc -d -in uu.ts -out uu_out.ts -K ********************* -iv 00000000000000000000000000000000</code></pre> 
   <p style="">发现并无报错,证明解密成功</p> 
   <div class="kdocs-line-container" style="display:flex;"> 
    <div class="kdocs-img" style="flex-direction:column;max-width:100%;display:flex;width:1191px;justify-content:center;align-items:center;height:auto;"> 
     <div class="kdocs-img" style="padding-top:7.97649%;height:0;"> <a href="http://img.e-com-net.com/image/info8/31584b68d5aa472a828e7a5d5d3e2776.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/31584b68d5aa472a828e7a5d5d3e2776.jpg" style="margin-left:;display:block;width:1191px;margin-top:-7.97649%;height:auto;" width="650" height="52"></a> 
     </div> 
    </div> 
   </div> 
   <p style="">播放也没有问题,视频解密流程搞定。</p> 
   <div class="kdocs-line-container" style="display:flex;"> 
    <div class="kdocs-img" style="flex-direction:column;max-width:100%;display:flex;width:504px;justify-content:center;align-items:center;height:auto;"> 
     <div class="kdocs-img" style="padding-top:73.412704%;height:0;"> <a href="http://img.e-com-net.com/image/info8/9a2dec3d34a34fb7a1eba21dcbe7c580.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/9a2dec3d34a34fb7a1eba21dcbe7c580.jpg" style="margin-left:;display:block;width:504px;margin-top:-73.412704%;height:auto;;border:1px solid black;" width="650" height="478" alt="小X通m3u8视频流AES加密分析_第7张图片"></a> 
     </div> 
    </div> 
   </div> 
   <p style="">为了避免不必要的麻烦,对key等关键部分做了处理,本文只做研究分析,不想带来不必要的麻烦。</p> 
   <h2 style="">小结</h2> 
   <p style="">最后来个小结,对整个流程分析下来还是很顺畅,难点也不多,真正难的算是对js的分析,js已经做了混淆,很多代码中找到对应的解密地址还是很麻烦,花了不少时间。</p> 
   <p style="">最后对视频加防下载的一些思考</p> 
   <ol start="1"> 
    <li style="margin-left:1.4em;list-style-type:decimal;text-indent:0;"><p>目前大部分视频网站都采用的是HLS来进行视频流的获取和播放,因为首先对应的资源很丰富,各个云平台厂商均有对应的接口,方便开发者快速的搭建,但是对应的加密方式还是由很多问题</p></li> 
   </ol> 
   <ol start="2"> 
    <li style="margin-left:1.4em;list-style-type:decimal;text-indent:0;"><p>首先是加密方式,有些小厂商也不会对视频进行加密处理,直接可以进行下载播放,这种破解很简单就不提了。</p></li> 
   </ol> 
   <ol start="3"> 
    <li style="margin-left:1.4em;list-style-type:decimal;text-indent:0;"><p>有些选择了对m3u8文件进行加密,但是个人感觉这个和对key二次加密是一样的,均可以在js中找到对应的解密方法和最终的key或m3u8文件,这个只是时间问题,毕竟js文件在客户端,服务器不可控。</p></li> 
   </ol> 
   <ol start="4"> 
    <li style="margin-left:1.4em;list-style-type:decimal;text-indent:0;"><p>即便解密对应的key很费时间,但是如果采用对浏览器hook可以解决所有的加密方法,毕竟最终还是要在网页进行播放,只要抓取最终的数据流并dump就可以拿到最终解密完成的视频。</p></li> 
   </ol> 
   <ol start="5"> 
    <li style="margin-left:1.4em;list-style-type:decimal;text-indent:0;"><p>个人感觉加水印等防止小白录屏是可以,但是对懂一点技术的其实整个破解只是时间和熟练问题,我测试有些监控是自己通过c实现了一个加密解密算法,对视频进行加密保存,解密读取流程,虽然很安全,但是对.dll进行逆向还是可以找到对应的key和加密算法,只是时间问题。</p></li> 
   </ol> 
   <ol start="6"> 
    <li style="margin-left:1.4em;list-style-type:decimal;text-indent:0;"><p>说了这么多感觉什么都不安全,都可以被破解,事实也确实是这样,但是我们可以经常更新加密算法和加密key,来增加破解者的时间成本,也是可行的,让攻击者自己放弃,哈哈差不多就这样。</p></li> 
   </ol> 
  </div> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1707464335284056064"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(前端,html5)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1943990125864218624.htm"
                           title="JavaScript 树形菜单总结" target="_blank">JavaScript 树形菜单总结</a>
                        <span class="text-muted">Auscy</span>
<a class="tag" taget="_blank" href="/search/microsoft/1.htm">microsoft</a>
                        <div>树形菜单是前端开发中常见的交互组件,用于展示具有层级关系的数据(如文件目录、分类列表、组织架构等)。以下从核心概念、实现方式、常见功能及优化方向等方面进行总结。一、核心概念层级结构:数据以父子嵌套形式存在,如{id:1,children:[{id:2}]}。节点:树形结构的基本单元,包含自身信息及子节点(若有)。展开/折叠:子节点的显示与隐藏切换,是树形菜单的核心交互。递归渲染:因数据层级不固定,</div>
                    </li>
                    <li><a href="/article/1943987856808669184.htm"
                           title="前端项目架构设计要领" target="_blank">前端项目架构设计要领</a>
                        <span class="text-muted"></span>

                        <div>1.架构设计的核心目标在设计前端项目架构时,核心目标是模块化、可维护、可扩展、可测试,以及开发效率的最大化。这些目标可以通过以下几个方面来实现:组件化:将UI功能封装为可复用的组件。模块化:将业务逻辑分解为独立的模块或服务。自动化构建与部署:实现自动化构建、测试和部署流程,减少人为操作的错误。代码规范化与检查:确保团队协作时,代码风格和质量一致。2.项目目录结构设计一个清晰合理的目录结构对大型项目</div>
                    </li>
                    <li><a href="/article/1943987101301272576.htm"
                           title="精通Canvas:15款时钟特效代码实现指南" target="_blank">精通Canvas:15款时钟特效代码实现指南</a>
                        <span class="text-muted">烟幕缭绕</span>

                        <div>本文还有配套的精品资源,点击获取简介:HTML5的Canvas是一个用于绘制矢量图形的API,通过JavaScript实现动态效果。本项目集合了15种不同的时钟特效代码,帮助开发者通过学习绘制圆形、线条、时间更新、旋转、颜色样式设置及动画效果等概念,深化对Canvas的理解和应用。项目中的CSS文件负责时钟的样式设定,而JS文件则包含实现各种特效的逻辑,通过不同的函数或类处理时间更新和动画绘制,提</div>
                    </li>
                    <li><a href="/article/1943979785097113600.htm"
                           title="【前端】jQuery数组合并去重方法总结" target="_blank">【前端】jQuery数组合并去重方法总结</a>
                        <span class="text-muted"></span>

                        <div>在jQuery中合并多个数组并去重,推荐使用原生JavaScript的Set对象(高效简单)或$.unique()(仅适用于DOM元素,不适用于普通数组)。以下是完整解决方案:方法1:使用ES6Set(推荐)//定义多个数组constarr1=[1,2,3];constarr2=[2,3,4];constarr3=[3,4,5];//合并数组并用Set去重constmergedArray=[...</div>
                    </li>
                    <li><a href="/article/1943974618851241984.htm"
                           title="Vue3+Vite+TS+Axios整合详细教程" target="_blank">Vue3+Vite+TS+Axios整合详细教程</a>
                        <span class="text-muted">老马聊技术</span>
<a class="tag" taget="_blank" href="/search/Vue/1.htm">Vue</a><a class="tag" taget="_blank" href="/search/Vite/1.htm">Vite</a><a class="tag" taget="_blank" href="/search/TS/1.htm">TS</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a>
                        <div>1.Vite简介Vite是新一代的前端构建工具,在尤雨溪开发Vue3.0的时候诞生。类似于Webpack+Webpack-dev-server。其主要利用浏览器ESM特性导入组织代码,在服务器端按需编译返回,完全跳过了打包这个概念,服务器随起随用。生产中利用Rollup作为打包工具,号称下一代的前端构建工具。vite是一种新型的前端构建工具,能够显著的提升前端开发者的体验。它主要有俩部分组成:一个</div>
                    </li>
                    <li><a href="/article/1943971211121848320.htm"
                           title="前端 NPM 包的依赖可视化分析工具推荐" target="_blank">前端 NPM 包的依赖可视化分析工具推荐</a>
                        <span class="text-muted">前端视界</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E8%89%BA%E5%8C%A0%E9%A6%86/1.htm">前端艺匠馆</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a><a class="tag" taget="_blank" href="/search/arcgis/1.htm">arcgis</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a>
                        <div>前端NPM包的依赖可视化分析工具推荐关键词:NPM、依赖管理、可视化分析、前端工程、包管理、依赖冲突、性能优化摘要:本文将深入探讨前端开发中NPM包依赖可视化分析的重要性,介绍5款主流工具的使用方法和特点,并通过实际案例展示如何利用这些工具优化项目依赖结构、解决版本冲突问题以及提升构建性能。文章将帮助开发者更好地理解和掌控项目依赖关系,提高开发效率和项目可维护性。背景介绍目的和范围本文旨在为前端开</div>
                    </li>
                    <li><a href="/article/1943963776244051968.htm"
                           title="入门html这篇文章就够了" target="_blank">入门html这篇文章就够了</a>
                        <span class="text-muted">ξ流ぁ星ぷ132</span>
<a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>HTML笔记文章目录HTML笔记html介绍什么是htmlhtml的作用HTML标签介绍常用标签标签and标签and标签u标签del删除线br标签用于换行pre标签,预处理标签span标签div标签sub标签andsup标签hr标签h1,h2...h6标签:HTML5中的语义标签:特殊字符img标签a标签第一种用法:超链接第二种用法:锚点video标签表格标签:form标签input标签selec</div>
                    </li>
                    <li><a href="/article/1943961125532004352.htm"
                           title="数字孪生技术为UI前端注入新活力:实现产品设计的沉浸式体验" target="_blank">数字孪生技术为UI前端注入新活力:实现产品设计的沉浸式体验</a>
                        <span class="text-muted">ui设计前端开发老司机</span>
<a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a>
                        <div>hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年+经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言:从“平面交互”到“沉浸体验”的UI革命当用户在电商APP中翻看3D家具模型却无法感知其与自家客厅的匹配度,当设计师在2D屏幕上绘制汽车内饰却难以预判实际乘坐体验——传统UI设计的“平面化、静态化、割裂感”</div>
                    </li>
                    <li><a href="/article/1943960369345130496.htm"
                           title="Java三年经验程序员技术栈全景指南:从前端到架构,对标阿里美团全栈要求" target="_blank">Java三年经验程序员技术栈全景指南:从前端到架构,对标阿里美团全栈要求</a>
                        <span class="text-muted">可曾去过倒悬山</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a>
                        <div>Java三年经验程序员技术栈全景指南:从前端到架构,对标阿里美团全栈要求三年经验是Java程序员的分水岭,技术栈深度决定你成为“业务码农”还是“架构师候选人”。本文整合阿里、美团、滴滴等大厂招聘要求,为你绘制可落地的进阶路线。一、Java核心:从语法糖到JVM底层三年经验与初级的核心差异在于系统级理解,大厂面试常考以下能力:JVM与性能调优内存模型(堆外内存、元空间)、GC算法(G1/ZGC适用场</div>
                    </li>
                    <li><a href="/article/1943946255763828736.htm"
                           title="《Java前端开发全栈指南:从Servlet到现代框架实战》" target="_blank">《Java前端开发全栈指南:从Servlet到现代框架实战》</a>
                        <span class="text-muted"></span>

                        <div>前言在当今Web开发领域,Java依然是后端开发的主力语言,而随着前后端分离架构的普及,Java开发者也需要掌握前端技术栈。本文将全面介绍JavaWeb前端开发的核心技术,包括传统Servlet/JSP体系、现代前端框架集成方案,以及全栈开发的最佳实践。通过本文,您将了解如何构建现代化的JavaWeb应用前端界面。一、JavaWeb前端技术演进1.1传统技术栈Servlet:JavaWeb基础,处</div>
                    </li>
                    <li><a href="/article/1943932016164663296.htm"
                           title="Vue3组件库实战: 打造高复用UI系统" target="_blank">Vue3组件库实战: 打造高复用UI系统</a>
                        <span class="text-muted">武昌库里写JAVA</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98%E6%B1%87%E6%80%BB%E4%B8%8E%E8%A7%A3%E6%9E%90/1.htm">面试题汇总与解析</a><a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/1.htm">课程设计</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/layui/1.htm">layui</a><a class="tag" taget="_blank" href="/search/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/1.htm">毕业设计</a>
                        <div>Vue3组件库实战:打造高复用UI系统介绍什么是Vue3组件库在前端开发中,UI组件库是非常重要的一部分。Vue3组件库是基于Vue.js3.x版本开发的一套可用于构建Web应用的UI组件集合,可以帮助开发者快速搭建页面并保证页面的一致性和美观性。目标关键词:Vue3组件库设计与构建设计原则组件库的设计需要遵循一定的原则,比如易用性、可维护性、扩展性等。在设计阶段需要考虑到不同场景的使用,并且保证</div>
                    </li>
                    <li><a href="/article/1943930502771699712.htm"
                           title="Flutter基础(前端教程⑥-按钮切换)" target="_blank">Flutter基础(前端教程⑥-按钮切换)</a>
                        <span class="text-muted">aaiier</span>
<a class="tag" taget="_blank" href="/search/Flutter/1.htm">Flutter</a><a class="tag" taget="_blank" href="/search/flutter/1.htm">flutter</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a>
                        <div>1.假设你已有的两个表单组件(示例)//手机号注册表单(示例)classPhoneRegisterFormextendsStatelessWidget{@overrideWidgetbuild(BuildContextcontext){returnColumn(children:[TextField(decoration:InputDecoration(labelText:'手机号')),Text</div>
                    </li>
                    <li><a href="/article/1943929870320988160.htm"
                           title="为Layui Table组件添加前端搜索功能" target="_blank">为Layui Table组件添加前端搜索功能</a>
                        <span class="text-muted">caifox菜狐狸</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E4%B9%8B%E6%97%85%EF%BC%9A%E4%BB%8E%E6%96%B0%E6%89%8B%E5%88%B0%E4%B8%93%E5%AE%B6/1.htm">学习之旅:从新手到专家</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/layui/1.htm">layui</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/table/1.htm">table</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%90%9C%E7%B4%A2/1.htm">前端搜索</a><a class="tag" taget="_blank" href="/search/%E8%A1%A8%E6%A0%BC%E6%90%9C%E7%B4%A2/1.htm">表格搜索</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a>
                        <div>在现代Web开发中,数据展示和交互功能是构建高效、用户友好界面的关键要素之一。Layui作为一款广受欢迎的前端UI框架,以其简洁的代码、丰富的组件和强大的功能,为开发者提供了极大的便利。其中,Layui的Table组件更是以其强大的数据展示能力和灵活的配置选项,成为了许多项目中不可或缺的部分。然而,在实际应用中,仅仅展示数据往往是不够的。用户通常需要根据自己的需求快速查找特定信息,这就需要为表格添</div>
                    </li>
                    <li><a href="/article/1943919909612351488.htm"
                           title="Vue.js 过渡 & 动画" target="_blank">Vue.js 过渡 & 动画</a>
                        <span class="text-muted">lsx202406</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>Vue.js过渡&动画引言在Web开发中,过渡与动画是提升用户体验的关键元素。Vue.js作为一款流行的前端框架,提供了强大的过渡与动画功能,使得开发者能够轻松实现丰富的交互效果。本文将深入探讨Vue.js中的过渡与动画,包括其原理、应用场景以及实现方法。一、Vue.js过渡原理Vue.js过渡是利用CSS3的transition属性实现的。当Vue.js侦测到数据变化时,会自动触发过渡效果。过渡</div>
                    </li>
                    <li><a href="/article/1943853592725221376.htm"
                           title="GPT实操——利用GPT创建一个应用" target="_blank">GPT实操——利用GPT创建一个应用</a>
                        <span class="text-muted">狗木马</span>
<a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/gpt-3/1.htm">gpt-3</a><a class="tag" taget="_blank" href="/search/gpt/1.htm">gpt</a>
                        <div>功能描述信息查询:用户可以询问各种问题,如天气、新闻、股票等,机器人会返回相关信息。任务执行:用户可以要求机器人执行一些简单的任务,如设置提醒、发送邮件等。情感支持:机器人可以与用户进行情感交流,提供安慰和支持。个性化设置:用户可以自定义机器人的回复风格和偏好。技术栈前端:React.js后端:Node.js+Express数据库:MongoDB自然语言处理:OpenAIGPT-3API其他工具:</div>
                    </li>
                    <li><a href="/article/1943847416503529472.htm"
                           title="前端面试题总结——JS篇" target="_blank">前端面试题总结——JS篇</a>
                        <span class="text-muted">又又呢</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>一、说说JavaScript中的数据类型?存储上有什么差别?1、数据类型基本类型number:数值类型十进制:letintNum=55八进制(零开头):letnum1=070十六进制(0x开头):lethexNum1=0xANaN:特殊数值,意为“不是数值”string:字符串类型boolean:布尔值,true或falseundefined:表示未定义null:空值symbol:是原始值,且符号</div>
                    </li>
                    <li><a href="/article/1943844765225250816.htm"
                           title="前端面试题——5.AjAX的缺点?" target="_blank">前端面试题——5.AjAX的缺点?</a>
                        <span class="text-muted">浅端</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">前端面试题</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">前端面试题</a>
                        <div>①传统的web交互是:用户一个网页动作,就会发送一个http请求到服务器,服务器处理完该请求再返回一个完整的HTML页面,客户端再重新加载,这样极大地浪费了带宽。②AJAX的出现解决了这个问题,它只会向服务器请求用户所需要的数据,并在客户端采用JavaScript处理返回的数据,操作DOM更新页面。③AJXA优点:无刷新更新页面异步服务器通信前端后端负载均衡④AJAX缺点:干掉了Back和Hist</div>
                    </li>
                    <li><a href="/article/1943842998383079424.htm"
                           title="2023高薪前端面试题(二、前端核心——Ajax)" target="_blank">2023高薪前端面试题(二、前端核心——Ajax)</a>
                        <span class="text-muted"></span>

                        <div>原生AjaxAjax简介Ajax全程为AsynchronousJavaScript+XML,就是异步的JS和XML通过AJAX可以在浏览器中向服务器发送异步请求,最大的优势是:无刷新获取数据,实现局部刷新Ajax是一种用于创建快速动态网页的技术AJAX不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式Ajax的应用场景页面上拉加载更多数据列表数据无刷新分页表单项离开焦点数据验证搜索框提示</div>
                    </li>
                    <li><a href="/article/1943841736426057728.htm"
                           title="前端面试题——手写实现 ajax" target="_blank">前端面试题——手写实现 ajax</a>
                        <span class="text-muted">阿水爱踢中锋</span>
<a class="tag" taget="_blank" href="/search/ajax/1.htm">ajax</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>凡是和后台有过数据交互的小伙伴肯定都接触过ajax.我们可以通过ajax来实现页面的无刷新请求数据,这样就能在保证良好用户体验的同时,将更多的内容展示给用户ajax在我们的开发工作中已经司空见惯,几乎所有我们频繁使用的库和框架都提供了经过完善封装后的ajax方法,如jQuery、zepto、angular等等,这使得我们的数据请求变得异常简洁明了但是这也带来了很明显的缺陷,就是我们知道如何去使用封</div>
                    </li>
                    <li><a href="/article/1943826858080530432.htm"
                           title="uniapp 如何封装实现任意页面都能使用的全局弹窗" target="_blank">uniapp 如何封装实现任意页面都能使用的全局弹窗</a>
                        <span class="text-muted">代码简单说</span>
<a class="tag" taget="_blank" href="/search/2025%E5%BC%80%E5%8F%91%E5%BF%85%E5%A4%87%28%E9%99%90%E6%97%B6%E7%89%B9%E6%83%A0%29/1.htm">2025开发必备(限时特惠)</a><a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/uniapp%E5%85%A8%E5%B1%80%E5%BC%B9%E7%AA%97/1.htm">uniapp全局弹窗</a><a class="tag" taget="_blank" href="/search/uniapp%E5%BC%B9%E7%AA%97%E7%BB%84%E4%BB%B6/1.htm">uniapp弹窗组件</a>
                        <div>【实战干货】uniapp如何封装实现任意页面都能使用的全局弹窗标签:uniapp弹窗组件全局弹窗Vue动态渲染跨页面弹窗✨前端老司机亲授,uniapp无法在所有页面中直接用自定义弹窗?别急,一招动态挂载vue实例,优雅解决!背景故事:一个被“弹窗”搞崩溃的早晨作为一名前端开发工程师,有一天我在给uniapp项目加IM消息功能,需求是:不论当前用户在哪个页面,只要有消息来,就要立即弹出提示窗口。听起</div>
                    </li>
                    <li><a href="/article/1943824842390302720.htm"
                           title="【前端】接口日志追踪" target="_blank">【前端】接口日志追踪</a>
                        <span class="text-muted">毕业茄</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>1.问题描述场景:前端提交数据后,接口回调再次添加参数,但页面跳转/刷新导致之前的console.log数据丢失。影响:无法追踪完整的请求流程,调试困难。2.环境信息项目说明浏览器GoogleChrome120+开发者工具ChromeDevTools技术栈前端:Vue/React/其他接口类型RESTfulAPI/GraphQL3.解决方案3.1保留控制台日志(推荐)步骤:打开Chrome开发者工</div>
                    </li>
                    <li><a href="/article/1943824841912152064.htm"
                           title="【前端】异步任务风控验证与轮询机制技术方案(通用笔记版)" target="_blank">【前端】异步任务风控验证与轮询机制技术方案(通用笔记版)</a>
                        <span class="text-muted"></span>

                        <div>一、背景场景在某类生成任务中,例如用户点击“执行任务”按钮后触发一个较耗时的后端操作(如生成报告、渲染图像、转码视频等),由于其调用了模型、渲染服务或需要较长处理时间,为了防止接口被频繁恶意调用,系统需要加入风控验证机制。此外,因任务处理为异步,前端无法立即获得最终结果,因此需通过轮询方式定期查询任务状态,等待任务完成后展示结果。二、整体流程说明1.用户点击“执行任务”按钮:前端调用风控接口/ap</div>
                    </li>
                    <li><a href="/article/1943823200676802560.htm"
                           title="uniapp对接unipush 1.0 ios/android" target="_blank">uniapp对接unipush 1.0 ios/android</a>
                        <span class="text-muted">车轮滚滚__</span>
<a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                        <div>配置注意需要打包自定义基座之后在手机上运行自定义基座才可以!官方有文档可以根据文档来我这里用的是1.0为什么没有2.0因为2.0要用uinicloud注意每次打包之后cid都会变cid用户的标识iduniapp通过这个id可以把消息推送给指定人前端代码前端要做的很简单直接放到app.vue中onLaunch钩子中即可麻烦的在后端和个推的对接onPushMessage(that){//#ifdefA</div>
                    </li>
                    <li><a href="/article/1943798231427248128.htm"
                           title="在html中加入网址,网页超链接怎么做,添加超链接网址的的详细步骤" target="_blank">在html中加入网址,网页超链接怎么做,添加超链接网址的的详细步骤</a>
                        <span class="text-muted">一只爪子</span>
<a class="tag" taget="_blank" href="/search/%E5%9C%A8html%E4%B8%AD%E5%8A%A0%E5%85%A5%E7%BD%91%E5%9D%80/1.htm">在html中加入网址</a>
                        <div>此系列教程主要讲解HTML从基础到精通。自己能够设计一个完整的前端网页项目。程序员写代码在HTML中添加图片其实很简单,就是添加一个img的标签。图片标签的语法一般有src、alt、width、height四种属性就够用了。效果:图片的显示效果图片路径的写法src表示的是图片的路径,这里面的值应该怎么写呢?(1)html文件和图片在相同一个文件夹下。HTML文件和图片文件在相同的目录下,可以直接书</div>
                    </li>
                    <li><a href="/article/1943791672676642816.htm"
                           title="uniapp项目如何优雅处理Token失效自动重试 token无感刷新" target="_blank">uniapp项目如何优雅处理Token失效自动重试 token无感刷新</a>
                        <span class="text-muted">代码简单说</span>
<a class="tag" taget="_blank" href="/search/2025%E5%BC%80%E5%8F%91%E5%BF%85%E5%A4%87%28%E9%99%90%E6%97%B6%E7%89%B9%E6%83%A0%29/1.htm">2025开发必备(限时特惠)</a><a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/uniapp/1.htm">uniapp</a><a class="tag" taget="_blank" href="/search/token%E9%87%8D%E8%AF%95/1.htm">token重试</a><a class="tag" taget="_blank" href="/search/uniapp/1.htm">uniapp</a><a class="tag" taget="_blank" href="/search/token%E8%8E%B7%E5%8F%96/1.htm">token获取</a><a class="tag" taget="_blank" href="/search/token%E6%97%A0%E6%84%9F%E5%88%B7%E6%96%B0/1.htm">token无感刷新</a><a class="tag" taget="_blank" href="/search/uniapp%E8%87%AA%E5%8A%A8%E5%88%B7%E6%96%B0token/1.htm">uniapp自动刷新token</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E7%99%BB%E5%BD%95%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86/1.htm">前端登录状态管理</a><a class="tag" taget="_blank" href="/search/token%E8%87%AA%E5%8A%A8%E5%88%B7%E6%96%B0/1.htm">token自动刷新</a>
                        <div>uniapp项目如何优雅处理Token失效自动重试token无感刷新标签:uniapp|前端登录状态管理|Token自动刷新|前端重试队列作为一名前端开发,我在重构公司旧项目时,踩到了一个大家经常遇到的坑:Token失效后请求失败,用户体验极差。而更糟糕的是,在一个页面里多个请求同时发出,全部失败并跳转登录,场面就像是“弹窗地狱”。我决定把这个问题解决到底,封装出一个可复用、稳定、自动重试的请求模</div>
                    </li>
                    <li><a href="/article/1943790915952898048.htm"
                           title="前端每周清单第 16 期:JavaScript 模块化现状;Node V8 与V6 真实性能对比" target="_blank">前端每周清单第 16 期:JavaScript 模块化现状;Node V8 与V6 真实性能对比</a>
                        <span class="text-muted"></span>

                        <div>前端每周清单第16期:JavaScript模块化现状;NodeV8与V6真实性能对比;Nuxt.jsSSR与权限验证指南为InfoQ中文站特供稿件,首发地址为这里;如需转载,请与InfoQ中文站联系。从属于笔者的Web前端入门与工程实践的前端每周清单系列系列;部分文章需要自备梯子。前端每周清单第16期:JavaScript模块化现状;NodeV8与V6真实性能对比;Nuxt.jsSSR与权限验证指</div>
                    </li>
                    <li><a href="/article/1943786882114580480.htm"
                           title="【译】2018 前端性能优化清单 —— 第一部分" target="_blank">【译】2018 前端性能优化清单 —— 第一部分</a>
                        <span class="text-muted">qq_36320160</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>原文地址:Front-EndPerformanceChecklist2018-Part1原文作者:VitalyFriedman译文出自:掘金翻译计划本文永久链接:https://github.com/xitu/gold-miner/blob/master/TODO/front-end-performance-checklist-2018-1.md译者:tvChan校对者:mysterytonyry</div>
                    </li>
                    <li><a href="/article/1943786755819892736.htm"
                           title="如何做到无感刷新token?" target="_blank">如何做到无感刷新token?</a>
                        <span class="text-muted"></span>

                        <div>如何做到无感刷新token?前言后端刷新Token方案--自动刷新token前端刷新Token方案--token续约疑问及思考前言解决方案:自动刷新tokentoken续约思路如果Token即将过期,你在验证用户权限的同时,为用户生成一个新的Token并返回给客户端,客户端需要更新本地存储的Token,还可以做定时任务来刷新Token,可以不生成新的Token,在快过期的时候,直接给Token增加</div>
                    </li>
                    <li><a href="/article/1943785495385403392.htm"
                           title="uniapp登录成功后跳回原有页面+无感刷新token" target="_blank">uniapp登录成功后跳回原有页面+无感刷新token</a>
                        <span class="text-muted">黑匣子~</span>
<a class="tag" taget="_blank" href="/search/uniapp/1.htm">uniapp</a><a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/token/1.htm">token</a>
                        <div>uniapp登录成功后跳回原有页面引言在C端的页面场景中,我们经常会有几种情况到登录页:区分需要登录和不用登录的页面,点击需要登录才能查看的页面已经登录但是超时,用户凭证失效等原因以上情况可以细分为两种,一种是从未登录过的,需要第一次去登录,还一种是已经登录了,但是cookie失效了,需要重新获取用户凭证,这样的话后端会将两个状态码区分,那我们前端需要根据不同的状态码进行相应的处理。第一次登录时当</div>
                    </li>
                    <li><a href="/article/1943761678143385600.htm"
                           title="观众信息设置与统计(视频高级分析与统计功能)" target="_blank">观众信息设置与统计(视频高级分析与统计功能)</a>
                        <span class="text-muted">视频砖家</span>
<a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E5%AE%89%E5%85%A8/1.htm">视频安全</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E5%8A%A0%E5%AF%86/1.htm">视频加密</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E8%A7%82%E7%9C%8B%E5%88%86%E6%9E%90/1.htm">视频观看分析</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">视频数据分析</a>
                        <div>Web播放器(POLYV-html5-player)支持设置观众信息参数,设置后在播放器上报的观看日志中会附带观众信息,这样用户就可以通过管理后台的统计页面或服务端API来查看特定观众的视频观看情况了。一、观众信息设置播放器设置观众信息参数的代码示例如下:varplayer=polyvPlayer({wrap:'#player',width:800,height:533,vid:'88083abb</div>
                    </li>
                                <li><a href="/article/115.htm"
                                       title="C/C++Win32编程基础详解视频下载" target="_blank">C/C++Win32编程基础详解视频下载</a>
                                    <span class="text-muted">择善Zach</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/Win32/1.htm">Win32</a>
                                    <div>课题视频:C/C++Win32编程基础详解 
视频知识:win32窗口的创建 
                  windows事件机制 
主讲:择善Uncle老师 
学习交流群:386620625 
验证码:625 
 
--</div>
                                </li>
                                <li><a href="/article/242.htm"
                                       title="Guava Cache使用笔记" target="_blank">Guava Cache使用笔记</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/guava/1.htm">guava</a><a class="tag" taget="_blank" href="/search/cache/1.htm">cache</a>
                                    <div>1.Guava Cache的get/getIfPresent方法当参数为null时会抛空指针异常 
 
我刚开始使用时还以为Guava Cache跟HashMap一样,get(null)返回null。 
实际上Guava整体设计思想就是拒绝null的,很多地方都会执行com.google.common.base.Preconditions.checkNotNull的检查。 
 
 
2.Guava</div>
                                </li>
                                <li><a href="/article/369.htm"
                                       title="解决ora-01652无法通过128(在temp表空间中)" target="_blank">解决ora-01652无法通过128(在temp表空间中)</a>
                                    <span class="text-muted">0624chenhong</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                                    <div>解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程 
 
一个sql语句后,大约花了10分钟,好不容易有一个结果,但是报了一个ora-01652错误,查阅了oracle的错误代码说明:意思是指temp表空间无法自动扩展temp段。这种问题一般有两种原因:一是临时表空间空间太小,二是不能自动扩展。 
分析过程: 
   既然是temp表空间有问题,那当</div>
                                </li>
                                <li><a href="/article/496.htm"
                                       title="Struct在jsp标签" target="_blank">Struct在jsp标签</a>
                                    <span class="text-muted">不懂事的小屁孩</span>
<a class="tag" taget="_blank" href="/search/struct/1.htm">struct</a>
                                    <div>非UI标签介绍: 
控制类标签: 
1:程序流程控制标签   if   elseif    else 
<s:if test="isUsed"> 
 <span class="label label-success">True</span> 
</</div>
                                </li>
                                <li><a href="/article/623.htm"
                                       title="按对象属性排序" target="_blank">按对象属性排序</a>
                                    <span class="text-muted">换个号韩国红果果</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%AF%B9%E8%B1%A1%E6%8E%92%E5%BA%8F/1.htm">对象排序</a>
                                    <div>利用JavaScript进行对象排序,根据用户的年龄排序展示 
 
<script>
var bob={
name;bob,
age:30
}
var peter={
name;peter,
age:30
}
var amy={
name;amy,
age:24
}
var mike={
name;mike,
age:29
}
var john={
</div>
                                </li>
                                <li><a href="/article/750.htm"
                                       title="大数据分析让个性化的客户体验不再遥远" target="_blank">大数据分析让个性化的客户体验不再遥远</a>
                                    <span class="text-muted">蓝儿唯美</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a>
                                    <div>顾客通过多种渠道制造大量数据,企业则热衷于利用这些信息来实现更为个性化的体验。 
分析公司Gartner表示,高级分析会成为客户服务的关键,但是大数据分析的采用目前仅局限于不到一成的企业。 挑战在于企业还在努力适应结构化数据,疲于根据自身的客户关系管理(CRM)系统部署有效的分析框架,以及集成不同的内外部信息源。 
然而,面对顾客通过数字技术参与而产生的快速变化的信息,企业需要及时作出反应。要想实</div>
                                </li>
                                <li><a href="/article/877.htm"
                                       title="java笔记4" target="_blank">java笔记4</a>
                                    <span class="text-muted">a-john</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>操作符 
1,使用java操作符 
      操作符接受一个或多个参数,并生成一个新值。参数的形式与普通的方法调用不用,但是效果是相同的。加号和一元的正号(+)、减号和一元的负号(-)、乘号(*)、除号(/)以及赋值号(=)的用法与其他编程语言类似。 
      操作符作用于操作数,生成一个新值。另外,有些操作符可能会改变操作数自身的</div>
                                </li>
                                <li><a href="/article/1004.htm"
                                       title="从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序" target="_blank">从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%AD%A6%E4%B9%A0/1.htm">嵌入式学习</a>
                                    <div>    笔者学习嵌入式Linux也有一段时间了,很奇怪的是很多书讲驱动编程方面的知识,也有很多书将ARM9方面的知识,但是从以前51形式的(对寄存器直接操作,初始化芯片的功能模块)编程方法,和思维模式,变换为基于Linux操作系统编程,讲这个思想转变的书几乎没有,让初学者走了很多弯路,撞了很多难墙。 
    笔者因此写上自己的学习心得,希望能给和我一样转变</div>
                                </li>
                                <li><a href="/article/1131.htm"
                                       title="在springmvc中解决FastJson循环引用的问题" target="_blank">在springmvc中解决FastJson循环引用的问题</a>
                                    <span class="text-muted">asialee</span>
<a class="tag" taget="_blank" href="/search/%E5%BE%AA%E7%8E%AF%E5%BC%95%E7%94%A8/1.htm">循环引用</a><a class="tag" taget="_blank" href="/search/fastjson/1.htm">fastjson</a>
                                    <div>          我们先来看一个例子: 
          
package com.elong.bms;

import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import co</div>
                                </li>
                                <li><a href="/article/1258.htm"
                                       title="ArrayAdapter和SimpleAdapter技术总结" target="_blank">ArrayAdapter和SimpleAdapter技术总结</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/SimpleAdapter/1.htm">SimpleAdapter</a><a class="tag" taget="_blank" href="/search/ArrayAdapter/1.htm">ArrayAdapter</a><a class="tag" taget="_blank" href="/search/%E9%AB%98%E7%BA%A7%E7%BB%84%E4%BB%B6%E5%9F%BA%E7%A1%80/1.htm">高级组件基础</a>
                                    <div>ArrayAdapter比较简单,但它只能用于显示文字。而SimpleAdapter则有很强的扩展性,可以自定义出各种效果 
  
ArrayAdapter;的数据可以是数组或者是队列 
  
     // 获得下拉框对象 
AutoCompleteTextView textview = (AutoCompleteTextView) this
</div>
                                </li>
                                <li><a href="/article/1385.htm"
                                       title="九封信" target="_blank">九封信</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E7%94%9F/1.htm">人生</a><a class="tag" taget="_blank" href="/search/%E5%8A%B1%E5%BF%97/1.htm">励志</a>
                                    <div>        有时候,莫名的心情不好,不想和任何人说话,只想一个人静静的发呆。有时候,想一个人躲起来脆弱,不愿别人看到自己的伤口。有时候,走过熟悉的街角,看到熟悉的背影,突然想起一个人的脸。有时候,发现自己一夜之间就长大了。         2014,写给人</div>
                                </li>
                                <li><a href="/article/1512.htm"
                                       title="Linux下安装MySQL Web 管理工具phpMyAdmin" target="_blank">Linux下安装MySQL Web 管理工具phpMyAdmin</a>
                                    <span class="text-muted">sunjing</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/Install/1.htm">Install</a><a class="tag" taget="_blank" href="/search/phpMyAdmin/1.htm">phpMyAdmin</a>
                                    <div>PHP http://php.net/ 
phpMyAdmin http://www.phpmyadmin.net 
Error compiling PHP on CentOS x64 
  
一、安装Apache 
请参阅http://billben.iteye.com/admin/blogs/1985244 
  
二、安装依赖包 
sudo yum install gd </div>
                                </li>
                                <li><a href="/article/1639.htm"
                                       title="分布式系统理论" target="_blank">分布式系统理论</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a>
                                    <div>FLP 
One famous theory in distributed computing, known as FLP after the authors Fischer, Lynch, and Patterson, proved that in a distributed system with asynchronous communication and process crashes, </div>
                                </li>
                                <li><a href="/article/1766.htm"
                                       title="ssh2整合(spring+struts2+hibernate)-附源码" target="_blank">ssh2整合(spring+struts2+hibernate)-附源码</a>
                                    <span class="text-muted">白糖_</span>
<a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/1.htm">项目管理</a>
                                    <div>最近抽空又整理了一套ssh2框架,主要使用的技术如下: 
spring做容器,管理了三层(dao,service,actioin)的对象 
struts2实现与页面交互(MVC),自己做了一个异常拦截器,能拦截Action层抛出的异常 
hibernate与数据库交互 
BoneCp数据库连接池,据说比其它数据库连接池快20倍,仅仅是据说 
MySql数据库 
  
项目用eclipse</div>
                                </li>
                                <li><a href="/article/1893.htm"
                                       title="treetable bug记录" target="_blank">treetable bug记录</a>
                                    <span class="text-muted">braveCS</span>
<a class="tag" taget="_blank" href="/search/table/1.htm">table</a>
                                    <div>// 插入子节点删除再插入时不能正常显示。修改:
//不知改后有没有错,先做个备忘
 Tree.prototype.removeNode = function(node) {
      // Recursively remove all descendants of +node+
      this.unloadBranch(node);

      // Remove</div>
                                </li>
                                <li><a href="/article/2020.htm"
                                       title="编程之美-电话号码对应英语单词" target="_blank">编程之美-电话号码对应英语单词</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a>
                                    <div>

import java.util.Arrays;

public class NumberToWord {

	/**
	 * 编程之美 电话号码对应英语单词
	 * 题目:
     *  手机上的拨号盘,每个数字都对应一些字母,比如2对应ABC,3对应DEF.........,8对应TUV,9对应WXYZ,
     *  要求对一段数字,输出其代表的所有可能的字母组合</div>
                                </li>
                                <li><a href="/article/2147.htm"
                                       title="jquery ajax读书笔记" target="_blank">jquery ajax读书笔记</a>
                                    <span class="text-muted">chengxuyuancsdn</span>
<a class="tag" taget="_blank" href="/search/jQuery+ajax/1.htm">jQuery ajax</a>
                                    <div>1、jsp页面 
 
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()</div>
                                </li>
                                <li><a href="/article/2274.htm"
                                       title="JWFD工作流拓扑结构解析伪码描述算法" target="_blank">JWFD工作流拓扑结构解析伪码描述算法</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E6%B4%BB%E5%8A%A8/1.htm">活动</a><a class="tag" taget="_blank" href="/search/J%23/1.htm">J#</a>
                                    <div>  对工作流拓扑结构解析感兴趣的朋友可以下载附件,或者下载JWFD的全部代码进行分析 
 
 
  /*  流程图拓扑结构解析伪码描述算法 
 
        public java.util.ArrayList DFS(String graphid, String stepid, int j) </div>
                                </li>
                                <li><a href="/article/2401.htm"
                                       title="oracle I/O 从属进程" target="_blank">oracle I/O 从属进程</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                                    <div>I/O 从属进程 
 
  I/O从属进程用于为不支持异步I/O的系统或设备模拟异步I/O.例如,磁带设备(相当慢)就不支持异步I/O.通过使用I/O 从属进程,可以让磁带机模仿通常只为磁盘驱动器提供的功能。就好像支持真正的异步I/O 一样,写设备的进程(调用者)会收集大量数据,并交由写入器写出。数据成功地写出时,写入器(此时写入器是I/O 从属进程,而不是操作系统)会通知原来的调用者,调用者则会</div>
                                </li>
                                <li><a href="/article/2528.htm"
                                       title="高级排序:希尔排序" target="_blank">高级排序:希尔排序</a>
                                    <span class="text-muted">dieslrae</span>
<a class="tag" taget="_blank" href="/search/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F/1.htm">希尔排序</a>
                                    <div>
    public void shellSort(int[] array){
        int limit = 1;
        int temp;
        int index;
        
        while(limit <= array.length/3){
            limit = limit * 3 + 1;
    </div>
                                </li>
                                <li><a href="/article/2655.htm"
                                       title="初二下学期难记忆单词" target="_blank">初二下学期难记忆单词</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/english/1.htm">english</a><a class="tag" taget="_blank" href="/search/word/1.htm">word</a>
                                    <div>kitchen 厨房 
cupboard 厨柜 
salt 盐 
sugar 糖 
oil 油 
fork 叉;餐叉 
spoon 匙;调羹 
chopsticks 筷子 
cabbage 卷心菜;洋白菜 
soup 汤 
Italian 意大利的 
  
Indian 印度的 
workplace  工作场所 
even 甚至;更 
Italy 意大利 
laugh 笑 
m</div>
                                </li>
                                <li><a href="/article/2782.htm"
                                       title="Go语言使用MySQL数据库进行增删改查" target="_blank">Go语言使用MySQL数据库进行增删改查</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>目前Internet上流行的网站构架方式是LAMP,其中的M即MySQL, 作为数据库,MySQL以免费、开源、使用方便为优势成为了很多Web开发的后端数据库存储引擎。MySQL驱动Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持database/sql标准,而有些是采用了自己的实现接口,常用的有如下几种: 
 
  http://code.google.c...o-mysql-dri</div>
                                </li>
                                <li><a href="/article/2909.htm"
                                       title="git命令" target="_blank">git命令</a>
                                    <span class="text-muted">shuizhaosi888</span>
<a class="tag" taget="_blank" href="/search/git/1.htm">git</a>
                                    <div>---------------设置全局用户名:
git config --global user.name "HanShuliang" //设置用户名 
git config --global user.email "13241153187@163.com" //设置邮箱

---------------查看环境配置
git config --li</div>
                                </li>
                                <li><a href="/article/3036.htm"
                                       title="qemu-kvm 网络 nat模式 (四)" target="_blank">qemu-kvm 网络 nat模式 (四)</a>
                                    <span class="text-muted">haoningabc</span>
<a class="tag" taget="_blank" href="/search/kvm/1.htm">kvm</a><a class="tag" taget="_blank" href="/search/qemu/1.htm">qemu</a>
                                    <div>qemu-ifup-NAT 
 

#!/bin/bash
BRIDGE=virbr0
NETWORK=192.168.122.0
GATEWAY=192.168.122.1
NETMASK=255.255.255.0
DHCPRANGE=192.168.122.2,192.168.122.254
TFTPROOT=
BOOTP=
function check_bridge()
</div>
                                </li>
                                <li><a href="/article/3163.htm"
                                       title="不要让未来的你,讨厌现在的自己" target="_blank">不要让未来的你,讨厌现在的自己</a>
                                    <span class="text-muted">jingjing0907</span>
<a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB+%E5%A5%8B%E6%96%97+%E5%B7%A5%E4%BD%9C+%E6%A2%A6%E6%83%B3/1.htm">生活 奋斗 工作 梦想</a>
                                    <div> 故事one 
 23岁,他大学毕业,放弃了父母安排的稳定工作,独闯京城,在家小公司混个小职位,工作还算顺手,月薪三千,混了混,混走了一年的光阴。    24岁,有了女朋友,从二环12人的集体宿舍搬到香山民居,一间平房,二人世界,爱爱爱。偶然约三朋四友,打扑克搓麻将,日子快乐似神仙;    25岁,出了几次差,调了两次岗,薪水涨了不过百,生猛狂飙的物价让现实血淋淋,无力为心爱银儿购件大牌</div>
                                </li>
                                <li><a href="/article/3290.htm"
                                       title="枚举类型详解" target="_blank">枚举类型详解</a>
                                    <span class="text-muted">一路欢笑一路走</span>
<a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a><a class="tag" taget="_blank" href="/search/%E6%9E%9A%E4%B8%BE%E8%AF%A6%E8%A7%A3/1.htm">枚举详解</a><a class="tag" taget="_blank" href="/search/enumset/1.htm">enumset</a><a class="tag" taget="_blank" href="/search/enumMap/1.htm">enumMap</a>
                                    <div>枚举类型详解 
一.Enum详解 
     1.1枚举类型的介绍 
  
JDK1.5加入了一个全新的类型的”类”—枚举类型,为此JDK1.5引入了一个新的关键字enum,我们可以这样定义一个枚举类型。 
  
   Demo:一个最简单的枚举类 
  
public enum ColorType {
   RED</div>
                                </li>
                                <li><a href="/article/3417.htm"
                                       title="第11章 动画效果(上)" target="_blank">第11章 动画效果(上)</a>
                                    <span class="text-muted">onestopweb</span>
<a class="tag" taget="_blank" href="/search/%E5%8A%A8%E7%94%BB/1.htm">动画</a>
                                    <div>index.html 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/</div>
                                </li>
                                <li><a href="/article/3544.htm"
                                       title="Eclipse中jsp、js文件编辑时,卡死现象解决汇总" target="_blank">Eclipse中jsp、js文件编辑时,卡死现象解决汇总</a>
                                    <span class="text-muted">ljf_home</span>
<a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/jsp%E5%8D%A1%E6%AD%BB/1.htm">jsp卡死</a><a class="tag" taget="_blank" href="/search/js%E5%8D%A1%E6%AD%BB/1.htm">js卡死</a>
                                    <div>使用Eclipse编辑jsp、js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲。将所有用过的方法罗列如下: 
  
1、取消验证 
windows–>perferences–>validation 
把 除了manual 下面的全部点掉,build下只留 classpath dependency Valida</div>
                                </li>
                                <li><a href="/article/3671.htm"
                                       title="MySQL编程中的6个重要的实用技巧" target="_blank">MySQL编程中的6个重要的实用技巧</a>
                                    <span class="text-muted">tomcat_oracle</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>每一行命令都是用分号(;)作为结束 
对于MySQL,第一件你必须牢记的是它的每一行命令都是用分号(;)作为结束的,但当一行MySQL被插入在PHP代码中时,最好把后面的分号省略掉,例如: 
mysql_query("INSERT INTO tablename(first_name,last_name)VALUES('$first_name',$last_name')"); 
</div>
                                </li>
                                <li><a href="/article/3798.htm"
                                       title="zoj 3820 Building Fire Stations(二分+bfs)" target="_blank">zoj 3820 Building Fire Stations(二分+bfs)</a>
                                    <span class="text-muted">阿尔萨斯</span>
<a class="tag" taget="_blank" href="/search/Build/1.htm">Build</a>
                                    <div> 题目链接:zoj 3820 Building Fire Stations 
 题目大意:给定一棵树,选取两个建立加油站,问说所有点距离加油站距离的最大值的最小值是多少,并且任意输出一种建立加油站的方式。 
 解题思路:二分距离判断,判断函数的复杂度是o(n),这样的复杂度应该是o(nlogn),即使常数系数偏大,但是居然跑了4.5s,也是醉了。 判断函数里面做了3次bfs,但是每次bfs节点最多</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>