<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Whynot&#39;Blog</title>
  
  <subtitle>努力把自己培养成理想型</subtitle>
  <link href="https://whynotv.github.io/atom.xml" rel="self"/>
  
  <link href="https://whynotv.github.io/"/>
  <updated>2026-08-20T02:04:42.922Z</updated>
  <id>https://whynotv.github.io/</id>
  
  <author>
    <name>咕咕</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>成为更好的自己</title>
    <link href="https://whynotv.github.io/posts/7435.html"/>
    <id>https://whynotv.github.io/posts/7435.html</id>
    <published>2026-08-19T09:49:06.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<p>时隔好久好久了，都快忘了我还有个博客，今天突然想起来了，想写点东西，记录一下自己的生活。<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/IMG_0265.JPG" style="width:50%;"/></div></div></p><p>工作也过了一年了，但是还是继续在倒班，已经倒班倒了半年多了，现在还要倒班三个月，或许是我真的不适合倒班吧，倒班真的很累，尤其是夜班，晚上睡不着觉，白天又要上班，整个人都很疲惫。希望自己能坚持下去，熬过这段时间。熬过去这三个月！我的生活节奏就会慢慢恢复正常了。</p><p>今年也是充满惊喜的一年，工作上也有了新的变化，虽然有些压力，但是我相信自己可以应对。生活中也有很多小确幸，8月9日，我去看了解解的演唱会，那是我的梦想之一呢，实现啦！！！非常的开心，解解的演唱会真的很棒，现场的氛围非常好，解解也很努力地表演，让我感受到了她的热情和才华。希望以后能有机会和自己心爱的人一起去看演唱会，感受那份美好。</p><p>还有一件小确幸，那就是亲戚介绍了一个女孩，她是一个非常温柔善良的女孩，和她相处的时候，我感受到了久违的温暖和关心。虽然我们还在了解彼此，但是我希望能慢慢地走近她，成为更好的自己，也希望能给她带来更多的快乐和幸福。虽然我做错了一些事，之前相处的时候我有点没有边界感，并且心意有点过了头，但是我会努力改正自己的不足，学会尊重她的感受和空间。希望我们能慢慢地了解彼此，建立起更深厚的感情。<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/dji_export_20260816_photo_0001.JPG" style="width:50%;"/></div></div></p><p>这个月开启了我的新的生活状态，我开始每天健身，每天都在坚持做有意义的事，不在像以前一样，工作完就无所事事的消遣时间。现在我专注于学习AI，每天都在学习新的知识和技能，提升自己的能力。希望自己能在未来的日子里，成为一个更好的人，不仅在工作上有所成就，也能在生活中找到更多的快乐和满足。</p><p>With the passage of time, I have come to realize that life is a journey of self-discovery and growth. Every experience, whether good or bad, has shaped me into the person I am today. I am grateful for the lessons learned and the opportunities that have come my way. As I continue on this path, I will strive to be more mindful, compassionate, and resilient.<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/IMG_0270.JPG" style="width:50%;"/></div></div></p><p>淡淡的，才能顺顺的！Fighting!</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;时隔好久好久了，都快忘了我还有个博客，今天突然想起来了，想写点东西，记录一下自己的生活。&lt;br&gt;&lt;div class=&quot;img-wrap&quot;&gt;&lt;div class=&quot;img-bg&quot;&gt;&lt;img class=&quot;img&quot; src=&quot;https://whynot-image.oss-</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>浅谈十月</title>
    <link href="https://whynotv.github.io/posts/ffed.html"/>
    <id>https://whynotv.github.io/posts/ffed.html</id>
    <published>2025-11-03T14:29:02.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<h1 id="忙碌的十月"><a href="#忙碌的十月" class="headerlink" title="忙碌的十月"></a>忙碌的十月</h1><pre><code>国庆，只能说有点糟糕，1号参加聪哥的婚礼，中午干了点白酒，然而白酒激活了我的口腔溃疡以及智齿发炎了！肿了几天，去牙科医院检查了，然后被连哄带骗直接原价深层次洗牙，花了我五百五十大洋！本来就不富裕，直接把我余额干负了，然后省吃俭用了。等发工资。。。十月中旬，从三期指挥部轮岗换到采矿了，然后参加AI应用培训，去德铜出差了，出差真好呢，24岁生日一个人过的，心里没什么波澜，就是觉得又老了一岁，好像30岁也很快了，但是心态还是很幼稚，有点长不大的样子。培训完了周六回矿里咯，</code></pre>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;忙碌的十月&quot;&gt;&lt;a href=&quot;#忙碌的十月&quot; class=&quot;headerlink&quot; title=&quot;忙碌的十月&quot;&gt;&lt;/a&gt;忙碌的十月&lt;/h1&gt;&lt;pre&gt;&lt;code&gt;国庆，只能说有点糟糕，1号参加聪哥的婚礼，中午干了点白酒，然而白酒激活了我的口腔溃疡以及智齿发炎了！</summary>
      
    
    
    
    <category term="生活" scheme="https://whynotv.github.io/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="随想" scheme="https://whynotv.github.io/tags/%E9%9A%8F%E6%83%B3/"/>
    
  </entry>
  
  <entry>
    <title>入职感悟</title>
    <link href="https://whynotv.github.io/posts/3d03.html"/>
    <id>https://whynotv.github.io/posts/3d03.html</id>
    <published>2025-08-18T20:00:00.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<h1 id="入职感悟"><a href="#入职感悟" class="headerlink" title="入职感悟"></a>入职感悟</h1><p>从7月17号报道到今天8月17号，已经一个月了，回顾这一个月的工作和生活，感触颇多。</p><h2 id="工作方面"><a href="#工作方面" class="headerlink" title="工作方面"></a>工作方面</h2><p>先是去南昌司情教育，了解公司的整体情况和发展方向。回来后就是半天的培训，内容主要是公司的规章制度和一些基本的业务流程。通过这次培训，我对公司的整体运作有了初步的了解，机电车间、采矿车间、选矿车间、机修厂、三期。下午就是半天的军训，所谓的服从性训练吧，每个阶段都给我来个军训，7月份半个月，发了个基础岗位工资1000（不嘻嘻）。也不知道8月份发多少，我还指望着发了工资我买个小电驴呢，然后熬两个月买辆瓜车！我的瓜车！我天天都想骑车，奈何这里天气太太太热了，出门我都要打伞。。。</p><p>8.15签了合同，下午去了机电车间，我要轮岗六个月，机电-三期-采矿-选矿-设备与信息管理部。<br>嘿嘿明天就是正式去机电车间工作了，先新生见面会，我又要社死一回了，想想说啥吧。。。<br>“各位领导，同事们大家好，我是古建杰，来自四川，毕业于成都理工大学，计算机专业，入职岗位是网络技术，后续的日子需要大家多多关照，一起进步！谢谢。”</p><p>8.18发工资啦！这个月的岗位基础工资＋上个月的绩效工资，扣除两个月的社保和公积金，拿到手的工资是：2602.72元，<img no-lazy class="inline" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/IMG_4601.PNG" style="height:600px;"/>还有零有整，哈哈哈哈哈,然后今天也报销了车费，这样才够我去买个电驴和生活。嘻嘻，下个月应该会多一些我算了，应该有4700左右，期待吧！<img no-lazy class="inline" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/IMG_4604.PNG" style="height:600px;"/></p><h2 id="生活方面"><a href="#生活方面" class="headerlink" title="生活方面"></a>生活方面</h2><p>饮食上嘛，工作日吃食堂，周末在姑妈家吃，反正没啥开销，吃的味道还过得去，没有外卖，正好能健康饮食，好好减肥；然后就是去健身房爬坡或者跑步了，或者就是在宿舍打cs，瘾又犯了… 但是打多了也烦，现在想提升自己，学习搭建个人的知识系统吧，坚持自我成长！我觉得我不能丧失进步的能力，也不能就此躺平了，我要提升提升提升，除开BLW（Balance Life and Work），我还需要持续贯彻“8小时能谋生存，8小时外谋发展”，好好把自己养成理想的自我。</p><p>这里工作时间呢，早上7:30到11:30下午14:00到18:00，冬令时就下午13:30-17:30,每天8小时；周末双休，工作强度不大，生活节奏也比较轻松。</p><h2 id="未来展望"><a href="#未来展望" class="headerlink" title="未来展望"></a>未来展望</h2><p>未来的工作和生活，我希望能在这里学到更多的专业知识和技能，深耕一线更要超越一线，从最简单的设备流程以及矿山各系统的运行过程相关设备的学习，提升自己的综合素质。同时，我也希望能结识更多志同道合的朋友，一起分享生活的点滴和工作的经验。最重要的是，我希望能在这段时间里找到自己的定位，明确自己的职业发展方向，为未来的职业生涯打下坚实的基础。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;入职感悟&quot;&gt;&lt;a href=&quot;#入职感悟&quot; class=&quot;headerlink&quot; title=&quot;入职感悟&quot;&gt;&lt;/a&gt;入职感悟&lt;/h1&gt;&lt;p&gt;从7月17号报道到今天8月17号，已经一个月了，回顾这一个月的工作和生活，感触颇多。&lt;/p&gt;
&lt;h2 id=&quot;工作方面&quot;&gt;&lt;</summary>
      
    
    
    
    <category term="生活" scheme="https://whynotv.github.io/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="感悟" scheme="https://whynotv.github.io/tags/%E6%84%9F%E6%82%9F/"/>
    
  </entry>
  
  <entry>
    <title>《岁月》</title>
    <link href="https://whynotv.github.io/posts/2ad8.html"/>
    <id>https://whynotv.github.io/posts/2ad8.html</id>
    <published>2025-06-07T12:01:42.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<h1 id="《岁月》改编自阎真的小说《沧浪之水》"><a href="#《岁月》改编自阎真的小说《沧浪之水》" class="headerlink" title="《岁月》改编自阎真的小说《沧浪之水》"></a>《岁月》改编自阎真的小说《沧浪之水》</h1><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/59DAFAC5625D541FE7A168A6EC2C71BE.png" style="width:60%;"/></div></div><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/IMG_3308.JPG" style="width:60%;"/></div></div><p>电视剧《岁月》改编自阎真的小说《沧浪之水》，由刘江执导，胡军、梅婷、于和伟等主演。该剧以1980年代末的中国为背景，讲述了主人公梁致远从研究生毕业后进入公务员系统，经历理想与现实的冲突，最终在官场中成长的故事。<br>《楚辞·渔父》<br>沧浪之水清兮，可以濯吾缨；<br>沧浪之水浊兮，可以濯吾足。<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/IMG_3305.JPG" style="width:60%;"/></div></div></p><p>📖 句意解释：<br>“沧浪之水清兮，可以濯吾缨”：如果沧浪江的水是清澈的，我可以用它来洗涤帽缨（象征荣誉或身份）。<br>“沧浪之水浊兮，可以濯吾足”：如果沧浪江的水是浑浊的，我就用它来洗脚（象征最低限度的实用）。</p><p>🧠 含义与哲理：<br>这句话表面上讲的是对水质的适应，实际上寓意非常深刻：</p><p>✅ 核心思想是<strong>“随遇而安，宠辱不惊”</strong>：<br>不执着于外界环境清浊（好坏、善恶、荣辱），而是在其中找到恰当的自我行为方式。</p><p>无论处在清明还是混浊之中，都可以有所作为，保持内心的自持和自在。</p><p>✅ 在中国传统文化中，这句话象征一种超脱、处世有道的智慧：<br><strong>“缨”</strong>代表的是身份与理想，</p><p><strong>“足”</strong>代表的是实用与基本生存，</p><p>既能高洁，也能务实；不因境遇改变而失去自我。</p><p>从中领悟的道理：<strong>顺势而不随波、适应而不失节的处世之道。在纷繁复杂的现实中，不求一尘不染，但求心中有尺，行有所止。</strong></p><h2 id="剧情概述"><a href="#剧情概述" class="headerlink" title="剧情概述"></a>剧情概述</h2><p>梁致远（胡军饰）是一位中医研究生，初入职场，满怀理想，性格耿直，不善于应对复杂的人际关系。他在市卫生局工作，面对官场的种种潜规则和人情世故，屡屡碰壁。在经历了职场的挫折、家庭的压力以及个人情感的波折后，梁致远逐渐学会了在现实中寻找平衡，最终在官场中站稳了脚跟。<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/4E75FAF55772478BF799ECE4341351EF.png" style="width:60%;"/></div></div></p><h2 id="角色分析"><a href="#角色分析" class="headerlink" title="角色分析"></a>角色分析</h2><p>梁致远：从理想主义者到现实主义者的转变，体现了个人成长的复杂性。</p><p>闻局长：官场中的老谋深算者，对梁致远有提携之恩，也代表了权力的运作方式。</p><p>许小曼：梁致远的初恋，聪明能干，代表了现实中的智慧与妥协。</p><p>秦梅：梁致远的妻子，性格复杂，婚姻中的矛盾体现了个人选择的代价。</p><h2 id="主题解析"><a href="#主题解析" class="headerlink" title="主题解析"></a>主题解析</h2><p>《岁月》深刻描绘了理想主义者在现实社会中的挣扎与妥协。剧中通过梁致远的成长历程，探讨了“入世”与“出世”的哲学命题。“入世”意味着接受社会规则，参与竞争；“出世”则代表保持自我，远离权力纷争。梁致远的转变体现了人在现实压力下的适应与改变。<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/D8022CA324E1D2221E49B6C6CA49E4BC.png" style="width:60%;"/></div></div></p><h3 id="🧭-一、权力与体制的“沧浪之水”：理想主义的坠落与现实主义的诞生"><a href="#🧭-一、权力与体制的“沧浪之水”：理想主义的坠落与现实主义的诞生" class="headerlink" title="🧭 一、权力与体制的“沧浪之水”：理想主义的坠落与现实主义的诞生"></a>🧭 一、权力与体制的“沧浪之水”：理想主义的坠落与现实主义的诞生</h3><h4 id="表层主题："><a href="#表层主题：" class="headerlink" title="表层主题："></a>表层主题：</h4><p>主人公梁致远是一个拥有“知识分子洁癖”的理想主义者，他相信制度清明、公平正义，想做事、做好事。</p><h4 id="深层主题："><a href="#深层主题：" class="headerlink" title="深层主题："></a>深层主题：</h4><p>体制的复杂性与非理性：他所在的官场不是靠能力说话，而是讲人情、讲关系、讲站队。制度虽在，却被“人治”侵蚀。</p><p>权力的双面性：权力既能实现公共价值，也可成为谋取私利的工具。梁致远从“厌恶权力”到“接受并运用权力”，不是堕落，而是现实。</p><p>“濯吾缨”与“濯吾足”隐喻：清浊皆可用，关键是看你如何自处。梁致远最终没有沉沦，而是在妥协中保有某种道德底线。</p><p>梁致远的转变不是黑化，而是一种“自我保护性进化”。</p><h3 id="🌊-二、知识分子的宿命：孤独、无力与适应"><a href="#🌊-二、知识分子的宿命：孤独、无力与适应" class="headerlink" title="🌊 二、知识分子的宿命：孤独、无力与适应"></a>🌊 二、知识分子的宿命：孤独、无力与适应</h3><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/E75BBAAB08E718BBF4F5E1A4600A926E.png" style="width:60%;"/></div></div><p>梁致远最初象征着“知识改变命运”，但在体制内部，他却被视为“不识趣”的另类。此处展开了对“知识分子角色”的反思：</p><p>与体制的格格不入：他的知识背景与官场运行逻辑严重冲突，无法理解“话说三分”、“懂得进退”的潜规则。</p><p>孤独感：身边同事在“油滑”中生存得游刃有余，他的坚持反成“无能”与“天真”的象征。</p><p>最终自我重构：他从“用理想去改变体制”到“在体制内寻找做人的余地”，这是对知识分子“现实主义”路径的折射。</p><h3 id="🏠-三、婚姻与情感：公私关系的张力"><a href="#🏠-三、婚姻与情感：公私关系的张力" class="headerlink" title="🏠 三、婚姻与情感：公私关系的张力"></a>🏠 三、婚姻与情感：公私关系的张力</h3><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/4A2E8F674869AF1E2DEB7DD7FFC88BA9.png" style="width:60%;"/></div></div><p>剧中梁致远的情感经历同样是他人生演化的一面镜子：</p><p>初恋许小曼：象征纯粹理想的爱情，但在现实中注定无果。两人理念相似，却各自奔向不同方向。</p><p>婚姻中的秦梅：代表现实选择的伴侣，有情感、有支持，也有现实摩擦。两人间的婚姻是妥协的产物。</p><p>“家庭”与“体制”双重消耗：梁致远在单位被掣肘，在家庭也感压力，体会到“双重角色”的撕裂。</p><h3 id="🧠-四、人性欲望与制度困局：道德的流动边界"><a href="#🧠-四、人性欲望与制度困局：道德的流动边界" class="headerlink" title="🧠 四、人性欲望与制度困局：道德的流动边界"></a>🧠 四、人性欲望与制度困局：道德的流动边界</h3><p>剧中很多角色如闻局长、石秘书、王副市长等，并非传统意义的“坏人”，但都在现实中做出妥协甚至不道德的选择。</p><p>并非道德沦丧，而是人性的妥协与权衡；</p><p>制度设计的灰色地带助长了这种“可转化的价值观”：能干但不守规矩的，可能更容易上位；</p><p>梁致远一度也走到了“被推着往前走”的十字路口，但他始终保持某种“自我警觉”，这是角色可贵之处。<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/FDD4D3496E20A41B55104F80A1BBA52A.png" style="width:60%;"/></div></div></p><h3 id="🕊-五、时间与记忆：成长的代价与人生的本质"><a href="#🕊-五、时间与记忆：成长的代价与人生的本质" class="headerlink" title="🕊 五、时间与记忆：成长的代价与人生的本质"></a>🕊 五、时间与记忆：成长的代价与人生的本质</h3><p>剧名《岁月》，不只是讲“年代”，更是讲“成长的疼痛”。</p><p>岁月是最大的试金石：它磨平了理想的棱角，也检验了一个人的底线；</p><p>梁致远的心路历程，是一代人从青春到中年的缩影；</p><p>人在选择中失去一些，也获得一些。这就是“岁月的答卷”。</p><h4 id="🧩-总结：本剧的主题结构层级"><a href="#🧩-总结：本剧的主题结构层级" class="headerlink" title="🧩 总结：本剧的主题结构层级"></a>🧩 总结：本剧的主题结构层级</h4><div class="table-container"><table><thead><tr><th>层级</th><th>主题方向</th><th>表达内容</th></tr></thead><tbody><tr><td>表层</td><td>官场成长</td><td>梁致远如何“混出头”、升职、应对权力博弈</td></tr><tr><td>中层</td><td>理想与现实冲突</td><td>知识分子的理想如何在现实面前改写</td></tr><tr><td>深层</td><td>人性、制度、哲学思辨</td><td>人如何自处？是随波逐流，还是守住内心一隅净土？</td></tr><tr><td>哲思</td><td>处世哲学“沧浪之水”</td><td>清时濯缨，浊时濯足——既不高洁虚伪，也不随波逐流，无愧于心</td></tr></tbody></table></div><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/IMG_3306.JPG" style="width:60%;"/></div></div><p>择高处立，居中间坐，向宽处行；<br>许上等愿，结中等缘，享下等福。<br>▍择高处立<br>追求理想与信念，不自甘平庸。人生志向应高远，立于精神之巅。<br>→ 做人要有格局、有追求。</p><p>▍居中间坐<br>为人处世宜中庸持平，不偏不倚。<br>→ 心境平和、处事有度，不极端、不激进。</p><p>▍向宽处行<br>凡事往开阔、宽容的方向走，心怀豁达，不计小利小怨。<br>→ 眼界宽、胸襟广、路才走得远。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;《岁月》改编自阎真的小说《沧浪之水》&quot;&gt;&lt;a href=&quot;#《岁月》改编自阎真的小说《沧浪之水》&quot; class=&quot;headerlink&quot; title=&quot;《岁月》改编自阎真的小说《沧浪之水》&quot;&gt;&lt;/a&gt;《岁月》改编自阎真的小说《沧浪之水》&lt;/h1&gt;&lt;div clas</summary>
      
    
    
    
    <category term="生活" scheme="https://whynotv.github.io/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="观后感" scheme="https://whynotv.github.io/tags/%E8%A7%82%E5%90%8E%E6%84%9F/"/>
    
  </entry>
  
  <entry>
    <title>致即将告别的自己</title>
    <link href="https://whynotv.github.io/posts/6976.html"/>
    <id>https://whynotv.github.io/posts/6976.html</id>
    <published>2025-06-07T09:20:25.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<h1 id="嘿嘿，我要毕业啦！"><a href="#嘿嘿，我要毕业啦！" class="headerlink" title="嘿嘿，我要毕业啦！"></a>嘿嘿，我要毕业啦！</h1><p>6月4日，我的毕业答辩顺利结束了。<br><img src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/IMG_3241.JPG?x-oss-process=image/resize,w_600" style="width: 60%; display: block; margin: 0 auto;"></p><p>84、84、83，最后平均分是83.6，不高不低，但刚刚好——像是给这四年画了一个温柔的句点。<br><img src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/cca64caf20edb4e5bcc7d8bc4e3af666.png" alt="答辩成绩"></p><p>说不上激动，但确实松了一口气。毕设的反复修改、演示的紧张准备，这些日子过得并不轻松，但好在都撑过来了。比起“终于完成了”，我更多的是一种“原来就快结束了”的实感。</p><p>一场答辩，像是提醒我：真的要毕业了。<br>宿舍的卡下个月把电用完，校园卡余额清零，快递地址要改，微信步数不再和一群人比拼，曾经一走就能见到的朋友，以后可能要预约很久才能碰一次面。</p><p>想想四年前，带着对“智能科学与技术”的懵懂与期待进了校门，那时候根本不会想到有一天会自己做一个系统、站在老师面前答辩，也没想过四年会这么快过去。现在的我，能独立完成项目，也学会了自己面对焦虑、熬夜赶DDL、在群里对学弟学妹说“加油”。</p><p>六月底就要离开学校了。下个月就要走进职场了。<br>这大概就是“人生的下一章节”吧。说没有不舍是假的，但更多的是期待。校园的日子可能回不去了，但它给我的，不只是知识，还有成长。</p><p>谢谢自己一直坚持到这里。<br>也谢谢所有一起走过这段时光的人。</p><p>毕业快乐，愿我们都奔赴更好的远方。  </p><p><img src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/mountains-9618595_1920.jpg" alt="雪山"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;嘿嘿，我要毕业啦！&quot;&gt;&lt;a href=&quot;#嘿嘿，我要毕业啦！&quot; class=&quot;headerlink&quot; title=&quot;嘿嘿，我要毕业啦！&quot;&gt;&lt;/a&gt;嘿嘿，我要毕业啦！&lt;/h1&gt;&lt;p&gt;6月4日，我的毕业答辩顺利结束了。&lt;br&gt;&lt;img src=&quot;https://why</summary>
      
    
    
    
    <category term="生活" scheme="https://whynotv.github.io/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="心得" scheme="https://whynotv.github.io/tags/%E5%BF%83%E5%BE%97/"/>
    
  </entry>
  
  <entry>
    <title>观《天道》有感</title>
    <link href="https://whynotv.github.io/posts/7f5b.html"/>
    <id>https://whynotv.github.io/posts/7f5b.html</id>
    <published>2025-03-17T10:18:38.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<h1 id="观《天道》有感，原作《遥远的救世主》"><a href="#观《天道》有感，原作《遥远的救世主》" class="headerlink" title="观《天道》有感，原作《遥远的救世主》"></a>观《天道》有感，原作《遥远的救世主》</h1><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/BB6CA75162096422748425D9CD093D08.png" style="width:60%;"/></div></div><h2 id="爱情篇"><a href="#爱情篇" class="headerlink" title="爱情篇"></a>爱情篇</h2><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/1D9DE5BF9CE1E0CECBF09AFA2D75FD37.png" style="width:50%;"/></div></div><p>“随缘，惜缘，不攀缘” 从一开始不要理想化一个人，固定化一个形象，非这个人不可，但是一旦碰到自己真心喜欢的人，你对她好，她也对你好，那就珍惜这段缘分，在当下好好地爱，要做好自己，不要背离自己的初心，然后对他人是有益有价值，不要攀附这段缘，要给自己和对方都有自己的独立性，自己感情和生活的空间，界限，不要迷失自我，要保留自己的“自我完整性”，也要尊重他人的“自我完整性”。<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/%E5%A4%A9%E9%81%93.png" style="width:50%;"/></div></div></p><p>女人是形式逻辑的典范，辩证逻辑的障碍</p><h2 id="思考篇"><a href="#思考篇" class="headerlink" title="思考篇"></a>思考篇</h2><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/EE6BFF6031A2039A8EB0D71C4868AA03.png" style="width:50%;"/></div></div><p>强势文化是一种以结果为导向、务实且适应规则的文化。它追求效率、竞争和创新，更注重实用主义和实际利益，重视法律和规则的权威性。</p><p>在《天道》中，丁元英认为西方资本主义文化是典型的强势文化。这种文化重视竞争、个人能力、财富创造等，这种思维方式使得个人和社会都倾向于通过努力获得经济上的成功和社会地位的提升。强势文化注重适应环境的同时对环境进行改变和影响。</p><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/17365B9BE9AF6D26490DBD18BC220220.png" style="width:50%;"/></div></div><p>弱势文化是指一种注重传统、道德和依赖性强的文化，较少关注实际利益和规则，更倾向于回避竞争和改变，具有较强的依赖性和宿命论倾向。</p><p>在《天道》中，丁元英认为中国传统文化中有部分内容属于弱势文化，特别是在面对市场经济的规则时。这种文化会偏向于安于现状、较少改变，甚至对财富和成功持保守和负面的态度。弱势文化容易产生自我设限，容易因畏惧风险而缺乏创新。</p><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/B4311F32E5E2A5A3EBCAAACCA862F29C.png" style="width:60%;"/></div></div><p>我们要自求，不是趋炎附势，主动去获取而不是等待有谁来救自己。</p><p>在时代的浪潮下，人改变命运的道路很多，强势文化并非人定胜天无所不能，人必须认识到自己的局限和边界，有时抱定着一些“笨”原则，比一味锐意进取更需要智慧，好比“人没法赚到自己认知外的钱”，同时“创业难，守业更难。”<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/6B4D2048C70D5EBE4B8DC173C18488F5.png" style="width:60%;"/></div></div></p><p><img src="https://whynot-image.oss-cn-chengdu.aliyuncs.com/img/man-4321831_1280.jpg" alt="man-4321831_1280"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;观《天道》有感，原作《遥远的救世主》&quot;&gt;&lt;a href=&quot;#观《天道》有感，原作《遥远的救世主》&quot; class=&quot;headerlink&quot; title=&quot;观《天道》有感，原作《遥远的救世主》&quot;&gt;&lt;/a&gt;观《天道》有感，原作《遥远的救世主》&lt;/h1&gt;&lt;div clas</summary>
      
    
    
    
    <category term="生活" scheme="https://whynotv.github.io/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="观后感" scheme="https://whynotv.github.io/tags/%E8%A7%82%E5%90%8E%E6%84%9F/"/>
    
  </entry>
  
  <entry>
    <title>计算机网络核心概念</title>
    <link href="https://whynotv.github.io/posts/7ff5.html"/>
    <id>https://whynotv.github.io/posts/7ff5.html</id>
    <published>2025-03-09T14:56:43.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<h3 id="浅显易懂的计算机网络核心概念解析"><a href="#浅显易懂的计算机网络核心概念解析" class="headerlink" title="浅显易懂的计算机网络核心概念解析"></a>浅显易懂的计算机网络核心概念解析</h3><h4 id="1-计算机网络是什么？"><a href="#1-计算机网络是什么？" class="headerlink" title="1. 计算机网络是什么？"></a><strong>1. 计算机网络是什么？</strong></h4><p>计算机网络就像一张“信息高速公路网”，把分散在不同地方的电脑、手机、服务器等设备连在一起，让它们能互相通信、共享资源（比如文件、打印机、网络服务）。简单来说，就是通过网线、Wi-Fi或光纤等介质，让设备能“对话”的系统 </p><h4 id="2-核心组成部分"><a href="#2-核心组成部分" class="headerlink" title="2. 核心组成部分"></a><strong>2. 核心组成部分</strong></h4><ul><li><strong>硬件</strong>：电脑、路由器、交换机、网线、光纤等物理设备。</li><li><strong>软件</strong>：浏览器、微信、网络操作系统等应用软件。</li><li>协议：设备之间通信的“语言规则”，比如TCP/IP、HTTP、Wi-Fi协议等</li></ul><h4 id="3-网络分层结构（OSI模型-vs-TCP-IP模型）"><a href="#3-网络分层结构（OSI模型-vs-TCP-IP模型）" class="headerlink" title="3. 网络分层结构（OSI模型 vs TCP/IP模型）"></a><strong>3. 网络分层结构（OSI模型 vs TCP/IP模型）</strong></h4><p><strong>OSI七层模型</strong>（理论框架）：</p><ol><li><strong>物理层</strong>：传输电信号或光信号（如网线、Wi-Fi信号）。</li><li><strong>数据链路层</strong>：通过MAC地址（如<code>00:1A:2B:3C:4D:5E</code>）在局域网内传输数据帧。</li><li><strong>网络层</strong>：用IP地址（如<code>192.168.1.1</code>）跨网络寻址和路由（路由器工作在此层）。</li><li><strong>传输层</strong>：确保数据可靠传输（TCP协议）或快速传输（UDP协议）。</li><li><strong>会话层</strong>：管理通信会话（如微信聊天连接的建立和断开）。</li><li><strong>表示层</strong>：数据加密、压缩（如HTTPS加密）。</li><li>应用层：直接面向用户的服务（如浏览器访问网页用HTTP协议）</li></ol><p><strong>TCP/IP四层模型</strong>（实际应用）：</p><ol><li><strong>网络接口层</strong>（物理+数据链路层）。</li><li><strong>互联网层</strong>（网络层）。</li><li><strong>传输层</strong>。</li><li>应用层（会话+表示+应用层）</li></ol><h4 id="4-关键协议与地址"><a href="#4-关键协议与地址" class="headerlink" title="4. 关键协议与地址"></a><strong>4. 关键协议与地址</strong></h4><ul><li><strong>IP地址</strong>：设备的“网络身份证”（如<code>192.168.1.1</code>），用于跨网络通信。</li><li>MAC地址：网卡的“物理身份证”（如<code>00:1A:2B:3C:4D:5E</code>），用于局域网内通信</li><li><strong>TCP</strong>：可靠传输协议（如文件下载），确保数据不丢失、不乱序。</li><li>UDP：快速传输协议（如视频通话），允许少量丢包但延迟低</li><li><strong>HTTP/HTTPS</strong>：网页访问协议（HTTP明文，HTTPS加密）。</li><li>DNS：将域名（如<code>www.baidu.com</code>）转换为IP地址的“电话簿”</li></ul><h4 id="5-网络设备的作用"><a href="#5-网络设备的作用" class="headerlink" title="5. 网络设备的作用"></a><strong>5. 网络设备的作用</strong></h4><ul><li><p>集线器（Hub）：无脑广播数据，所有设备共享一条“车道”，易拥堵</p></li><li><p>交换机（Switch）：智能转发数据，根据MAC地址精准送达，减少冲突</p></li><li><p>路由器（Router）：连接不同网络（如家里的Wi-Fi和互联网），通过IP地址选择最佳路径</p></li><li><p>防火墙（Firewall）：网络“保安”，监控进出流量，阻止恶意访问</p></li></ul><h4 id="6-网络类型与拓扑结构"><a href="#6-网络类型与拓扑结构" class="headerlink" title="6. 网络类型与拓扑结构"></a><strong>6. 网络类型与拓扑结构</strong></h4><ul><li>按范围分类：<ul><li><strong>局域网（LAN）</strong>：小范围（如家庭、办公室）。</li><li>广域网（WAN）：跨城市或国家（如跨国企业内网）</li></ul></li><li>拓扑结构：<ul><li><strong>星型</strong>：所有设备连到中心交换机（易管理，中心故障全瘫）。</li><li>网状型：设备多路径连接（高可靠性，适合大型网络）</li></ul></li></ul><h4 id="7-数据传输过程"><a href="#7-数据传输过程" class="headerlink" title="7. 数据传输过程"></a><strong>7. 数据传输过程</strong></h4><ol><li><strong>封装</strong>：数据从应用层到物理层，每层添加头部信息（如IP地址、端口号）。</li><li><strong>传输</strong>：通过路由器、交换机逐跳转发。</li><li>解封装：接收端从物理层到应用层逐层解析，还原原始数据</li></ol><p><strong>示例</strong>：发送微信消息时，数据会被打包成TCP段→IP数据包→数据帧，最终通过Wi-Fi信号传输 </p><h4 id="8-关键性能指标"><a href="#8-关键性能指标" class="headerlink" title="8. 关键性能指标"></a><strong>8. 关键性能指标</strong></h4><ul><li><strong>带宽</strong>：网络的“车道宽度”，单位Mbps（如100M宽带=每秒传输12.5MB数据）。</li><li>时延：数据从发送到接收的总时间，包括发送时延、传播时延（光速限制）、处理时延</li><li><strong>吞吐量</strong>：实际每秒传输的数据量（受网络拥堵影响）。</li><li>RTT（往返时延）：数据从发送到确认返回的时间，影响实时应用（如游戏）</li></ul><h4 id="9-网络安全基础"><a href="#9-网络安全基础" class="headerlink" title="9. 网络安全基础"></a><strong>9. 网络安全基础</strong></h4><ul><li><p><strong>加密</strong>：HTTPS、VPN对数据加密，防止窃听。</p></li><li><p><strong>防火墙</strong>：过滤非法访问（如黑客攻击）。</p></li><li><p>病毒与木马</p><p>：通过漏洞入侵设备，需安装杀毒软件</p></li></ul><h4 id="10-常见问题与误区"><a href="#10-常见问题与误区" class="headerlink" title="10. 常见问题与误区"></a><strong>10. 常见问题与误区</strong></h4><ul><li>“IP地址和MAC地址有什么区别？”<ul><li>IP地址是逻辑地址，随网络环境变化（如手机连不同Wi-Fi）；MAC地址是物理地址，出厂固定</li></ul></li><li>“Wi-Fi信号满格但网速慢？”<ul><li>可能是带宽不足、信道拥堵或路由器性能瓶颈</li></ul></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;浅显易懂的计算机网络核心概念解析&quot;&gt;&lt;a href=&quot;#浅显易懂的计算机网络核心概念解析&quot; class=&quot;headerlink&quot; title=&quot;浅显易懂的计算机网络核心概念解析&quot;&gt;&lt;/a&gt;浅显易懂的计算机网络核心概念解析&lt;/h3&gt;&lt;h4 id=&quot;1-计算机网络是什</summary>
      
    
    
    
    
    <category term="计网" scheme="https://whynotv.github.io/tags/%E8%AE%A1%E7%BD%91/"/>
    
  </entry>
  
  <entry>
    <title>技巧提升</title>
    <link href="https://whynotv.github.io/posts/d435.html"/>
    <id>https://whynotv.github.io/posts/d435.html</id>
    <published>2024-09-18T11:43:55.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<h1 id="学习技巧"><a href="#学习技巧" class="headerlink" title="学习技巧"></a>学习技巧</h1><h2 id="使用AI小技巧"><a href="#使用AI小技巧" class="headerlink" title="使用AI小技巧"></a>使用AI小技巧</h2><ul><li>使用元问题提问<br>我想深入全面的学习了解“xxx”相关的知识，我应该问你什么问题？请至少列出20个。(使用大模型，不用搜索功能)<br>然后再根据给出的20个问题，逐个问perplexity，它会有相关的5个问题，在第二轮可以根据延升继续问<br>Round1-20个 Round2-100个</li><li>英文提问x沉浸式翻译<br>英语提问 然后回答的英语 直接用插件翻译</li><li>限定字数 （不限定字数 回答可能字数很少，限定字数 回答会尽可能的多）</li><li>找资料<br>帮我找xxx的链接</li><li>如果想短期了解一个行业或者什么的 试着一天之内围绕一个专题</li></ul><h2 id="脑图的使用"><a href="#脑图的使用" class="headerlink" title="脑图的使用"></a>脑图的使用</h2><ul><li><p>快捷键<br>Ctrl + K 添加超链接<br>Ctrl + T 添加注释<br>Ctrl + F 查找替换<br>Ctrl + R 插入关系线<br>Ctrl + 12345 添加优先级</p><p>Alt + 1 收起<br>Alt + 0 展开所有<br>Alt + d 依次展开主题</p></li><li><p>学习、复习记录</p></li><li><p>思考<br>浮动主题功能 双击空白处</p><p>首先是有个大主题<br>然后想到什么写什么<br>然后对这些进行分类</p></li><li><p>工作<br>做计划<br>会议管理<br>会议演示<br>任务管理<br>项目管理</p></li></ul><h2 id="Anki卡片"><a href="#Anki卡片" class="headerlink" title="Anki卡片"></a>Anki卡片</h2><blockquote><p>Anki 是一款基于间隔重复原理的记忆卡片软件，旨在帮助用户更高效地记忆各种信息。其名称源自日语“暗记”，意为“记忆”或“背诵”。</p></blockquote><p><a href="http://www.ankichina.net/manual/anki">Anki使用文档中文版</a><br><a href="https://utgd.net/article/9595">快速入门了解</a></p><h4 id="初步了解Anki"><a href="#初步了解Anki" class="headerlink" title="初步了解Anki"></a>初步了解Anki</h4><p>使用Anki的核心就是 牌组跟卡片</p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240918111054965.png" alt="image-20240918111054965"></p><p>牌组就是分类，把不同的卡片归类于不同的牌组，方便分类记忆</p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240918111232091.png" alt="image-20240918111232091"></p><p>卡片的使用就是 问题 —&gt; 答案 使用Anki的好处 可以设置复习 定期提醒 不像记笔记记了就不去看了</p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240918111440451.png" alt="image-20240918111440451"></p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240918111454557.png" alt="image-20240918111454557"></p><p>还有一个点就是，所有问题、答案、笔记 都自己手动添加，自己整理的才是适合自己的。</p><p>可以使用别人的笔记模板，无非是多了一些字段，卡片格式会更好一些。<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240918111807524.png" alt="image-20240918111807524" style="zoom:50%;" /><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240918111657530.png" alt="image-20240918111657530"></p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240918111905141.png" alt="image-20240918111905141"></p><h4 id="使用卡片"><a href="#使用卡片" class="headerlink" title="使用卡片"></a>使用卡片</h4><p>开始学习<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240918112243434.png" alt="image-20240918112243434"></p><p>回忆答案，然后再显示答案</p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240918112324075.png" alt="image-20240918112324075"></p><p>选择下面的评分，Anki利用评分的算法来给你设置复习的时间…</p><p>需要对每次复习的卡片进行新的知识补充 点击左边的编辑就好了。</p><h4 id="关于卡片同步"><a href="#关于卡片同步" class="headerlink" title="关于卡片同步"></a>关于卡片同步</h4><p>多平台同步，登录账号就ok<br>ios的Anki需要付费168好像，解决方案是… 暂时没找到解决方案 可以尝试的方案（卡片导出，然后下载能导入.apkg格式的app，可以解决）</p><p>安卓可以直接下载安卓版</p><h4 id="模板下载"><a href="#模板下载" class="headerlink" title="模板下载"></a>模板下载</h4><p>找我发给你</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;学习技巧&quot;&gt;&lt;a href=&quot;#学习技巧&quot; class=&quot;headerlink&quot; title=&quot;学习技巧&quot;&gt;&lt;/a&gt;学习技巧&lt;/h1&gt;&lt;h2 id=&quot;使用AI小技巧&quot;&gt;&lt;a href=&quot;#使用AI小技巧&quot; class=&quot;headerlink&quot; title=&quot;使用A</summary>
      
    
    
    
    <category term="技术" scheme="https://whynotv.github.io/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="效率" scheme="https://whynotv.github.io/tags/%E6%95%88%E7%8E%87/"/>
    
  </entry>
  
  <entry>
    <title>近期感悟</title>
    <link href="https://whynotv.github.io/posts/28df.html"/>
    <id>https://whynotv.github.io/posts/28df.html</id>
    <published>2024-09-14T15:25:33.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<h1 id="九月"><a href="#九月" class="headerlink" title="九月"></a>九月</h1><p>焦虑、迷茫、不安一定是伴随着这一年的，尤其是我选择的是就业，学习Java开发断断续续地，Java基础、JavaWeb、SpringBoot、用户中心系统（学习，部署，上线，上线了还有点问题，感觉是跨越问题，emmm不清楚 有空了再调一下。），域名、服务器，域名还是备案成功了，后期再做两个项目部署上去…</p><p>为什么焦虑呢，我的选择真的有点晚了，寒假感情不顺，然后选择好好搞技术，24年开头才开始学呢，然后慢慢地就到了9月份，秋招时间来了，但是我的项目还没有落实，八股文也没有背，刷题也没有刷，SpringCloud还没学，就是差很多东西，是吧。。。</p><p>实训课，唯一听的一点就是，老师在讲考研、考公、就业。。。</p><blockquote><p>教师以后要裁员  研究生去教幼儿园  大专的GG<br>考公<br>1.如果你要钱，就不去，因为如果突发<br>2.最好有关系，不然G，因为就算公务员不能直系，但是可以交换进比如你国电领导和烟草领导说好各接受自己的子女，然后交换垄断<br>3.不自由，护照有限制，车子，电话品牌被限制<br>4.你想辞职都难，而且容易被调，一调难回<br>5.西部计划什么的，都是吃苦，难提升<br>考研：<br>1.要明确自己位置<br>2.我们专业后面有前途<br>3.但是保研名额增加是双非增加<br>4.考研上岸主要还是复试，复试1分当考研6分<br>5.考研如果进不了92，导师不好GG，最好别去<br>就业<br>1.抓住校园招聘，校招不代表只能本校参加，你可以去985参加，大厂多<br>2.最好先进大厂，大城市，后面跳槽好跳</p></blockquote><p>  很真实，反正目前大家都是牛马了，看哪匹牛哪匹马能在群牛马里脱颖而出</p><p>  秋招估计是寄了，差点准备，差点心态，现在就是全力准备春招提前批了<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/ec6b42fc0824ea9da4278a3ca5ee43c7.png" alt="校招图"></p><p>  这个我觉得还是有点用<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/9ce73c17aa26be733a3eb73a7bb410c8.png" alt="校招把握"></p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/f40f89c94e46089257655cda49eb4314.png" alt="途径"></p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/431cec0641c7bdbe02d680a9167208c2.png" alt="过程"></p><p>现在的状态就是，八股文、面试题、算法刷题、项目、以及SpringCloud的学习，需要自己的持续性输出，不能懈怠，六级也要准备（嘻嘻嘻，这次真得下功夫了，不然六级真过不了。。。那就太糟糕了。）</p><p>自己心态还是要放平，就算天塌下来了，也要有passion，完成自己的mission，不然就真毕业失业，然后转业。。。</p><p>还有就是，没真正了解你具体情况的，你不要受他们的影响，他们什么都不懂，你坚定自己的方向就好啦，最后都是结果论，走到那一步再说。</p><p>最后还是跟自己说一句：干就完事儿，关关难过关关过！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;九月&quot;&gt;&lt;a href=&quot;#九月&quot; class=&quot;headerlink&quot; title=&quot;九月&quot;&gt;&lt;/a&gt;九月&lt;/h1&gt;&lt;p&gt;焦虑、迷茫、不安一定是伴随着这一年的，尤其是我选择的是就业，学习Java开发断断续续地，Java基础、JavaWeb、SpringBoot、</summary>
      
    
    
    
    <category term="生活" scheme="https://whynotv.github.io/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="随想" scheme="https://whynotv.github.io/tags/%E9%9A%8F%E6%83%B3/"/>
    
  </entry>
  
  <entry>
    <title>咕咕の用户中心</title>
    <link href="https://whynotv.github.io/posts/1854.html"/>
    <id>https://whynotv.github.io/posts/1854.html</id>
    <published>2024-08-24T20:35:18.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<h1 id="咕咕の用户中心"><a href="#咕咕の用户中心" class="headerlink" title="咕咕の用户中心"></a>咕咕の用户中心</h1><h2 id="项目回顾"><a href="#项目回顾" class="headerlink" title="项目回顾"></a>项目回顾</h2><p>1、<strong>开发规范-REST</strong>前后端分离，各自专注于各自的工作，一定要在开发过程编写一个<strong>接口文档</strong>，前后端都按照接口文档选用api，后端测试方法的时候可以按照接口文档通过Postman进行测试，后端测试好，写前端，再进行前后端联调。<br>2、准备对应的Controller、Service（接口、实现类）、Mapper基础结构<br>3、环境搭建 创建SpringBoot工程，引入对应的起步依赖(pom.xml)—&gt; 配置文件application.yml 中引入mybatis，准备对应的实体类<br>4、Controller-&gt;Service-&gt;Mapper 编写流程<br>5、项目工程结构应该按照如下 controller、mapper、pojo、service （但是这个项目呢，做的时候没有这么来，之后慢慢调整）<br>    <img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20221213222039985.png" alt="项目工程结构"></p><p>Controller、Service(接口、实现类)和Mapper的基础结构及其规范如下:</p><ol><li><p>Controller层:<br>结构:</p><ul><li>使用@RestController或@Controller注解标记</li><li>定义请求映射方法,处理HTTP请求</li><li>调用Service层方法处理业务逻辑<br>规范:</li><li>只负责请求参数的接收和结果的返回</li><li>不包含业务逻辑,将业务处理委托给Service层</li><li>方法命名应体现功能,如listUsers(), createOrder()等</li><li>统一的异常处理和返回结果封装</li></ul></li><li><p>Service层:<br>结构:</p><ul><li>接口:定义业务方法</li><li>实现类:实现接口中定义的方法,包含具体业务逻辑<br>规范:</li><li>接口命名为IXxxService,实现类命名为XxxServiceImpl</li><li>包含核心业务逻辑</li><li>调用Mapper层进行数据操作</li><li>方法命名应体现业务含义</li><li>使用事务管理保证数据一致性</li></ul></li><li><p>Mapper层:<br>结构:</p><ul><li>接口:定义数据库操作方法</li><li>XML文件:编写SQL语句<br>规范:</li><li>接口与XML文件一一对应</li><li>方法命名规范,如insert, update, delete, select等</li><li>SQL语句应优化以提高性能</li></ul></li></ol><p>这样分层的主要目的是:</p><ol><li>职责分离:每一层负责特定的功能,降低耦合</li><li>提高可维护性:修改某一层不会影响其他层</li><li>利于测试:可以对每一层单独进行单元测试</li><li>提高复用性:Service层可以被多个Controller调用</li><li>便于团队协作:不同开发人员可以专注于不同的层</li></ol><p>通过这种分层结构,可以使代码更加清晰、易于维护和扩展。在实际开发中应该严格遵循这些规范,以保证项目的质量和可维护性。</p><h2 id="企业做项目流程"><a href="#企业做项目流程" class="headerlink" title="企业做项目流程"></a>企业做项目流程</h2><p>需求分析 =&gt; 设计（概要设计、详细设计）=&gt; 技术选型 =&gt; 初始化 / 引入需要的技术 =&gt; 写 Demo =&gt; 写代码（实现业务逻辑） =&gt; 测试（单元测试、系统测试）=&gt; 代码提交 / 代码评审 =&gt; 部署 =&gt; 发布上线</p><h2 id="团队职责"><a href="#团队职责" class="headerlink" title="团队职责"></a>团队职责</h2><ol><li>产品经理:</li></ol><ul><li>市场调研和需求分析</li><li>产品定义和规划</li><li>编写产品需求文档(PRD)</li><li>用户界面和交互设计</li><li>协调各方资源,推进项目进度</li><li>产品发布后的数据分析和迭代优化</li></ul><ol><li>前端开发:</li></ol><ul><li>参与需求评审,提出前端相关建议</li><li>技术方案设计</li><li>页面重构和视觉还原</li><li>前端功能开发</li><li>与后端进行接口联调</li><li>前端自测</li><li>配合测试修复bug</li><li>性能优化</li></ul><ol><li>后端开发:</li></ol><ul><li>参与需求分析,设计系统架构</li><li>数据库设计</li><li>编写API接口文档</li><li>后端功能开发和单元测试</li><li>与前端联调接口</li><li>系统集成测试</li><li>性能调优和安全加固</li><li>部署上线</li></ul><p>整体流程:</p><ol><li>需求分析</li><li>产品设计</li><li>技术方案(初步编写API接口文档)</li><li>开发实现</li><li>测试</li><li>发布上线</li><li>运维和迭代</li></ol><p>在实际项目中,三个角色需要紧密配合,相互沟通,共同推进项目进度。产品经理起到统筹协调的作用,前后端则专注于各自的技术实现。整个过程是迭代循环的,需要不断优化改进。</p><hr><h2 id="Bug优化"><a href="#Bug优化" class="headerlink" title="Bug优化"></a>Bug优化</h2><h4 id="bug优化"><a href="#bug优化" class="headerlink" title="bug优化"></a>bug优化</h4><ul><li>id自增 由于Mybatis-plus框架可能版本问题原因 导致每次新增数据的id 生成19位且随机(因为mybatis-plus默认主键策略 使用了雪花算法导致的 )<br>解决方案—-&gt; 实体类中 user 设置主键策略，同时将表的数据清除，重新添加数据。</li></ul><p>确保在实体类中设置了正确的主键策略。可以在<code>@TableId</code>注解中指定<code>IdType.AUTO</code>，以使用数据库的自增ID功能。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">java<span class="meta">@TableId(value = &quot;id&quot;, type = IdType.AUTO)</span></span><br><span class="line"><span class="keyword">private</span> Long id;</span><br></pre></td></tr></table></figure><hr><h2 id="需求分析"><a href="#需求分析" class="headerlink" title="需求分析"></a>需求分析</h2><ol><li>登录 / 注册</li><li>用户管理（仅管理员可见，实际就是后台管理后续可以扩充更多功能）对用户的查询或者修改</li><li>用户校验（注册时填写星球编号）</li></ol><h2 id="技术选型"><a href="#技术选型" class="headerlink" title="技术选型"></a>技术选型</h2><p>前端：三件套 + React + 组件库 Ant Design + Umi + Ant Design Pro（现成的管理系统）</p><p>后端：</p><ul><li>java</li><li>spring（依赖注入框架，帮助你管理 Java 对象，集成一些其他的内容）</li><li>springmvc（web 框架，提供接口访问、restful接口等能力）</li><li>mybatis（Java 操作数据库的框架，持久层框架，对 jdbc 的封装）</li><li>mybatis-plus（对 mybatis 的增强，不用写 sql 也能实现增删改查）</li><li>springboot（<strong>快速启动</strong> / 快速集成项目。不用自己管理 spring 配置，不用自己整合各种框架）</li><li>junit 单元测试库</li><li>mysql 数据库</li></ul><p>部署：服务器 / 容器（平台）</p><h2 id="初始化-Java-项目的方式"><a href="#初始化-Java-项目的方式" class="headerlink" title="初始化 Java 项目的方式"></a>初始化 Java 项目的方式</h2><p> 直接在 IDEA 开发工具中生成  ✔</p><p>如果要引入 java 的包，可以去 maven 中心仓库寻找（<a href="http://mvnrepository.com/）">http://mvnrepository.com/）</a></p><h2 id="数据库设计"><a href="#数据库设计" class="headerlink" title="数据库设计"></a>数据库设计</h2><p>什么是数据库？存数据的</p><p>数据库里有什么？数据表（理解为 excel 表格）</p><p>java 操作数据库？程序代替人工</p><h3 id="什么是设计数据库表？"><a href="#什么是设计数据库表？" class="headerlink" title="什么是设计数据库表？"></a>什么是设计数据库表？</h3><p>有哪些表（模型）？表中有哪些字段？字段的类型？数据库字段添加索引？表与表之间的关联？</p><h3 id="用户表设计"><a href="#用户表设计" class="headerlink" title="用户表设计"></a>用户表设计</h3><p>id（主键）bigint</p><p>username 昵称  varchar</p><p>userAccount 登录账号 </p><p>avatarUrl 头像 varchar</p><p>gender 性别 tinyint</p><p>userPassword 密码  varchar</p><p>phone 电话 varchar</p><p>email 邮箱 varchar</p><p>userStatus 用户状态 int  0 - 正常 </p><p>createTime 创建时间（数据插入时间）datetime</p><p>updateTime 更新时间（数据更新时间）datetime</p><p>isDelete 是否删除 0 1（逻辑删除）tinyint</p><p>userRole 用户角色 0 - 普通用户 1 - 管理员</p><p>开发过程 有需要添加的可以后续添加</p><p>planetCode 用户标识码，连通其他业务</p><h3 id="自动生成器的使用"><a href="#自动生成器的使用" class="headerlink" title="自动生成器的使用"></a>自动生成器的使用</h3><p>MyBatisX 插件，自动根据数据库生成：</p><ul><li>domain：实体对象</li><li>mapper：操作数据库的对象</li><li>mapper.xml：定义了 mapper 对象和数据库的关联，可以在里面自己写 SQL</li><li>service：包含常用的增删改查</li><li>serviceImpl：具体实现 service</li></ul><p>从而提高开发效率！</p><h2 id="注册逻辑设计"><a href="#注册逻辑设计" class="headerlink" title="注册逻辑设计"></a>注册逻辑设计</h2><ol><li>用户在前端输入账户和密码、以及校验码（todo）</li><li>校验用户的账户、密码、校验密码，是否符合要求<ol><li>非空</li><li>账户长度 <strong>不小于</strong> 4 位</li><li>密码就 <strong>不小于</strong> 8 位吧</li><li>账户不能重复</li><li>账户不包含特殊字符</li><li>密码和校验密码相同</li></ol></li><li>对密码进行加密（密码千万不要直接以明文存储到数据库中）</li><li>向数据库插入用户数据</li></ol><h2 id="登录功能"><a href="#登录功能" class="headerlink" title="登录功能"></a>登录功能</h2><h3 id="接口设计"><a href="#接口设计" class="headerlink" title="接口设计"></a>接口设计</h3><p>接受参数：用户账户、密码</p><p>请求类型：POST </p><p>请求体：JSON 格式的数据</p><blockquote><p>请求参数很长时不建议用 get</p></blockquote><p>返回值：用户信息（ <strong>脱敏</strong> ）</p><h3 id="登录逻辑"><a href="#登录逻辑" class="headerlink" title="登录逻辑"></a>登录逻辑</h3><ol><li><p>校验用户账户和密码是否合法</p><ol><li>非空</li><li>账户长度不小于 4 位</li><li>密码就不小于 8 位</li><li>账户不包含特殊字符</li></ol></li><li><p>校验密码是否输入正确，要和数据库中的密文密码去对比</p></li><li><p>用户信息脱敏，隐藏敏感信息，防止数据库中的字段泄露</p></li><li><p>我们要记录用户的登录态（session），将其存到服务器上（用后端 SpringBoot 框架封装的服务器 tomcat 去记录）</p><p>cookie</p></li><li><p>返回脱敏后的用户信息</p></li></ol><h3 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h3><p>控制层 Controller 封装请求</p><p>application.yml 指定接口全局路径前缀：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">servlet:</span><br><span class="line">  context-path: /api</span><br></pre></td></tr></table></figure><p>控制器注解：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@RestController 适用于编写 restful 风格的 api，返回值默认为 json 类型</span><br></pre></td></tr></table></figure><p>校验写在哪里？</p><ul><li>controller 层倾向于对请求参数本身的校验，不涉及业务逻辑本身（越少越好）</li><li>service 层是对业务逻辑的校验（有可能被 controller 之外的类调用）</li></ul><h3 id="如何知道是哪个用户登录了？"><a href="#如何知道是哪个用户登录了？" class="headerlink" title="如何知道是哪个用户登录了？"></a>如何知道是哪个用户登录了？</h3><ol><li><p>连接服务器端后，得到一个 session 状态（匿名会话），返回给前端</p></li><li><p>登录成功后，得到了登录成功的 session，并且给该session设置一些值（比如用户信息），返回给前端一个设置 cookie 的 ”命令“ </p><p><strong>session =&gt; cookie</strong> </p></li><li><p>前端接收到后端的命令后，设置 cookie，保存到浏览器内</p></li><li><p>前端再次请求后端的时候（相同的域名），在请求头中带上cookie去请求</p></li><li><p>后端拿到前端传来的 cookie，找到对应的 session</p></li><li><p>后端从 session 中可以取出基于该 session 存储的变量（用户的登录信息、登录名）</p></li></ol><h2 id="用户管理"><a href="#用户管理" class="headerlink" title="用户管理"></a>用户管理</h2><p>接口设计关键：必须鉴权！！！</p><ol><li>查询用户（允许根据用户名查询）</li><li>删除用户</li><li>编辑用户信息</li></ol><h2 id="写代码流程"><a href="#写代码流程" class="headerlink" title="写代码流程"></a>写代码流程</h2><ol><li>先做设计</li><li>代码实现</li><li>持续优化！！！（复用代码、提取公共逻辑 / 常量）</li></ol><h2 id="前后端交互"><a href="#前后端交互" class="headerlink" title="前后端交互"></a>前后端交互</h2><p>前端需要向后端发送请求才能获取数据 / 执行操作。</p><p>怎么发请求：前端使用 ajax 来请求后端</p><h3 id="前端请求库及封装关系"><a href="#前端请求库及封装关系" class="headerlink" title="前端请求库及封装关系"></a>前端请求库及封装关系</h3><ul><li><p>axios 封装了 ajax</p></li><li><p>request 是 ant design 项目又封装了一次</p></li></ul><p>追踪 request 源码：用到了 umi 的插件、requestConfig 配置文件</p><h2 id="代理"><a href="#代理" class="headerlink" title="代理"></a>代理</h2><p>正向代理：替客户端向服务器发送请求，可以解决跨域问题</p><p>反向代理：替服务器统一接收请求。</p><p>怎么实现代理？</p><ul><li>Nginx 服务器</li><li>Node.js 服务器</li></ul><h3 id="举例"><a href="#举例" class="headerlink" title="举例"></a>举例</h3><p>原本请求：<a href="http://localhost:8000/api/user/login">http://localhost:8000/api/user/login</a></p><p>代理到请求：<a href="http://localhost:8080/api/user/login">http://localhost:8080/api/user/login</a></p><h2 id="前端框架介绍"><a href="#前端框架介绍" class="headerlink" title="前端框架介绍"></a>前端框架介绍</h2><h3 id="Ant-Design-Pro（Umi-框架）权限管理"><a href="#Ant-Design-Pro（Umi-框架）权限管理" class="headerlink" title="Ant Design Pro（Umi 框架）权限管理"></a>Ant Design Pro（Umi 框架）权限管理</h3><ul><li>app.tsx：项目全局入口文件，定义了整个项目中使用的公共数据（比如用户信息）</li><li>access.ts 控制用户的访问权限</li></ul><p>获取初始状态流程：首次访问页面（刷新页面），进入 app.tsx，执行 getInitialState 方法，该方法的返回值就是全局可用的状态值。</p><h3 id="ProComponents-高级表单"><a href="#ProComponents-高级表单" class="headerlink" title="ProComponents 高级表单"></a>ProComponents 高级表单</h3><ol><li>通过 columns 定义表格有哪些列</li><li>columns 属性<ul><li>dataIndex 对应返回数据对象的属性</li><li>title 表格列名</li><li>copyable 是否允许复制</li><li>ellipsis 是否允许缩略</li><li>valueType：用于声明这一列的类型（dateTime、select）</li></ul></li></ol><h3 id="框架关系"><a href="#框架关系" class="headerlink" title="框架关系"></a>框架关系</h3><p>Ant Design 组件库 =&gt; 基于 React 实现</p><p>Ant Design Procomponents =&gt; 基于 Ant Design 实现</p><p>Ant Design Pro 后台管理系统 =&gt; 基于 Ant Design + React + Ant Design Procomponents + 其他的库实现</p><h3 id="其他知识"><a href="#其他知识" class="headerlink" title="其他知识"></a>其他知识</h3><p>MFSU：前端编译优化</p><h2 id="后端优化"><a href="#后端优化" class="headerlink" title="后端优化"></a>后端优化</h2><h3 id="通用返回对象"><a href="#通用返回对象" class="headerlink" title="通用返回对象"></a>通用返回对象</h3><p>目的：给对象补充一些信息，告诉前端这个请求在业务层面上是成功还是失败</p><p>200、404、500、502、503</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;yupi&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line">↓</span><br><span class="line"></span><br><span class="line"><span class="comment">// 成功</span></span><br><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;code&quot;</span><span class="punctuation">:</span> <span class="number">0</span> <span class="comment">// 业务状态码</span></span><br><span class="line">    <span class="attr">&quot;data&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;whynot&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;message&quot;</span><span class="punctuation">:</span> <span class="string">&quot;ok&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// 错误</span></span><br><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;code&quot;</span><span class="punctuation">:</span> <span class="number">50001</span> <span class="comment">// 业务状态码</span></span><br><span class="line">    <span class="attr">&quot;data&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line"><span class="attr">&quot;message&quot;</span><span class="punctuation">:</span> <span class="string">&quot;用户操作异常、xxx&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>自定义错误码，返回类支持返回正常和错误</p><h3 id="封装全局异常处理器"><a href="#封装全局异常处理器" class="headerlink" title="封装全局异常处理器"></a>封装全局异常处理器</h3><h3 id="实现-1"><a href="#实现-1" class="headerlink" title="实现"></a>实现</h3><ol><li><p>定义业务异常类</p><ol><li>相对于 java 的异常类，支持更多字段</li><li>自定义构造函数，更灵活 / 快捷的设置字段</li></ol></li><li>编写全局异常处理器（利用 Spring AOP，在调用方法前后进行额外的处理）</li></ol><h3 id="作用"><a href="#作用" class="headerlink" title="作用"></a>作用</h3><ol><li>捕获代码中所有的异常，内部消化，让前端得到更详细的业务报错 / 信息</li><li>同时屏蔽掉项目框架本身的异常（不暴露服务器内部状态）</li><li>集中处理，比如记录日志</li></ol><h2 id="前端优化"><a href="#前端优化" class="headerlink" title="前端优化"></a>前端优化</h2><h3 id="全局响应处理"><a href="#全局响应处理" class="headerlink" title="全局响应处理"></a>全局响应处理</h3><p>应用场景：我们需要对接口的 <strong>通用响应</strong> 进行统一处理，比如从 response 中取出 data；或者根据 code 去集中处理错误，比如用户未登录、没权限之类的。</p><p>优势：不用在每个接口请求中都去写相同的逻辑</p><p>实现：参考你用的请求封装工具的官方文档，比如 umi-request（<a href="https://github.com/umijs/umi-request#interceptor、https://blog.csdn.net/huantai3334/article/details/116780020）。如果你用">https://github.com/umijs/umi-request#interceptor、https://blog.csdn.net/huantai3334/article/details/116780020）。如果你用</a> <strong>axios</strong>，参考 axios 的文档。</p><p>创建新的文件，在该文件中配置一个全局请求类。在发送请求时，使用我们自己的定义的全局请求类。</p><h2 id="用户校验"><a href="#用户校验" class="headerlink" title="用户校验"></a>用户校验</h2><blockquote><p>仅适用于用户可信的情况</p></blockquote><p>先让用户自己填：2 - 5 位编号，全凭自觉。</p><p>后台补充对编号的校验：长度校验、唯一性校验</p><p>前端补充输入框，适配后端。</p><blockquote><p>后期弄一个业务码，有业务码才能注册捏</p></blockquote><h2 id="多环境"><a href="#多环境" class="headerlink" title="多环境"></a>多环境</h2><p>参考文章：<a href="https://blog.csdn.net/weixin_41701290/article/details/120173283">https://blog.csdn.net/weixin_41701290/article/details/120173283</a></p><p>本地开发：localhost（127.0.0.1）</p><p>多环境：指同一套项目代码在不同的阶段需要根据实际情况来调整配置并且部署到不同的机器上。</p><p>为什么需要？</p><ol><li>每个环境互不影响</li><li>区分不同的阶段：开发 / 测试 / 生产</li><li>对项目进行优化：<ol><li>本地日志级别</li><li>精简依赖，节省项目体积</li><li>项目的环境 / 参数可以调整，比如 JVM 参数</li></ol></li></ol><p>针对不同环境做不同的事情。</p><p>多环境分类：</p><ol><li>本地环境（自己的电脑）localhost</li><li>开发环境（远程开发）大家连同一台机器，为了大家开发方便</li><li>测试环境（测试）开发 / 测试 / 产品，单元测试 / 性能测试 / 功能测试 / 系统集成测试，独立的数据库、独立的服务器</li><li>预发布环境（体验服）：和正式环境一致，正式数据库，更严谨，查出更多问题</li><li>正式环境（线上，公开对外访问的项目）：尽量不要改动，保证上线前的代码是 “完美” 运行</li><li>沙箱环境（实验环境）：为了做实验</li></ol><h3 id="前端多环境实战"><a href="#前端多环境实战" class="headerlink" title="前端多环境实战"></a>前端多环境实战</h3><ul><li><p>请求地址</p><ul><li><p>开发环境：localhost:8000</p></li><li><p>线上环境：user-backend.code-nav.cn</p></li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_">startFront</span>(<span class="params">env</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span>(env === <span class="string">&#x27;prod&#x27;</span>) &#123;</span><br><span class="line">        <span class="comment">// 不输出注释 </span></span><br><span class="line">        <span class="comment">// 项目优化</span></span><br><span class="line">        <span class="comment">// 修改请求地址</span></span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="comment">// 保持本地开发逻辑</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>用了 umi 框架，build 时会自动传入 NODE_ENV == production 参数，start NODE_ENV 参数为 development</p></li><li><p>启动方式</p><ul><li>开发环境：npm run start（本地启动，监听端口、自动更新）</li><li>线上环境：npm run build（项目构建打包），可以使用 serve 工具启动（npm i -g serve）</li></ul></li><li><p>项目的配置</p><p>不同的项目（框架）都有不同的配置文件，umi 的配置文件是 config，可以在配置文件后添加对应的环境名称后缀来区分开发环境和生产环境。参考文档：<a href="https://umijs.org/zh-CN/docs/deployment">https://umijs.org/zh-CN/docs/deployment</a></p><ul><li>开发环境：config.dev.ts</li><li>生产环境：config.prod.ts</li><li>公共配置：config.ts 不带后缀</li></ul></li></ul><h3 id="后端多环境实战"><a href="#后端多环境实战" class="headerlink" title="后端多环境实战"></a>后端多环境实战</h3><p>SpringBoot 项目，通过 application.yml 添加不同的后缀来区分配置文件</p><p>可以在启动项目时传入环境变量：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java -jar .\user-center-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod</span><br></pre></td></tr></table></figure><p>主要是改：</p><ul><li><p>依赖的环境地址</p><ul><li><p>数据库地址</p></li><li><p>缓存地址</p></li><li><p>消息队列地址</p></li><li><p>项目端口号</p></li></ul></li><li><p>服务器配置</p></li></ul><h2 id="项目部署"><a href="#项目部署" class="headerlink" title="项目部署"></a>项目部署</h2><p>参考文章：<a href="https://www.bilibili.com/read/cv16179200">https://www.bilibili.com/read/cv16179200</a></p><p>需要 Linux 服务器（建议大家用 CentOS 8+ / 7.6 以上）</p><h3 id="原始部署"><a href="#原始部署" class="headerlink" title="原始部署"></a>原始部署</h3><p>什么都自己装</p><h4 id="前端"><a href="#前端" class="headerlink" title="前端"></a>前端</h4><p>需要 web 服务器：<strong>nginx</strong> 、apache、tomcat</p><p>安装 nginx 服务器：</p><ol><li><p>用系统自带的软件包管理器快速安装，比如 centos 的 yum</p></li><li><p>自己到官网安装（参考文章）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">curl -o nginx-1.21.6.tar.gz http://nginx.org/download/nginx-1.21.6.tar.gz</span><br><span class="line"></span><br><span class="line">tar -zxvf nginx-1.21.6.tar.gz</span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span> nginx-1.21.6</span><br><span class="line"></span><br><span class="line">   37  2022-04-17 23:30:09 yum install pcre pcre-devel -y</span><br><span class="line">   39  2022-04-17 23:30:59 yum install openssl openssl-devel -y</span><br><span class="line">   41  2022-04-17 23:31:57 ./configure --with-http_ssl_module --with-http_v2_module --with-stream</span><br><span class="line">   42  2022-04-17 23:32:13 make</span><br><span class="line">   43  2022-04-17 23:32:54 make install</span><br><span class="line">   48  2022-04-17 23:33:40 <span class="built_in">ls</span> /usr/local/nginx/sbin/nginx</span><br><span class="line">   vim /etc/profile</span><br><span class="line">  在最后一行添加：<span class="built_in">export</span> PATH=<span class="variable">$PATH</span>:/usr/local/nginx/sbin</span><br><span class="line">  </span><br><span class="line">  nginx</span><br><span class="line">  </span><br><span class="line">  netstat -ntlp 查看启动情况</span><br></pre></td></tr></table></figure><p>注意 nginx 权限</p></li></ol><h4 id="后端"><a href="#后端" class="headerlink" title="后端"></a>后端</h4><p>java、maven</p><p>安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">yum install -y java-1.8.0-openjdk*</span><br><span class="line"></span><br><span class="line">curl -o apache-maven-3.8.5-bin.tar.gz https://dlcdn.apache.org/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz</span><br><span class="line"></span><br><span class="line">git <span class="built_in">clone</span> xxx 下载代码</span><br><span class="line"></span><br><span class="line">打包构建，跳过测试</span><br><span class="line">mvn package -DskipTests</span><br><span class="line"></span><br><span class="line">java -jar ./user-center-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod</span><br></pre></td></tr></table></figure><h3 id="宝塔-Linux-部署"><a href="#宝塔-Linux-部署" class="headerlink" title="宝塔 Linux 部署"></a>宝塔 Linux 部署</h3><p>Linux 运维面板</p><p>官方安装教程：<a href="https://www.bt.cn/new/download.html">https://www.bt.cn/new/download.html</a></p><p>方便管理服务器、方便安装软件</p><h3 id="前端托管"><a href="#前端托管" class="headerlink" title="前端托管"></a>前端托管</h3><p>前端腾讯云 web 应用托管（比容器化更傻瓜式，不需要自己写构建应用的命令，就能启动前端项目）</p><blockquote><p><a href="https://console.cloud.tencent.com/webify/new">https://console.cloud.tencent.com/webify/new</a></p></blockquote><ul><li>小缺点：需要将代码放到代码托管平台上</li><li>优势：不用写命令、代码更新时自动构建</li></ul><h3 id="Docker-部署"><a href="#Docker-部署" class="headerlink" title="Docker 部署"></a>Docker 部署</h3><p>docker 是容器，可以将项目的环境（比如 java、nginx）和项目的代码一起打包成镜像，所有同学都能下载镜像，更容易分发和移植。</p><p>再启动项目时，不需要敲一大堆命令，而是直接下载镜像、启动镜像就可以了。</p><p>docker 可以理解为软件安装包。</p><p>Docker 安装：<a href="https://www.docker.com/get-started/">https://www.docker.com/get-started/</a> 或者宝塔安装</p><p>Dockerfile 用于指定构建 Docker 镜像的方法</p><p>Dockerfile 一般情况下不需要完全从 0 自己写，建议去 github、gitee 等托管平台参考同类项目（比如 springboot）</p><p>Dockerfile 编写：</p><ul><li>FROM 依赖的基础镜像</li><li>WORKDIR 工作目录</li><li>COPY 从本机复制文件</li><li>RUN 执行命令</li><li>CMD / ENTRYPOINT（附加额外参数）指定运行容器时默认执行的命令</li></ul><p>根据 Dockerfile 构建镜像：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 后端</span></span><br><span class="line">docker build -t user-center-backend:v0.0.1 .</span><br><span class="line"></span><br><span class="line"><span class="comment"># 前端</span></span><br><span class="line">docker build -t user-center-front:v0.0.1 .</span><br></pre></td></tr></table></figure><p>Docker 构建优化：减少尺寸、减少构建时间（比如多阶段构建，可以丢弃之前阶段不需要的内容）</p><p>docker run 启动：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 前端</span></span><br><span class="line">docker run -p 80:80 -d user-center-frontend:v0.0.1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 后端</span></span><br><span class="line">docker run -p 8080:8080 user-center-backend:v0.0.1</span><br></pre></td></tr></table></figure><p>虚拟化</p><ol><li>端口映射：把本机的资源（实际访问地址）和容器内部的资源（应用启动端口）进行关联</li><li>目录映射：把本机的端口和容器应用的端口进行关联</li></ol><p>进入容器：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker <span class="built_in">exec</span> -i -t  fee2bbb7c9ee /bin/bash</span><br></pre></td></tr></table></figure><p>查看进程：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker ps </span><br></pre></td></tr></table></figure><p>查看日志：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker logs -f [container-id]</span><br></pre></td></tr></table></figure><p>杀死容器：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker <span class="built_in">kill</span></span><br></pre></td></tr></table></figure><p>强制删除镜像：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker rmi -f</span><br></pre></td></tr></table></figure><h3 id="Docker-平台部署"><a href="#Docker-平台部署" class="headerlink" title="Docker 平台部署"></a>Docker 平台部署</h3><ol><li>云服务商的容器平台（腾讯云、阿里云）</li><li>面向某个领域的容器平台（前端 / 后端微信云托管）<strong>要花钱！</strong></li></ol><p>容器平台的好处：</p><ol><li>不用输命令来操作，更方便省事</li><li>不用在控制台操作，更傻瓜式、更简单</li><li>大厂运维，比自己运维更省心</li><li>额外的能力，比如监控、告警、其他（存储、负载均衡、自动扩缩容、流水线）</li></ol><p>爽就完事了！！！</p><h2 id="绑定域名"><a href="#绑定域名" class="headerlink" title="绑定域名"></a>绑定域名</h2><p>前端项目访问流程：用户输入网址 =&gt; 域名解析服务器（把网址解析为 ip 地址 / 交给其他的域名解析服务） =&gt; 服务器 =&gt;（防火墙）=&gt; nginx 接收请求，找到对应的文件，返回文件给前端 =&gt; 前端加载文件到浏览器中（js、css） =&gt; 渲染页面</p><p>后端项目访问流程：用户输入网址 =&gt; 域名解析服务器 =&gt; 服务器 =&gt; nginx 接收请求 =&gt; 后端项目（比如 8080端口）</p><p>nginx 反向代理的作用：替服务器接收请求，转发请求</p><h2 id="跨域问题解决"><a href="#跨域问题解决" class="headerlink" title="跨域问题解决"></a>跨域问题解决</h2><p>浏览器为了用户的安全，仅允许向 <strong>同域名、同端口</strong> 的服务器发送请求。</p><p>如何解决跨域？</p><p>最直接的方式：把域名、端口改成相同的</p><h3 id="添加跨域头"><a href="#添加跨域头" class="headerlink" title="添加跨域头"></a>添加跨域头</h3><p>让服务器告诉浏览器：允许跨域（返回 cross-origin-allow 响应头）</p><h4 id="1-网关支持（Nginx）"><a href="#1-网关支持（Nginx）" class="headerlink" title="1. 网关支持（Nginx）"></a>1. 网关支持（Nginx）</h4><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 跨域配置</span></span><br><span class="line"><span class="section">location</span><span class="regexp"> ^~</span> /api/ &#123;</span><br><span class="line">    <span class="attribute">proxy_pass</span> http://127.0.0.1:8080/api/;</span><br><span class="line">    <span class="attribute">add_header</span> <span class="string">&#x27;Access-Control-Allow-Origin&#x27;</span> <span class="variable">$http_origin</span>;</span><br><span class="line">    <span class="attribute">add_header</span> <span class="string">&#x27;Access-Control-Allow-Credentials&#x27;</span> <span class="string">&#x27;true&#x27;</span>;</span><br><span class="line">    <span class="attribute">add_header</span> Access-Control-Allow-Methods <span class="string">&#x27;GET, POST, OPTIONS&#x27;</span>;</span><br><span class="line">    <span class="attribute">add_header</span> Access-Control-Allow-Headers <span class="string">&#x27;*&#x27;</span>;</span><br><span class="line">    <span class="attribute">if</span> (<span class="variable">$request_method</span> = <span class="string">&#x27;OPTIONS&#x27;</span>) &#123;</span><br><span class="line">        <span class="attribute">add_header</span> <span class="string">&#x27;Access-Control-Allow-Credentials&#x27;</span> <span class="string">&#x27;true&#x27;</span>;</span><br><span class="line">        <span class="attribute">add_header</span> <span class="string">&#x27;Access-Control-Allow-Origin&#x27;</span> <span class="variable">$http_origin</span>;</span><br><span class="line">        <span class="attribute">add_header</span> <span class="string">&#x27;Access-Control-Allow-Methods&#x27;</span> <span class="string">&#x27;GET, POST, OPTIONS&#x27;</span>;</span><br><span class="line">        <span class="attribute">add_header</span> <span class="string">&#x27;Access-Control-Allow-Headers&#x27;</span> <span class="string">&#x27;DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range&#x27;</span>;</span><br><span class="line">        <span class="attribute">add_header</span> <span class="string">&#x27;Access-Control-Max-Age&#x27;</span> <span class="number">1728000</span>;</span><br><span class="line">        <span class="attribute">add_header</span> <span class="string">&#x27;Content-Type&#x27;</span> <span class="string">&#x27;text/plain; charset=utf-8&#x27;</span>;</span><br><span class="line">        <span class="attribute">add_header</span> <span class="string">&#x27;Content-Length&#x27;</span> <span class="number">0</span>;</span><br><span class="line">        <span class="attribute">return</span> <span class="number">204</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="2-修改后端服务"><a href="#2-修改后端服务" class="headerlink" title="2. 修改后端服务"></a>2. 修改后端服务</h4><ol><li><p>配置 @CrossOrigin 注解</p></li><li><p>添加 web 全局请求拦截器</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WebMvcConfg</span> <span class="keyword">implements</span> <span class="title class_">WebMvcConfigurer</span> &#123;</span><br><span class="line"> </span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">addCorsMappings</span><span class="params">(CorsRegistry registry)</span> &#123;</span><br><span class="line">        <span class="comment">//设置允许跨域的路径</span></span><br><span class="line">        registry.addMapping(<span class="string">&quot;/**&quot;</span>)</span><br><span class="line">                <span class="comment">//设置允许跨域请求的域名</span></span><br><span class="line">                <span class="comment">//当**Credentials为true时，**Origin不能为星号，需为具体的ip地址【如果接口不带cookie,ip无需设成具体ip】</span></span><br><span class="line">                .allowedOrigins(<span class="string">&quot;http://localhost:9527&quot;</span>, <span class="string">&quot;http://127.0.0.1:9527&quot;</span>, <span class="string">&quot;http://127.0.0.1:8082&quot;</span>, <span class="string">&quot;http://127.0.0.1:8083&quot;</span>)</span><br><span class="line">                <span class="comment">//是否允许证书 不再默认开启</span></span><br><span class="line">                .allowCredentials(<span class="literal">true</span>)</span><br><span class="line">                <span class="comment">//设置允许的方法</span></span><br><span class="line">                .allowedMethods(<span class="string">&quot;*&quot;</span>)</span><br><span class="line">                <span class="comment">//跨域允许时间</span></span><br><span class="line">                .maxAge(<span class="number">3600</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>定义新的 corsFilter Bean，参考：<a href="https://www.jianshu.com/p/b02099a435bd">https://www.jianshu.com/p/b02099a435bd</a></p></li></ol><h2 id="项目优化点"><a href="#项目优化点" class="headerlink" title="项目优化点"></a>项目优化点</h2><ol><li>功能扩充<ol><li>管理员创建用户todo、修改用户信息√、删除用户√</li><li>上传头像todo（上传文件功能，再利用阿里云oss）</li><li>按照更多的条件去查询用户todo</li><li>更改权限</li></ol></li><li>修改 Bug</li><li>项目登录改为分布式 session（单点登录 - redis）</li><li>通用性<ol><li>set-cookie domain 域名更通用，比如改为 *.xxx.com</li><li>把用户管理系统 =&gt; 用户中心（之后所有的服务都请求这个后端）</li></ol></li><li>后台添加全局请求拦截器（统一去判断用户权限、统一记录请求日志）</li></ol>]]></content>
    
    
    <summary type="html">一个用户管理后台项目</summary>
    
    
    
    <category term="项目" scheme="https://whynotv.github.io/categories/%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="-Java项目 -前后端分离单体项目" scheme="https://whynotv.github.io/tags/Java%E9%A1%B9%E7%9B%AE-%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB%E5%8D%95%E4%BD%93%E9%A1%B9%E7%9B%AE/"/>
    
  </entry>
  
  <entry>
    <title>JavaWeb-JSP</title>
    <link href="https://whynotv.github.io/posts/6a6d.html"/>
    <id>https://whynotv.github.io/posts/6a6d.html</id>
    <published>2024-07-24T16:38:45.000Z</published>
    <updated>2026-08-20T02:04:42.921Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Javaweb-JSP"><a href="#Javaweb-JSP" class="headerlink" title="Javaweb-JSP"></a>Javaweb-JSP</h2><h3 id="JSP：Java-Server-Pages，Java服务端页面"><a href="#JSP：Java-Server-Pages，Java服务端页面" class="headerlink" title="JSP：Java Server Pages，Java服务端页面"></a>JSP：Java Server Pages，Java服务端页面</h3><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723104538940.png" alt="image-20240723104538940"></p><h3 id="JSP-快速入门"><a href="#JSP-快速入门" class="headerlink" title="JSP 快速入门"></a>JSP 快速入门</h3><p>1.导入JSP坐标 pom.xml</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>javax.servlet.jsp<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>jsp-api<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">version</span>&gt;</span>2.2<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">scope</span>&gt;</span>provided<span class="tag">&lt;/<span class="name">scope</span>&gt;</span> //这个不要忘了</span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>2.在webapp文件下 创建jsp文件</p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723104925854.png" alt="image-20240723104925854"></p><p>3.编写HTML标签 和 Java代码<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723105025132.png" alt="image-20240723105025132"></p><h3 id="JSP原理"><a href="#JSP原理" class="headerlink" title="JSP原理"></a>JSP原理</h3><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723105149687.png" alt="image-20240723105149687"></p><h3 id="JSP脚本"><a href="#JSP脚本" class="headerlink" title="JSP脚本"></a>JSP脚本</h3><p>JSP脚本用于在JSP页面内定义Java代码</p><p>JSP脚本分类：</p><ol><li><code>&lt;%...%&gt;</code>内容会直接放到_jspService()方法中</li><li><code>&lt;%=...%&gt;</code>内容会放到out.print()中，作为out.print()的参数</li><li><code>&lt;%!...%&gt;</code>内容会放到_jspService()方法之外，被类直接包含</li></ol><h3 id="JSP-缺点"><a href="#JSP-缺点" class="headerlink" title="JSP 缺点"></a>JSP 缺点</h3><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723105907987.png" alt="image-20240723105907987"><br>后续用html+ajax 替换jsp</p><h3 id="EL表达式"><a href="#EL表达式" class="headerlink" title="EL表达式"></a>EL表达式</h3><ul><li>Expression Language 表达式语言，用于简化JSP页面内的Java代码</li><li>主要功能：获取数据</li><li>语法：<script type="math/tex">{expression}</script></li><li><script type="math/tex">{brands}</script>: 获取域中存储的key为brands的数据</li><li>JavaWeb 中的四大域对象：<ol><li>page:当前页面有效</li><li>request：当前请求有效</li><li>session：当前会话有效</li><li>application：当前应用有效</li></ol></li></ul><p><strong>el 表达式获取数据，会依次从这4个域中寻找，直到找到为止</strong></p><h3 id="JSTL-标签"><a href="#JSTL-标签" class="headerlink" title="JSTL 标签"></a>JSTL 标签</h3><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723111947777.png" alt="image-20240723111947777"><br>主要用 if 跟 foreach</p><h3 id="JSTL-快速入门"><a href="#JSTL-快速入门" class="headerlink" title="JSTL 快速入门"></a>JSTL 快速入门</h3><p>1.导入坐标</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- jstl--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>jstl<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>jstl<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.2<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>taglibs<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>standard<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.1.2<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure><p>2.在JSP页面上引入JSTL标签库</p><figure class="highlight jsp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;%<span class="meta">@taglib</span> prefix=<span class="string">&quot;c&quot;</span> uri=<span class="string">&quot;http://java.sun.com/jsp/jstl/core&quot;</span> %&gt;</span><br></pre></td></tr></table></figure><p>3.使用 <code>&lt;c:if&gt;</code></p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723112542098.png" alt="image-20240723112542098"><br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723112559204.png" alt="image-20240723112559204"></p><figure class="highlight jsp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line">&lt;%--</span><br><span class="line">  Created by IntelliJ IDEA.</span><br><span class="line">  User: V<span class="string">&#x27;jie</span></span><br><span class="line"><span class="string">  Date: 2024/7/22</span></span><br><span class="line"><span class="string">  Time: 15:16</span></span><br><span class="line"><span class="string">  To change this template use File | Settings | File Templates.</span></span><br><span class="line"><span class="string">--%&gt;</span></span><br><span class="line"><span class="string">&lt;%@ page contentType=&quot;text/html;charset=UTF-8&quot; language=&quot;java&quot; %&gt;</span></span><br><span class="line"><span class="string">&lt;%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;</span></span><br><span class="line"><span class="string">&lt;html&gt;</span></span><br><span class="line"><span class="string">&lt;head&gt;</span></span><br><span class="line"><span class="string">    &lt;title&gt;Title&lt;/title&gt;</span></span><br><span class="line"><span class="string">&lt;/head&gt;</span></span><br><span class="line"><span class="string">&lt;body&gt;</span></span><br><span class="line"><span class="string">&lt;input type=&quot;button&quot; value=&quot;新增&quot; id=&quot;add&quot;&gt;&lt;br&gt;</span></span><br><span class="line"><span class="string">&lt;hr&gt;</span></span><br><span class="line"><span class="string">&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; width=&quot;80%&quot;&gt;</span></span><br><span class="line"><span class="string">    &lt;tr&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;序号&lt;/th&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;品牌名称&lt;/th&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;企业名称&lt;/th&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;排序&lt;/th&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;品牌介绍&lt;/th&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;状态&lt;/th&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;操作&lt;/th&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &lt;/tr&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &lt;c:forEach items=&quot;$&#123;brands&#125;&quot; var=&quot;brand&quot; varStatus=&quot;status&quot;&gt;</span></span><br><span class="line"><span class="string">    &lt;tr align=&quot;center&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;%--        &lt;td&gt;$&#123;brand.id&#125;&lt;/td&gt;--%&gt;</span></span><br><span class="line"><span class="string">        &lt;td&gt;$&#123;status.count&#125;&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;td&gt;$&#123;brand.brandName&#125;&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;td&gt;$&#123;brand.companyName&#125;&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;td&gt;$&#123;brand.ordered&#125;&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;td&gt;$&#123;brand.description&#125;&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;c:if test=&quot;$&#123;brand.status == 1&#125;&quot;&gt;</span></span><br><span class="line"><span class="string">            &lt;td&gt;启用&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;/c:if&gt;</span></span><br><span class="line"><span class="string">        &lt;c:if test=&quot;$&#123;brand.status != 1&#125;&quot;&gt;</span></span><br><span class="line"><span class="string">            &lt;td&gt;禁用&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;/c:if&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        &lt;td&gt;&lt;a href=&quot;/brand-demo/selectByIdServlet?id=$&#123;brand.id&#125;&quot;&gt;修改&lt;/a&gt; &lt;a href=&quot;#&quot;&gt;删除&lt;/a&gt;&lt;/td&gt;</span></span><br><span class="line"><span class="string">    &lt;/tr&gt;</span></span><br><span class="line"><span class="string">    &lt;/c:forEach&gt;</span></span><br><span class="line"><span class="string">    </span></span><br><span class="line"><span class="string">&lt;/table&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;script&gt;</span></span><br><span class="line"><span class="string">    document.getElementById(&quot;add&quot;).onclick = function ()&#123;</span></span><br><span class="line"><span class="string">        location.href = &quot;/brand-demo/addBrand.jsp&quot;;</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string">&lt;/script&gt;</span></span><br><span class="line"><span class="string">&lt;/body&gt;</span></span><br><span class="line"><span class="string">&lt;/html&gt;</span></span><br></pre></td></tr></table></figure><h3 id="MVC模式和三层架构"><a href="#MVC模式和三层架构" class="headerlink" title="MVC模式和三层架构"></a>MVC模式和三层架构</h3><p>MVC是一种分层开发的模式</p><ul><li>M：Model，业务模型，处理业务</li><li>V：View，视图，界面展示</li><li>C：Controller，控制器，处理请求，调用模型和视图</li></ul><p>MVC好处：</p><ul><li>职责单一，互不影响</li><li>有利于分工协作</li><li>有利于组件重用</li></ul><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723112941011.png" alt="image-20240723112941011"></p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723113002026.png" alt="image-20240723113002026"></p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723113047496.png" alt="image-20240723113047496"></p><h3 id="案例-完成品牌数据的增删改查操作"><a href="#案例-完成品牌数据的增删改查操作" class="headerlink" title="案例-完成品牌数据的增删改查操作"></a>案例-完成品牌数据的增删改查操作</h3><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723113155501.png" alt="image-20240723113155501"></p><h4 id="1-准备环境"><a href="#1-准备环境" class="headerlink" title="1. 准备环境"></a>1. 准备环境</h4><ul><li><p>[ ] 创建新的模块 brand_demo,引入坐标</p></li><li><p>[ ] 创建三层架构的包结构<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723113352471.png" alt="image-20240723113352471"></p></li><li><p>[ ] 数据库表 tb_brand<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723113451946.png" alt="image-20240723113451946"></p></li><li><p>[ ] 实体类Brand<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723113547634.png" alt="image-20240723113547634"></p></li><li><p>[ ] MyBatis基础环境<br>MyBatis-config.xml <img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723113747395.png" alt="image-20240723113747395"><br>BrandMapper.xml 包名一定要和上面的对应 上下对应<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723113842115.png" alt="image-20240723113842115"></p><p>BrandMapper 接口<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723113954916.png" alt="image-20240723113954916"></p></li></ul><h4 id="2-查询所有"><a href="#2-查询所有" class="headerlink" title="2. 查询所有"></a>2. 查询所有</h4><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240723114123511.png" alt="image-20240723114123511"></p><p>写网页 index.html</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Title<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;/brand-demo/selectAllServlet&quot;</span>&gt;</span>查询所有<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>Step1: 数据层： 在BrandMapper中 使用注解的方式 实现查询所有<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724144037742.png" alt="image-20240724144037742"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询所有</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Select(&quot;select * from tb_brand&quot;)</span></span><br><span class="line"><span class="meta">@ResultMap(&quot;brandResultMap&quot;)</span></span><br><span class="line">List&lt;Brand&gt; <span class="title function_">selectAll</span><span class="params">()</span>;</span><br></pre></td></tr></table></figure><blockquote><p>Mapper相关的知识点<br>在MyBatis中，Mapper是一个核心的概念，它定义了映射到数据库操作的接口。Mapper是MyBatis的映射器接口，用于描述SQL语句和Java方法之间的映射关系，以及输入参数和输出结果之间的映射关系。Mapper接口是使用JDK代理生成的一个代理类。在编写MyBatis的程序时，常见的做法是编写一个Mapper接口，再编写相应的映射文件，之后便可以初始化MyBatis的环境，调用该接口的方法执行操作数据库的各中操作。MyBatis提供了注解来定义数据库操作，如<code>@Select</code>、<code>@Insert</code>、<code>@Update</code>等。这些注解可以直接写在Mapper接口的方法上，以定义该方法对应的SQL语句。</p><p>查询时 无名称，需要使用 ResultMap，进行映射</p><p> <strong>ResultMap详解</strong></p><p>在这个代码中，<code>BrandMapper</code>接口和<code>BrandMapper.xml</code>文件共同定义了一个ResultMap，名为<code>brandResultMap</code>。这个ResultMap用于将SQL查询结果映射到<code>Brand</code>Java对象的属性中。</p><p> <strong>ResultMap的定义</strong></p><p>在<code>BrandMapper.xml</code>文件中，ResultMap的定义如下：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">resultMap</span> <span class="attr">id</span>=<span class="string">&quot;brandResultMap&quot;</span> <span class="attr">type</span>=<span class="string">&quot;brand&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">result</span> <span class="attr">column</span>=<span class="string">&quot;brand_name&quot;</span> <span class="attr">property</span>=<span class="string">&quot;brandName&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">result</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">result</span> <span class="attr">column</span>=<span class="string">&quot;company_name&quot;</span> <span class="attr">property</span>=<span class="string">&quot;companyName&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">result</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">resultMap</span>&gt;</span></span><br></pre></td></tr></table></figure><p>这里，<code>id</code>属性指定了ResultMap的名称为<code>brandResultMap</code>，而<code>type</code>属性指定了ResultMap映射到的Java对象类型为<code>brand</code>。</p><p> <strong>ResultMap的映射规则</strong></p><p>在ResultMap中，定义了两个映射规则：</p><ol><li><code>brand_name</code>列映射到<code>brandName</code>属性</li><li><code>company_name</code>列映射到<code>companyName</code>属性</li></ol><p>这意味着，当MyBatis执行SQL查询时，它会将查询结果中的<code>brand_name</code>和<code>company_name</code>列分别映射到<code>Brand</code>对象的<code>brandName</code>和<code>companyName</code>属性中。</p><p> <strong>ResultMap的作用</strong></p><p>ResultMap的主要作用是简化对象关系映射（ORM）过程，使得开发人员不需要手动编写代码来映射SQL查询结果到Java对象中。通过定义ResultMap，MyBatis可以自动将SQL查询结果映射到Java对象中，减少了开发人员的工作量。</p><p> <strong>ResultMap的优点</strong></p><p>使用ResultMap有以下优点：</p><ul><li>简化ORM过程</li><li>减少开发人员的工作量</li><li><p>提高代码的可读性和可维护性</p><p><strong>总结</strong></p></li></ul><p>ResultMap是MyBatis中用于定义对象关系映射的重要组件。通过定义ResultMap，开发人员可以简化ORM过程，减少工作量，并提高代码的可读性和可维护性。在你的代码中，<code>brandResultMap</code> ResultMap用于将SQL查询结果映射到<code>Brand</code>Java对象的属性中，展示了ResultMap的作用和优点。</p></blockquote><p>Step2: Service层 封装业务逻辑 调用<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724144945020.png" alt="image-20240724144945020"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询所有</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> List&lt;Brand&gt; <span class="title function_">selectAll</span><span class="params">()</span>&#123;</span><br><span class="line">    <span class="comment">// 调用BrandMapper.selectAll()</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">//2. 获取SqlSession</span></span><br><span class="line">    <span class="type">SqlSession</span> <span class="variable">sqlSession</span> <span class="operator">=</span> factory.openSession();</span><br><span class="line">    <span class="comment">//3. 获取BrandMapper</span></span><br><span class="line">    <span class="type">BrandMapper</span> <span class="variable">mapper</span> <span class="operator">=</span> sqlSession.getMapper(BrandMapper.class);</span><br><span class="line"></span><br><span class="line">    <span class="comment">//4. 调用方法</span></span><br><span class="line">    List&lt;Brand&gt; brands = mapper.selectAll();</span><br><span class="line"></span><br><span class="line">    sqlSession.close();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> brands;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><p>每个方法的实现都遵循了以下步骤：</p><ol><li>获取SqlSession对象</li><li>获取BrandMapper对象</li><li>调用BrandMapper对象的相应方法</li><li>提交事务（如果需要）</li><li>释放资源</li></ol></blockquote><p>Step3：Web层<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724145617816.png" alt="image-20240724145617816"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.itheima.web;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.itheima.pojo.Brand;</span><br><span class="line"><span class="keyword">import</span> com.itheima.service.BrandService;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.*;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.*;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.annotation.*;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="meta">@WebServlet(&quot;/selectAllServlet&quot;)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SelectAllServlet</span> <span class="keyword">extends</span> <span class="title class_">HttpServlet</span> &#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">BrandService</span> <span class="variable">service</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BrandService</span>();</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doGet</span><span class="params">(HttpServletRequest request, HttpServletResponse response)</span> <span class="keyword">throws</span> ServletException, IOException &#123;</span><br><span class="line">        <span class="comment">// TODO Auto-generated method stub</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">//1. 调用BrandService完成查询</span></span><br><span class="line">        List&lt;Brand&gt; brands = service.selectAll();</span><br><span class="line"></span><br><span class="line">        <span class="comment">//2. 存入request域中</span></span><br><span class="line">        request.setAttribute(<span class="string">&quot;brands&quot;</span>,brands);</span><br><span class="line"></span><br><span class="line">        <span class="comment">//3. 转发到brand.jsp</span></span><br><span class="line">        request.getRequestDispatcher(<span class="string">&quot;/brand.jsp&quot;</span>).forward(request,response);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doPost</span><span class="params">(HttpServletRequest request, HttpServletResponse response)</span> <span class="keyword">throws</span> ServletException, IOException &#123;</span><br><span class="line">        <span class="comment">// TODO Auto-generated method stub</span></span><br><span class="line">        <span class="built_in">this</span>.doGet(request, response);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724145935761.png" alt="image-20240724145935761"></p><p>brand.jsp</p><figure class="highlight jsp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line">&lt;%--</span><br><span class="line">  Created by IntelliJ IDEA.</span><br><span class="line">  User: V<span class="string">&#x27;jie</span></span><br><span class="line"><span class="string">  Date: 2024/7/22</span></span><br><span class="line"><span class="string">  Time: 15:16</span></span><br><span class="line"><span class="string">  To change this template use File | Settings | File Templates.</span></span><br><span class="line"><span class="string">--%&gt;</span></span><br><span class="line"><span class="string">&lt;%@ page contentType=&quot;text/html;charset=UTF-8&quot; language=&quot;java&quot; %&gt;</span></span><br><span class="line"><span class="string">&lt;%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;</span></span><br><span class="line"><span class="string">&lt;html&gt;</span></span><br><span class="line"><span class="string">&lt;head&gt;</span></span><br><span class="line"><span class="string">    &lt;title&gt;Title&lt;/title&gt;</span></span><br><span class="line"><span class="string">&lt;/head&gt;</span></span><br><span class="line"><span class="string">&lt;body&gt;</span></span><br><span class="line"><span class="string">&lt;input type=&quot;button&quot; value=&quot;新增&quot; id=&quot;add&quot;&gt;&lt;br&gt;</span></span><br><span class="line"><span class="string">&lt;hr&gt;</span></span><br><span class="line"><span class="string">&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; width=&quot;80%&quot;&gt;</span></span><br><span class="line"><span class="string">    &lt;tr&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;序号&lt;/th&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;品牌名称&lt;/th&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;企业名称&lt;/th&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;排序&lt;/th&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;品牌介绍&lt;/th&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;状态&lt;/th&gt;</span></span><br><span class="line"><span class="string">        &lt;th&gt;操作&lt;/th&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &lt;/tr&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &lt;c:forEach items=&quot;$&#123;brands&#125;&quot; var=&quot;brand&quot; varStatus=&quot;status&quot;&gt;</span></span><br><span class="line"><span class="string">    &lt;tr align=&quot;center&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;%--        &lt;td&gt;$&#123;brand.id&#125;&lt;/td&gt;--%&gt;</span></span><br><span class="line"><span class="string">        &lt;td&gt;$&#123;status.count&#125;&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;td&gt;$&#123;brand.brandName&#125;&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;td&gt;$&#123;brand.companyName&#125;&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;td&gt;$&#123;brand.ordered&#125;&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;td&gt;$&#123;brand.description&#125;&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;c:if test=&quot;$&#123;brand.status == 1&#125;&quot;&gt;</span></span><br><span class="line"><span class="string">            &lt;td&gt;启用&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;/c:if&gt;</span></span><br><span class="line"><span class="string">        &lt;c:if test=&quot;$&#123;brand.status != 1&#125;&quot;&gt;</span></span><br><span class="line"><span class="string">            &lt;td&gt;禁用&lt;/td&gt;</span></span><br><span class="line"><span class="string">        &lt;/c:if&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        &lt;td&gt;&lt;a href=&quot;/brand-demo/selectByIdServlet?id=$&#123;brand.id&#125;&quot;&gt;修改&lt;/a&gt; &lt;a href=&quot;#&quot;&gt;删除&lt;/a&gt;&lt;/td&gt;</span></span><br><span class="line"><span class="string">    &lt;/tr&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &lt;/c:forEach&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;/table&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;script&gt;</span></span><br><span class="line"><span class="string">    document.getElementById(&quot;add&quot;).onclick = function ()&#123;</span></span><br><span class="line"><span class="string">        location.href = &quot;/brand-demo/addBrand.jsp&quot;;</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string">&lt;/script&gt;</span></span><br><span class="line"><span class="string">&lt;/body&gt;</span></span><br><span class="line"><span class="string">&lt;/html&gt;</span></span><br><span class="line"><span class="string"></span></span><br></pre></td></tr></table></figure><h4 id="3-添加"><a href="#3-添加" class="headerlink" title="3. 添加"></a>3. 添加</h4><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724150458379.png" alt="image-20240724150458379"></p><p>写网页 addBrand.jsp</p><figure class="highlight jsp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">&lt;%--</span><br><span class="line">  Created by IntelliJ IDEA.</span><br><span class="line">  User: V<span class="string">&#x27;jie</span></span><br><span class="line"><span class="string">  Date: 2024/7/22</span></span><br><span class="line"><span class="string">  Time: 19:19</span></span><br><span class="line"><span class="string">  To change this template use File | Settings | File Templates.</span></span><br><span class="line"><span class="string">--%&gt;</span></span><br><span class="line"><span class="string">&lt;%@ page contentType=&quot;text/html;charset=UTF-8&quot; language=&quot;java&quot; %&gt;</span></span><br><span class="line"><span class="string">&lt;!DOCTYPE html&gt;</span></span><br><span class="line"><span class="string">&lt;html lang=&quot;en&quot;&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;head&gt;</span></span><br><span class="line"><span class="string">    &lt;meta charset=&quot;UTF-8&quot;&gt;</span></span><br><span class="line"><span class="string">    &lt;title&gt;添加品牌&lt;/title&gt;</span></span><br><span class="line"><span class="string">&lt;/head&gt;</span></span><br><span class="line"><span class="string">&lt;body&gt;</span></span><br><span class="line"><span class="string">&lt;h3&gt;添加品牌&lt;/h3&gt;</span></span><br><span class="line"><span class="string">&lt;form action=&quot;/brand-demo/addServlet&quot; method=&quot;post&quot;&gt;</span></span><br><span class="line"><span class="string">    品牌名称：&lt;input name=&quot;brandName&quot;&gt;&lt;br&gt;</span></span><br><span class="line"><span class="string">    企业名称：&lt;input name=&quot;companyName&quot;&gt;&lt;br&gt;</span></span><br><span class="line"><span class="string">    排序：&lt;input name=&quot;ordered&quot;&gt;&lt;br&gt;</span></span><br><span class="line"><span class="string">    描述信息：&lt;textarea rows=&quot;5&quot; cols=&quot;20&quot; name=&quot;description&quot;&gt;&lt;/textarea&gt;&lt;br&gt;</span></span><br><span class="line"><span class="string">    状态：</span></span><br><span class="line"><span class="string">    &lt;input type=&quot;radio&quot; name=&quot;status&quot; value=&quot;0&quot;&gt;禁用</span></span><br><span class="line"><span class="string">    &lt;input type=&quot;radio&quot; name=&quot;status&quot; value=&quot;1&quot;&gt;启用&lt;br&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &lt;input type=&quot;submit&quot; value=&quot;提交&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;/form&gt;</span></span><br><span class="line"><span class="string">&lt;/body&gt;</span></span><br><span class="line"><span class="string">&lt;/html&gt;</span></span><br></pre></td></tr></table></figure><p>Step1：Dao层<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724150557724.png" alt="image-20240724150557724"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Insert(&quot;insert into tb_brand values(null,#&#123;brandName&#125;,#&#123;companyName&#125;,#&#123;ordered&#125;,#&#123;description&#125;,#&#123;status&#125;)&quot;)</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">add</span><span class="params">(Brand brand)</span>;</span><br></pre></td></tr></table></figure><p>Step2：Service层 实现add业务逻辑</p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724150715195.png" alt="image-20240724150715195"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">   * 添加</span></span><br><span class="line"><span class="comment">   * <span class="doctag">@param</span> brand</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">add</span><span class="params">(Brand brand)</span>&#123;</span><br><span class="line">      <span class="comment">//2. 获取SqlSession</span></span><br><span class="line">      <span class="type">SqlSession</span> <span class="variable">sqlSession</span> <span class="operator">=</span> factory.openSession();</span><br><span class="line">      <span class="comment">//3. 获取BrandMapper</span></span><br><span class="line">      <span class="type">BrandMapper</span> <span class="variable">mapper</span> <span class="operator">=</span> sqlSession.getMapper(BrandMapper.class);</span><br><span class="line"></span><br><span class="line">      <span class="comment">//4. 调用方法</span></span><br><span class="line">      mapper.add(brand);</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 提交事务</span></span><br><span class="line">      sqlSession.commit();</span><br><span class="line">      <span class="comment">//释放资源</span></span><br><span class="line">      sqlSession.close();</span><br><span class="line">  &#125;</span><br></pre></td></tr></table></figure><p>Step3：Web层</p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724150846514.png" alt="image-20240724150846514"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.itheima.web;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.itheima.pojo.Brand;</span><br><span class="line"><span class="keyword">import</span> com.itheima.service.BrandService;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.*;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.*;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.annotation.*;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="meta">@WebServlet(&quot;/addServlet&quot;)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AddServlet</span> <span class="keyword">extends</span> <span class="title class_">HttpServlet</span> &#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">BrandService</span> <span class="variable">service</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BrandService</span>();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doGet</span><span class="params">(HttpServletRequest request, HttpServletResponse response)</span> <span class="keyword">throws</span> ServletException, IOException &#123;</span><br><span class="line"></span><br><span class="line">        <span class="comment">//处理POST请求的乱码问题</span></span><br><span class="line">        request.setCharacterEncoding(<span class="string">&quot;utf-8&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">//1. 接收表单提交的数据，封装为一个Brand对象</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">brandName</span> <span class="operator">=</span> request.getParameter(<span class="string">&quot;brandName&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">companyName</span> <span class="operator">=</span> request.getParameter(<span class="string">&quot;companyName&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">ordered</span> <span class="operator">=</span> request.getParameter(<span class="string">&quot;ordered&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">description</span> <span class="operator">=</span> request.getParameter(<span class="string">&quot;description&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">status</span> <span class="operator">=</span> request.getParameter(<span class="string">&quot;status&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">//封装为一个Brand对象</span></span><br><span class="line">        <span class="type">Brand</span> <span class="variable">brand</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Brand</span>();</span><br><span class="line">        brand.setBrandName(brandName);</span><br><span class="line">        brand.setCompanyName(companyName);</span><br><span class="line">        brand.setOrdered(Integer.parseInt(ordered));</span><br><span class="line">        brand.setDescription(description);</span><br><span class="line">        brand.setStatus(Integer.parseInt(status));</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="comment">//2. 调用service 完成添加</span></span><br><span class="line">        service.add(brand);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="comment">//3. 转发到查询所有Servlet</span></span><br><span class="line">        request.getRequestDispatcher(<span class="string">&quot;/selectAllServlet&quot;</span>).forward(request,response);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doPost</span><span class="params">(HttpServletRequest request, HttpServletResponse response)</span> <span class="keyword">throws</span> ServletException, IOException &#123;</span><br><span class="line">        <span class="built_in">this</span>.doGet(request, response);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="4-修改-回显数据"><a href="#4-修改-回显数据" class="headerlink" title="4. 修改-回显数据"></a>4. 修改-回显数据</h4><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724151301547.png" alt="image-20240724151301547"></p><p>修改- 首先要实现回显数据，顾名思义就是 修改页面 保留原来的数据信息 </p><figure class="highlight jsp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line">update.jsp</span><br><span class="line">&lt;%--</span><br><span class="line">  Created by IntelliJ IDEA.</span><br><span class="line">  User: V<span class="string">&#x27;jie</span></span><br><span class="line"><span class="string">  Date: 2024/7/22</span></span><br><span class="line"><span class="string">  Time: 19:19</span></span><br><span class="line"><span class="string">  To change this template use File | Settings | File Templates.</span></span><br><span class="line"><span class="string">--%&gt;</span></span><br><span class="line"><span class="string">&lt;%@ page contentType=&quot;text/html;charset=UTF-8&quot; language=&quot;java&quot; %&gt;</span></span><br><span class="line"><span class="string">&lt;%@taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;</span></span><br><span class="line"><span class="string">&lt;!DOCTYPE html&gt;</span></span><br><span class="line"><span class="string">&lt;html lang=&quot;en&quot;&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&lt;head&gt;</span></span><br><span class="line"><span class="string">    &lt;meta charset=&quot;UTF-8&quot;&gt;</span></span><br><span class="line"><span class="string">    &lt;title&gt;修改品牌&lt;/title&gt;</span></span><br><span class="line"><span class="string">&lt;/head&gt;</span></span><br><span class="line"><span class="string">&lt;body&gt;</span></span><br><span class="line"><span class="string">&lt;h3&gt;修改品牌&lt;/h3&gt;</span></span><br><span class="line"><span class="string">&lt;form action=&quot;/brand-demo/updateServlet&quot; method=&quot;post&quot;&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &lt;%--隐藏域，提交id--%&gt;</span></span><br><span class="line"><span class="string">    &lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;$&#123;brand.id&#125;&quot;&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    品牌名称：&lt;input name=&quot;brandName&quot; value=&quot;$&#123;brand.brandName&#125;&quot;&gt;&lt;br&gt;</span></span><br><span class="line"><span class="string">    企业名称：&lt;input name=&quot;companyName&quot; value=&quot;$&#123;brand.companyName&#125;&quot;&gt;&lt;br&gt;</span></span><br><span class="line"><span class="string">    排序：&lt;input name=&quot;ordered&quot; value=&quot;$&#123;brand.ordered&#125;&quot;&gt;&lt;br&gt;</span></span><br><span class="line"><span class="string">    描述信息：&lt;textarea rows=&quot;5&quot; cols=&quot;20&quot; name=&quot;description&quot;&gt;$&#123;brand.description&#125;&lt;/textarea&gt;&lt;br&gt;</span></span><br><span class="line"><span class="string">    状态：</span></span><br><span class="line"><span class="string">    &lt;c:if test=&quot;$&#123;brand.status == 0&#125;&quot;&gt;</span></span><br><span class="line"><span class="string">        &lt;input type=&quot;radio&quot; name=&quot;status&quot; value=&quot;0&quot; checked&gt;禁用</span></span><br><span class="line"><span class="string">        &lt;input type=&quot;radio&quot; name=&quot;status&quot; value=&quot;1&quot;&gt;启用&lt;br&gt;</span></span><br><span class="line"><span class="string">    &lt;/c:if&gt;</span></span><br><span class="line"><span class="string">    &lt;c:if test=&quot;$&#123;brand.status == 1&#125;&quot;&gt;</span></span><br><span class="line"><span class="string">        &lt;input type=&quot;radio&quot; name=&quot;status&quot; value=&quot;0&quot;&gt;禁用</span></span><br><span class="line"><span class="string">        &lt;input type=&quot;radio&quot; name=&quot;status&quot; value=&quot;1&quot; checked&gt;启用&lt;br&gt;</span></span><br><span class="line"><span class="string">    &lt;/c:if&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &lt;input type=&quot;submit&quot; value=&quot;提交&quot;&gt;</span></span><br><span class="line"><span class="string">&lt;/form&gt;</span></span><br><span class="line"><span class="string">&lt;/body&gt;</span></span><br><span class="line"><span class="string">&lt;/html&gt;</span></span><br></pre></td></tr></table></figure><p>Step1: Dao层 在BrandMapper 中 编写操作数据库的映射代码</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 根据id查询</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> id</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Select(&quot;select * from tb_brand where id = #&#123;id&#125;&quot;)</span></span><br><span class="line"><span class="meta">@ResultMap(&quot;brandResultMap&quot;)</span></span><br><span class="line">Brand <span class="title function_">selectById</span><span class="params">(<span class="type">int</span> id)</span>;</span><br></pre></td></tr></table></figure><p>Step2：Service层 在BrandService.java 中 实现业务逻辑 根据id查询 实现回显数据</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 根据id查询</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> Brand <span class="title function_">selectById</span><span class="params">(<span class="type">int</span> id)</span>&#123;</span><br><span class="line">    <span class="comment">// 调用BrandMapper.selectAll()</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">//2. 获取SqlSession</span></span><br><span class="line">    <span class="type">SqlSession</span> <span class="variable">sqlSession</span> <span class="operator">=</span> factory.openSession();</span><br><span class="line">    <span class="comment">//3. 获取BrandMapper</span></span><br><span class="line">    <span class="type">BrandMapper</span> <span class="variable">mapper</span> <span class="operator">=</span> sqlSession.getMapper(BrandMapper.class);</span><br><span class="line"></span><br><span class="line">    <span class="comment">//4. 调用方法</span></span><br><span class="line">    <span class="type">Brand</span> <span class="variable">brand</span> <span class="operator">=</span> mapper.selectById(id);</span><br><span class="line"></span><br><span class="line">    sqlSession.close();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> brand;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Step3：Web层 </p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724152532115.png" alt="image-20240724152532115"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.itheima.web;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.itheima.pojo.Brand;</span><br><span class="line"><span class="keyword">import</span> com.itheima.service.BrandService;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.ServletException;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.annotation.WebServlet;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServlet;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="meta">@WebServlet(&quot;/selectByIdServlet&quot;)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SelectByIdServlet</span> <span class="keyword">extends</span> <span class="title class_">HttpServlet</span> &#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">BrandService</span> <span class="variable">service</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BrandService</span>();</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doGet</span><span class="params">(HttpServletRequest request, HttpServletResponse response)</span> <span class="keyword">throws</span> ServletException, IOException &#123;</span><br><span class="line">        <span class="comment">// TODO Auto-generated method stub</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">//1. 接收id</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">id</span> <span class="operator">=</span> request.getParameter(<span class="string">&quot;id&quot;</span>);</span><br><span class="line">        <span class="comment">//2. 调用service查询</span></span><br><span class="line">        <span class="type">Brand</span> <span class="variable">brand</span> <span class="operator">=</span> service.selectById(Integer.parseInt(id));</span><br><span class="line">        <span class="comment">//3. 存储到request中</span></span><br><span class="line">        request.setAttribute(<span class="string">&quot;brand&quot;</span>,brand);</span><br><span class="line"></span><br><span class="line">        <span class="comment">//4. 转发到update.jsp</span></span><br><span class="line">        request.getRequestDispatcher(<span class="string">&quot;/update.jsp&quot;</span>).forward(request,response);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doPost</span><span class="params">(HttpServletRequest request, HttpServletResponse response)</span> <span class="keyword">throws</span> ServletException, IOException &#123;</span><br><span class="line">        <span class="comment">// TODO Auto-generated method stub</span></span><br><span class="line">        <span class="built_in">this</span>.doGet(request, response);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><blockquote><p> <strong>代码分析</strong></p><p>该代码是一个Servlet，它负责接收一个ID参数，然后通过Service层查询对应的品牌数据，并将数据转发到一个JSP页面进行显示。整个过程遵循MVC模式。</p><p> <strong>MVC模式分析</strong></p><p>在MVC模式中，Servlet扮演的是Controller的角色。它负责接收请求，处理业务逻辑，并将数据转发到View层（在本例中是JSP页面）。</p><ul><li>Model层：在本例中，Model层是由<code>Brand</code>类和<code>BrandService</code>类组成的。<code>Brand</code>类代表了品牌数据，而<code>BrandService</code>类负责查询和操作品牌数据。</li><li>View层：在本例中，View层是由<code>update.jsp</code>页面组成的。该页面负责显示品牌数据。</li><li><p>Controller层：在本例中，Controller层是由<code>SelectByIdServlet</code>类组成的。该类负责接收请求，处理业务逻辑，并将数据转发到View层。</p><p><strong>代码逻辑分析</strong></p></li></ul><p>代码的逻辑如下：</p><ol><li>接收ID参数：Servlet接收一个ID参数，该参数用于查询对应的品牌数据。</li><li>查询品牌数据：Servlet通过<code>BrandService</code>类查询对应的品牌数据。</li><li>存储数据：Servlet将查询到的品牌数据存储到request对象中。</li><li><p>转发数据：Servlet将request对象转发到<code>update.jsp</code>页面。</p><p><strong>Servlet功能分析</strong></p></li></ol><p>Servlet的功能如下：</p><ul><li>处理GET请求：Servlet负责处理GET请求，并将请求参数传递给Service层进行处理。</li><li>查询品牌数据：Servlet通过Service层查询对应的品牌数据。</li><li><p>准备数据：Servlet将查询到的品牌数据存储到request对象中，并将其转发到View层。</p><p><strong>总结</strong></p></li></ul><p>该代码是一个Servlet，它负责接收一个ID参数，然后通过Service层查询对应的品牌数据，并将数据转发到一个JSP页面进行显示。整个过程遵循MVC模式。通过分析代码逻辑和MVC模式，可以更好地理解Servlet的功能和作用。</p></blockquote><h4 id="5-修改-修改数据"><a href="#5-修改-修改数据" class="headerlink" title="5.修改-修改数据"></a>5.修改-修改数据</h4><p>前面一步实现 回显数据，</p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724153126966.png" alt="image-20240724153126966"></p><p>Step1：Dao层</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> brand</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Update(&quot;update tb_brand set brand_name = #&#123;brandName&#125;,company_name = #&#123;companyName&#125;,ordered = #&#123;ordered&#125;,description = #&#123;description&#125;,status = #&#123;status&#125; where id = #&#123;id&#125;&quot;)</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">update</span><span class="params">(Brand brand)</span>;</span><br></pre></td></tr></table></figure><p>Step2：Service层 在BrandService.java 业务逻辑层 实现代码</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> brand</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">update</span><span class="params">(Brand brand)</span>&#123;</span><br><span class="line">    <span class="comment">//2. 获取SqlSession</span></span><br><span class="line">    <span class="type">SqlSession</span> <span class="variable">sqlSession</span> <span class="operator">=</span> factory.openSession();</span><br><span class="line">    <span class="comment">//3. 获取BrandMapper</span></span><br><span class="line">    <span class="type">BrandMapper</span> <span class="variable">mapper</span> <span class="operator">=</span> sqlSession.getMapper(BrandMapper.class);</span><br><span class="line"></span><br><span class="line">    <span class="comment">//4. 调用方法</span></span><br><span class="line">    mapper.update(brand);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 提交事务</span></span><br><span class="line">    sqlSession.commit();</span><br><span class="line">    <span class="comment">//释放资源</span></span><br><span class="line">    sqlSession.close();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Step3：Web层 UpdateServlet</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.itheima.web;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.itheima.pojo.Brand;</span><br><span class="line"><span class="keyword">import</span> com.itheima.service.BrandService;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.ServletException;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.annotation.WebServlet;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServlet;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="meta">@WebServlet(&quot;/updateServlet&quot;)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">UpdateServlet</span> <span class="keyword">extends</span> <span class="title class_">HttpServlet</span> &#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">BrandService</span> <span class="variable">service</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BrandService</span>();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doGet</span><span class="params">(HttpServletRequest request, HttpServletResponse response)</span> <span class="keyword">throws</span> ServletException, IOException &#123;</span><br><span class="line"></span><br><span class="line">        <span class="comment">//处理POST请求的乱码问题</span></span><br><span class="line">        request.setCharacterEncoding(<span class="string">&quot;utf-8&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">//1. 接收表单提交的数据，封装为一个Brand对象</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">id</span> <span class="operator">=</span> request.getParameter(<span class="string">&quot;id&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">brandName</span> <span class="operator">=</span> request.getParameter(<span class="string">&quot;brandName&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">companyName</span> <span class="operator">=</span> request.getParameter(<span class="string">&quot;companyName&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">ordered</span> <span class="operator">=</span> request.getParameter(<span class="string">&quot;ordered&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">description</span> <span class="operator">=</span> request.getParameter(<span class="string">&quot;description&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">status</span> <span class="operator">=</span> request.getParameter(<span class="string">&quot;status&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">//封装为一个Brand对象</span></span><br><span class="line">        <span class="type">Brand</span> <span class="variable">brand</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Brand</span>();</span><br><span class="line">        brand.setId(Integer.parseInt(id));</span><br><span class="line">        brand.setBrandName(brandName);</span><br><span class="line">        brand.setCompanyName(companyName);</span><br><span class="line">        brand.setOrdered(Integer.parseInt(ordered));</span><br><span class="line">        brand.setDescription(description);</span><br><span class="line">        brand.setStatus(Integer.parseInt(status));</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="comment">//2. 调用service 完成修改</span></span><br><span class="line">        service.update(brand);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="comment">//3. 转发到查询所有Servlet</span></span><br><span class="line">        request.getRequestDispatcher(<span class="string">&quot;/selectAllServlet&quot;</span>).forward(request,response);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doPost</span><span class="params">(HttpServletRequest request, HttpServletResponse response)</span> <span class="keyword">throws</span> ServletException, IOException &#123;</span><br><span class="line">        <span class="built_in">this</span>.doGet(request, response);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="6-练习，实现删除数据功能"><a href="#6-练习，实现删除数据功能" class="headerlink" title="6.练习，实现删除数据功能"></a>6.练习，实现删除数据功能</h4><p>为了实现删除数据的功能，我们需要在<code>BrandMapper</code>接口中添加一个删除方法，在<code>BrandService</code>类中添加一个删除方法，并在<code>DeleteServlet</code>类中处理删除请求。</p><p>Step1：BrandMapper接口添加删除方法<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724155724699.png" alt="image-20240724155724699"></p><p>Step2：在BrandService中添加 删除方法</p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724160037678.png" alt="image-20240724160037678"></p><p>Step3：Web层 实现DeleteServlet<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724160731156.png" alt="image-20240724160731156"><br>把重定向改成 转发到查询所有Servlet 因为重定向它会跳转页面，跳转的页面没实现就会错误，虽然实现了删除，转发到查询所有Servlet 就会在当前页面，并且删除后显示最新的数据。</p><p>Step4：删除按钮 在brand.jsp页面添加删除按钮<br><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/image-20240724161634279.png" alt="image-20240724161634279"><br>按照修改 写就ok了 </p>]]></content>
    
    
    <summary type="html">JavaWeb学习笔记</summary>
    
    
    
    <category term="技术" scheme="https://whynotv.github.io/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="Java" scheme="https://whynotv.github.io/tags/Java/"/>
    
    <category term="JavaWeb" scheme="https://whynotv.github.io/tags/JavaWeb/"/>
    
  </entry>
  
  <entry>
    <title>智能机器人</title>
    <link href="https://whynotv.github.io/posts/9962.html"/>
    <id>https://whynotv.github.io/posts/9962.html</id>
    <published>2024-06-24T18:24:25.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<h1 id="机器人系统基础"><a href="#机器人系统基础" class="headerlink" title="机器人系统基础"></a>机器人系统基础</h1><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/%E6%9C%BA%E5%99%A8%E4%BA%BA%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80.png" alt="思维导图"></p><p><img src="https://raw.githubusercontent.com/WhynotV/tuchuang/main/img/%E5%A4%9A%E6%BB%A8%E4%B9%A0%E9%A2%98.png" alt="多滨课上习题"></p><h2 id="机械臂结构"><a href="#机械臂结构" class="headerlink" title="机械臂结构"></a>机械臂结构</h2><h3 id="机械臂分类与作用"><a href="#机械臂分类与作用" class="headerlink" title="机械臂分类与作用"></a>机械臂分类与作用</h3><ul><li><p>机械手臂分类</p><ul><li><p>空间几何运动形式</p><ul><li><p>直角坐标系型</p><ul><li><p>PPP的作业空间是一个长方形</p><ul><li>优点：构造相对简单，经济成本低，控制简单。</li><li>缺点：机械臂的移动只能是直线，或者说是折线，运动不灵活。</li></ul></li></ul></li><li><p>圆柱坐标系型</p><ul><li><p>圆柱坐标型机械臂</p><ul><li>优点：直观性更好，结构简单，机械臂所占空间小且在空间中运动辐射范围大、</li><li>缺点：灵活度有一定局限性。</li></ul></li></ul></li><li><p>球坐标系型</p><ul><li><p>球型坐标系机械臂</p><ul><li>优点：灵活性更高，可以相对自由的移动到球体空间的任意位置，动作范围大。</li></ul></li></ul></li></ul></li><li><p>驱动方式</p><ul><li><p>电气驱动</p><ul><li>电机驱动常采用不同的伺服电机，虽然手臂整体构造比较简单，但仍能实现复杂的运动，并且控制精度高，反应速度也灵敏，智慧化程度很高。能耗一般较小，常用于轻载或中载场合。</li></ul></li><li><p>液压驱动</p><ul><li>液压驱动需要装配电机和液压泵外，还需要需要搭配不同的管道，手臂结构比电机驱动更为复杂。虽然液压驱动智慧化程度低，很难实现复杂的动作，动作也比较迟缓，能耗高，但可以实现大功率，大转矩输出。常用于重载场合。</li></ul></li><li><p>气压驱动</p><ul><li>气压驱动则需要搭载电机和气泵，也需要安装管道，结构也比较复杂。智慧化程度一般，一般实现抓取这类简单的动作，动作迅速，能耗一般，常用于轻载场合。</li></ul></li></ul></li></ul></li><li><p>机械臂的作用</p><ul><li>1、机械臂可以改善劳动条件，避免人身事故。</li><li>2、可以减轻劳动强度，提高生产效率。实现生产过程中的自动化，智能化。</li><li>3、实现完成人手不能做的工作。</li></ul></li></ul><h3 id="机械臂机构设计"><a href="#机械臂机构设计" class="headerlink" title="机械臂机构设计"></a>机械臂机构设计</h3><ul><li><p>机械臂的组成</p></li><li><ul><li><p>手部</p><ul><li><p>用途</p><ul><li><p>手爪</p><ul><li>手爪的主要功能是抓住工件、握持工件和释放工件。</li></ul></li><li><p>操作工具</p><ul><li>作业工具是进行某种作业的专用工具。</li></ul></li></ul></li><li><p>夹持原理</p><ul><li><p>机械钳爪式</p><ul><li><p>内撑式</p><ul><li></li></ul></li><li><p>外夹式</p><ul><li></li></ul></li></ul></li><li><p>吸附式</p><ul><li><p>磁力吸附式</p><ul><li></li></ul></li><li><p>真空吸附式</p><ul><li></li></ul></li></ul></li></ul></li></ul></li><li><p>腕部</p><ul><li><p>腕部设计分类</p><ul><li>自由度是指机械手各运动部件在三维空间坐标轴上所具有的独立运动数</li><li><p>腕部</p><ul><li><p>单自由度</p><ul><li>回转型R</li><li>俯仰型P</li><li>一般单自由度手腕的运动形式为俯仰型（用字母P表示）或回转型（我们用字母R表示）。单自由度手腕的运动轨迹是一条线。</li></ul></li><li><p>二自由度</p><ul><li>二自由度手腕则是俯仰型和回转型的组合。可以组合成双俯仰型和俯仰回转型，但是不能构成双回转型。二自由度手腕的运动空间是一个面。</li></ul></li><li><p>三自由度</p><ul><li>三自由度手腕同样是俯仰型和回转型的组合。常用的结构PPR,RRR,PRR,RPR。三自由度手腕的运动空间是一个立体空间。</li></ul></li></ul></li><li><p>臂部</p></li><li><p>臂部可由大臂、小臂或多臂所组成，其作用是支撑手部和腕部，并且可以通过伸缩、回转、俯仰和升降等运动改变手部的空间位置。</p><pre><code>  - 臂部设计的基本要求      - ①手臂应具备足够的承载能力和刚度      - ②手臂质量和转动惯量要小      - ③手臂运动要平稳，定位精度要高      - ④手臂导向性要好</code></pre></li><li><p>立柱</p><ul><li>立柱是支撑手臂的部件，立柱也可以是手臂的一部分，手臂的回转运动和升降运动均与立柱有密切的联系。</li></ul></li></ul></li></ul></li></ul></li></ul><pre><code>    - 机座        - 机座是机械手的基础部分，起到固定支持和作用，机械臂驱动系统通常安装于机座上。        - 机座的设计方式            - 移动式            - 非移动式</code></pre><ul><li><p>系统分析</p><ul><li>①根据机械臂的使用场合，明确机械臂的目的和任务。</li><li>②分析机械臂所在系统的工作环境，包括机械臂与已有设备的兼容性。</li><li>认真分析系统的工作要求，确定机械臂的基本功能和方案。</li></ul></li><li><p>技术设计</p><ul><li>1.机械臂基本参数的确定</li><li>2.机械臂运动形式的选择</li><li>3.拟定检测传感系统框图</li><li>4.确定控制系统总方案，绘制框图</li><li>5.机械结构设计</li></ul></li></ul><h2 id="机器人行走机构"><a href="#机器人行走机构" class="headerlink" title="机器人行走机构"></a>机器人行走机构</h2><h3 id="轮式行走机构"><a href="#轮式行走机构" class="headerlink" title="轮式行走机构"></a>轮式行走机构</h3><ul><li><p>两轮轮系</p><ul><li>1.当两驱动轮具有相同的速度时，机器人进行直线运动</li><li>2.当一个驱动轮的速度为零，另一个驱动轮速度不为零时，机器人绕前一驱动轮与地面的接触点作旋转运动</li><li>3.当两驱动轮速度出现其他情况时，机器人的运动将会是这两种分运动的合运动</li></ul></li><li><p>三轮轮系</p></li><li>四轮轮系</li><li><p>轮式行走机构特点</p><ul><li>运动速度快</li><li>能量消耗少</li><li>机械结构简单</li><li>运动控制容易</li><li>但其环境适应性差，常用于平坦无阻的地面环境</li></ul></li></ul><h3 id="履带式移动机构"><a href="#履带式移动机构" class="headerlink" title="履带式移动机构"></a>履带式移动机构</h3><ul><li><p>履带式行走机构的特征是将圆环状的履带卷绕在多个车轮上，使车轮不直接同地面接触，而是利用履带缓和地面的凹凸不平。</p><ul><li><p>同步带</p><ul><li>优点：效率高，设计简单。</li><li>缺点：同步带应用灵活性差</li></ul></li><li><p>活节带</p><ul><li>优点：活节履带可以任意增减履块，因此更灵活。</li><li>缺点：①各履块之间靠连杆连接，若连杆处受力不均则容易发生损坏。②活节履块运行噪音较大</li></ul></li></ul></li><li><p>履带式行走机构的特点</p><ul><li>履带式行走机构稳定性好、越野能力和地面适应能力强。</li><li>但其机械结构复杂，质量大；不仅能耗大，而且运动速度慢，噪声大。</li></ul></li></ul><h3 id="足式移动机构"><a href="#足式移动机构" class="headerlink" title="足式移动机构"></a>足式移动机构</h3><ul><li><p>足式机构的优势</p><ul><li>适应力强</li><li>具有主动隔振能力</li><li>自恢复平稳性</li><li>能耗低</li></ul></li><li><p>两足结构</p><ul><li>两足步行机器人具有良好的环境适应性，其运动结构也最接近人类，故也被称为“类人双足行走机器人”。</li></ul></li><li><p>四足结构</p></li><li><p>六足结构</p><ul><li><ul><li><p>周期步态</p><ul><li><p>二步态</p><ul><li>二步态将机器人的六足分为两组，每组有三条足且均为摆动相或支撑相</li><li>机器人运动过程中一组为摆动相，则另一组为支撑相，两组在摆动相和支撑相间循环切换</li><li>摆腿的顺序为153-426-153</li></ul></li></ul></li></ul></li></ul></li></ul><pre><code>  - 三步态    - 摆腿的顺序为15-26-34-15  - 六步态    - 摆腿的顺序为4-2-6-1-5-3-4-2-6      - </code></pre><h3 id="轮式、履带式、足式行走机构的比较"><a href="#轮式、履带式、足式行走机构的比较" class="headerlink" title="轮式、履带式、足式行走机构的比较"></a>轮式、履带式、足式行走机构的比较</h3><ul><li>1、轮式机器人更适合平坦的路面，并且能高速移动。但容易打滑，不平稳，对复杂地形无能为力。</li><li>2、履带式机器人能更好的适应松软的地形。履带与地面接触面积大，运动更加平稳。缺点是无法应对高低落差较大的地形。</li><li>3、足式机器人几乎可以适应各种复杂地形，能够跨越障碍，缺点是行进速度较低，运动控制更加复杂。</li></ul><h2 id="机器人驱动机构"><a href="#机器人驱动机构" class="headerlink" title="机器人驱动机构"></a>机器人驱动机构</h2><h3 id="驱动电机"><a href="#驱动电机" class="headerlink" title="驱动电机"></a>驱动电机</h3><ul><li><p>特点及要求</p><ul><li>1 可控性高</li><li>2 精度高</li><li>3 可靠性高</li><li>4 响应迅速</li><li>5 环境适应性强</li></ul></li><li><p>分类</p><ul><li><p>伺服电机</p><ul><li>直流伺服电机</li><li>交流伺服电机</li><li><p>转速和转向取决于电压和相位</p><ul><li></li></ul></li></ul></li><li><p>直流电动机</p><ul><li>有刷直流电机</li><li>无刷直流电机</li></ul></li><li><p>步进电机</p><ul><li>步进电机是一种将电脉冲信号转化为角位移的执行机构</li><li>每输入一个脉冲，步进电机就按设定的方向转动一个固定的角度。</li><li></li><li><p>步进电机特点</p><ul><li>步进电机具有惯量低、定位精度高、无累积误差、控制简单等特点</li><li>广泛应用于机电一体化产品，如数控机床、机械臂、计算机外部设备等。</li></ul></li></ul></li></ul></li></ul><h3 id="驱动控制"><a href="#驱动控制" class="headerlink" title="驱动控制"></a>驱动控制</h3><ul><li><p>驱动控制任务</p><ul><li>姿态稳定控制</li><li>路径跟踪控制</li><li>轨迹跟踪控制</li></ul></li><li><p>底层控制任务</p><ul><li><p>速度控制</p><ul><li></li></ul></li><li><p>位置控制</p><ul><li></li></ul></li><li><p>航向角控制</p></li></ul></li><li><p>控制策略</p><ul><li><p>PID控制</p><ul><li></li><li><p>特点</p><ul><li>PID控制算法结构简单、易于实现，并具有较强的鲁棒性</li><li>当被控对象的结构和参数不能完全掌握，或得不到精确的数学模型时，应用PID控制技术最为方便</li><li>PID控制算法参数的整定就是PID算法中的kp、ki、kd参数，使相应的计算机控制系统输出的动态响应满足某种性能要求</li></ul></li></ul></li><li><p>变结构控制</p></li><li>自适应控制</li><li>模糊控制</li><li>神经网络控制</li></ul></li></ul><h3 id="驱动电源"><a href="#驱动电源" class="headerlink" title="驱动电源"></a>驱动电源</h3><h2 id="多机器人系统"><a href="#多机器人系统" class="headerlink" title="多机器人系统"></a>多机器人系统</h2><h3 id="特点"><a href="#特点" class="headerlink" title="特点"></a>特点</h3><ul><li>更广泛的任务领域</li><li>更高的容错性</li><li>更强的鲁棒性</li><li>较好的内在的并行性</li><li>系统效率更高</li><li>经济成本更低</li><li>系统更加稳定可靠</li></ul><h3 id="研究方向"><a href="#研究方向" class="headerlink" title="研究方向"></a>研究方向</h3><ul><li><p>体系结构</p><ul><li><p>决定了多机器人系统在任务分配、规划、决策和执行过程中的运行机制，以及系统各机器人成员所担当的角色</p><ul><li>集中式</li><li>分布式</li><li>混合式</li></ul></li></ul></li><li><p>感知</p></li><li><p>通信</p><ul><li>显式通信</li><li>隐式通信</li><li>混合式通信</li></ul></li><li><p>协同规划</p></li></ul><h3 id="典型的多机器人系统"><a href="#典型的多机器人系统" class="headerlink" title="典型的多机器人系统"></a>典型的多机器人系统</h3><ul><li><p>群智能机器人系统</p><ul><li>由许多无差别的自治机器人组成的分布式系统，它主要研究如何使能力有限的个体机器人通过交互产生群体智能</li></ul></li><li><p>可重构机器人系统</p><ul><li>以一些具有不同功能的标准模块为组件，根据任务的需要，对这些模块进行组合，进而形成具有不同功能的系统。</li></ul></li><li><p>协作机器人系统</p><ul><li>由多个具有一定智能的自治机器人组成，机器人之间通过通信实现相互间的协作，来完成复杂的任务</li></ul></li></ul><h3 id="人机协作的关键技术"><a href="#人机协作的关键技术" class="headerlink" title="人机协作的关键技术"></a>人机协作的关键技术</h3><ul><li><ol><li>机构设计</li></ol></li><li><ol><li>多维感知</li></ol></li><li><ol><li>场所监视</li></ol></li><li><ol><li>规划测试</li></ol></li><li><ol><li>人机交互</li></ol></li></ul><h2 id="机器人智能"><a href="#机器人智能" class="headerlink" title="机器人智能"></a>机器人智能</h2><h3 id="基于行为的控制方法"><a href="#基于行为的控制方法" class="headerlink" title="基于行为的控制方法"></a>基于行为的控制方法</h3><ul><li><ul><li>控制单元将感知信息转换为执行器的指令</li><li>触发单元则用来决定控制单元何时动作</li><li>当传感器触发某种行为时，会立即作出相对应的动作</li></ul></li><li><p>机器人的运动</p><ul><li>感知单元</li><li><p>智能单元</p><ul><li>基于行为组</li><li>仲裁器</li></ul></li><li><p>执行单元</p></li></ul></li></ul><h3 id="基于机器人行为的实例"><a href="#基于机器人行为的实例" class="headerlink" title="基于机器人行为的实例"></a>基于机器人行为的实例</h3><ul><li><ul><li><p>任务分析</p><ul><li>1、识别目标物——区分墙体和箱子——箱子可以移动，墙体不能移动</li><li>2、运动避障——避开墙体——在碰到墙体的时候调整方向</li><li>3、推箱子——推箱子至A区域——依靠光线强弱推箱子</li></ul></li><li><p>任务行为分解</p><ul><li><p>避障行为</p><ul><li>在收集箱子中，机器人将向检测到的特定物体推动，这可以帮助机器人判别障碍物是不是箱子。如果机器人不能推动所检测到的物体，则认为它是障碍物。逃离行为将被触发。</li></ul></li><li><p>逃离行为</p><ul><li>当机器人无力推动的物体或发生碰撞时，逃离行为可以通过控制机器人后退和旋转，为其选择一个新的运动方向行进。</li></ul></li><li><p>暗中拒推行为</p><ul><li>可以有效的避免机器人将箱子推离光源位置。当机器人认为光线很暗时，机器人会停止运动，触发反向飞蛾行为</li></ul></li><li><p>反向飞蛾行为</p><ul><li>当机器人认为光线很暗，可以控制机器人转向行驶，从而将箱子推至目标区域内。</li></ul></li></ul></li><li><p>传统的控制方法</p><ul><li><p>“感知-建模-规划-执行”的控制策略</p><ul><li>扫描房间中环境信息，建立环境模型</li><li>定位箱子的位置</li><li>规划机器人运动的路径</li><li>依次将箱子推至A区域中</li></ul></li><li><p>自顶向下</p><ul><li><p>优点</p><ul><li>结构层次清晰，容易实现的模块功能，能具有高层次智能的行为。</li></ul></li><li><p>缺点</p><ul><li>系统实时性比较差，控制时间延长。当某一环节出现问题时，整个控制系统环链难以顺利执行。</li></ul></li></ul></li></ul></li><li><p>基于行为的控制方法</p><ul><li>通过搜索一系列可编程的“条件—动作”语句，实现对机器人的控制</li><li><p>自下而上</p><ul><li><p>优点</p><ul><li>机器人反应快速，传感器与执行器之间是一种直接映射的关系</li></ul></li></ul></li></ul></li></ul></li></ul><h3 id="模糊控制"><a href="#模糊控制" class="headerlink" title="模糊控制"></a>模糊控制</h3><ul><li>定义：用模糊数学的知识模仿人脑的思维方式，对模糊现象进行识别和判决，并给出控制量，对被控对象进行控制。</li><li>基本步骤：首先根据操作人员手动控制的经验，总结出一套完整的控制规则，再根据系统当前的运行状态，经过模糊推理、模糊判决等运算，求出控制量，实现对被控对象的控制。</li><li>主要特点：不需要建立对象的数学模型</li></ul><h3 id="模糊控制系统"><a href="#模糊控制系统" class="headerlink" title="模糊控制系统"></a>模糊控制系统</h3><ul><li></li><li><p>模糊化具体过程</p><ul><li></li></ul></li><li><p>知识库</p><ul><li><p>数据库</p><ul><li>隶属函数</li><li>尺度变换因子</li><li>模糊空间分级数</li></ul></li><li><p>模糊控制规则库</p><ul><li>模糊规则</li></ul></li></ul></li><li><p>模糊推理</p><ul><li>模糊推理是模糊控制器的核心</li><li>模糊推理：运用模糊逻辑中所蕴含关系和推理规则来进行模糊概念的推理</li></ul></li><li><p>清晰化</p><ul><li></li></ul></li></ul><h3 id="神经网络"><a href="#神经网络" class="headerlink" title="神经网络"></a>神经网络</h3><ul><li><p>生物神经网络</p><ul><li>树突：接受信息</li><li>轴突：发送信息</li><li>当神经元所获得的输入信号，累计超过某个域值时，它就会处于兴奋状态，产生电脉冲，由上层神经元的轴突将电脉冲信号传递给下一层的神经元细胞树突</li><li>层层的神经元细胞相互连接，便构成了错综复杂的神经网络</li></ul></li><li><p>人工神经网络</p><ul><li><p>特点</p><ul><li>1、具有自主学习能力</li><li>2、具有联想存储功能</li><li>3、具有高速寻找优化解的能力</li><li>4、具有容错能力</li></ul></li><li><p>工作原理</p><ul><li></li></ul></li></ul></li></ul><h3 id="机器学习"><a href="#机器学习" class="headerlink" title="机器学习"></a>机器学习</h3><ul><li><p>步骤</p><ul><li></li></ul></li><li><p>分类</p><ul><li>1、监督式学习</li><li>2、非监督式学习</li><li>3、半监督式学习</li><li>4、强化学习</li></ul></li></ul><h2 id="机器人通信系统"><a href="#机器人通信系统" class="headerlink" title="机器人通信系统"></a>机器人通信系统</h2><h3 id="通信"><a href="#通信" class="headerlink" title="通信"></a>通信</h3><ul><li><p>通信是利用电子信息技术建立一个信道，通过信道将信息源的信息传输到目的点</p><ul><li></li></ul></li><li><p>通信系统的基本模型</p><ul><li><ul><li>信源：把待传输的信息转换成原始电信号</li><li>发送设备（转换器）：将信源发出的信息变换成适合在信道中传输的信号，使原始信号适应信道传输要求</li><li><p>信道：传递信息的通道或传递信号的设施。</p><ul><li>有线信道</li><li>无线信道</li></ul></li><li><p>接收设备：把从信道上接收的信号变换成信息受信者可以接收的信息，起着还原信号的作用。</p></li><li>信宿（受信者）：信息接收者，可将复原的原始信号转换成相应的消息</li><li>噪声源：系统内各种干扰因素的等效集合</li></ul></li></ul></li><li><p>现代通信系统的功能模块</p><ul><li><p>接入功能模块</p><ul><li>将语言、图像或数据进行数字化后并变换为适合于网络传输的信号</li></ul></li><li><p>传输功能模块</p><ul><li>将接入的信号进行信道编码和调制，变为适合于传输的信号形式</li></ul></li><li><p>控制功能模块</p><ul><li>由信令网、交换设备和路由器等部件组成。它的作用是运营计费和数据保密</li></ul></li><li><p>应用功能模块</p><ul><li>为运营商提供视频、语音、娱乐等业务支持</li></ul></li></ul></li><li><p>机器人的通信系统</p><ul><li>机器人的通信系统是智能机器个体以及群体机器人协调工作中的一个重要组成部分</li><li><p>机器人的通信可以从通信对象角度分为内部通信和外部通信</p><ul><li><p>内部通信</p><ul><li>协调各功能模块间的协作</li></ul></li><li><p>外部通信</p><ul><li>协调机器人与控制者或者机器人之间的信息交互</li></ul></li></ul></li><li><p>机器人通信系统的要求</p><ul><li>稳定性好，通信质量高，延迟低</li><li>能耗低</li><li>体积小，易安装，易维修</li></ul></li><li><p>通信方式</p><ul><li><p>显式通信</p><ul><li><p>多机器人系统利用特定的通信介质，通过某种共有的规则和方式实现信息的传递</p><ul><li><p>直接通信</p><ul><li><p>要求发送者和接收者保持一致，即通信时发送者和接收者同时在线。因此，直接通信需要一种通讯协议</p><ul><li>如点对点通信</li></ul></li></ul></li><li><p>间接通信</p><ul><li><p>间接通信不需要发送者与接收者保持一致</p><ul><li>如广播、监听</li></ul></li></ul></li></ul></li></ul></li><li><p>隐式通信</p><ul><li><p>多机器人系统通过外界环境和自身传感器来获取所需的信息，并实现机器人之间的相互协作</p><ul><li><p>感知通信</p><ul><li><p>机器人利用自身传感器，通过感知环境的变化，并依据自身内部的推理和模型理解，进行相应的决策和协作</p><ul><li>如灯塔通信</li></ul></li></ul></li><li><p>环境通信</p><ul><li><p>机器人在通过传感器获取外界环境信息的同时也可能获取到其它机器人遗留在环境中的某些特定信息，从而进行信息传递</p><ul><li>如信息素通信</li></ul></li></ul></li></ul></li></ul></li></ul></li><li><p>通信模型</p><ul><li><p>C/S 通信模型</p><ul><li>集中式结构</li><li><p>特点</p><ul><li>系统具有中心服务器，所有客户进程与服务器进程进行双向通信，客户进程间无直接通路。</li><li>C/S 通信适用于需要集中控制的场合，其结构简单，易于实现，便于错误诊断及系统维护。</li></ul></li></ul><p>-</p></li><li><p>P2P 通信模型</p><ul><li>分布式结构</li><li><p>特点</p><ul><li>节点间通信不经过中心服务器的转发，而是直接进行通信。</li><li>系统运行不依赖于模型中某个节点，因此系统负载较为均衡，可靠性高</li></ul></li></ul></li></ul></li></ul></li></ul><h2 id="传感器专题"><a href="#传感器专题" class="headerlink" title="传感器专题"></a>传感器专题</h2><p>1、什么是传感器<br>把非电量转换为电量的器件</p><p>2、传感器静态指标<br>线性度、灵敏度、重复性、分率力、精度等</p><p>3、电位器的分类<br>直线型电位器、旋转型电位器</p><p>3、常见测距的传感器<br>超声波传感器、红外线传感器</p><p>4、拾音器的构成和语音的基本参数<br>麦克风、放大器<br>语音的基本参数：声强、响度、音高、基因周期等。</p><p>5、压力测量的传感器<br>压电式传感器、应变片式传感器、电容式传感器</p><p>6、什么是电阻式传感器<br>电阻应变片的工作原理是基于应变效应<br>即导体或半导体材料在外界力的作用下产生机械变形时，其电阻值相应发生变化， 这种现象称为“应变效应”。<br>电阻式传感器通过测量电阻值的变化来感知物理量的变化，如温度、压力等。常见的电阻式传感器包括热敏电阻和应变片。</p><p>7、什么是霍尔效应<br>在导体或半导体中，当电流垂直于磁场方向流动时，会在垂直于电流和磁场的方向上产生电压差。这种效应被用于霍尔传感器中</p><p>8、电五官对应人体的那些感官</p><ul><li><strong>光敏传感器</strong>：视觉</li><li><strong>声敏传感器</strong>：听觉</li><li><strong>气敏传感器</strong>：嗅觉</li><li><strong>化学传感器</strong>：味觉</li><li><strong>触觉传感器</strong>：触觉</li></ul><p>9、陀螺仪传感器直接测量的物理量<br>角速度</p><p>10、激光扫描测距的方法<br>激光扫描测距通过发射激光束，当激光束遇到物体后被反射回传感器，传感器通过测量激光的飞行时间或相位差来计算物体到传感器的距离<br>方法：三角法、相位法</p><p>11、红外测距的原理<br>根据反射光的强弱判断物体的距离，距离近则反射光强，距离远则反射光弱。</p><p>12、超声波测距原理<br>通过测量超声波经反射到达接收传感器的时间和发射时间之差来实现机器人与障碍物之间的测距。</p><p>13、多传感器数据融合的目的和原理<br>目的：利用多个传感器共同联合的操作优势，提高传感器系统的有效性。<br>基本原理：充分利用多传感器资源，将多个传感器在空间和时间上的冗余、互补信息依据某种算法进行融合，获得对被测对象一致性解释或描述。再由辅助系统进行环境判定、从而形成更高层次的综合决策。</p><h2 id="智能机器人笔试"><a href="#智能机器人笔试" class="headerlink" title="智能机器人笔试"></a>智能机器人笔试</h2><h3 id="选择20分"><a href="#选择20分" class="headerlink" title="选择20分"></a>选择20分</h3><h3 id="判断10分"><a href="#判断10分" class="headerlink" title="判断10分"></a>判断10分</h3><h3 id="简答题40分"><a href="#简答题40分" class="headerlink" title="简答题40分"></a>简答题40分</h3><h3 id="创新题30分"><a href="#创新题30分" class="headerlink" title="创新题30分"></a>创新题30分</h3>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;机器人系统基础&quot;&gt;&lt;a href=&quot;#机器人系统基础&quot; class=&quot;headerlink&quot; title=&quot;机器人系统基础&quot;&gt;&lt;/a&gt;机器人系统基础&lt;/h1&gt;&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Whynot</summary>
      
    
    
    
    <category term="复习" scheme="https://whynotv.github.io/categories/%E5%A4%8D%E4%B9%A0/"/>
    
    
    <category term="复习" scheme="https://whynotv.github.io/tags/%E5%A4%8D%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>英语议论文写作模版</title>
    <link href="https://whynotv.github.io/posts/e1a.html"/>
    <id>https://whynotv.github.io/posts/e1a.html</id>
    <published>2024-06-14T09:00:00.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">  <script id="hbeData" type="hbeData" data-hmacdigest="3793a8a1dc3922d71fc42ee84e897380b6e1a6e62074dab45a19cf597a47b8d9">f29e6ea516484662d5633a97ddab6d16a23f164a78dfcdf2b5272a4fcac4a877e02f668b733cd7970ba9e156b959148624031e07e4acd5847003abc6aa9c44c5fa4529927df457fe7aca57a7fcb3d6f25f0dd14114f0d95bab542eeba596328cbb9c5ed51a98d970e4d636bb89d0644fb0d825dcfb0b44a692d4326118aad1d3710e5da452f0f6c4d4f1894988ef717f9d500b330aa3704ed22f8218af09a8fede44e59abbc2716912c31b073923c7bfdea7cefd68f05628d98cbee1702e8122095fe60aa9d57eebb58b1e9acad941d83be086ada0979d9cf88ef273f4436de77e63fdf473e21ed4c8e5fc72ab4ddf2e5b6747dff5d69b98d463430b4546c01fc7b626d72bd982967d984995c08880287418040074a03e506d99514c01acad31d522063b01b0df21d80b0e02f33dfe55b0bea293b521716661f02c350e7d1329af435de1714a5188e09bc3e0ae2734a4061ae7af1928798ced2661b03b40056604378589d334c12699f35d95ba4827ef1f3b1e82ba20cab8eb7292e518dac248631f39d50fae78b419db467ab46f7b98af87549b1b08765618ca86c70a58d07f41692d41f8e82a977ab123449e92d90f6a30bacd5cafc296cd44dae6130aeb96d3fdefc159fba9a3d3814a1ee82bb70191cd2b0c115168b3bd4d0978eae7dc24d74c330e72c13e863636ba8bfe8587075625e93585c87d1503ac9eca3e1048eb92c31241bde5861068e13b2c0bebc1a918f27135cc62bf86f2347bd3c51118148a706f3c0343c0a1d2b18d394b753dddefbaf678c63398159f570df8bf35b89ef58af70bc493183031a216a551efecd7e5ec46c9ac63e4684151a1c1e76f4534d28703c23ed8237c121d358d672363abc9db45b8f85b723520fcf00816efbacb5b85fb913f32ceb87c0ccbb2c3b147207a16979aab76d123d843abc619abb7b8fc2a2525feb3ab2cb33774406d874c7b8d3fb1ba39ca167acb9fc49ea43e11c7b0083de972ca96ba4baad60615ab7ca630d8f6dfec74392622b80e0ae2ed37afa20595d23b434791bd3886e286d015f2ad08196d7417008d66700a0afaf07da71cb4af0b8a695be31021db49b089618c1a4a7e60332f2505b89507fae1d693950c2f5e0a9418467e09908d4317e18b2fb62fdc5a712a209bfcc98f4f22c4c0c3cc6122e53fd7a8a8a2ddc7d9280092038a382c47944a7359454bc52120817303feaab950ca4c108073183ce446fe18e610baf97116d335312cddd723b644ffd1ec341eddbf29f5b909a25907bdc62fa4e37601e05fad54da2adeeeb6dc1165768154c09d808bb3f86424cde6c6f4b520e3a9778b40701d9bc5f24051634bc8111f1d7badbc261d63b5a8eb80bf52638d3b1df01e65212a19cb9690c2bda6de6c29413fff56f60a835745475499cb8eee98356478d4252dbdc2a2fceedbb0fc626fc085dfbf12068b72c8ac0444dabedf53b4ad03bb43b2aa7f2639ebef9e0400f293b1b28374ca02159a5fe48b62f9ed8c82178754eae96c49f42e5e3922849a520e48d928848b50acdf07f4b36c30f256969cae58725add88712ab40e9ea1643a9c854ffd984621282c6d9e88403b6037b6a5ceb8e0c01e5796beb21c8c137362b5a1e5854fe920d0b922957ddbb92a5e7e82060aef10f2f5a1627ad885d99c1505a649e3dad56565eec6108326172ddf6b90eb334536e91cbdd31dffe460cd3ad248da0691232c1b733ad9b94b383671c26d129c7ae9ac042c45cf3de0adb3c6a47e6d3ebc0be4047555a7ffa8aa064e23393ea1efcbdcaa01be0455c8fe55d0d6157ae168bfd6e8356ed9f1751623293fa0d318dc2ca9aa1e270ac6b4b5b8b192d90b037afd2ad817565ec26f351145dc48e4b4000e0d4c473333e9a3b579412e1df4741ea45f46b3c0b4def0af41526b5cbc6c08ad55a161429f644bf35d23fe727314d30ac48b3c00250bf6a766e1ecdaa4ef1cd2ac688b496d4a9f34ebd7b58e5c34de13335c4ff5e1ed5427bdbc4b381d4209f7f3f886dfad62147752ce09d25cba76b3333f853386c279f9c82f5449b607e0831c7c43bf5cdb241b8ce49c6c89836338e8627845bafc812f5c27240045d5ffff4047578b2ae80996184f463ab3ae838a1d65149d7e9453da00cf521ac351855fdc2a127f8244f6c6c1aa4d4b8573d964799f0c4f2364026cac02d5d8a4de8087f44c879aa47af7f4296d36e1023b911d2177e08b60cee66ddd728597fe936b702a9cba83ec408f5380b1c6babb181c3d0a9c0e2eebf38e53e39b3870c360184dfc702bcb2480b118cbb7de5c6cab2bb3c8912206d943ac8483054bc5d988475bb591aa34ac261abee6e7af98e86c6278be1b0284301bae87dc7a0b7431165a6f7b0c053eaeb202ba9cb0af5db0bf351c06a076acc2cd6b801883f1049dac91e0cf6d7c8d56cfa7ee04174cc956040e4c5bf3587a75766f8624d51b1b05e7eed416713f536243fb83c7250a6e996c6132e37d91dbe13cf6dadecada4e727ee43522a8117152357a1ac11e3271cbe6988e34e2a382f7196e086421d92bde5802a0d426e64ec595d8599379c6dc72c0b6a19e39919e1e06cb3826b6fd36d3194173d6da682fe4a43faa8a34f88a60d913b4e4e6b06f584f2d52522ffbc6594f7a6b89551ea02f22ece23ef95fca6b4c1be4270b6f1ffbd57d6ba4461796e6db81a777dab3cb46b9ebbf4e81c6f5286fac18f32fbf77199928908663efe5918ec554abb64c50100a6f9ebbffa3fd8b4967fb22ac4fd663abec6b21a8a54fbc82677bbabb683fd0fc550a68f19987c4d0e1057f672a90849391a474d415b26a40bcf28b1800baac7c095efc49224cdd6fc7a4ffd95c026977b55ebba800bbbe0e7b61fe25f355e276435f1ed77f40879bf8947209f10143b0dfaff2a84e435723dd808c71125c48af1c97299557e0a4ef5daf4716a8cd6627601f5fd43d5771550d7212474a5397913bb8b60b03433470a60fe5a9078f6419a30dd0baaad03cf549664b255f6c9d9eeb6b267437b4a08f06e5e5649187390ce8eb3e0c6716fe2214c1a22c59380543d529bdc937ded793eed5e44cb540fc31b4c6a89987d816db02cd80ff838687b485a2d0f34b9d04ea68572f4fb6abe13d8ecc02b8f02cff32743f8f0023d621b25f6c67c83720f9ffe907133b037e6c67d30f61ae2f6e1852278efaae9d68eaf85aa620e3c2f5b29a84bebe4bedaf2adf61717b562c35c0f010b58c2d6c2cf64e2eea937910da8bb5e886635ce5c828865b1b047583e8a7edb96276838841e781a2faa92607ec0d4799d684a7ab3a56b50c73463c7356b54899900b663235965928d4aa7789adf2bb5830fc14be19aace008a096ac05c3a046e3a31b62cf8ff82ea1c617e2832d9d7968643e24049b4e6eb9440684641189d4110b0e597285bc7dd3bf4b8bdde479eaecd6a25eea5514da87bb0b0015b93eabc70c8d992c452bda2633dcb051f0581ecaf3c7093e233de2d88f55a4b8c2f19c45731aeb5d3eada4505c53bd2f22b75d8dd39f5de62c700b0911a2495f186b2b0e9270017a251c911a10bfd183b9b6be648ddd0825fb6c8e0b781dec34626737c74ee743ba8e4bb38e34e7eb45296c1f250edb44bbe2ad224a64f3547f2925708a1fd0cdb19dec8912904835270d0734ab43f18d2013591bb7fa702cf74419faa0a907d27c349adce481ab56cf8762098da46f83e9a535a90c1f9b5f3590ced81f55bc4969060ff77adb62fbb420e2ec6c14d48ef6ef972d925cccf6964c3665ad6d7bf9f1355da11c456554ae67622669dc6fcfeb7a97597aa367f8954ebe877e2995856557fb3b6c92359d4cdb9136c628787c9b7e766f5860441dda5083decda564af0305f4de275515ec9b68bc3710413498a3bab01f7f813fe86ee839879f7b10c06c07ac184a5ed3d87e515d9509085dab5d8d9a82dcc056291ca63ce55035616262fe164af4c0e1aedaf220078e645447f24ec334818abbfaf396e1b041efb7a3e7a91dd42874cec178766a634291fbf9009e95844d67c6cd2c1fcce0f6893629f527612b2c6fe0198788c6034b628b591b71061d28f4d06434cd9ae62c46175f1087f7b3bb8f459ef4f3fae402d5c1aad2b38a88c0c70e8f4324ed04f7915adfb1550fc1eb3cc3d35560407a2ee498fd5e05b41fb30807bfdd40b48af89862c22f9e377b05b2403f5630ead9a3768885562c8f5dc20b28285207cc0be006912714188aa30c6dd1a01e3cf52ec5bfa430a88017c7f8e9cccfeba84b42fce51cd76943c76b068fb4fe16c4d7682879c778871c35986ae3883f6cc7f70e985ac0d5df2b6047a6e0155929286fae1d0f5a0de1cd8ea95741b8a2efaa05d6e28e714dacafc68a9a122766dde7a2f2d9ddca92937fad0598e02373c4e7a5902c69e478c03cb2d37473537d1c01eab6a767f2660f694c7fcf4f71a735d86869acadef9910b226302f46516a5fa98579d975fb527cb43b42aa9d8308c6547d230fe27bdd963c5387adbd8043f236d2c6e1f18bf5959be87d1158ea4ce259032ad9bbb306ba0c732eba281123e910b46de4d0ea1281bb4283926d2604cbf6bf9d3a3c63d599d51f098655e750bb5e2f6167af1f6ddf150915fd5bef22a91405bd41d4109b80d10d27978241eb89ea818bdfa7efb3c2480404833d661f41f3c069c857d510ce32e455ddb8c4b9b40c33438200d13f6278531b6d7b0ffffba62e26e59513bd5256d0586b414d2ef07dea61d41465abbf028791459f0e87fda08a5bd9000376a8adc6410d03cd3251bf2a869d4ac1d29932f107d994d12f958283bdb74523c2af3608c1189fd9eafcc34ae361e17f2195f0e4af8405004bf960118ba4a28fa79420a74d9814f0823c3c78b0a9f09454a0824106c31d26904e46a75a20c7be1b53f90e2bf8bcdae80208b3b0286156c75c38c1d86bb309cff45478431c3c863f5a25f6e620d026f00620ed2641bcf32b8cd46641e156bb3673100785fb8548187c24ad03879c54a10a6468a4b045ece8fac89336a1f4606a1478f64f025fb762b899a8c9397f605e2aeb1e1b1650af6f73a06b9203663b1c1f6f205e291611a177d616a1862db14200fb53f345abd2df655aec5b9f444e7ff5f9dee25d042c4d172a952fb621a23879147aa33fd9ba0e46b327962ca9f33cfe289fb5d797e68957b5a8327e3414849cd43a08e1e48371e034d6f17b6b0eb46d560307276200087061027392a82c174007572790c01a7b6fe1a782d0eaa753e774c2795604e86b8cabe3007edd98758ea670c0059829994f00d614603c6a50a8f96bca22493967bd9808f412d1ecbf00124c9301f8142eac6d604781e67702348d0d3a3cdaf505b860c3f0f91ba5185f2ef12f05158984d2368116a9e0996a59bac1a850172a4272260e969a3d2da775f36118d003fc203918ed46469331d158f11579d879ed32aaaab836cb5fb49b7cd0c211510b6b3ea5b9f5535ff7e3ee3b31c6fb3d0c81ecb20f1e13ba94e76cfa78b1143a369b5b8597c93caa818837c911bdfb6c748a0b7f40cd58d4cc213165a291bf52364370c9b41a2752c50aa8e3762a536b924ba477f43397f8f474d03215b6abcb18094ae62cf3b9c30a56cbfb13d1bca49697355aad0be79531f35fa43f69752d400994c4cb829ec45787ae424169101810b319e8a89cd9d04f35900b3c9c10ddcfb2c7915495f0ef72a237f47ce3dd64df5fdd46ddee4300c0a30aa4fc8ffd38d0f1a09e580352307b4be10733ea5debca1197d0547c3d47a04136c02de1aa26cbce6629ef471216b759c6c0833e9cc69ce08a58bf0ec8cc179512df9ce756ccc04809f84dee0229acccb4b56119c1f8aed23bca1b93e515a19946067d4e24ae161e1e7639fa8a83997610b80132351df9f217fe6c57e86e1f4a22728cef391744e3332b22b45d2946331ae81ea2493d330a87187b74d8431f2fd9e42ce464b60ad7309a3790398990213b6349e0817ca11ce4ebd0735393b14b1fad378a1d55785c253223f99f2ee71e560d3db43fa1098ef4fe5cc0a03c05339989460828e3b44db8e9ff34a7deddd02b4c929adc9b14c32a6e6ef258420bd94656d075ecdccbe44a7d98dd9a7036507f79c8eaee6522d231ddc00419088e2735cfe84f51669942becea4b1d570fdb23115fd3bbfd34f2effdaaadf04d5cb2733042ebb9596ec942e59e53278a2078f068fc62a7404c44a287595b08660e7e7ddea2305c9a564c0b054c57288fe8bddaa1afa96a0e27ef558dfbc5d7ea6f8963336c8eba128778c8a2596ae6c66868628faa86ddbd3cea790f913e54e534010702926c9a51c718e41c7b1e0fbed83486d62060a73d77a4952ac100ade52f0864b46ffad304d5e3a5079eb63b89431bc0262a69198c524e73e296806131544cb952792e7934113d706925d25a3987c1847379ec3c6065561c2cffccf2f10b303805cb841f9680844cf0d032ac852c2d18177d2f80c88072146b92b162df905d948c9d76ccd079ea7e55e27ec0e8906e9e8c30bdaab7810101f4011b8b54a9d7f8c4f066cdff2f7007382157f4737c1b6c3161cb9cd6180054d03d3a9794f116356a70a16adec0d8bb3167372c6af9798844d3bdb640cd08a72030d8e28e533f9a97c8a0cbd529d4d5cb712b3d8508411e6a65fccc783d995b69c9783515624caac6a49cf928c5daa718c1368ad849a6dd2ce6ddb85af92f27c2b0adad56466dbaf8bf6b1c8bf02efc9ee24588e7d41baa070aeba0310985b4d6a5344142b769546b3df52086cc1db169ba8732035f3032be98ff6d48d7f58da51ffc54321700fc6c76b7db723b3f49665bc1429dcf9ee5e09892d28010b8d89d69e2c07b90af58aba3c92b088d5bda3dad5cba50d6c7667740c2b1043298dc28664df40357e2cc325cdc45c38e450f9990bbbc670eb639261ee1fe45abe74a68f880d18a71b13a31d1b09203f3e874bd1f604ffa2fdcc920bd7c84b7d98a78040c74b78f98dc9fc586685cd5744d17805bbede49886af6d0340b87c48ea3a6e35559bf5bd5a6440549fc32be939bcd4bb27ae2ff091d9dad933f80bc75e66ef0f325c29c7fa10963bd48f93657d7c4fba08fd50e57b2c851d667ec7693d5f46fcb4e2940170087a1ed6a6a3d40630996fb9db4b66c8cc156536f71db827eafa491bb866ce736300396d7bf1f3de54576991580a0f9d1000abf7cfd26b97beefe3d5cbcca9aaef050b62a0fdefe4414eadbf3e982d3ec278e00f03ebef309b29b1da441b89401a1a89623019a3fbc06fd200446b2b0241bb3628eda8478e3befddc4c11c18094db84e2a259f4db2742e46b685394d2f9c7c7ed2f17c82e32062dbb00f19925baf72f5759c6fa1d625487d13ac3174c0cade76c35bf80200d943597b31181bca238002cd415f42432a7a6b1ac5cd2a8803d26483a0d96c31a5c299729e4d8a1ecefd99d7c78b610a5dc6973ab47f17e2356278857c4c485d3def6e19ecb56312716c1d3ea3d3af65bba52d0e6ef0a78f545232188e4184e4f93efb8e1bf03f049e274a0d714b03a4ba739f49596d4b969bd07c6043b1da32c08c1feede4affa25ee42ffea880a5b1c026ece4c5da4e3dfa702d6320ed580f90bed1657d7a5045bb209a13ed273f92c4ad2cb94059ecad184f77289a90143d1435335b2cc7dc55cbc25ccf4222c6e24638cf17c4024951571cc12ffdafd1a78ba5d71a652a0c2af098194afb29f4a618f13db0eec49e2a9b50888ae2cb10dfb1fb15d1101947e235f33af81720a040a95576628e61c29fa2fcefbe70dca639503d2dd878f6ce5a413cb2ebaa75f38e34861b09bf873bd87df8e8ed5272728833570d97e860cd08b15bf6fd01d2a159d05476b47397df80f93fa1b88a97dce67104e0c31241f210728a17f041d7dab7741377d695653971d262012f5eda2868c0b73c313857a96d48425daae554cecf33da4c7552e80a6fd2c9b5f6047282f424d649a669c066bb5c984037f12c856e4dfd5dea4b52893351373971988291571d7c3e1df9d5e859078b564ebe9940e0946327ddec1d8955baeccb547afc4ea0f227bbaf687c9c760f9ab476bad15a900b4020822d25338a14f2f100d725214cddfa31993f3db650f463a69b226715d0241f98b1cfb9f311faf5b4b128bce42c200e58f24940d7765c730b3ea4270762e6e46d6d02a25a0dfa3c031f8f53e244e830251443ab753ee2ec65b8a73ab2d9b2ecf870cd219e71b160b4c976e590f2e7beefdb1388c5362c975c4a003061893bd4764f6ff10d71296f984f0dc3cf254329d6db6c959a110df739a8e666083f1f303c295a3a17c16ac53f2b503d969d20a9f513e4a8933b89ee72a4102ba9575c3d1aea12384300c95b0cd6082585e538e3d13de8c67bc90bf092071068d371bf8d41ed7aa1752890780b8c2be24cd6b20a7f7cf79b0afe5cbe0467046617fd4b05c9a7fbe7bec4a208233c6f1c1ec0b7be881855bda4d0d8ee5e6ae1190a3a67416c105e644d4c316e05798070aea017ab5eae6a9dd182afc80680e7df8a3e07d3d347dc4bdc40db6283d8ebd7bf26e9bb24edede24e9650add89c15798aefae06a740ba346e4bcd427e4533444c4d2c554ba8788e84734c686d93d0d2af0555247866c383f30c59f0f11e02ae2c66e2737dcf4af2dfe99c1542775d7c43184d67a234245306f14c06b226dc13dfb2bfb6fc44180948da6aaed87f0465cf14a110ef1be224ef006ad19657aa9ee5b847d41b290d6e9f5c2e6e021eef5ade515861c71a93f3b95608415502cb00cdd289cac3545f351994a66862f3d59b94bfe4b398e68d7994fe8b1ec4d3c9f07c5832c1be6db86b0e5a6e0db5b2ad6801d74670495d1108f3bc5d3d9407505440668d54c8c34141fa5eff026703be3b2233f2f205f5242f452938105af2b6c58f32757cf7ee8e4b7df615fea9e2bbfa1650a694df952d44bf2080729b59e523c6484a0d2cdc63bb065e166296c78f2ba94bb053b89fc82a39936aee04dcaea02880177d974d9fef9a32360c03a23906764ed1b50dfddf170b9ad4c2b2d5f675cffdc905560e8736b818a37a3ed8866df8d24e93dba5f5a75e42a27e06c19feaaaf2b45132b811d839c02df63af981a1a0fb7aa35d9cf5819e43e4c6e060a3027d58e62074b22e73df9947203079774ec00e1dcc5f9d1ea779f40bc5dda5b16e34f8cf5e187ea5e979e8d7613b27b71e1484fc9d20ad685c25c2ffe010e5cc2149b532dea54fc13050be93e68e577a1490dca505088f258afbd5413d74d7d2570c483103ff632e74793e3447ae1314d26c3fac7ee5924427db98db07e73a751383846f1492ac157880c3f0abf9b734ac357d8b30c2abf91dfc66e594b8bca85b464b29869fd410d0dbd24935b4481537c312641fee1ecba1f62bbd5a7b7429c39762b992f058d84d276593929ff41c880c72bf6047536f555d163ae4174f1ff38eda7c921ccdc21344d1743ff9f03d794a2663c6b24a8f9bcbee650dd548fbc94af760c1bc72ac2fa55bb1310d92d2fc9c73b82ee704b3933b8726bc9df4449ca597cb16d9a04633997c34d069b901279506e6d8faf7cd814fd148eaadbbbda085b8ee660f51a1f55b827baf51708cee9d294986605aacecc8ca7f91b7bf612d031d9b54e123591e017584b4153dbd86a4aedd37c5238a3cc1737298299a7e35ea091be03703b8c70b2baf5775c12df143863d3c8b65d5b8b126b3b68b5240064d0032f49bd7f68649f761b4765807ae1290822ce15edea837e1e334ba81b86814eb87c81d8e16677acaca8265c60d51344dbd582934e3a60df5153059233d7c5511e3ebec88d72494bb92d390231e36645ff900e7fb0de3f3ac6fff1ee9161fabde709afbf7750179f6dac721dbe085be89ea2c3a4b555e8bfb410240a08105d273a8bead5ca1fb6aa9e6b55467b090d2cdb8ff5ddb4f471c8aa7420bc3096d5c545d76197bdf14111141a1111e49fdaf147e65867084312ad2ed85b11f6495bbc925139107e6213806974e14e36fb1898bea7ab99fc097753b3f364a2705c86ba37be0d5fe273c495fc30108b15fa47bb9739776aea5d5b3be39970f1d482a89b1bdb1e68d5f00cb588c4d04f6d19c2ebb67f314b0994e60360fa5fa9444e2eafa22b738cf0d7d463a3cd438d48228fb51b43612210dff7c9fdcd570af4b80754eb25d7a1ec22bbcf3dd9961d99d7c94b93b6b74a153ed8b3be0a4dc923d553a4f8dc74577c106c243b00b11c88875a1f0e73fd8f034c6a2b979cd6c9d00018e602cc8ac71d158b9e4a3875e112105890826ed1576e5b391893726e7b6f027fef76b32aa3ea5c3357e846f3c27cb0aafc39c19da156506debfec8547d66130eac790bac1bbe838b5e3f17e2dd9db0e279eca01bf983b58cd127de9d6451722db31abdd20db850cd7b05592f4bb492cee8659bee386b78544c8b693185c9cfdc1a8689d75d6e382da3750a9f99357a16602e36e4d3efd7c14d07fcce71ed7d29d18c36ff5ee6bd50d4fef11d6417a44d890ace53707a694af18242af35f86c00c15b1d4d55c2028b9fd2deceb99cf130c1c4b14083773ea71709b0428f2e3c23fe5ca91bb1b16a6263a453813969667b82ea94b485c3df6c55dd4402f830bfeb3f8fe06879dc6f12b9f8eac85594ac93d73f0450aa633ba6ddbd699daeb0b2de54e05a9d5e8d14460468b28bd916e5b58738eebcd4c6dff17747c7352201194fe9e15e0adf4585316a48bedb21c1a77bb5f40e60abea24138001d50def474e8f9850821747d7c2fc8ee953cd18ca25fccc306c1080479e90c6f87e1acc246fc99bae26b139f9066db65bbce247763117190b1b0d612503d80c272269a6dcd67eefb1f141c5ad5f3963dfebd43404283e9713df83249a2980181df4208f192a0c0a219b76410ff182d14a652a7aaff154a673bb8f4467c8d42a7d8c97f629eccb4217aec42c78f6aa4b37cee0ba0e26f87af42e3665e1a215194da5a527448acc417109d4ddf9a2db465297eab0a27cc0eb46db84df86142793c0551990a221220ce26658d6ef6859c1651d91a6f87a588a8e97a8a3cc51736df36a2c37c23515062dfb0d8bc6bb7945733db60ea86f7921a048774d317ed6cd14bfeb5d2b2abe87fddce8883193e435ea33a313f4348755d0c5c8f0b33f3bc87840a44c1b6a1cd95af2fdf0689601a59063eba3484a4b535b1b0a0d3ed41e8ebebd27a0862b6c4f164d20f9fe0588bc4d675b13caf01af063db28b0d4340b243eaa24b0f33eb68f8a5e52f71e752e76313c4e53cedfe3809bcab19bd1718a3440b5d5597a1b2b94ff3428943f59bc31bd1acedb17981e098f3f97b52a3f04ff7404b44eed234a047ba073ceba5d2ede3f21e187eb35c8c78709f1a5c75b437d17e888b59aee6d20bd085976da576e490729218a08a5876abffe1b7565b4ea26a28227ee87f7fd73b4c29232ccbb4d45d5dd377e1d9b24e3df005ac1c3df5821be383c751ffb2508d041f76935331d19c264cb7811025a7508301efff16a62b7fcdf27fdc6fd4b39aeb1738a4a0d453ac1aa7bc9558139eec917336bb4e3ee909426c47d52de1a0927c08c36b95cc99cf7515ee087e9501bbb982895e87d77781d58c729beaa7bd57eb7d2d660c16512c369f74a6b5bb1572f8a42256cac6dd7929ea66ecdd409fa670b7d1f9c6725bf66ebebcc66e4477e169680088ee24de6ec14745527ff188b870ac203c256e50b7ed4d0d08376e256f37fc284969e2b12d6c94cc2e141cb1a6e66a333285884acf7237f77fb8ac1e7f2cb60167b8d75c20e23a088a61c71fd146ad937d4a7a4b7f84f13ddeb43e2319b12622b68c66616c6cfb5781b5e13ba77c17e0513729984f916a71bbaf00902a514bb5e90ff2afbc69263ec9826314526b64a9ee3a18f4dc507f3f5472f0bd87e9c7b05fba1ce3c03660c0f4817bcbdc36f7264e001057c0cb831d106f958400e6a0fc92a9ef1c63cb8a48fb9e5b825808d84292b7f3a1729910bde9403b94c4d030aa61abf387fe6e748fb0803e4ed96bb49d8f3b892a74a3337811dd4d7012e64a5757555f278b42e5bb19c97d833dafdc0a9bcf5a69c49d10a4e11abd010809c22497f4aaf7555075e9ef7f65c0027def9c0f3bb0fb0175eb5801433563ddf2d080bf9e9df471e26d6799628ae82f1d5581904c8f00d8683629c908e001870ad5ca3624d6b6c680f248c9af1a6bcfa7e489d2c92069a0ee56a31039ff3c584f2b48a5eba35c0b8ac1647ae08daa6b5a6b5b5f6ef5d6433c1e9bad3e2db3df3844bdcdb749cf3ddb3a183f221f7a50fbe4f2256ca11e9e6950f1426f269decff49b247078e5baf5117c8a3985227b6d34df31154ddb14c9d1d70eda6cd88b00c42d4007426e9e98a62908a1715fcee6b54ba6818437caaebb120080d5eb50f8479056981b144a0e20080bd320edf8ff12b72d4383302a2f6b9586c66410b6e406fbb1bf160f06e35e299604dff30517b2e88f449455014e87389c1149f9b858498d4b890a35344ddf365af308f32f12a72d015f09e171e054e2d5f89307b4d2fc9a0977da0bcfc43dc9e01de7147af343d087b7e7baf9cc834737199b147c85bd66c850b76be0f7501ce37c58873eb6ccd6e67c7f26451fcf564634c5a5c44d73e5073cce8d9708d49b260f5d70f4ba1c5a18ad42c734d7cafef555661db27c70aa57c24daf35f1142681cb788748f25a1939b9113f323ed8b06cf82b16898025dcebd6555246104ad020fd15158ec33e3f26786a08ebfcd250dc09c13833d0d48c6bf9aff1d4d3b5239f260c3f8ca2c8d04a4e91aeca823f8dee24f31ca942991ba46de79cf4d8dae5f22245d18514db655e444d2d3b798a576fc1a10c92ba69d44881903150b1842720d29876653769b6c9678b72c349974869b3087e367057d910892760c161ea36bbaa13ad61887ea097e6ea048a7dff9d92eda6c6345f6d2e13480d83076609ad4abf10b6ea2fe9de8f4447df44b44f9b8eb1ae85c8a6a1e2d6bd332871f30a426457d2d4d7261fd8e5190fe6f7716499247bdb0555288c1177c2fd27471ac7b388cf8ef8173966cc7b9d7efb9f11cb6b9b7e95177ad443910ae2a448ad142fcdd6ed75a3d6af36ba2956268d298cf824ed3ba306e871584dbdc9e1a3aa0293a582996265e046ee6693aba08d09f01899225bd9fd080c2769e94a3b7910d807adfbb4f914d14395026bb96740365c383204b567ca92cc89ae971c4a7807eedb95de048a8b998b308d4d0ffd38da80448cbe6751223f71f586ec765b9dcdb419b32ce70dd564d20a9a3218653c3883c6bffa90678fd0c08265980d5c26d6e4ec122807933b1e62424d9a76b3effe28f8028564fb1cee7a584698621c48da52398d993fc42fdb5f8197c52608a55c8828b65294142ce39adc99e310ae11d474b59d3dccaf52a36ca74716f69cbb2564a9023a2b91dcc52c4f3e6430216e19bcdb466651754f4ca170263bfed196255d53f363d618d18269a1c709c5be46f9cf30f58a31d3d3fc03817b9d21ac6e9aaf8778aab38ca6d10b70a01a698313cb91ccf936791c3fa3a67251413c24a60058c978d9f821e0f912c2cc21c5c326a07912eabe8a72bbdc993980685a5609f21251e6dcf0ba58aea0d225afebbdea2cb566eedc6d4a5501db7fa7cbb8c043827c06b668fd755e983e2cf0fcc8c7e457ecdd2824b48b8869abe7a835fd4ddcdb8ca05e1f976304fc7336698d5385d9b20921503cf9b4c3af28b473fb1879c05193d7c888887181b44b07a3ab913a8599000358d1af2c904348d90792d578764792416a68c157313429bad035f6380ce676f2c3f6dd7d18f6e1054fddd7ec336babf3c184f19f64c49a51306f8143ca1b88e7a59301b7df3de30e7d973372c4c0068581910ca3581398b5ea957e1182e991e9c050f0cafae3e3e904b3d7a43cc779ac6a9992a714fb00623111dde14706ed574c2b724d0b7b70c341f67012134d7e90f22661b18c4e1575673f07bc482b2376adc4e6db4ebfd3ed58dc6512577cf05df16f054a3ca9a187eb65964d617d2b511de58fb7c1346d727381546befcff87d061042aee6a7976f564397791157e12440c2aec58e21096843e5151f06380cea2d7248a80973fb7ad998d13e18ad5476e646ae556c2992ff9e7b318636b5fa5c15190b4c6e65d69a0832d346b72bff2e61cae748bcbf5a103c6e708d0dcfff962071a95b72218654862fd0509d5d5648cf89faed33988102edc0e51c2d4f3fbda8c6779dc7c9756bb40229161b5f926e2f092613f67b705afabab4f2473cefe69a0ec436da9472cfdf24f981a0d6032af21ca2686b47233ea4d2816779000059ec70f33dffa500455ba08af6145bde09dc3d7eaea84e7220a1b98642318ac97ae4dbe4125937878a9c33773f2225305b6b0c04ddc109df4810f77d85c5aec882e6272869878185548db48ffbc61277afec4ce5d6ce9b6a066d4f61c6b03a5b1357696ffaf4cc3f952e7de50e330ce6447f4a2e8b896728a2ed321f1e3f8b2e3b4783e027a796f4d2eecc2513ebccf6f5ddff2a814826d01b3fe708d4c082ad12433bb3d448660196f2e589e5418ee663d15f182603c9fab1caad20a2588ec2bd718a7303ff91ddee97ce3fd38bcaa48595a9538e286c511d2fc749716bbae83e77f28f85bcce977774923c640bfa3abb2a082adf4b3aa746660352e73dde10576a241845573d38a9145ab97ff2255a45f1dceba73748f87be9d041131607cf514b946095701d5d978cb509cbe06e75e156e208cdf81015fbf363a4ae43449fffb61b4039ef34121770210cf03e8529c5c808e39029a60c5959a26dcca712741c52155ff03d32a9224f3ce049fe2b31a6de627109e4ac5584525ee792fe5ead5e39ce522e4fc3249244702f8736da545f9847c9ca76d6fe59fd6457ba0b28fcf819de73f6fa94b60fb6f922d168f161e9dcdde2ef1d5fddfb02c38d72314ac0228398e31250c42e7d76571eb1d3db85b992c3ba2155c6496c7e6475eeab31c567f3b9673a7deb6df029a23df2af05d173321c66189a877be958d3b1efabf96272733a503d5b5ba96e1a88098df9793bf42c45312820d7dcb4613cb695a16cf564107f4d0b43c90237c16e106518ab49adeaa63b2f7dc09ef64fcdb59e470c68102b8438ab64d8e955d676eb5a6ab0e0ef01c60160b0daecd351d82c8cb67f265e3b67ec14c1610010b13ff60e1506f06abde6e4b61931c72b0cf125ca93cbd2082c1515900a3598e81a41aff0ad76dce3c5b6ea3d1d1f4e64bf3071ebabf2896fbac592bd4545f5d68c36343217a43076b32dc1e1f87957a3aa71d35c7cb91b32bbef90b8f2f9d94c6379b95ac791fa66cb779909245c18bae88b3ce852d40c9773db1e6a59f033890f8b7a46e3edb98ebb1e640cd156f320afe9abc290bfe89136123d3bb6e829eabd709e2907c2c604ef842b80932700421f2df1333aed07079f579a188f1b934bb3e33e2025d89fe6d63527d2318859ce7079d1f91b8084fb7a6e87459a56c2c575117d6f1ff4eb2c8e630c1e793eb7f485da04cd65e2fbc780c3ef8b95d49ddea6a779596bc477361fd77c2266c60d0644d13cf1bc9cef04ad2757c0bf83ec22d5ab546d5b7e50dcce822701a555ecdbc3d9d6f5a7331559e5787250d50014ed64f3bcbc13440141d537e73d666b620d558c2db2a57f000c33967bad700740348c73564c2ebbf5337491f997ba1ba0afbfe3c6c03e070832d6421424c73686b4c6388f267f6e2c30aac0921cd8b66d52270fef22a120bfc193d52eeb666addb1acf2ddbe5db95fa010f89df8bb31524dec0bf91b5662b8160a4a7f41c2d7c04b055b4af6a7646bdbc4e7d4eda90cf2902a96aff914894622236c75b2153cc6fb90d97a2b099437d2ab6c13d4a5d1b6cf0c5f239073c70c0127ab001a1e35b32a1ec4cb234a0b2b891699c813f9527fecd622e119a753be9072e4e8f1bc8202af157f42967d309438e4126d2339958471a30f6d3fd35cf1c96536629f70b1ad149e011a7cd44a19e172b512b17c0c714506553d171fb4df5963af0f40c6858ff4f311116d891d047a4e158d2276f63bfb47241d1a41ed05c25ff4fe726980b65e797213d8e1a9296a5d6e1eaec8eddaffcc69237c97b2b2728974ef8e4e57c6ea1da7d86649ba3c76b2e3dbb733fcead479830b3e6867d28c958bdf3bd90e61e9858c301459e4d776c02877045e65a88d5eb2755d6b87eb4c79821ad51d67ca83cd9e67453de2f4215da133beba449e679b0c4c7eab0217610ea614aa0b7e640e34a3494ebb412f1a20e49fe7aea89f01f58f379cd525c2bb272d0559d686e797b907b61b193273d7de9de16ecbd9a952e718fa747ba37ecac09cb0809d7472be7e487d40c036ae50269a22f39dfadfe59869e351453f81520536254c7f8b50c2fe394501e9f9962a684e75d13aed6468b9bed7a64a05dbf1ab8912babea3e0324850b2c1b13e6f5a77fce829133ce135cbe972dc8b1e4470b2bbaf2805b5898a196c00cf39e849806a5384a18fdf84abd6d67b38459852420f334dc8c49fee8022ab90a5f013ed8dfae1f4210fe13d2a238523d7d2940d8a874ba06f11372c3b9844ec0f9e1060bac82e7c3d00176947e82c6e3f839e33f1b1702c329de5a1a680b9ead9bc3721e558b19849ba217a81f54522252db82fe5fdac6a1ede51248c6f28169d1d1f3503ab1cbaa30f9955b53f781494a78c619c1d4c8ec6fe74ce5549a765a81fe433eb5d6fc826b6c333f7079843c15a725bc6d5ff84b19d7a7d29cafeeed27badb1d6e7f1ed062a0322c01694936dbc38eb40398837958c542f69133d5d39752ec3c347ac82c849140d68e67fe8dd4342513b976f2a9baf0a368bdd721794e551ced205f0f28d2c2afaab296eae0ca016c448af2bfce464c71d4e2ad949efd059fdd4d6bca07ca32df9b6015a3046192a69eb83ecb556360d226dd24a64d3685b14dcfd58d28681e601fe17d1edcae2ae12c5fca55d4a0d9c07532337dff72e006f8a440e37c60f3961bcb498fd1e6f0ffe6199551c23f54e57f0af042fe0d08e136c707c56a68146901fcbaf80df41fb49a70d71eb8993d6c13ffc2e3db150c52acadb37ed7b794044867dece666995ce18047aad327fbe81a8ed203bc75c0bd83f2b460f278a8b3eb97636d1a9e7ae0f1979e0041159f7b454f2fbf5cab1aa0f446424eadb47866573f3fe88f30b0fab802be2490513c9e52d5a08e9ed6d386e8ead1257c9ca8f660777088905c288b6253edcd51f7f0ae7ac3097b8fd1831d640c704f165d463426ce7b51522163b954ca2070df9a45f558f475e03cf11ad78fb7a4b6da4755926a9fd6f14be30656cb7ac843d231fd22f894e3d9e2003d1ce24a6dff0666ecc9405cf821502d6b45a7d626b4c48bc524d2ea34da05b2d68815c80e945ab2b98f94844ca6985b13dd23237622987760026254ecb526bf0ea56bbb52968b97e6518619f3aaa76a77763a4214d5f6aa73e354db03a667e38cbcd2f497a60c0a3edbefcaf9b1613407b2d6ca5a4a6e354fab1c54ab4b48a6a847d6dcb5556b9544197e1ab0760bed35b889bd40b808cb45f39491b383ec51b82fc5709bebf6b1f3119efe63e7701dd53284501ae01489a93e96c8d3f2d0dbff1d6e72b9d28d4c4376de213d8bf42d5063675a7034a0c14e18ffdc9b531b52fe72850fc9983217d632100eeede4ee35a67311b80076eefc62208bc479e891cc00bab40ffa6952a8c980249d6234f31d548ec54ac13c97fa6a85a722c7a5f988c7a275bf131a74ca6b6a0a7b05fe12f46432db8606269098a9b6282d7df021399b48d707fdde9f11a5cd1978499b0ed50ef6d528228553c853b9b7f90063ec11950c5007ffacb2a4ee7840d5594037d4c19d3f0a4ccf91cbdcc5e42a2f7456317565f87ab6ad4e4e6d7e0fd184d96d7cdf8c85e9d726d8b0a4b08122563c58620debe57e3e5906c93a9cd87bf95f183dd59ae71f1f8135d0ae16452d5a7a1ae1e008fd805b8cbe9ccf00e030de12e1982e9a6bf9bfda61469dd7261435b1c591da7cd0fd60967134373d76caeedbfa29bedd2d187bf8dc8e17cfbc0c65a6163f5947b3cfaba002543e5e09057dd2fc9d74fd499a4597f88f1654e246905e627a9b5d0405d2b8d5ffe2aa4cbf9eb8462f76d86ed7789aa727c7d4fd68cc1ece8507fcc71e1942219d39179af0a8ee0e06ad34f75148ab0eede58e011d1d02ee807fdfae37d15951ef9c5d4fbfd0f08849ca62fbe58619f1be7bcd759000055f224a5fdf51f6628b60b2ad9a6212581ca7fcb1d74d3189987b6adc840ed4d4a054cbbf46f92070a7c5c8f94278464e8fe31bbeb657a3ab21deead55234040de3baf7f69cd8e20468bd4005e167ae10ac2067838489a22716c94b07569fe6077c0c5b801149d9b356f2618bf2563b15a6a8f8681e3b00e644a866d80cefc9875b4afd88cdd03025cff6044e29e80019218bb57932ea13a47378eb69c64ab814a90269c03939e9ed1112bb2bad2f7e0d363b318a89516bb1aacd4cc6d128d4f1f9cddc38608ce7cb48537129dfc657621a71bed4f820bdbe22c00d96924cf7213cc2eb762e082a98d36286fd1398f4f1b7f403dba3c10a315ae7c9f4c45f78660fad327d482c5b5b8df1f08a009b8b22607ae2bb517db091e7e3340619a1465cc4bb52756ac4a2480360ac2873a5015a85f4844f487f67b782c849a4f8473c29be63da95259310b0a4652c6fd6baab44b5f0a673272543c2d266382c6ed980ccdec050ec05d2bce246d74aab994349445cca2850de5d04e08bceb99ba8116e68dbf732b225e9eb9c4b14964fc4b226f365ed24be5825ce2ff02765d9771327a6cc5e724919384ba5e5c4ce0f5cbde1a206b092a472d7507d273c1d3953215c8024bd2b7bba7fcea321affa1452bcc61364b1a004ef0e17a811081d00135c11a47cae6d59e5d9969eec9bc5fc05871bdb98d19debb4f4ee4d96ff28733bfbc58c834da79e1508f2eced14a0f0622e36d9607cc3fc3fdb0eca0783752b3b180b7eef669908397986d9b39a2f91de502c705eb543a5b6572e4d4af05d76a83207610f349147cb7a44e5122d305840c15aad3ab46b6caaf4ff1411c864d1a7981bc5455a8d2387bb70666300c881ad78ef6330ab7fd65291fc16055a366cc1cc5f3fb5a1a8ec05ab42abbf428600794113371b6500a66cf5324e3a455a7ad467879f96225c63f3c5ba0ae7bbe17a720123ff307199492c2a61bda454760eccf04a057a45b7c25dd36595e71d8387b1c7182495825014aef3b4cd88677d8e977c4f2ddfb1008bf90600557f93a9158ac5b234a51e2c3b9f3da94e79cdb414b9f61135ad54a23a6b3593d7ac01d271a5985562d752b6a6d2f8c0c92d94c18e9bf82d7ff0c727185be01d7f15669a64e391fd5b7dc895cb4a0fc69395189dc96d7a13464f487be67463b62f242f72f78796616c24fe0f0441e5cae420b77f1aea4047985422c31ef6d7989880e030ebeca509f515f177bce76a87705d55c6b5fa9e84901cd6ed03d22c253da7c62682578c52432fa028741cda8fea453da5af8c8086d20204264245e524358a9455f1baba2437af41f1161eb88cae010c8d5a17973261745cba1654517172bb092aaff1908921229b986f19375b62c7035d524b90cbe1942e7ac4cd440ee293b06ce0344429d6985ec1b17cc1dd9ca989a6248507f9c362bcaaee786a09a1a6adaad94fd8fe53474f8e9c6fb5ba3ca03e385d09dbdc83d27b4b5e8f40df5041f8743a34fd98d3b780be46836cbf27531a1e3cd1cdaeaeb6bf2094205ffd989d43f1ef85531564047b7eb9493547e22eb15ea274a131c9555627963ff3e2bddc4ea856723961c7b35d5f0f086a5bf14aee6e94e7b8e6624432d01ef3d71de4d9d77e7ffecc9509fffa8ffaa3ea4ebaff5cfc03cab67ef4a911581c543c33229d85c6b2ed9dcf9e17c9d50f9095dcfddef6a91ca4a9592c2d2329bca3212d5193c44ef03ac7740daa381f8ebac5725c1c4caea9115cf54ec8fc07cdaab7075e4fb9979fe3c8a4acdcc590ffe72f29181b7480831c3bf1cde961acd7809a699f5a18d097121cbdc3de7fa4994ef525f816cea4168b4eb309180b2a4e82d02124c2ff5188f9f0dcb4fba08d409b9663197b47498447d7086c9a985686196a3ad0227ebcef1a06f3debed557bd9efb89983a28d88b3e2983b6c029a510bfb17d175295470125bc5c3d3b95673acbf0b24992e0e32008ed4c0a25cfba3a4392a5eadcdbbb37c04b5c901fa744ac5a2678dffa1ed3bb6f37d9b2e381e29b3fb9c4317a2d3bb25c926178c7a215f39db6b2cdcd8c22a312f7021aca8a349e73a06de24c78e6fc8aeb740ef0f7f09bb5ab380c87182ee89fe7feabdc9387aa83d89fb821bbf01055b0da6f9ca8133f4cc87f60639e610b5d4eba55e5df080f853ac647642172b70c96e49bf443271ea638c2fef8cefea2f8b352302412b526f54524b89d04b99d64c3e3f9438638bb51533c5a41ff1f7210859d26355adb94711e079a51d4cd97caeb6780372304ef7db4d173baff5dc4078a0b8070cf3ca8234bab97f44ebf735759d2bc234b00c3c32e001bf1dd38316d92cafd045ba2ec3781d94efdda4c28e45ef1e730442951922ef8f036ca2e2a5be1a4d07728273e35761c3d40e05c67252791e150ced435ac40e3a03a1487592611d770a93f14a65cf0a39e9a342e84fe31699914077123233848df37e08273493f485a46d21be9666d0f3be8872ff32f98cf87fa307b7f679a5abd64d7a86b81a29e019245fc90e8d474a968fbd44bfe7b2ac90b267fcf295d1f727d0c4e811c3d9adeb6265cd863eaa1082307eebac3d3af2046cf4e888a66aad975a1cb2d9a7fd3b4251c13455ec86f2bcf49bb24ce0529cc70c6f79bdbc0a1e01f275abf867d9ea67a69aa7b7c83072721368ca74f1f9211a1814001f2eb7f2ad2ce175484a4f8a3311ecd584ca17df113629ab6ca40ae989723aabdb583fb9270aa0781f3c57fe1ec1476d8beed2f758c322bb83a57985af63c4e0e5fcc87f9c6f42f1a8d02d87e8f5c5a009821201617837681f734c465af029cfa9842a1a7aaa485aecd506a54ccfde647cf62baba77bacc30f503213d729b139546ef2595e6a13155fa6f361e8b11c998f60370b28052dfeac5cc6c7ebd8c76aaa021ee768b72907ef2186a8deb530c38f2771b2e45023041fcab3f2d2f15a041c84bac32eb4fe471b0209abbf6124a1d64c187b773c3b2a909576f71895356616db055ec234285ac7539d26258ad37f4e4884bd5bd626d4852d5f23d919b938ae3cc1f58da626cbfdb40b5a9bbb4455a89ed15d9a4c01f441ca9859816ba6f249a42c3087a8b7216b79fb2c60f278f6ea0d39d9baf3f5c937ad0ff795cd877fe4698884370c1cb24e0200180ccd51c558b45cab6b2149ac15e5df8148da1ac24b08200a20ddaee8c68d76f86326969527ece21a610be64947b51355bd1f6ca5723afe4e57c9393814cfcf04cd5eedf8205eb649d3a89f629fa59bf91ffdc1f0934f08abf564f4a35db0ff345231a2c989960943a7eecb91fc73e8dcb65785e9175ce02698af845740a4ab5d2b014767ebb9bc9314cb0a48c14a6664fdb57eb95100456af8561d8e952988575c059e5f9ca08fc91ce3ca21c484983bcca10b4ec597d9faa953994292c909180a1340642f2fd99bdec2678ff46ccd7fea8d1362a8394d9e56bb7e3496301b865894548ace5a74a74b6292f5215603f81ab6da63e3400f47a53c9b4aa60690cf8b26947ec947658e3775300929a4ff310124e3b1e1fade30b82f680988eeadae754fe649316a68514da69ec72c978a79e1622abd51cc532f516e556ad44860db5e05444562f875b8f863889cb4d7caa16b2f9430abc7ee3354ef86147314a1fed427333d50bc7024a64db4d8d2cccc44ea42ea7790901ddb4643cef8516024732a7c97b8edb8a750eca0edb5b2c5e47b7fb4fbcf67651b06049daff650ab45db493cf7d37331cc27c60b22accbe28c3be46efa42c6ee5e312319e934d9ec1a0f2403667221419ce91fd7732358a08953b1fc5ac1bd09fa13aa3419d908119c2ea335d70a8b77e60835202f86289cd1cec9215be5d2edd40c7fa3ad74a5c7d49c12298d1d66e0a4ff706e4ea49bfdcc9a5009e174d0122575be13a0335029554d7779e4ccda2725311178f3140ad7014b79a265b716c322dfc012c6015e3b1bf2623e8885a8adb016ac16bf4cf6b9ff7c188f9d746d7519365d90b640d1311bfa1cabeda9ff83ac3ae1bf01eb9b90fe2a2faf89110dc55f66858f06a5eda7b74a05049711975f861b5ea95a3af7ef357213c972ebf9df900d828400e731e918ca054c5f54de96a6f807f5595bc58e132fa7f2c37e3f68d942eafbd83be5485a07f252da9ab66ad63ae173162123b5f44f799f73042c8ac11c9ae1914d722c69e959f982d4de2c4c595d96c1ebcfb5ff54d0d9007b092cb37444e9968270e7b36f4d0a6bf0077c8df0dc20c4eb998c7b5731f57b619d763bd0068484fa040bd2b5d0d683a8b4c43ef20fecc834c2c6ac22452e0917f47fba2b6d7f1ea5221e0f73fd867f79375a91a5c290762ccf44fa44cb50e0b2a75ff7208bc2cecd179b853d0ca2d684a60de3d8d411c49eab7ee66c80c0d3c6b871b8008e6d631bf49eaac3af2236e69e22b808e4fb9d23166dcc38ba8a0969ee410986d10e58c82f5bfd448127aa8692a4aca1d86884b65dec5eab3819b82faba343871e614fe03f9e965cfc1c637a5d341a40d7dba25a926f650ecfd1b681c6754c894b36833ad006b0bc0925b016c1c4ca119d8ca6c01897217c77365a0c801f863af73d41840a0286febcbe9c153a74679df8fb584eb0089223b7ad1156f1f029c2bf10d0173a29ee15d67f887f0993d6738e400ea173eb4ee500b1e2bbf0a74cbbf7ae3134c1370a86a2ef90a15f74a8f8408ea56b6d2326b5e7e2da0316b9f167611cec2f6875a384e86e62e2618c5b6303466977257c69c291a0827d687fe03780320e793ca9f5d21be33598d9cba9f007212708286e579ad3b744358b2caaa03fb0139f42652a19f2988066d2855da339137a220d95058ee45e372ce39b67b805e5fa318e2c3f361c829a16da1c45f0ce3c84be6717317259c49f5153d8712ed928608036236ade30d27850994bf601f48a85861bba1d44e7ac098ecddc6ea5a30fd01dd98abfdcb9ee90c71b6e9c3387e91dae4ec437f94a0f78762c9e97af7365d7b9611c3aef273ff559a114f4bb7ee6f92fb8dcfa4fc3f343ee5556fb4062ca58310f64c88e4f04f56ec8bd88481769d21e3725a6cbd47d73d267fafa426cfb71b12ee73f2d3cb00967286bec0bdb6c5aedd843844e4d100079d0e3c9fb7de41ecb8bf3d72edf95719c930640405831704725678a663efc54c5eeac5415914fdb6b1c79e5ba75525cca189a7bf2b3b9cfbf09a27233620a9cccfcf67ab49d5dd422aefeba5291e633343a854ffcb8ae1322aeb7a0de3fd3ef25910104c4a1f6966a8b6580100f362043907c4b9e18911031b41ada2825b7b89a5b396cf735b3b86b8bbd5a98e9a2db9b20fe4dec236712b2e9a8d787ac3d9873d468fa7777965d364f8ea82f8745bfb4d6209a934bf7fc3bb594f1ff14321c0e770202b398776744a8d28ba021d4b57e53e6d288e1826bdcc788c7c10868108b0bc098b13ccd6ab637a5ec6e1dd358a68c15d8a6687931e18684158301471df4d5d2cbeaa162e27983928997b68b4ff59da90d9094e09fc96963bd90bebedddb1bb745f4b914243487684f5c1a67a84cbb66809a0015fda7f6a007ae09db902b21167a05a46a429b046f5725f55d3163be14e3b43eb7d6534f75d0c903016dc69bd6ce81a2339eb53d2322c856e071d6c6920e8d096a19795ae89db815e1a18bee0a5f832e3ad1aff4037dbe70ce5deb3fea70f746745406cf8972b5c0d0df1766b72214fb43f9961f36e9911b03eae32762b120951b09d35679629286a1d967dc673799314b51211cb5153bb1fe26c13c50e53c4c466947b99e573d02931ce8bd6627189b6b15a3b9899eb4bf3eb36cd48b22bdb9e6fbd77ee4ef83a53c8b4bd2f78f9f8c652a42f4fd91ce70c15822f053b58de447bc4aee4017f8409f6d91257d8c97ad8ee03ecc6065cab9aa5c00180d471e2a30ff1b81062550604492f852a6d0675d4f612c37918b1e89f4e3a6435b85b42bf4ff67787e931dbdc3181f844af3d5a8b3411265131dc825505c41012f668f23d05ced4ab9b049c12629ae1c21eb3f05be6ad6a007a3438b16802b793c65143f5f6226e82321558a7d8a1bdcc12838730943062769cd92689d17952392618653a2943eea695b984a3583b006593ec9f20e2ef3fb77804b07c9be30d754c11d9ce1af464008de57d2fb7a74bfc64af74e20a0b2cb4799fdf9a988bf13d5c864e4fc719bb3fd6f2a9da3b1c7625028afcd28e36b507d5231129654a0eee80acd3bc199b68e14f852b9863a34da080b7af8cf0d7fc2b7a26b73913e66f95104f86271a199a79ecc46d5cb629ad86ce0f647af62a8cecb3fcb06cedb1590288af76c8292b3f30441a8843d3e9dd765944ec8286161da09d589af020bc62858001c01f80c8b6a399d7d8533ca2be321146b5c69a2104b6eb0c5de2a5177650319722aaf9a4957c107db73c13d7dbec649a868672bae8b4dd3c6bd4ecff0076f2c80ff92279905c70f8632e1ef55516b9ef619c48670e0b3648f43bfa93d892efa93162de70cdabadb5a102c482c8e6fec9b5859f4eb3a0402d85cd728f92739330879b9c50f18c858c4e1d4e3bf37ec6eb84cc51ae0a43e944c90eead88557e73eb20182a24bf9afbcac60be039c32efaf0aff3cf4da16a41df67ecad4e40c94af91a8a25e6c41125f91bedade33d950ad2287cd6bedcb8153443045c1f5eb1053bd14171a20ff4d4907ae94cfefec14da832b0243b42223c4956e794fb0c1be132a334eaf920c5dbeb7d7430ea4f567c78cffd5cd68ef5108c429208260099474d6e144ac895e9727839ad118e454b22aa084174c0d22164776d209f6633f902d798176a008b728b3c9730383fe6a217983f4ab9525095e14fe30165b0d7908dfafcf50ec66669914f5fd4353c76867cc349baa8a708865c3e2096be8270fbf9bdcbd02d5418f83bb2bccb0e6ca444017b6ba40a26ef83567ae4a0122c57bcd1515dd447f72a985d9216597c549ca7fef6e161160e5fc6bbf8b22b1d57dd6308ceae3e6c7478ab94bb3f95f4c6ce2d0f7f20ce5758600b9b7cd9ccdb72b38db1f6b7787eb21602c5eb16f5967746854ddb16c0d75cf879d6e682f25e81de236262e672aa75f66e36724a709a09eb8807a7d0d21d4fb44801f81ba9889c21609092d600ffe9c26b2ec2ae015126bda7a70f10b923194b08be326ff0af2456ee39de96548b1d37353dbc56addf0c2afd940b3b420497ae5288f8d51677fef37829ffa636225c185e5e863df7377a2d7066772c0a2a422cb4cb1fbc1d80fcc4ab3334e3588fc250ecd1267e446984a5e48e7f4c8c0312499e688b76b28a5a2651f03608debc6dd1295e0e27a070fb7ab510e6a559a461f7bb4aac3e1589b4f34b36f5052ee983533ff2cee9028db90fa3a7bb353a2db7224a9284f1b29db67d3c5c4718cc80f9ddc8e1335756bf903d5ce6c591595539bd766780a90250a0f374577f8fc37787768f39b5169b87b47f17d83fc4b18fc172cc7d669b740fc830a51f475c220484ddf3eb79d5f05650403ec3151f4c68e8be57d96fe0f8756f4b15e9353f5699bdf4236719bb301aa3f61ad2509517a327b11249e2d2f3b6e1a86544428e2a0d3a6a1866974454b36ed90864a519854344c943616e4c3a1a1e7836e9fb49e92d4f4ef4a302700f10d8d00d298e41929a47658571758c2acff93a704c0061d48a34dbf28f4fd641c22f7b7c0789cc601cd1be59f7e28dcd6dbf75540099717dc26c09cfa73443972456b5c7af17f8ff53d514c0586ffb60f501fce0f6f356239a480a884932b1d17dbbcf17264851a61c9127760b8303c78e68e48b6c1828a12a38e450e97d32a5f02dcdb4224de4e41fd873c53127fcf19aec3573e73e79f33f49149889b8837c401b2640b5ce8de5307268e03ffbac3eb4de946343efb24fbd7db9026c9732969e7fce1de69b073a519520c198f26604aa5c3c272891539fc93dbaea8e1acbe088701f5b2e2a49d7cfd23e663b3da9e7abc7e7f3bfdd5cbb8de68f3433a6030be182e40004b2d9b87f5cb596ba7a95235ce409b7fe3f9cbb55a1eacf9149977056f94b139238798da20673d6a6525f3ff67597424e4f1bde7d887b08efc783874e33f0856acc5027d774883cac28d515e0abfb6e4b5c72a8c45312ca896065f99a6d22c5121b8819bb4794ebec733da79209fb98b5d2119e6d945cf265cab6740a1ab68081df76cf3754de03748753e755fcf1d5b51f651abeb844e3eec835bb522a1941e88367c52a1915b396c7c490c7d5e8991423a7cbe1b35e6a746479f567c84d27c5a3aadd0138e386c00c7804c459976a629dee5e0b8f376b94e07b0fdc972b8745041ae85a0385f8cd2863068c7f8597ab2c4094b8af317941c34120ffd27e4eae2c5c65d5201d45bad2b8e21d6e53bea9ee0fce42b431522692d6ace2a2c698f91d02d86c7af8601365506030465ac5019c5da81d9c4c6f65510d4a6b77f53d8cc9586488bbd7093aa3f5a12850f662c80ea19f5f58687ab6e2205ca60ddcf5bb3afc6eeed15356c42534bc52ad178f63542bd890fa04a792c7405cc34275aff6850e6781f5cc648ab948a51c2d5eadeac5b061aeee40f06c06d7e3d4428465acc78a5d41689ed51291a052b7928db1c05e527d62c123ee296ca50b8b533d33aae2ea4326c88a235782f51d34bd794998ee6c9414fc3d6725375824bc60d46ffccd44e0c20a9b2c0b0f9056ca1918d4fa764b52ee1721e932418fd6da13259a58464004949b68090034590e7822f87b8e0be7bd8491c0fd8d02a42b9bbb291e718baafcb2a3cca945bea7836aa3ac3371f57c18b8fe9cdf09189b0c04a967acb1e56186c4afdf819dcfb727735ae55f96038ef167a662a3f4d79cb1229ae11b63e75258bc0e4fb714ac817e83fd5f8238dfab9a134130eb204cf41118c502acf3ce3c97b46579748c03d8a39e5c3c7d9eedb901cdf0f587ca9ac560d44cd54346c9b809bca56eeeed262164326de0cfafd8b9165a66c9a236ca8c785892afd5ffb7e492fa3d38bda383a1f933384840ffa9d8e6b025401eebaa65eb0ec7deec61280694c9612444bf8ed67e9f27d17a1120c0a34f6d9c3bddcfca2ab32149c5c6c735ce42c1dc23661f6c6241da9f21f8361f9171e60f2df73764123bb379e86732fb9edf2c936a10871620ca463b38ecd1f0555fb575bfac3e53a42ac9366f4b068bbc2f1c1f53828373defea631ca0b1cd007e26c8dbeae7959ad978156011aeffd71345d89984483780f57f33c92faf495d74684e974d7a6091889b3081751ac218b0fbda8b380ea4749e91c5a70d5ce8a0d5cc58fcfff41f12ae169b83f980451cb8d377b3611d13849b330889b140203f5f52f8fedd05002d3284392443e054731a008064f5c0b9eefded237e82e5216116ee721914b31a08e5f82ffd04d88f579ec7b0106fd064457616fa03605b5dbc59b35c9a3b75629f307f1086e9efd1d267e0235a5b6b8145d80a94283394fb9fd4d30b5cb6001af65f842cbe3c3c85f756bc367f43eb55e283158d103678795b5f8edc42a3281a90c959aaf9798bca1f5257e59d3ce0de1afc02661e87fc24b968354042792edcd960a8b057951a874ab535989f1342b69914fe8d8ab6a388e99b32f2b477619e45cc8977121f9dcc5efcefc40ee06885cb41fc1f6fda0c6195afd7a0c83e2f8298f326ab1a88c854ba77381923ee2d9b3f7ffb0f3e0278cde2324f64598a185e7d288a960f152b75b7984dd9b95a513efc87fb70d38be2126ec1ab2c438953214e4f9790d46cb8cb7290a246451bf927163786d106d062f6201db95e347e254d9ebf50921d0f7202da0f4a6bfc8cf1108ad23d610f44c771ab8695adf26fb6ca9f7fc5f0dd5e1eb71e3fbf2f829f6d6380e98091691220929c0ce5f6fcb2d8982e3d85049f1528376db783846f1add4ad235a9f8edd9c422d42a8a46e59d69d198c8c8bac92cfc13c2747175acd5549bd764f63a747a51f2bf1eba662b6ad1d66b3c9a0ec0906e71ad9e7b9bbe077f96e1d2478df8c15f66ca918c2eafe9ef71d4f7d0ae563a58a1b09ce5d37f2d3673dd8227735390feba97292e7d490face806354568a685e410555d5f1b88124bdabfc95a2629033b91eed3bc40299b31ab2c9aa791830d88c3063fd3f5954d11e7440b081a0ebaaa07ca1b2faa1a20388a193162e5c1da08d24a5a4b6d6ba80ad4e152bf258915fb570b9e8976569768bb9af7c55fa0f9f599d595b97732cfb9c134b647e8ba48dab6f1ba18062657f36c2cfd85bdd9b6f406c8a560ac492c7a011c85da639c757d981dae744d3b79728c84b19b1b06cf18748c4807cd0e86ffd6e32db193a8d173b6f59c10df0f80f96756ddc04e881dd7a1aab9aeaa8e86166831f9d57be62dc127713a9efce76c40d1da856ab1ea42bb8bfa1028abd3b36111ddf8d7e9688b629fda2c9621a063ab8e8803f8b9cb867b212e5a68a5973af30cd021f32b163c36633ca3ab99fae420bff9c93e686a4717978ff4e3474d272f26261ea6317e844350610a22dee9c738e60ada32c4117f99f60f055775dec4b875fc0f4153d7598b07dbb3da18af4727cd78742e94d68fe63e5b90648d7d5c67915d5f03d2f13a2fbae22a1ddef22fadf575e68ff665c2422ce23f6b0ddbcecf3402fa4a2f82f2b77217998b73afe48acaadb0cfcf70f50e458639f5073baba981416336b736c39d62546edec076322abccd3ce54e9243b51630e2caeab816f01158961e8eefc23ee4951c258854ba277b19c035ad2d53636b82e5f837e710bc546f3cbade32e997d90a3741d7390711b3c81ab95b65bd6c80673546cf1cbd5a09c5406255615c7a4576a261d624d73daca1d2a300b5a10a942f4c8550e6b0cfb1fb2f8caaf23d2ad3e82de71a828af60e5f9e4cd4d88281b42e5e465e7abd268b8e7cab76187cb0c06353eec33dc4abbb9f00eed479c75d4117eda01af7cfc7291dd53439798ce7bc7e04dac877e05c5d0e056d857ce406cb5977e8c2a371f772fe8d496a5ed501c03b23121d42e5dd49edeb554377d5efd3536c945e06ed2ce11e0ea7089a4f579d7a04634cc72a3044e0967bac6e77b49780243c9646f67dcee14682daf4a27bb289d48710b72a321e9df4f9964c09a49618d87be538f7bc30dc6b7a9c5724992ed03523ae7dee9319ed516c8e1deb4627e2ca025d50f618958ff121012a6c56e1588a5a605ede996a48007a89c9bd56887336fb965d43cf4a1d4ed73e578494919f8f0de7902238b8867401ab9fad13c30ec403402efdfb9fecf72c994636efa7ee3d6606525a13ca5d691febfeb38d2cb3fe0a4cf80004ca34867bf10cf80efb84b00ccee327c37d03d5400735ac44f50047228631c297a970a08f29a7d2bc9dfcf2dd100011f575c84d636d440d326491bdee569ed3fba76ee2bee70c7411e4dc8763cc57d78051d11e5ee46b965e500f4151322bb53fa45c0524134bb74a11d6267e8b48aaf644fe82bf7b75ba90866ecfaac2f9352431fccbb1b4eba8094e6d205356dae67b3655b56d57b742fa6cafa32d2da40fffb04c4329dcf75be583d2309abc9b9811290f6751dbccf41b7f79b48f9cd07c80a1942b189bfff54442d2ee2e011b18724e493f3502f4d669cce46a720cb240a447c3736f3a345baf05468d2db2144a14c2b0b7e91a0c1331e1d8c905aeb34528dc85d9cccae3a0650a6cb5419ee8691bab1a17298531c3466c22837028aedada096e3b30fc096a64e6c2f626806c9784a460e1f94669904993ee6120a1460067f55c55fcd8638c482e320f4124e9e4d4357ebd6711eb77e677f97341fc4b02b00fc986804a81ebdef74c163842e8e15f6bed999dbf8cc771c140f137d5dc0b91810fb7627a534caa0b47ba63d4272f9fe83bc2211c74ca49809a42067ebe153c9f2fb6b3f4e5e0d106cfe3ab991960e753de8a41af12af941a71b00c2148fc2a3c129e991b748b82ffbb8a1f2ea38b24ed21ab81463b37592a5beebaa1e2bceb0301a726815ce83f4894b4bd158b29075ae7045db96ee59d9625414532949f74beafa4e06ddde31444645ad350f307641241bda3b24454aaf64d061fe16af1dc09dc50935bb7793f854f6a346ff52593b3df1d1672ca1f4a8fddaf5903cd8d21e8974fca1dd72a4f06eda1db58a37553bb3875a0db440bdff7eb48cec0bdc8c68cd0fa18fa69047d9644f24788b9a467e54fee949f60dec03df1eaef3efa5c14c1574a8fa7389dab549cfc70a436f506dedeb3ea906e0e525dce3579a6b93a91221e707696b27f9986dca9ba83bc6bec23a715ea56234fb83c5d806ee6924d1eede20f4482a60a425d6aea077ccfc677a3984909486a706d645ca3041b02d8fc3c323804c4db33c9e7d57072a6a5d8a2801934eb9a3e1fe171146ca05edf2e40a53c4f6f124d924066f0ac601ca4f244fc7cc9de0e60562c8b062f3249912ad945dc1d4ee6050c2241cd25f83751509dc6b78e5aa12a7080d868224ec0358b7eec2879d83b73d3a1ae4b9e674dad7cb7cfd45224084e03cec9a72b20a7b00844e2f0794881b56c9a791c111c1710a048a1551a8d39a48608fe8e0ebfb4e742cadf6164f3a5df87c03a7c1167adc64f239aab99b317fab7490f0468562f5c92aff1568976da7cdffdb524694b275aec2c6cea242e91b9f9add11d9fad184bcf0a3d3409b18ad59a4471cef5c53c10e08e8a3e5de654f4e55603123c2b64ab06415441e3768a7662760d145d7f058213e6d00139966c66fdecd257fe93e49dae5051dd0a0b7be3ad2fd194cfa0f558d863009583b5e6f4da734497b64d6202763daee0fd3c69ab1807f930721329bc42d54f358f404356d9dc7a15c2d5b04d7913c035756e92660b09e8a322fff60f045be92f8424bc6455ec933dc6291b81a4b7084b21db258d6eb40601a016b9b0be9cde6b3cba1d95b2f056bb43af70e1e24166b5dd4de154a853b1863eacdf928ee74bec48ae4c7ac32c78eaf1e580442020a1dc29292b2bc27c03dcbd62b5a0741bcffa3a0940e9235441125d0de835edfc3c51b6d02c06749f08a4a10063a5dd1d8e4ce7c79f84b2eb4885803b74632c0d9964b475da0492304a25afbc8bf7c9e980e46fe60f3a237724dd75957152d9baeec6be27f4b25536df123d0378efee34f09790f741374de382cab6e4c428632d579c20fcf34932f4a0fc709ffca564541a66effbc32936a00b7454f94c297967c32024fa593fa96ffb1b386ff115c139c3a775b672c4de2df2105cc37a7b12b8f5d0505cb48e2871c01a7e63a94edb2ecdb68fed5975b634502f4e41267d71130a1e4c216640bde5f8ee758e74dbe5b2a9ea4e47248ead69b6a45fe59ee0df3f9c5aaf7d1c2e462bc672666e5127ba1ad235f56420111b78ecbb8195eabfb9340344ffb55cc04f02a9d00909732448982d58552f6e15fc3ad4f1bf7d16d7038043fcc049d2ab830cb3a735923d5496c5143d9d787839b96f053744357ddbfc8e187ecffe729476e9225e768f01ec7d25803feb5364f25015202f819c87c77a9e9d55c3c8dd6066cb27b7880dbfb27b3d446afaf331c1c0f2507ec2a48dad3f08ea02f584fa120f6593652df297574355b3b1390615d710e592c34392e79001dff90877db077e57aae0f3bb1e3e4cb2336a1e4f4aec0c15ad5fc98c76683f8a9a3f8047387462cdc67ecbd6917eb4f3fa50d482038bb07446e4ee5bad9064eafdb85305fea2f03623b35f2011c97409fa0e984ea0341d61ee7e31979425b4a0806c8bf537dfc87d666493def8137aae62cfb1feac2041d7bb4fdd322c476ee8de9cbac5a5299f219d64c118ed706c0c66c61c5fb668a5208702a820987d34dabe2a71412328db886956f9a531e5e2b8d4665aa0a5b8823d1ee74312fe3ead259befb375ef3758b9a8a9eb39d88a6fa9fd40a0eee5b0f18aa5b965408889892ac8488ee209cda6511300f4f4bad2824bad3546595d69303755caa283b276d706304fba199f2eef8903e664c79f397236e10b486deace60191e51d5f3a874bc162ad0d0813bcf72597b24224ffd92396ad35acab747af0b4de914e09b69d287053fe311bbd8bf7bb73f3c8c2d227bd011d4a9001370e1992d3f8fd30459deb5dc37cc47ed2f4ca882d338aeb7d097a89ac3f245ead3d04f2ab6deb3a1fa394ce8d07a63d6197b7a9fed339525966f5d96d0966966e9678872646aec2f463ad6127da3579708979d0bdd07c8ce3c4283e6c25aac2ef343bb53c75a3f5017572cacf6e924bd3ed3c7a24776da912bd2ef1eb817eb79553d801b1cbd92e55012190e9337752ba5d567f4124a4328b7c4d17e919185cf2a36dbc12d32b483c2d722dbf688c0932f5eeda999a15fdc070a7e383c74fffd7509edc9789b4284defe3468a455777415617a0c4114a141fc741ec04421ceb602f15750a3f37838e4ef77f83a707a7523f048c4d55657afa7dc219cef9fcc768193fb031b6fb33ed036d33320a58133e2661db1b8b716aa41924b74757cf6f8c858762502f079d50ab7ed2dbaf27adb828f60c491d58fecc5e2a8dfada2a4d81cc1e6be50deee5eccd519c2ccc46457920289254c8deb5c1e5e76afde01ac9e11ca3d020e7dc08429550c1db5e943440894a386d6ffc78b464bdeb3b8bfa96dcf9bb9558a3f8da94bb0e249e1c89b840b1f2db095122b95f630c1c02a069cb0a9773a282325e4d6f2327b444e8ba6ac1e0c2caf87308c102762f69adf7a73882d8c3</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-default">      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">写作模版</summary>
    
    
    
    <category term="考试备考" scheme="https://whynotv.github.io/categories/%E8%80%83%E8%AF%95%E5%A4%87%E8%80%83/"/>
    
    
    <category term="四六级" scheme="https://whynotv.github.io/tags/%E5%9B%9B%E5%85%AD%E7%BA%A7/"/>
    
    <category term="考试备考" scheme="https://whynotv.github.io/tags/%E8%80%83%E8%AF%95%E5%A4%87%E8%80%83/"/>
    
  </entry>
  
  <entry>
    <title>英语四六级备考指南</title>
    <link href="https://whynotv.github.io/posts/8ccc.html"/>
    <id>https://whynotv.github.io/posts/8ccc.html</id>
    <published>2024-06-14T09:00:00.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<h1 id="英语四六级备考指南"><a href="#英语四六级备考指南" class="headerlink" title="英语四六级备考指南"></a>英语四六级备考指南</h1><h3 id="时间分配建议："><a href="#时间分配建议：" class="headerlink" title="时间分配建议："></a>时间分配建议：</h3><p><img src="/img/src/六级时间分配.png" alt="时间分配"></p><p>第一部分是写作跟听力，这一部分是1小时，开始答题后30分钟写作时间，然后就开始播放听力了。<br>建议 ①写作 25min左右 留5min看听力 ②听力 35min 答完题后收第一张答题卡。</p><p>第二部分是阅读和翻译（这一部分是取舍问题，有效的时间拿更多的分，重点的地方可以适当多些时间）<br>答题顺序①仔细阅读 ②长篇阅读(段落匹配) ③翻译 ④选词填空<br>①仔细阅读：10×(2-2.5)min<br>②段落匹配：15-18min<br>③翻译：25min<br>④选词填空：剩多少时间用多少.</p><h3 id="写作模版"><a href="#写作模版" class="headerlink" title="写作模版"></a>写作模版</h3><ul><li><a href="https://whynotv.github.io/posts/e1a.html">英语议论文模版</a> </li></ul><h3 id="六级阅读"><a href="#六级阅读" class="headerlink" title="六级阅读"></a>六级阅读</h3><h4 id="段落匹配-方法"><a href="#段落匹配-方法" class="headerlink" title="段落匹配-方法"></a>段落匹配-方法</h4><ol><li>浏览题干选取定位词<br> 定位词选取：<ul><li>有专有先挑专有信息定位（比如 专有名词 人名、地名、机构名、年代、时间、数字、特殊符号）</li><li>没有专有挑名词（不可以是文章背景信息，因为背景信息的名词全篇出现）</li><li>实在没有名词再考虑形容词和动词的组合</li></ul></li><li>容易定位题目和能够暗示段落的题目优先做<br> recent / today / future 这类词 大概出现在文章的后置段落 (学术文章一般是有时间顺序 从古老-最近)<br> cost / spent : 花费 那就可能对应 有 货币符号、数字<br> stage : 步骤、阶段 那就可能对应 序数<br> different : 不同的 那就可能会 罗列信息 展示不同类别</li><li>剩下题目优先查找未出题段落</li><li>若该段落包含题目中两个及以上原词或者同转，则该段为答案</li></ol><p>注意：</p><ul><li>若两个题目定位在同一段落，可以额外划另外一个定位词验证</li><li>注意段落可能被复选</li></ul><p>文章结构：<br>  问题 (客观困难) 的描述，问题解决1 + 问题解决2 + 问题解决3 + 问题解决4 + 要求 建议 期待 未来 更好</p><h4 id="仔细阅读-方法"><a href="#仔细阅读-方法" class="headerlink" title="仔细阅读-方法"></a>仔细阅读-方法</h4><ol><li>理解题干大意并选取定位词</li><li>注意题干设问给我们的暗示</li><li>优先理解定位句当句内容，通过理解然后直接进行选项匹配</li><li>对于不好定位的题目可以使用“夹B原则”；单选题为顺序出题</li><li>无定位词的段落，从定位段落最后一句向上推，寻找第一次存在逻辑表达的句子；再理解句子内容，进行选项匹配</li></ol><p>注意：</p><ul><li>不推荐先浏览选项，容易先入为主；</li><li>不要从选项中划关键词回文章中定位；</li><li>应当先知道文章对应的答案表述句，再进行选项匹配 </li></ul><h4 id="选词填空-方法"><a href="#选词填空-方法" class="headerlink" title="选词填空-方法"></a>选词填空-方法</h4><p>嘻嘻嘻，我基本上做到这里就没时间了，就简单的标一下词性，然后填空空。<br>这题主要考察词汇量和语法 放在最后做。</p><ol><li>阅读空格当句的内容</li><li>选择词性正确、搭配得当的词语</li></ol><hr><p>感谢您的访问！希望您能喜欢我的博客内容。</p>]]></content>
    
    
    <summary type="html">英语四六级备考指南</summary>
    
    
    
    <category term="考试备考" scheme="https://whynotv.github.io/categories/%E8%80%83%E8%AF%95%E5%A4%87%E8%80%83/"/>
    
    
    <category term="四六级" scheme="https://whynotv.github.io/tags/%E5%9B%9B%E5%85%AD%E7%BA%A7/"/>
    
    <category term="考试备考" scheme="https://whynotv.github.io/tags/%E8%80%83%E8%AF%95%E5%A4%87%E8%80%83/"/>
    
  </entry>
  
  <entry>
    <title>Hello</title>
    <link href="https://whynotv.github.io/posts/34d2.html"/>
    <id>https://whynotv.github.io/posts/34d2.html</id>
    <published>2024-06-08T10:26:06.000Z</published>
    <updated>2026-08-20T02:04:42.922Z</updated>
    
    <content type="html"><![CDATA[<h1 id="我的个人博客"><a href="#我的个人博客" class="headerlink" title="我的个人博客"></a>我的个人博客</h1><p>欢迎来到我的个人博客！在这里，我将分享我的想法、经验和项目。</p><h2 id="最新文章"><a href="#最新文章" class="headerlink" title="最新文章"></a>最新文章</h2><ul><li><a href="posts/article1.md">文章标题1</a> - 2024年6月8日</li><li><a href="posts/article2.md">文章标题2</a> - 2024年6月7日</li><li><a href="posts/article3.md">文章标题3</a> - 2024年6月6日</li></ul><h2 id="关于我"><a href="#关于我" class="headerlink" title="关于我"></a>关于我</h2><p>我是一个热爱编程和写作的开发者。在这个博客中，我会分享我的编程经验、项目以及一些个人见解。<br><div class="tip success"><p>success</p></div><br><div class="tip home"><p>home</p></div><br><div class="tip home"><p>Hello</p></div><br><div class="tip home"><p>测试</p></div><br>这是一条测试信息。。。。</p><h2 id="分类"><a href="#分类" class="headerlink" title="分类"></a>分类</h2><ul><li><a href="categories/programming.md">编程</a></li><li><a href="categories/life.md">生活</a></li><li><a href="categories/projects.md">项目</a></li></ul><h2 id="联系我"><a href="#联系我" class="headerlink" title="联系我"></a>联系我</h2><ul><li>邮箱: example@example.com</li><li>GitHub: <a href="https://github.com/yourusername">我的GitHub</a></li><li>LinkedIn: <a href="https://www.linkedin.com/in/yourusername">我的LinkedIn</a></li></ul><hr><p>感谢您的访问！希望您能喜欢我的博客内容。</p>]]></content>
    
    
    <summary type="html">这是我的测试网页</summary>
    
    
    
    <category term="测试" scheme="https://whynotv.github.io/categories/%E6%B5%8B%E8%AF%95/"/>
    
    
    <category term="测试" scheme="https://whynotv.github.io/tags/%E6%B5%8B%E8%AF%95/"/>
    
  </entry>
  
</feed>
