<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:version="2.0"><channel><title>🧊 BigWind&apos;s Blog</title><description>这是BigWind的博客，我在这里放置那些不为人知的秘密和故事。Welcome to visit and click, let&apos;s journey together!</description><link>https://bigwind.cn/</link><language>zh</language><item><title>3月6日小杂感</title><link>https://bigwind.cn/blog/life/3%E6%9C%886%E6%97%A5%E5%B0%8F%E6%9D%82%E6%84%9F/</link><guid isPermaLink="true">https://bigwind.cn/blog/life/3%E6%9C%886%E6%97%A5%E5%B0%8F%E6%9D%82%E6%84%9F/</guid><description>杂碎的想法，姑且是篇散文。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/life/3%E6%9C%886%E6%97%A5%E5%B0%8F%E6%9D%82%E6%84%9F/&quot;&gt;https://bigwind.cn/blog/life/3%E6%9C%886%E6%97%A5%E5%B0%8F%E6%9D%82%E6%84%9F/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Info from &amp;quot;../../../components/mdx/Info.astro&amp;quot;;&lt;/p&gt;
&lt;p&gt;&lt;Info&gt;近来所思，杂碎的想法，姑且是篇散文。&lt;/Info&gt;
好久没有去更新自己的博客，好久没有去写下文字，代码固然简洁高效，却难以寄托我的情感，实习的日子过了又去，工作的变动一天接一天，那些复杂难喻的感受，在日复一日的Work中积累消磨，始终没有被表达。&lt;/p&gt;
&lt;p&gt;我想人都是寂寞的，寂寞的雪也未曾在绵阳落下，倒是春雨淋漓了起来。&lt;/p&gt;
&lt;p&gt;在这些或者那些的要求下，娱乐也变得单调省时了，偶尔几把王者，偶尔去晒晒难得一见的太阳。我在两地的高铁奔波，却极少放眼流动的景色。&lt;/p&gt;
&lt;p&gt;在办公室伏案的日子里，我又错过了多少夕阳呢？&lt;/p&gt;
&lt;p&gt;日出也是少见的，当我出门时，阳光还在寻找回归线...&lt;/p&gt;
&lt;p&gt;当然努力也算有所见效的，至少...&lt;/p&gt;
&lt;p&gt;希望往后的春光依旧明媚，等我忙完这阵子，到处去转转，想必是极好的。&lt;/p&gt;
&lt;p&gt;而你呢？寂寞的游客，又是在哪的链接，寻得了这互联网的犄角旮旯，来见我。&lt;/p&gt;
&lt;p&gt;祝你也有和煦的阳光洒落肩头，消融你的寂寞。&lt;/p&gt;
&lt;p&gt;就这样...&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Tue, 03 Jun 2025 00:00:00 GMT</pubDate></item><item><title>Adding Comment Systems to Frosti</title><link>https://bigwind.cn/blog/adding-comment-systems/</link><guid isPermaLink="true">https://bigwind.cn/blog/adding-comment-systems/</guid><description>A comprehensive guide on how to integrate the Waline comment system into your Frosti blog</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/adding-comment-systems/&quot;&gt;https://bigwind.cn/blog/adding-comment-systems/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;One of the essential features of any blog is the ability for readers to engage with your content through comments. While Frosti provides an excellent foundation for your Astro-based blog, adding a comment system requires a few additional steps. This guide will walk you through integrating the Waline comment system into your Frosti blog.&lt;/p&gt;
&lt;p&gt;Static sites like those built with Astro don&amp;#39;t have built-in comment systems since they lack server-side processing. However, we can use third-party comment services that handle the backend for us, while we integrate their frontend components into our site.&lt;/p&gt;
&lt;h2&gt;Creating Comment Components in Astro&lt;/h2&gt;
&lt;p&gt;Before diving into a specific comment system, let&amp;#39;s understand how to create and use components in Astro. We&amp;#39;ll create a reusable component that can be easily added to any page.&lt;/p&gt;
&lt;h3&gt;Component Structure&lt;/h3&gt;
&lt;p&gt;We&amp;#39;ll create our comment component in the &lt;code&gt;src/components/comments&lt;/code&gt; directory. First, let&amp;#39;s ensure this directory exists:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir -p src/components/comments
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Integrating Waline&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://waline.js.org/&quot;&gt;Waline&lt;/a&gt; is a simple, safe, and feature-rich comment system with backend and frontend separation. It is highly customizable and easy to set up.&lt;/p&gt;
&lt;h3&gt;Step 1: Set Up Waline Backend&lt;/h3&gt;
&lt;p&gt;Before adding Waline to your site, you need to set up the backend:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a LeanCloud application to store your comments.&lt;/li&gt;
&lt;li&gt;Deploy the Waline server to Vercel or another hosting platform.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Follow the &lt;a href=&quot;https://waline.js.org/guide/get-started/&quot;&gt;official Waline guide&lt;/a&gt; to set up your backend service. After deploying, you&amp;#39;ll get a server URL that you will need for the frontend component.&lt;/p&gt;
&lt;h3&gt;Step 2: Create the Waline Component&lt;/h3&gt;
&lt;p&gt;Let&amp;#39;s create a reusable Waline component:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;touch src/components/comments/Waline.astro
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add the following code to this component:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;---
interface Props {
  serverURL: string;
  lang?: string;
  dark?: string;
  emoji?: string[];
  meta?: string[];
  requiredMeta?: string[];
  reaction?: boolean;
  pageview?: boolean;
}

const {
  serverURL,
  lang = &amp;quot;en&amp;quot;,
  dark = &amp;quot;html[data-theme-type=&amp;#39;dark&amp;#39;]&amp;quot;,
  emoji = [&amp;quot;https://unpkg.com/@waline/emojis@1.1.0/weibo&amp;quot;, &amp;quot;https://unpkg.com/@waline/emojis@1.1.0/bilibili&amp;quot;],
  meta = [&amp;quot;nick&amp;quot;, &amp;quot;mail&amp;quot;, &amp;quot;link&amp;quot;],
  requiredMeta = [],
  reaction = false,
  pageview = false,
} = Astro.props;
---

&amp;lt;div id=&amp;quot;waline-container&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/@waline/client@v3/dist/waline.css&amp;quot; /&amp;gt;

&amp;lt;script
  type=&amp;quot;module&amp;quot;
  define:vars={{
    serverURL,
    lang,
    dark,
    emoji,
    meta,
    requiredMeta,
    reaction,
    pageview,
  }}
&amp;gt;
  import { init } from &amp;quot;https://unpkg.com/@waline/client@v3/dist/waline.js&amp;quot;;

  let walineInstance;

  async function mountWaline() {
    if (walineInstance) {
      await walineInstance.destroy();
    }
    walineInstance = init({
      el: &amp;quot;#waline-container&amp;quot;,
      serverURL,
      path: location.pathname,
      lang,
      dark,
      emoji,
      meta,
      requiredMeta,
      reaction,
      pageview,
    });
  }

  document.addEventListener(&amp;quot;astro:after-swap&amp;quot;, () =&amp;gt; {
    mountWaline();
  });

  document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, () =&amp;gt; {
    mountWaline();
  });
&amp;lt;/script&amp;gt;

&amp;lt;style&amp;gt;
  #waline-container {
    margin-top: 2rem;
    margin-bottom: 2rem;
  }
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 3: Using the Waline Component&lt;/h3&gt;
&lt;p&gt;You can now use the Waline component in your Astro pages or layouts. Here&amp;#39;s how to add it to your blog post template:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;---
// In your blog post layout file
import Waline from &amp;quot;../../components/comments/Waline.astro&amp;quot;;
// Other imports and frontmatter...
---

&amp;lt;!-- Your blog post content --&amp;gt;
&amp;lt;article&amp;gt;
  &amp;lt;slot /&amp;gt;
&amp;lt;/article&amp;gt;

&amp;lt;!-- Add the comment section --&amp;gt;
&amp;lt;section class=&amp;quot;comments&amp;quot;&amp;gt;
  &amp;lt;h2&amp;gt;Comments&amp;lt;/h2&amp;gt;
  &amp;lt;Waline serverURL=&amp;quot;https://your-waline-server.vercel.app&amp;quot; /&amp;gt;
&amp;lt;/section&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace &lt;code&gt;&amp;quot;https://your-waline-server.vercel.app&amp;quot;&lt;/code&gt; with your actual Waline server URL.&lt;/p&gt;
&lt;h2&gt;Troubleshooting&lt;/h2&gt;
&lt;h3&gt;Common Issues&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Comments not displaying:&lt;/strong&gt; Make sure your &lt;code&gt;serverURL&lt;/code&gt; is correctly set and accessible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSS issues:&lt;/strong&gt; Ensure that the Waline stylesheet is properly loaded.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment issues:&lt;/strong&gt; If your server is on Vercel, check the environment variables and deployment logs.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Tue, 15 Apr 2025 00:00:00 GMT</pubDate></item><item><title>随笔 虚拟生命</title><link>https://bigwind.cn/blog/life/%E9%9A%8F%E7%AC%94-%E8%99%9A%E6%8B%9F%E7%94%9F%E5%91%BD/</link><guid isPermaLink="true">https://bigwind.cn/blog/life/%E9%9A%8F%E7%AC%94-%E8%99%9A%E6%8B%9F%E7%94%9F%E5%91%BD/</guid><description>脑海中的残缺故事</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/life/%E9%9A%8F%E7%AC%94-%E8%99%9A%E6%8B%9F%E7%94%9F%E5%91%BD/&quot;&gt;https://bigwind.cn/blog/life/%E9%9A%8F%E7%AC%94-%E8%99%9A%E6%8B%9F%E7%94%9F%E5%91%BD/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Info from &amp;quot;../../../components/mdx/Info.astro&amp;quot;;&lt;/p&gt;
&lt;p&gt;&lt;Info&gt;脑海中的残缺故事,梦后的只言片语&lt;/Info&gt;&lt;/p&gt;
&lt;h2&gt;结尾&lt;/h2&gt;
&lt;p&gt;如今想来也是可笑，我是个悲观主义的代表，总是寂寥的看待万事万物，他是乐观主义的荣光，永远张扬着活力和春意。&lt;/p&gt;
&lt;p&gt;到如今，我苟活着，倒有几分惬意和自由，他燃尽了光和热，决心和世界告别了。&lt;/p&gt;
&lt;p&gt;可惜世界似乎并不记得他。&lt;/p&gt;
&lt;p&gt;又或许他不想要被记得，无论是整个世界，还是我。不然怎么解释呢：对他的记忆模糊了，连同那些伤感、遗憾甚至快乐，都被抹去了？&lt;/p&gt;
&lt;p&gt;我想我也是个虚拟生命，为着一串不知目的的核心代码活着。&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Tue, 26 Nov 2024 00:00:00 GMT</pubDate></item><item><title>自由在两种文化环境下的核心</title><link>https://bigwind.cn/blog/life/%E8%87%AA%E7%94%B1%E5%9C%A8%E4%B8%A4%E7%A7%8D%E6%96%87%E5%8C%96%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84%E6%A0%B8%E5%BF%83/</link><guid isPermaLink="true">https://bigwind.cn/blog/life/%E8%87%AA%E7%94%B1%E5%9C%A8%E4%B8%A4%E7%A7%8D%E6%96%87%E5%8C%96%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84%E6%A0%B8%E5%BF%83/</guid><description>对东西方文化的一些感想</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/life/%E8%87%AA%E7%94%B1%E5%9C%A8%E4%B8%A4%E7%A7%8D%E6%96%87%E5%8C%96%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84%E6%A0%B8%E5%BF%83/&quot;&gt;https://bigwind.cn/blog/life/%E8%87%AA%E7%94%B1%E5%9C%A8%E4%B8%A4%E7%A7%8D%E6%96%87%E5%8C%96%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84%E6%A0%B8%E5%BF%83/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;在西方&lt;/h2&gt;
&lt;p&gt;自由在英语的表达是Free，他，源自古英语 freo，意为“免除束缚；自主行动”，亦有“高贵；欢乐”之意，源于原始日耳曼语 * friaz * “被爱的；不受束缚”的词。&lt;/p&gt;
&lt;p&gt;在近代Free还有免费的意思。&lt;/p&gt;
&lt;h2&gt;在东方的起源和变迁&lt;/h2&gt;
&lt;p&gt;而在中文中，自由最早的出处应该是史记的言贫富自由，无所予。 &lt;/p&gt;
&lt;p&gt;《孔雀东南飞》里面的母亲说岂敢自由专，来指责儿子的婚姻自作主张。
在东西方的语境里，自由都是从阶级斗争中产生的Free可以指从奴隶制中的解放或者专制的解放。而在东方里自由这个词更强调在新民主运动以后，和德先生赛先生一起加入了中国的主要价值观。
在此之前自由的提出，总是边角料的旁枝末节的。有人会把庄子当做自由的先贤，但庄子始终不在主流语境下保持着足够有震撼力的地位。&lt;/p&gt;
&lt;p&gt;只有在东方的提出伴随着清朝时期殖民主义和帝国主义的双重压迫，是在压迫的过程中，广大民众呐喊出的心声。
自由在东方总是要天街踏尽公卿骨的。总是带着王侯将相宁有种乎的。他是古老的，同时又是被忽视的，他是广为人知的，又同时是渺小无人在意的。&lt;/p&gt;
&lt;p&gt;直到反帝国和反殖民主义的思潮如火如荼，自由的呐喊，才真正的宣告了东方哲学上的诞生。&lt;/p&gt;
&lt;p&gt;因此自由在东方的价值观里代表着人民当家作主的核心要素和根本动力，代表着广大人民群众的主人翁精神，在东方的语境里自由不仅反掉了帝国主义殖民主义，各种杂七杂八的压迫的阶级性的主义，同时也加入了自己要当家作主的朴素要求。&lt;/p&gt;
&lt;p&gt;自由在古文里是由自的倒装， 我们很多人说自由自由，但是并不知道自由的字意是什么，由自己决定，这是东方古老的哲学。
由人民当家作主，这是东方新的哲学，也是共产的哲学，主人翁的精神标识。&lt;/p&gt;
&lt;p&gt;自由中间夹杂这半年以来的屈辱史带来的反思和无数前人先烈的探索和牺牲，因此在东方，自由即是一种追求，也是一种沉重的付出或者说代价。
自由是有代价的，是有牺牲的。他令人们向往追求，又令人血泪尽付，肝脑涂地。&lt;/p&gt;
&lt;h2&gt;自由在西方的阶级性变化&lt;/h2&gt;
&lt;p&gt;但是在西方的语境，自由是免于束缚，更多的是奴隶制的束缚。
自由中的阶级思想变得软弱了，甚至被遗忘了。在资本阶级的轰炸下，自由甚至是免费的。&lt;/p&gt;
&lt;p&gt;因此近代西方的自由，更多的强调是免于付出代价。这种代价是制度的或者是资本的。
自由在西方是脱缰野马，没有任何制度上的，道德上的基本的束缚。Free跟强调个体的独立，这种独立甚至是破坏性的。
因为你很Free，所以你可以做出破坏阶级团结，破坏社区和谐，或者破坏当地人民利益的事情，而在这个方面，西方显示出了制度上的缺漏。&lt;/p&gt;
&lt;p&gt;因此Free不仅美好，同时也可憎。西方的民众，坚信自由的代价是零的，因为他们没有偿还过这个代价，这个代价被拖欠了，阶级斗争和历史清算，没有结束，甚至没有开始。
宣扬或者说叫嚣着自由的林肯，死前甚至仍有种植园和奴隶佣人。而西方奴隶制度的真正废除，法律上的废除，甚至在新世纪之后，而且废除的不动声色、怕人声张。
换句话说，在西方，聪明的资本主义仍然在拖欠自由的结算，为此愿意付出高额的贷款利率，制度成本，并决意由他们的人民承担且继续长期的承担。&lt;/p&gt;
&lt;p&gt;在西方自由是文明的灯塔是绝对的正确，但很少有人说自由是有代价的，他们总是把代价转移给他人。当漂亮国派兵阿富汗时，他们在能源上自由了，把当前制度上的代价转寄给阿富汗的广大人民，阿富汗人民由此进入了政权的真空期，混乱的萌芽期，于是他们叫嚣着，虽然你们失去了一切，但是你们自由了。
他们把军事自由的代价交给了相信热爱国家并为此服上兵役的人民群众，他们把士兵道义上的困境，药物毒品的依赖，和美国人民极高的军事债务打包贷款了能源自由，即使这是一笔高利贷。
他们毫不在乎，因为还款的不是他们，资产主义阶级把所有代价通过华丽的金融包装，赋予他的天选人民，再把巨额的钞票和利润揣进自己腰兜。
美国人民由此破产，他们透支道义金融甚至是制度上的未来，资产主义唯一给他们带来的是拖延结算的美梦。&lt;/p&gt;
&lt;p&gt;无论当今的西方是谁上台谁下台，最核心的政治纲领就是拖延自由的破产清算，不惜以制度破产，国家破产降低欠款。
那么资本主义的自由能持续多久呢？换句话说，资本主义。想要拖到什么时候对自由进行破产清算呢？当然是拖到跑出国界时。
我们常说资本无国界，但很遗憾，这是理想状态。资本想要实现高利率，就必须绑架国家。中国的古话就是窃国者侯。当资本和国家深度绑定的时候，脱钩无疑是需要时间的。&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;资本想要的是脱钩，但广大的国家的人民群众想要的是清算。&lt;/p&gt;
&lt;p&gt;旧时代的账不能总是拖着，让新时代的人民来偿还。把旧时代的资本主义扫进历史尘埃。至少能还清一部分自由的债务。&lt;/p&gt;
&lt;p&gt;那个时候的Free，免费的账单终于有了顶额的清算。&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Mon, 11 Nov 2024 00:00:00 GMT</pubDate></item><item><title>What is Const in CPP</title><link>https://bigwind.cn/blog/cpp/what-is-const-in-cpp/</link><guid isPermaLink="true">https://bigwind.cn/blog/cpp/what-is-const-in-cpp/</guid><description>C++ const的个人理解</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/cpp/what-is-const-in-cpp/&quot;&gt;https://bigwind.cn/blog/cpp/what-is-const-in-cpp/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../../components/mdx/Collapse.astro&amp;quot;;
import Diff from &amp;quot;../../../components/mdx/Diff.astro&amp;quot;;
import Error from &amp;quot;../../../components/mdx/Error.astro&amp;quot;;
import Info from &amp;quot;../../../components/mdx/Info.astro&amp;quot;;
import Kbd from &amp;quot;../../../components/mdx/Kbd.astro&amp;quot;;
import Success from &amp;quot;../../../components/mdx/Success.astro&amp;quot;;
import Warning from &amp;quot;../../../components/mdx/Warning.astro&amp;quot;;
import TimeLine from &amp;quot;../../../components/mdx/TimeLine.astro&amp;quot;;
import LinkCard from &amp;quot;../../../components/mdx/LinkCard.astro&amp;quot;;&lt;/p&gt;
&lt;h2&gt;作用&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;修饰引用，指向常量的引用（reference to const），用于形参类型，即避免了拷贝，又避免了函数对值的修改；&lt;/li&gt;
&lt;li&gt;修饰成员函数，说明该成员函数内不能修改成员变量。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;const 的指针与引用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;指针&lt;ul&gt;
&lt;li&gt;指向常量的指针（pointer to const）&lt;/li&gt;
&lt;li&gt;自身是常量的指针（常量指针，const pointer）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;引用&lt;ol&gt;
&lt;li&gt;指向常量的引用（reference to const）&lt;/li&gt;
&lt;li&gt;没有 const reference，因为引用只是对象的别名，引用不是对象，不能用 const 修饰&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;const 的判断技巧&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;const总是先对左边生效再对右边生效&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;Info&gt;eg：int const a和 const int a 等价，在int const a 中const对左边int先生效。&lt;/Info&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;*的效果取决于在const左边还是右边，*在左边为const指针，*在右边const指针的数据内存值。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;Info&gt;eg: int const *p和 int * const p ，前者 * 在右为常量指针，后者为指针常量。&lt;/Info&gt;&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 23 Oct 2024 00:00:00 GMT</pubDate></item><item><title>复杂度分析复习笔记</title><link>https://bigwind.cn/blog/algorithm/complexity-analysis-review-notes/</link><guid isPermaLink="true">https://bigwind.cn/blog/algorithm/complexity-analysis-review-notes/</guid><description>《Hello算法》学习笔记</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/algorithm/complexity-analysis-review-notes/&quot;&gt;https://bigwind.cn/blog/algorithm/complexity-analysis-review-notes/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../../components/mdx/Collapse.astro&amp;quot;;
import Diff from &amp;quot;../../../components/mdx/Diff.astro&amp;quot;;
import Error from &amp;quot;../../../components/mdx/Error.astro&amp;quot;;
import Info from &amp;quot;../../../components/mdx/Info.astro&amp;quot;;
import Kbd from &amp;quot;../../../components/mdx/Kbd.astro&amp;quot;;
import Success from &amp;quot;../../../components/mdx/Success.astro&amp;quot;;
import Warning from &amp;quot;../../../components/mdx/Warning.astro&amp;quot;;
import TimeLine from &amp;quot;../../../components/mdx/TimeLine.astro&amp;quot;;
import LinkCard from &amp;quot;../../../components/mdx/LinkCard.astro&amp;quot;;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;复杂度分析犹如浩瀚的算法宇宙中的时空向导。
它带领我们在时间与空间这两个维度上深入探索，寻找更优雅的解决方案。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;算法效率评估&lt;/h2&gt;
&lt;p&gt;在算法设计中，我们先后追求以下两个层面的目标。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;找到问题解法&lt;/strong&gt;：算法需要在规定的输入范围内可靠地求得问题的正确解。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;寻求最优解法&lt;/strong&gt;：同一个问题可能存在多种解法，我们希望找到尽可能高效的算法。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;也就是说，在能够解决问题的前提下，算法效率已成为衡量算法优劣的主要评价指标，它包括以下两个维度。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;时间效率&lt;/strong&gt;：算法运行时间的长短。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;空间效率&lt;/strong&gt;：算法占用内存空间的大小。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简而言之，&lt;strong&gt;我们的目标是设计“既快又省”的数据结构与算法&lt;/strong&gt;。而有效地评估算法效率至关重要，因为只有这样，我们才能将各种算法进行对比，进而指导算法设计与优化过程。&lt;/p&gt;
&lt;p&gt;效率评估方法主要分为两种：实际测试、理论估算。&lt;/p&gt;
&lt;h3&gt;实际测试&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;缺点:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;难以排除测试环境的干扰因素&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;展开完整测试非常消耗资源&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;理论估算&lt;/h3&gt;
&lt;p&gt;&lt;Info&gt;由于实际测试具有较大的局限性，因此我们可以考虑仅通过一些计算来评估算法的效率。这种估算方法被称为&lt;u&gt;渐近复杂度分析（asymptotic complexity analysis）&lt;/u&gt;，简称&lt;u&gt;复杂度分析&lt;/u&gt;。&lt;/Info&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;复杂度分析描述了随着输入数据大小的增加，算法执行所需时间和空间的增长趋势&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;迭代与递归&lt;/h2&gt;
&lt;h3&gt;迭代&lt;/h3&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;迭代（iteration）&lt;/strong&gt;&lt;/u&gt;是一种重复执行某个任务的控制结构。在迭代中，程序会在满足一定的条件下重复执行某段代码，直到这个条件不再满足。&lt;/p&gt;
&lt;p&gt;常见代码迭代形式:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;迭代形式&lt;/th&gt;
&lt;th&gt;适用范围&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;for循环&lt;/td&gt;
&lt;td&gt;适合在预先知道迭代次数时使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;while 循环&lt;/td&gt;
&lt;td&gt;while与 for 循环类似， 循环比 for 循环的自由度更高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;嵌套循环&lt;/td&gt;
&lt;td&gt;时间复杂度可能会随嵌套升幂&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;递归&lt;/h3&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;递归（recursion）&lt;/strong&gt;&lt;/u&gt;是一种算法策略，通过函数调用自身来解决问题。它主要包含两个阶段。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;递&lt;/strong&gt;：程序不断深入地调用自身，通常传入更小或更简化的参数，直到达到“终止条件”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;归&lt;/strong&gt;：触发“终止条件”后，程序从最深层的递归函数开始逐层返回，汇聚每一层的结果。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;而从实现的角度看，递归代码主要包含三个要素。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;终止条件&lt;/strong&gt;：用于决定什么时候由“递”转“归”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;递归调用&lt;/strong&gt;：对应“递”，函数调用自身，通常输入更小或更简化的参数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;返回结果&lt;/strong&gt;：对应“归”，将当前递归层级的结果返回至上一层。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;对比&lt;/h3&gt;
&lt;p&gt;虽然从计算角度看，迭代与递归可以得到相同的结果，&lt;strong&gt;但它们代表了两种完全不同的思考和解决问题的范式&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;迭代&lt;/strong&gt;：“自下而上”地解决问题。从最基础的步骤开始，然后不断重复或累加这些步骤，直到任务完成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;递归&lt;/strong&gt;：“自上而下”地解决问题。将原问题分解为更小的子问题，这些子问题和原问题具有相同的形式。接下来将子问题继续分解为更小的子问题，直到基本情况时停止（基本情况的解是已知的）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以求和为例，f(n)=\sum n&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;迭代&lt;/strong&gt;：在循环中模拟求和过程，从1遍历到n，每轮执行求和操作,1+2 -&amp;gt; 1+2+3 -&amp;gt;... -&amp;gt;1+2+...+n&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;递归&lt;/strong&gt;：将问题分解为子问题,既f(n)=n+f(n-1),f(n-1)=n-1+f(n-2)..直至基本情况f(1)=1，再依次计算f(1)、f(2)...最终得到f(n)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;迭代&lt;/th&gt;
&lt;th&gt;递归&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;实现方式&lt;/td&gt;
&lt;td&gt;循环结构&lt;/td&gt;
&lt;td&gt;函数调用自身&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;时间效率&lt;/td&gt;
&lt;td&gt;效率通常较高，无函数调用开销&lt;/td&gt;
&lt;td&gt;每次函数调用都会产生开销&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内存使用&lt;/td&gt;
&lt;td&gt;通常使用固定大小的内存空间&lt;/td&gt;
&lt;td&gt;累积函数调用可能使用大量的栈帧空间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;适用问题&lt;/td&gt;
&lt;td&gt;适用于简单循环任务，代码直观、可读性好&lt;/td&gt;
&lt;td&gt;适用于子问题分解，如树、图、分治、回溯等，代码结构简洁、清晰&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;时间复杂度&lt;/h2&gt;
&lt;p&gt;&lt;Info&gt;时间复杂度分析统计的不是算法运行时间，&lt;strong&gt;而是算法运行时间随着数据量变大时的增长趋势&lt;/strong&gt;。&lt;/Info&gt;&lt;/p&gt;
&lt;h3&gt;常见类型&lt;/h3&gt;
&lt;p&gt;设输入数据大小为&lt;em&gt;n&lt;/em&gt;，常见的时间复杂度类型如图所示（按照从低到高的顺序排列）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240920-66ed11decfa4a.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240920-66ed11f249680.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;Warning&gt;&lt;strong&gt;算法的时间效率往往不是固定的，而是与输入数据的分布有关&lt;/strong&gt;。&lt;/Warning&gt;&lt;/p&gt;
&lt;h2&gt;空间复杂度&lt;/h2&gt;
&lt;p&gt;算法在运行过程中使用的内存空间主要包括以下几种。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输入空间&lt;/strong&gt;：用于存储算法的输入数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;暂存空间&lt;/strong&gt;：用于存储算法在运行过程中的变量、对象、函数上下文等数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出空间&lt;/strong&gt;：用于存储算法的输出数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一般情况下，空间复杂度的统计范围是“暂存空间”加上“输出空间”。&lt;/p&gt;
&lt;p&gt;暂存空间可以进一步划分为三个部分。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;暂存数据&lt;/strong&gt;：用于保存算法运行过程中的各种常量、变量、对象等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;栈帧空间&lt;/strong&gt;：用于保存调用函数的上下文数据。系统在每次调用函数时都会在栈顶部创建一个栈帧，函数返回后，栈帧空间会被释放。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指令空间&lt;/strong&gt;：用于保存编译后的程序指令，在实际统计中通常忽略不计。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;设输入数据大小为n ，常见的空间复杂度类型（从低到高排列）:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240920-66ed12f2a2d30.png&quot; alt=&quot;&quot;&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240920-66ed1306b51ae.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;降低时间复杂度通常需要以提升空间复杂度为代价，反之亦然&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;Q &amp;amp; A&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Q&lt;/strong&gt;：尾递归的空间复杂度是O(1)吗？&lt;/p&gt;
&lt;p&gt;理论上，尾递归函数的空间复杂度可以优化至 O(1)。不过绝大多数编程语言（例如 Java、Python、C++、Go、C# 等）不支持自动优化尾递归，因此通常认为空间复杂度是O(n)  。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q&lt;/strong&gt;：函数和方法这两个术语的区别是什么？&lt;/p&gt;
&lt;p&gt;&lt;u&gt;函数（function）&lt;/u&gt;可以被独立执行，所有参数都以显式传递。&lt;u&gt;方法（method）&lt;/u&gt;与一个对象关联，被隐式传递给调用它的对象，能够对类的实例中包含的数据进行操作。&lt;/p&gt;
&lt;p&gt;下面以几种常见的编程语言为例来说明。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C 语言是过程式编程语言，没有面向对象的概念，所以只有函数。但我们可以通过创建结构体（struct）来模拟面向对象编程，与结构体相关联的函数就相当于其他编程语言中的方法。&lt;/li&gt;
&lt;li&gt;Java 和 C# 是面向对象的编程语言，代码块（方法）通常作为某个类的一部分。静态方法的行为类似于函数，因为它被绑定在类上，不能访问特定的实例变量。&lt;/li&gt;
&lt;li&gt;C++ 和 Python 既支持过程式编程（函数），也支持面向对象编程（方法）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Q&lt;/strong&gt;：图解“常见的空间复杂度类型”反映的是否是占用空间的绝对大小？&lt;/p&gt;
&lt;p&gt;不是，该图展示的是空间复杂度，其反映的是增长趋势，而不是占用空间的绝对大小。&lt;/p&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.hello-algo.com/chapter_computational_complexity/&quot;&gt;Hello 算法-复杂度分析&lt;/a&gt;&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Fri, 20 Sep 2024 00:00:00 GMT</pubDate></item><item><title>开启Windows自带剪切板</title><link>https://bigwind.cn/blog/tutorial/enable_windows_built-in_clipboard/</link><guid isPermaLink="true">https://bigwind.cn/blog/tutorial/enable_windows_built-in_clipboard/</guid><description>快速学习Windows增强功能</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/tutorial/enable_windows_built-in_clipboard/&quot;&gt;https://bigwind.cn/blog/tutorial/enable_windows_built-in_clipboard/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../../components/mdx/Collapse.astro&amp;quot;;
import Diff from &amp;quot;../../../components/mdx/Diff.astro&amp;quot;;
import Error from &amp;quot;../../../components/mdx/Error.astro&amp;quot;;
import Info from &amp;quot;../../../components/mdx/Info.astro&amp;quot;;
import Kbd from &amp;quot;../../../components/mdx/Kbd.astro&amp;quot;;
import Success from &amp;quot;../../../components/mdx/Success.astro&amp;quot;;
import Warning from &amp;quot;../../../components/mdx/Warning.astro&amp;quot;;
import TimeLine from &amp;quot;../../../components/mdx/TimeLine.astro&amp;quot;;
import LinkCard from &amp;quot;../../../components/mdx/LinkCard.astro&amp;quot;;&lt;/p&gt;
&lt;p&gt;&lt;Info&gt;在使用电脑💻的时候，大家会用上各种快捷操作😃，如果要说一个在世界范围内都能称之为“经典”的电脑入门操作，莫过于 &lt;em&gt;&lt;strong&gt;复制&lt;/strong&gt;&lt;/em&gt; 和 &lt;em&gt;&lt;strong&gt;粘贴&lt;/strong&gt;&lt;/em&gt; 这两个几乎人人必学的功能。&lt;/Info&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240911-66e1514b91e54.gif&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;为什么要使用剪切板&lt;/h2&gt;
&lt;p&gt;复制和粘贴虽然经典，但是不少朋友也仅仅是复制粘贴，像是 Windows 系统自带的调出历史剪贴板内容的功能，可能一直都没有开启过。&lt;/p&gt;
&lt;p&gt;开启剪贴板，在大批量或者高频复制粘贴有着独特优势，同时剪贴板可以较长时间暂存图片和格式信息。&lt;/p&gt;
&lt;p&gt;例如有一百条学号号或者是好几段文献资料这类数据需要复制粘贴，如果只使用&lt;Kbd&gt;Ctrl&lt;/Kbd&gt;+&lt;Kbd&gt;C&lt;/Kbd&gt;/&lt;Kbd&gt;V&lt;/Kbd&gt;就会有及其高频的切换页面/软件的行为。&lt;/p&gt;
&lt;p&gt;一般来说Windows自带的剪切版就够用了，如果有更专业的需求，可以考虑剪切板增强工具，例如 &lt;a href=&quot;https://gitee.com/ayangweb/EcoPaste&quot;&gt;&lt;strong&gt;&lt;u&gt;EcoPaste&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;开启剪贴板&lt;/h2&gt;
&lt;p&gt;&lt;Error&gt;遗憾的是，在Windows电脑上，这个功能是默认关闭的&lt;/Error&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;开启方法：&lt;Kbd&gt;Win&lt;/Kbd&gt;+ &lt;Kbd&gt;V&lt;/Kbd&gt;键&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;开启效果如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240911-66e14ad3c8237.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;键位介绍&lt;/h2&gt;
&lt;p&gt;&lt;Warning&gt;请勿在剪贴板存储敏感数据，因为可能被其他风险软件/WEB获取&lt;/Warning&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;键&lt;/th&gt;
&lt;th&gt;操作说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;Kbd&gt;删除&lt;/Kbd&gt;键&lt;/td&gt;
&lt;td&gt;删除剪贴板中某条选中的数据。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;Kbd&gt;固定&lt;/Kbd&gt;键&lt;/td&gt;
&lt;td&gt;将某条选中数据固定，关机不会清空，适合高频不敏感数据。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;Kbd&gt;全部清除&lt;/Kbd&gt;键&lt;/td&gt;
&lt;td&gt;清除剪贴板中的所有数据，除了使用&lt;Kbd&gt;固定&lt;/Kbd&gt;键固定了的数据。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240911-66e14b14ac887.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;&lt;Success&gt;现在你成功学会了使用剪贴版，快去试试吧！&lt;/Success&gt;
会使用剪贴板，会在繁杂的文档工作中助你一臂之力💝&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 11 Sep 2024 00:00:00 GMT</pubDate></item><item><title>如何测试自建邮箱的得分</title><link>https://bigwind.cn/blog/web/how-to-test-the-score-of-a-self-built-mailbox/</link><guid isPermaLink="true">https://bigwind.cn/blog/web/how-to-test-the-score-of-a-self-built-mailbox/</guid><description>提高送达率，避免进入垃圾邮箱或者被拒绝</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/web/how-to-test-the-score-of-a-self-built-mailbox/&quot;&gt;https://bigwind.cn/blog/web/how-to-test-the-score-of-a-self-built-mailbox/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../../components/mdx/Collapse.astro&amp;quot;;
import Diff from &amp;quot;../../../components/mdx/Diff.astro&amp;quot;;
import Error from &amp;quot;../../../components/mdx/Error.astro&amp;quot;;
import Info from &amp;quot;../../../components/mdx/Info.astro&amp;quot;;
import Kbd from &amp;quot;../../../components/mdx/Kbd.astro&amp;quot;;
import Success from &amp;quot;../../../components/mdx/Success.astro&amp;quot;;
import Warning from &amp;quot;../../../components/mdx/Warning.astro&amp;quot;;
import TimeLine from &amp;quot;../../../components/mdx/TimeLine.astro&amp;quot;;
import LinkCard from &amp;quot;../../../components/mdx/LinkCard.astro&amp;quot;;&lt;/p&gt;
&lt;p&gt;&lt;Info&gt;很多朋友邮件发到 QQ 邮箱都进垃圾箱，或者干脆收不到，导致想要在朋友面前大显身手，结果颜面扫地😆，如何让你的邮件准确到达收件箱呢？&lt;/Info&gt;&lt;/p&gt;
&lt;h2&gt;推荐测试网站&lt;/h2&gt;
&lt;p&gt;你可以到👀 &lt;a href=&quot;http://www.mail-tester.com/&quot;&gt;&lt;strong&gt;&lt;u&gt;邮箱测试-mail-tester.com&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt; 😍检测你的邮件分数， 满分就基本确定你的自建邮箱可用且发送的邮件不会被识别成垃圾邮件！&lt;/p&gt;
&lt;h2&gt;测试步骤&lt;/h2&gt;
&lt;h3&gt;向测试邮箱发信&lt;/h3&gt;
&lt;p&gt;打开网站后会给你一个测试邮箱，点击复制后，在你的邮箱里发一份邮件，建议内容随便复制一段话(20个字左右即可) ❗不要留空,会减低评分&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240905-66d90b892e0f7.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;点击 &lt;em&gt;查看你的邮件得分&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240905-66d90b8c63a39.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;等待结果&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt; 如果是10分，恭喜你不用再折腾，如果不是，去下面没打勾的测试点击下拉查看详情并修改你的自建邮箱配置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;Warning&gt;一般来说自建邮箱开启DKIM认证非常重要，它使邮件可信且识别为重要&lt;/Warning&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240905-66d90b8f0cdaa.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;对自建邮箱测试是非常重要的👍&lt;/p&gt;
&lt;p&gt;我曾犯过偷懒💤的错，结果就是虽然邮箱的搭建是成功的，但被识别为垃圾邮件移送垃圾堆或钓鱼邮件被拒绝送达&lt;/p&gt;
&lt;p&gt;这导致了我以为已回复的邮件，对方根本没找到或收到🙌,使得我的简历并没有送达或被回复📞&lt;/p&gt;
&lt;p&gt;&lt;Info&gt;经常出现自建邮箱不好用，嫌折腾麻烦，看我这篇教程托管邮箱到lark &lt;a href=&quot;/blog/web/lark-email-uses-a-custom-domain-name&quot;&gt;&lt;strong&gt;&lt;u&gt;🚩使用Lark企业邮箱服务启用自定义域名邮箱&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/Info&gt;&lt;/p&gt;
&lt;p&gt;不过现在我轻松获得10分！你也来试试吧！&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Thu, 05 Sep 2024 00:00:00 GMT</pubDate></item><item><title>见近日青海路虎女逆行打人事件有感</title><link>https://bigwind.cn/blog/life/feeling-about-the-recent-incident-of-a-land-rover-driving-in-the-opposite-direction-and-hitting-people-in-qinghai/</link><guid isPermaLink="true">https://bigwind.cn/blog/life/feeling-about-the-recent-incident-of-a-land-rover-driving-in-the-opposite-direction-and-hitting-people-in-qinghai/</guid><description>以妥协求生存则亡，以斗争求生存则存</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/life/feeling-about-the-recent-incident-of-a-land-rover-driving-in-the-opposite-direction-and-hitting-people-in-qinghai/&quot;&gt;https://bigwind.cn/blog/life/feeling-about-the-recent-incident-of-a-land-rover-driving-in-the-opposite-direction-and-hitting-people-in-qinghai/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Info from &amp;quot;../../../components/mdx/Info.astro&amp;quot;;&lt;/p&gt;
&lt;h2&gt;事件起由&lt;/h2&gt;
&lt;p&gt;&lt;Info&gt;原报道：&lt;a href=&quot;https://news.sina.com.cn/s/2024-08-30/doc-incmmrrk3235499.shtml?hasPlayedTime=70.072735&quot;&gt;&lt;u&gt;被逆行路虎女司机打伤男司机是退伍军人，事后女司机未向其道歉-新浪新闻&lt;/u&gt;&lt;/a&gt;&lt;/Info&gt;&lt;/p&gt;
&lt;p&gt;“逆行插队打人事件”发生于8月28日13时许。据青岛崂山区警方此前通报，38岁的女司机王某驾路虎车行至崂山区青山村观景台附近时逆向行驶，因对向正常行驶的26岁男司机林某某(退役军人)未对其让行，王某下车对林某某进行辱骂、殴打。&lt;/p&gt;
&lt;h2&gt;疑点&lt;/h2&gt;
&lt;p&gt;现场有黑衣男子身份不明，后续公告称女已被拘留，但有网友称“在家拘留”，并拍摄到图片。&lt;/p&gt;
&lt;h2&gt;罗翔老师推崇的幸福者退让原则&lt;/h2&gt;
&lt;p&gt;在近期另一个地方的惨剧，两名男子起了冲突，其一名男子怒火攻心，持刀杀害了另一名男子。评论区纷纷普及所谓的幸福者退让原则&lt;/p&gt;
&lt;h3&gt;什么是幸福者退让原则&lt;/h3&gt;
&lt;p&gt;主张在狭路相逢的冲突情境下，那些拥有更多资源、更稳定生活状态的个体应主动退让，避免与处于弱势地位的人针锋相对。 这里的“命贵”，并非单纯指经济财富或社会地位，而是指个体所拥有的幸福感、安全感以及对未来生活的积极预期。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240902-66d577d3e824b.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240902-66d577d6bb091.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;谁幸福？&lt;/h2&gt;
&lt;p&gt;幸福是一个相对值，而阶级不是。&lt;/p&gt;
&lt;p&gt;你很难去比较谁更幸福，所谓的“&lt;em&gt;那些拥有更多资源、更稳定生活状态的个体&lt;/em&gt;”在许多冲突并不成立,冲突的双方往往都是普通的劳苦大众，争夺的是个体微薄的利益或尊严，于是打上了所谓的补丁“&lt;em&gt;这里的“命贵”，并非单纯指经济财富或社会地位，而是指个体所拥有的幸福感、安全感以及对未来生活的积极预期&lt;/em&gt;”。&lt;/p&gt;
&lt;p&gt;而事实上，马克思说过，拥有更多的资源、财富，本质上就拥有了更多的对人的社会支配权。一个被支配的、压迫的、为生计疲于奔命的的人，你怎么说所谓的幸福？&lt;/p&gt;
&lt;p&gt;所以幸福是一个相对值、比较值，它天然的具有&amp;quot;阶级性&amp;quot;。&lt;/p&gt;
&lt;p&gt;站在道德的高点去讲幸福、不过是小资主义的修正幻想，指望着退让和妥协能赢得社会的和谐和解决阶级的矛盾。&lt;/p&gt;
&lt;p&gt;所谓的“&lt;strong&gt;退让&lt;/strong&gt;”，不过是没有社会地位、财富、资源来解决这场冲突，而以自己的利益受损来换取“稳定的未来”。两位商贩会为了一个更有顾客的档口打的头破血流，他们谁更幸福呢？&lt;/p&gt;
&lt;p&gt;“三万姐”和人起了冲突，宁愿赔三万也不道歉，受了三万的人放弃了之前据理力争的“就要一个道歉”，他们谁更幸福呢？实质上，受了三万的人有现实的窘迫和实际的需求，只能以三万元来放下冲突和矛盾，矛盾只是被放下了，不是解决了。&lt;/p&gt;
&lt;p&gt;资本主义把人变成鬼，这不是空话。&lt;/p&gt;
&lt;h2&gt;在实际生活中，往往是“不幸福”的人退让&lt;/h2&gt;
&lt;p&gt;两位人起了冲突，和稀泥的说法总是说“他怎么就打你，不打别人”，来迫使“不幸福”的退让。&lt;/p&gt;
&lt;p&gt;“不幸福”的人才珍惜所谓的“幸福”，更糟糕的生存环境、更少的资源、更艰难的生活，更需要稳定，更遭不住所谓的变故。&lt;/p&gt;
&lt;p&gt;故曰“麻绳专挑细处断，厄运专找苦命人”&lt;/p&gt;
&lt;p&gt;每个人都会遇到“厄运”和“不幸福”，遇到这样的冲突和那样的矛盾。只是那些没有资源、财富的“苦命人”，任何一场小浪和风波都是致命的难关。&lt;/p&gt;
&lt;p&gt;有人为孩子的学费卖命和尊严，乞求帮助，有人在医院病重不起，烧干了积蓄也只是杯水车薪，有人减肥用几十万一针的糖尿病特效药，有人一顿饭钱就是万千工人的年薪总和。&lt;/p&gt;
&lt;p&gt;悲哀的、渺小的你， 怎么能不退让？&lt;/p&gt;
&lt;p&gt;让出资源、让出社会地位、接受剥削、接受不幸福，以汇聚成他们的幸福&lt;/p&gt;
&lt;h2&gt;“幸福”永远都是斗争出来的&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;以妥协求生存则亡，以斗争求生存则存&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;无论是国家的地位，还是个人的权益，都是斗争出来的，国家妥协了，美国的试探和祸心不会消失、个人妥协了、权益也不会凭空补足或生成。&lt;/p&gt;
&lt;h2&gt;改革到了“闯险滩，涉难关”的硬仗&lt;/h2&gt;
&lt;p&gt;如何促进公平正义，如何促进人民的幸福感、获得感、如何维护和代表最广大的人民的根本利益。如何在改革中发扬斗争精神、如何为人民打造“斗争精神”的生存土壤，是改革是否实现社会主义和提升民生福祉的本质要求。&lt;/p&gt;
&lt;p&gt;如何坚定和推进“按劳分配为主体，多种分配方式并存”，减少社会的贫富差距，决定了广大人民是否拥护和改革的成功关键。&lt;/p&gt;
&lt;p&gt;如何建设“法制社会”，决定了“有法必依、违法必究”的力度，更决定了广大人民的“法制精神”，只有更公平正义的维护人民切身利益的社会环境，人民才能用法律的武器去斗争，创造更公平正义的社会。&lt;/p&gt;
&lt;p&gt;广大人民对公平正义的呼声越来越强烈，改革必须总是他们的心声和夙愿。&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;没有法律的武器，就会有各种不公的矛盾。没有法律的武器，总会有别的武器。&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Mon, 02 Sep 2024 00:00:00 GMT</pubDate></item><item><title>使用Lark企业邮箱服务启用自定义域名邮箱</title><link>https://bigwind.cn/blog/web/lark-email-uses-a-custom-domain-name/</link><guid isPermaLink="true">https://bigwind.cn/blog/web/lark-email-uses-a-custom-domain-name/</guid><description>手把手教你免费快速拥有自建邮箱</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/web/lark-email-uses-a-custom-domain-name/&quot;&gt;https://bigwind.cn/blog/web/lark-email-uses-a-custom-domain-name/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../../components/mdx/Collapse.astro&amp;quot;;
import Diff from &amp;quot;../../../components/mdx/Diff.astro&amp;quot;;
import Error from &amp;quot;../../../components/mdx/Error.astro&amp;quot;;
import Info from &amp;quot;../../../components/mdx/Info.astro&amp;quot;;
import Kbd from &amp;quot;../../../components/mdx/Kbd.astro&amp;quot;;
import Success from &amp;quot;../../../components/mdx/Success.astro&amp;quot;;
import Warning from &amp;quot;../../../components/mdx/Warning.astro&amp;quot;;
import TimeLine from &amp;quot;../../../components/mdx/TimeLine.astro&amp;quot;;
import LinkCard from &amp;quot;../../../components/mdx/LinkCard.astro&amp;quot;;&lt;/p&gt;
&lt;h2&gt;什么是自定义域名邮箱？&lt;/h2&gt;
&lt;p&gt;像qq有@qq.com，微软有@outlook.com，如果你购买了一个心仪的域名eg:yourdomain.com，你也可以拥有一个自己的邮箱@yourdomain.com  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;拥有了自定义域名，是否想拥有自己的邮箱呢？&lt;/strong&gt;  &lt;/p&gt;
&lt;h2&gt;为什么要有一个自定义域名邮箱&lt;/h2&gt;
&lt;p&gt; ✅ 你能拥有专属的邮箱域名&lt;br&gt; ✅ 作为开发者更有逼格，值得用户信赖&lt;br&gt; ✅ 可以减少不必要的打扰&lt;/p&gt;
&lt;p&gt;如果你仅想接收邮件 参考此教程即可-&amp;lt;a href={&amp;quot;/blog/web/lark-email-uses-a-custom-domain-name&amp;quot;}&amp;gt;仅接收邮件的搭建办法&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;为什么要用Lark企业邮箱&lt;/h2&gt;
&lt;p&gt;Lark是飞书海外版，提供企业邮箱，有更宽松的机制，且可以实现用Cloudfare托管难以解决的麻烦事--发邮件。&lt;/p&gt;
&lt;p&gt;使用gmali代发仍会暴露我们的真实邮箱地址，这真的的很搞笑😂，你实际上在裸奔，且容易被识别为风险邮件而被拒绝或丢弃到垃圾箱，因此使用Lark来隐藏更好。&lt;/p&gt;
&lt;p&gt;更重要的是，Lark提供企业级邮箱的稳定，无需维护的同时，&lt;strong&gt;&lt;em&gt;国内直连可用&lt;/em&gt;&lt;/strong&gt; ！！！😍&lt;/p&gt;
&lt;p&gt;完全不用担心收不到，Gmail收个邮箱还要用魔法，但谁一天24小时不间断挂着魔法呢？&lt;/p&gt;
&lt;p&gt;SMTP 免费发送邮件功能限制：&lt;strong&gt;发信频率：200 封/100 秒，单日发信上限（一个发件人单日发信上限）450 封&lt;/strong&gt;。这些限制对于大多数小型社区或个人项目来说已经绰绰有余。&lt;/p&gt;
&lt;h2&gt;使用步骤&lt;/h2&gt;
&lt;h3&gt;点击&lt;a href=&quot;https://www.larksuite.com&quot;&gt;&lt;u&gt;Lark官网&lt;/u&gt;注册账号&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;Warning&gt;Lark限制了国内注册，请自行使用魔法和选择模式全局代理，使用&lt;a href=&quot;https://ip.900cha.com/&quot;&gt;&lt;u&gt;本机IP地址查询&lt;/u&gt;&lt;/a&gt; &lt;/Warning&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d157bde4d0d.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;填写个人信息，建议虚拟身份,避免暴露隐私 图略&lt;/p&gt;
&lt;h3&gt;点击 &lt;strong&gt;管理后台&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d157c096703.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;选择 产品设置-邮箱&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d16b7f3e72b.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;选择 &lt;strong&gt;开始设置&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d16c19b270f.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;配置域名邮箱后缀&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d157ca7fffd.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;将配置生成的DNS参数解析到你的DNS域名服务商，我是CF&lt;/p&gt;
&lt;p&gt;&lt;Warning&gt;我这里已实现邮箱服务，所以显示的是搬家，但是新增和他差别不大，都是把参数解析到dns&lt;/Warning&gt;&lt;/p&gt;
&lt;h3&gt;选择 &lt;strong&gt;立即验证&lt;/strong&gt; 通过后点击 &lt;strong&gt;下一步&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d157cbedf44.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;| 新增的图 怕你看不懂还是加上了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d157cd76f77.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;选择 &lt;strong&gt;立即配置&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d157cf06d92.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;选择自己的账号 配置后点击保存&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d157d0abcea.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;设置 公共邮箱&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d16c623636c.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;配置如图：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d157d44d682.png&quot; alt=&quot;&quot;&gt;
&lt;Info&gt;邮箱别名是指这个公共邮箱可以有多个地址,可以用不同的地址相同的密码和配置共享邮箱服务，很适合用来接收一次性验证码，后面可以把这个别名弃用防骚扰&lt;/Info&gt;&lt;/p&gt;
&lt;h3&gt;保存后 再次点击 编辑 即可看到 IMAP/SMTP 服务参数&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d15761a9cda.png&quot; alt=&quot;2024-08-30-13-11-30-image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;可以看到邮箱的限制：&lt;/p&gt;
&lt;p&gt;发信频率（调用 SMTP 服务的整体频率）&lt;strong&gt;200 封/ 100 秒&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;单日发信上限（一个发件人单日发信上限）&lt;strong&gt;450 封&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;邮箱总容量是&lt;strong&gt;200G&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;开启 DMARC&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;❗启用 DKIM 可以有效防范他人仿冒你的域名发信，同时尽量避免系统将你的外发邮件标记为垃圾邮件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤是进入 Lark 管理后台，点击 产品设置 &amp;gt; 邮箱 &amp;gt; 安全与反垃圾 &amp;gt; DKIM 身份验证&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;选择需要启用 DKIM 的域名，点击 启用&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d1576328c50.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;使用默认2048 密钥长度&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d157648021a.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;弹出需要域名解析需要的内容&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d15765beeba.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;到域名服务商设置域名解析增加TXT记录，添加完之后，点击立即验证&lt;/h3&gt;
&lt;p&gt;解析参考：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;选择记录类型：TXT

主机记录框填写：弹出的信息

记录值填写：弹出的信息

其他默认就可。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;验证成功后的效果&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d157dc47b1c.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;如何在第三方邮箱平台使用&lt;/h2&gt;
&lt;p&gt;&lt;Info&gt;如果你想要在手机或者电脑上使用第三方邮箱客户端来看邮件，请继续看&lt;/Info&gt;&lt;/p&gt;
&lt;h3&gt;管理员账号开启第三方登录(默认)&lt;/h3&gt;
&lt;p&gt;点击看&lt;a href=&quot;https://www.larksuite.com/hc/zh-CN/articles/360048488295-%E7%AE%A1%E7%90%86%E5%91%98%E5%BC%80%E5%90%AF%E7%AC%AC%E4%B8%89%E6%96%B9%E9%82%AE%E7%AE%B1%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%99%BB%E5%BD%95%E8%AE%BE%E7%BD%AE&quot;&gt;&lt;strong&gt;&lt;em&gt;官方教程链接&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;来检查是否开启权限&lt;/p&gt;
&lt;h3&gt;下载Lark客户端&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;看到这，有小伙伴要问了，为什么要下载呢？ [Lark | 立即下载Lark — 国际版](https://www.larksuite.com/zh_cn/download?from=navbar)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;Warning&gt;比较恶心的事发生了,账号的该设置选项仅在客户端有，你只能下载设置完成后在卸载&lt;/Warning&gt;&lt;/p&gt;
&lt;p&gt;安装打开登录后&lt;/p&gt;
&lt;h3&gt;点击 邮箱&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d16fc4a5755.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;点击设置&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d16ff9212e8.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;选择你需要的平台设备系统&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d170222c535.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;注意不同系统的登录密码不共用&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;生成的结果如图：
&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d170b06a58f.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;打开第三方邮箱平台客户端&lt;/h3&gt;
&lt;p&gt;我这里是Win10下的outlook客户端&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d171838dd31.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;输入你的域名邮箱  点击继续&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d171dd78ec7.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;选择IMAP&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d17285808a0.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;将Lark平台生成的配置填上去&lt;/h3&gt;
&lt;p&gt;&lt;Info&gt;SMTP密码可以留空,和IMAP一个密码,建议开启SSL防劫持&lt;/Info&gt;
&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d17342e7641.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;大功告成&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d1739fb455f.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;Success&gt;你可以用其他邮箱测试 我这里用qq邮箱发测试邮件，outlook客户端成功接收&lt;/Success&gt;
&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d173ed246b7.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;是不是很有成就感呢？现在你有一个独特的域名邮箱了，当然，它可以变成很多个，毕竟域名独属于你🌟&lt;/p&gt;
&lt;p&gt;从今天开始，你是一个有企业邮箱的开发者了，看起来就很厉害(&lt;del&gt;不是，实际上也很厉害&lt;/del&gt;)😡&lt;/p&gt;
&lt;p&gt;&lt;Warning&gt;点击这篇教程教你测试邮箱以确保万无一失  &lt;a href=&quot;/blog/web/how-to-test-the-score-of-a-self-built-mailbox&quot;&gt;&lt;strong&gt;&lt;u&gt;🚩如何测试自建邮箱的得分&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/Warning&gt;&lt;/p&gt;
&lt;p&gt;有什么问题或看法，欢迎评论区留言！&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Fri, 30 Aug 2024 00:00:00 GMT</pubDate></item><item><title>使用Cloudfare启用自定义域名邮箱收邮件</title><link>https://bigwind.cn/blog/web/use-cloudflare-to-enable-custom-domain-email-receiving/</link><guid isPermaLink="true">https://bigwind.cn/blog/web/use-cloudflare-to-enable-custom-domain-email-receiving/</guid><description>免费快速拥有自建邮箱收取邮件</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/web/use-cloudflare-to-enable-custom-domain-email-receiving/&quot;&gt;https://bigwind.cn/blog/web/use-cloudflare-to-enable-custom-domain-email-receiving/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../../components/mdx/Collapse.astro&amp;quot;;
import Diff from &amp;quot;../../../components/mdx/Diff.astro&amp;quot;;
import Error from &amp;quot;../../../components/mdx/Error.astro&amp;quot;;
import Info from &amp;quot;../../../components/mdx/Info.astro&amp;quot;;
import Kbd from &amp;quot;../../../components/mdx/Kbd.astro&amp;quot;;
import Success from &amp;quot;../../../components/mdx/Success.astro&amp;quot;;
import Warning from &amp;quot;../../../components/mdx/Warning.astro&amp;quot;;
import TimeLine from &amp;quot;../../../components/mdx/TimeLine.astro&amp;quot;;
import LinkCard from &amp;quot;../../../components/mdx/LinkCard.astro&amp;quot;;&lt;/p&gt;
&lt;h2&gt;什么是自定义域名邮箱？&lt;/h2&gt;
&lt;p&gt;像qq有@qq.com，微软有@outlook.com，如果你购买了一个心仪的域名eg:yourdomain.com，你也可以拥有一个自己的邮箱@yourdomain.com&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;拥有了自定义域名，是否想拥有自己的邮箱呢？&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;为什么要有一个自定义域名邮箱&lt;/h2&gt;
&lt;p&gt; ✅ 你能拥有专属的邮箱域名&lt;/p&gt;
&lt;p&gt; ✅ 作为开发者更有逼格，值得用户信赖&lt;/p&gt;
&lt;p&gt; ✅ 可以减少不必要的打扰，你可以方便地添加一个特定的邮箱用于一次性注册白嫖，eg:想要在A网站获得服务，但不想接收广告，可以虚拟一个&lt;a href=&quot;mailto:aserver@yourdomain.com&quot;&gt;aserver@yourdomain.com&lt;/a&gt;来接收邮件&lt;/p&gt;
&lt;h2&gt;使用cloudfare快速白嫖邮箱服务&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;❗ &lt;strong&gt;请提前将域名绑定解析到CF,该教程略过,其他人教程&lt;a href=&quot;https://developer.aliyun.com/article/1448373&quot;&gt;Cloudflare域名解析&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;Warning&gt;CF虽快，但是只能接收邮件，发邮件设置较为麻烦，建议仅用来接收再搭建，发可以考虑使用Gmail代发或者Worker(复杂)&lt;/Warning&gt;&lt;/p&gt;
&lt;h3&gt;打开面板&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d141681ed4b.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;按图片找到路由规则页面&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d1416b61ab3.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;点击创建&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d1416d2566e.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;按提示添加保存即可&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d1416ec5e59.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;这时可以在面板上看到已创建并启用&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d141704584e.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;测试一下&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;随便找个平台用你的域名邮箱接收验证码，查看你的接收邮箱&lt;a href=&quot;mailto:123@qq.com&quot;&gt;123@qq.com&lt;/a&gt;是否收到&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;也可以在日志看到CF帮我实现了转发&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d14171cd744.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;Warning&gt;这只实现了用&lt;a href=&quot;mailto:123@qq.com&quot;&gt;123@qq.com&lt;/a&gt;接收&lt;a href=&quot;mailto:test@bingwind.cn&quot;&gt;test@bingwind.cn&lt;/a&gt;的邮箱，如果你选择回复，仍然会使用&lt;a href=&quot;mailto:123@qq.com&quot;&gt;123@qq.com&lt;/a&gt;发送邮件而不是你的域名邮箱&lt;/Warning&gt; &lt;/p&gt;
&lt;h2&gt;如何实现所有自定义域名邮箱转发&lt;/h2&gt;
&lt;p&gt;&lt;Info&gt;如果你的域名只打算给自己用，且想用不同的邮箱账号来接收验证码或防打扰&lt;/Info&gt;&lt;/p&gt;
&lt;h3&gt;使用Catch-all 地址&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d141734dc22.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;添加成功后 你的所有域名邮箱都会发给你的接收邮箱&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;举例：你的域名为text.cn,&lt;a href=&quot;mailto:test@xyz.cn&quot;&gt;test@xyz.cn&lt;/a&gt;、&lt;a href=&quot;mailto:qq@xyz.cn&quot;&gt;qq@xyz.cn&lt;/a&gt;等邮箱地址邮件都会发送到&lt;a href=&quot;mailto:123@qq.com&quot;&gt;123@qq.com&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240830-66d14174c6a25.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;Success&gt;恭喜你已完成所有工作，记得测试邮箱是否正常使用再关闭哦!&lt;/Success&gt;&lt;/p&gt;
&lt;h2&gt;如果你想要发邮件&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;参考：&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://cleanclip.cc/zh/developer/cloudflare-worker-gmail-resend-enterprise-email/#%E7%A4%BA%E6%84%8F%E5%9B%BE&quot;&gt;Cloudflare + Gmail + Resend 十分钟轻松拥有免费的企业邮箱&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.shuziyimin.org/1355&quot;&gt;如何使用 Cloudflare 配置域名邮箱收发邮件 – 数字移民 &lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;Error&gt;这种使用Gmail代发邮件仍会暴露你的真实gamail邮箱地址，它会显示&lt;strong&gt;来自&lt;a href=&quot;mailto:test@bigwind.cn&quot;&gt;test@bigwind.cn&lt;/a&gt;由&lt;a href=&quot;mailto:bigwind@gmail.com&quot;&gt;bigwind@gmail.com&lt;/a&gt;代发&lt;/strong&gt;&lt;/Error&gt;&lt;/p&gt;
&lt;p&gt;如果你不想暴露真实邮箱，建议自建邮箱服务器或者使用大厂企业邮箱服务&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参考我的另一篇博文 &lt;a href=&quot;/blog/web/lark-email-uses-a-custom-domain-name&quot;&gt;&lt;strong&gt;使用Lark企业邮箱服务启用自定义域名邮箱&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Fri, 30 Aug 2024 00:00:00 GMT</pubDate></item><item><title>waline评论插件表情链接cdn分享</title><link>https://bigwind.cn/blog/web/waline%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F%E8%A1%A8%E6%83%85%E5%88%86%E4%BA%AB/</link><guid isPermaLink="true">https://bigwind.cn/blog/web/waline%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F%E8%A1%A8%E6%83%85%E5%88%86%E4%BA%AB/</guid><description>自己搭建图床，解决waline评论系统点击表情报错问题</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/web/waline%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F%E8%A1%A8%E6%83%85%E5%88%86%E4%BA%AB/&quot;&gt;https://bigwind.cn/blog/web/waline%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F%E8%A1%A8%E6%83%85%E5%88%86%E4%BA%AB/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Error from &amp;quot;../../../components/mdx/Error.astro&amp;quot;;
import Info from &amp;quot;../../../components/mdx/Info.astro&amp;quot;;&lt;/p&gt;
&lt;p&gt;&lt;Info&gt;使用的框架在今天发现评论表情无法加载，于是自己搭建了cdn链接修复并分享&lt;/Info&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Title:&lt;/strong&gt; 🛠️ Bug Report: [waline评论系统点击表情已不可用]&lt;/h2&gt;
&lt;h2&gt;&lt;strong&gt;Description:&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240828-66cf18a8a4050.png&quot; alt=&quot;&quot;&gt;
&lt;Error&gt;waline评论系统点击表情已不可用，报错如图，原因应该是原来框架的图床的桶设为私有或删除。&lt;/Error&gt;
&lt;img src=&quot;https://i.p-i.vip/37/20240828-66cf19588c1a7.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Proposed Fix or Solution:&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;修复建议：&lt;/h2&gt;
&lt;p&gt;我将其表情迁移到我的两个图床上(由于图床限制，第一个图床不能使用png动图)，很高兴你能使用，他们都是支持全球CDN访问的
&lt;Info&gt;使用方法:替换原来框架的waline组件表情网络地址&lt;br/&gt;
    组件路径：src/components/CommentWaline.astro&lt;/Info&gt;&lt;/p&gt;
&lt;p&gt;这是gif格式，这个图床的链接将是长久的&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;      &amp;quot;https://i.p-i.vip/37/20240828-66cf168c67b90.gif&amp;quot;,
      &amp;quot;https://i.p-i.vip/37/20240828-66cf11c98f75c.gif&amp;quot;,
      &amp;quot;https://i.p-i.vip/37/20240828-66cf16919077c.gif&amp;quot;,
      &amp;quot;https://i.p-i.vip/37/20240828-66cf167ed75d1.gif&amp;quot;,
      &amp;quot;https://i.p-i.vip/37/20240828-66cf168176744.gif&amp;quot;,
      &amp;quot;https://i.p-i.vip/37/20240828-66cf16978ff66.gif&amp;quot;,
      &amp;quot;https://i.p-i.vip/37/20240828-66cf13460d38a.gif&amp;quot;,
      &amp;quot;https://i.p-i.vip/37/20240828-66cf1687607bb.gif&amp;quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;png格式图床，这个图床是我自建的，所以有可能会被限速，但表情的下载速度问题应该不大&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;      &amp;quot;https://pub-e9759568a2dc405c9565f765445e931e.r2.dev/good.png&amp;quot;,
      &amp;quot;https://pub-e9759568a2dc405c9565f765445e931e.r2.dev/bad.png&amp;quot;,
      &amp;quot;https://pub-e9759568a2dc405c9565f765445e931e.r2.dev/happy.png&amp;quot;,
      &amp;quot;https://pub-e9759568a2dc405c9565f765445e931e.r2.dev/color.png&amp;quot;,
      &amp;quot;https://pub-e9759568a2dc405c9565f765445e931e.r2.dev/confuse.png&amp;quot;,
      &amp;quot;https://pub-e9759568a2dc405c9565f765445e931e.r2.dev/heart.png&amp;quot;,
      &amp;quot;https://pub-e9759568a2dc405c9565f765445e931e.r2.dev/rocket.png&amp;quot;,
      &amp;quot;https://pub-e9759568a2dc405c9565f765445e931e.r2.dev/eyes.png&amp;quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Contact Information:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name: [BigWind]&lt;/li&gt;
&lt;li&gt;Email: [&lt;a href=&quot;mailto:bigwind@bigwind.cn&quot;&gt;bigwind@bigwind.cn&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Fri, 30 Aug 2024 00:00:00 GMT</pubDate></item><item><title>看EveSunMaple博客《&apos;局外人&apos;读后感》有感</title><link>https://bigwind.cn/blog/life/%E7%9C%8Bevesunmaple%E5%8D%9A%E5%AE%A2%E5%B1%80%E5%A4%96%E4%BA%BA%E8%AF%BB%E5%90%8E%E6%84%9F%E6%9C%89%E6%84%9F/</link><guid isPermaLink="true">https://bigwind.cn/blog/life/%E7%9C%8Bevesunmaple%E5%8D%9A%E5%AE%A2%E5%B1%80%E5%A4%96%E4%BA%BA%E8%AF%BB%E5%90%8E%E6%84%9F%E6%9C%89%E6%84%9F/</guid><description>一些感想</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/life/%E7%9C%8Bevesunmaple%E5%8D%9A%E5%AE%A2%E5%B1%80%E5%A4%96%E4%BA%BA%E8%AF%BB%E5%90%8E%E6%84%9F%E6%9C%89%E6%84%9F/&quot;&gt;https://bigwind.cn/blog/life/%E7%9C%8Bevesunmaple%E5%8D%9A%E5%AE%A2%E5%B1%80%E5%A4%96%E4%BA%BA%E8%AF%BB%E5%90%8E%E6%84%9F%E6%9C%89%E6%84%9F/&lt;/a&gt;&lt;/blockquote&gt; &lt;blockquote&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.saroprock.com/blog/outsider&quot;&gt;原文链接&lt;/a&gt;&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;局外人&lt;/h2&gt;
&lt;h2&gt;原文&lt;/h2&gt;
&lt;p&gt;之前有人推荐我去看一本加缪的小说《局外人》，刚好手头无书好看，便从图书馆中借了一本来，同时还附了一本《鼠疫》。&lt;/p&gt;
&lt;p&gt;看完后，我突然明白他为何推荐这本书给我了。在之前，我曾写了一篇五千字的长文，记录了一下自己的心迹。简单来说，就是对这世界的环境失望了：限制互联网上太多负能量的内容，他们发出来大多只是为了找寻一份安慰或鼓励——这本身挺好。可问题是，我们对于他们来说，不过是一个&lt;strong&gt;局外人&lt;/strong&gt;罢了。一点点微不足道的安慰并不能改变他们所生活的环境，更不可能让他们忘记自己所经历过的事。我们这种局外人又做不了什么，反而会被这种情绪反噬，在我看来这是得不偿失的&lt;sup&gt;&lt;a href=&quot;https://www.saroprock.com/blog/outsider#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; aria-describedby=&quot;footnote-label&quot; data-footnote-ref=&quot;&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;所以那时我说，一昧从外界找帮助是不会有用的，而是靠自己的！&lt;/p&gt;
&lt;p&gt;但看完《局外人》后，我又不得不面对一种情况……&lt;/p&gt;
&lt;p&gt;故事的主人公确是犯了罪，这没错。可问题在于他自己成为了自己事情的“局外人”：律师是法律安排找的；辩词不是自己口中说的；意识是被强加的。整个过程中，他仿佛成了一个符号，可以被自由地挪动在各大报纸上。前因后果是不重要的、本人的想法是可以不听的。反倒是之前去参加母亲葬礼的事被一次次炒作，将他与另一个罪犯相提并论，最终在人民面前“人头落地”。&lt;/p&gt;
&lt;p&gt;记者只是为了更高的稿费；律师只是为了一次完美的辩护&lt;sup&gt;&lt;a href=&quot;https://www.saroprock.com/blog/outsider#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; aria-describedby=&quot;footnote-label&quot; data-footnote-ref=&quot;&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;；看似善良的神父也仅是执着于自己的信仰。无人关心这个事情的主角，主角成了&lt;strong&gt;局外人&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如此被裹挟的结果，主角好像也无力回天。也许他唯一能做的，不过是在上空，默默地看着自己被审判，然后死在广场上。&lt;/p&gt;
&lt;p&gt;漠然地做了这么久的局外人&lt;sup&gt;&lt;a href=&quot;https://www.saroprock.com/blog/outsider#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; aria-describedby=&quot;footnote-label&quot; data-footnote-ref=&quot;&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;，没想到最后成了自己的局外人。&lt;/p&gt;
&lt;p&gt;第一篇随笔，没什么思考，字也很差；最多的用处可能是证明我看了书。&lt;/p&gt;
&lt;h2&gt;原文（图片）&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240822-66c758beb710d.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;关于本文&lt;/h2&gt;
&lt;p&gt;推荐此书的人是：&lt;a href=&quot;https://nickchen.top/&quot;&gt;Nick Chen&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;BigWind读后评&lt;/h2&gt;
&lt;p&gt;有些时候我们太过于论心不论迹，总是对别人的真心和目的好奇、惶恐、悲伤，自然而然有种“局外人”之感，因为别人的真心和目的不总是关心与&amp;quot;我&amp;quot;的，故曰“他人既地狱”，先贤则劝“论迹不论心，论心无完人”。  &lt;/p&gt;
&lt;p&gt;即使是我们自个，与他人交往也经常会有别样的目的或心思，我们总是关注别人，也希望别人只关注自己，尼采想做所有人的太阳，便发了疯，喊着上帝已死，想来看着他心，不免悲哀，觉似在地狱18层。  &lt;/p&gt;
&lt;p&gt;但生活总要前进，与其穷究他人的根本，指望着他心通，不如修行自己。明己心如明月，便难以惹尘埃。了解个人的心思，坚定个人的志向，再借助他人的有意或无意的援助支持，才能化为鲲鹏。  &lt;/p&gt;
&lt;p&gt;想走进别人的生活，“局外人”是难免的，可经营自己的一生，不能总是困顿成自己的&amp;quot;局外人&amp;quot;。  &lt;/p&gt;
&lt;p&gt;共勉之。。。&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Fri, 23 Aug 2024 00:00:00 GMT</pubDate></item><item><title>🐤 建站神器：使用Cloudflare实现全站CDN</title><link>https://bigwind.cn/blog/web/%E4%BD%BF%E7%94%A8cloudflare%E5%AE%9E%E7%8E%B0%E5%85%A8%E7%AB%99cdn/</link><guid isPermaLink="true">https://bigwind.cn/blog/web/%E4%BD%BF%E7%94%A8cloudflare%E5%AE%9E%E7%8E%B0%E5%85%A8%E7%AB%99cdn/</guid><description>手把手教使用Cloudflare实现全站CDN</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/web/%E4%BD%BF%E7%94%A8cloudflare%E5%AE%9E%E7%8E%B0%E5%85%A8%E7%AB%99cdn/&quot;&gt;https://bigwind.cn/blog/web/%E4%BD%BF%E7%94%A8cloudflare%E5%AE%9E%E7%8E%B0%E5%85%A8%E7%AB%99cdn/&lt;/a&gt;&lt;/blockquote&gt; &lt;blockquote&gt;
&lt;p&gt;很多站长会购买虚拟主机或VPS来部署，甚至直接部署在自己的NAS上。我们知道，这种部署环境普遍存在性能或带宽不足的问题，一旦机器宕机或网络出现问题，轻则用户访问缓慢，重则直接打不开网站。解决方案，那就是Cloudflare的Page Rules和Cache Rules功能&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c80bea48d7a.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;关于Cloudflare的Page Rules和Cache Rules功能，很多人分不清二者有什么区别和联系。简单说，Page Rules除了可以配置缓存规则外，还可以设置很多其他的规则；而Cache Rules仅用于设置缓存相关的规则，并且其缓存规则的优先级要高于Page Rules。&lt;/p&gt;
&lt;h2&gt;前提准备&lt;/h2&gt;
&lt;p&gt;• 你的网站域名需要在Cloudflare上解析，并且开启代理这是必要条件(&lt;a href=&quot;https://mp.weixin.qq.com/s/W5ykzfYpLpmxpwxH6q_P4w&quot;&gt;传送门&lt;/a&gt;)&lt;br&gt;• 关闭Wordpress上的各种缓存插件，并清空缓存，这是建议&lt;/p&gt;
&lt;h2&gt;设置Page Rules&lt;/h2&gt;
&lt;p&gt;Cloudflare免费计划，每个域名可以免费添加3条页面规则，对于Wordpress来说正好够用，&lt;strong&gt;如果你是其他建站程序切勿直接照抄，要根据你的程序链接规则去设置&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;第一步、 从Cloudflare主页选择你的域名，进入到域名功能界面&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c80bebbb53b.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;第二步， 展开左侧菜单，点击&lt;code&gt;规则&lt;/code&gt;——&lt;code&gt;页面规则&lt;/code&gt;，进入页面规则设置页面&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c809ddb42df.jpg&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c809df41aab.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;第三步、 点击&lt;code&gt;创建页面规则&lt;/code&gt;按钮，一共添加3条规则，如下&lt;/h3&gt;
&lt;h4&gt;1、设置管理后台规则(如果有后台的话)&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;规则名称&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.bigwind.cn/admin&quot;&gt;https://www.bigwind.cn/admin&lt;/a&gt;* ，&lt;strong&gt;注意：这个网址要改成你自己的&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;浏览器完整性检查&lt;/td&gt;
&lt;td&gt;开启&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;安全级别&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;缓存级别&lt;/td&gt;
&lt;td&gt;绕过&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP地理位置表头&lt;/td&gt;
&lt;td&gt;开启&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;电子邮件混淆技术&lt;/td&gt;
&lt;td&gt;开启&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;如下图：&lt;/strong&gt;&lt;br&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c80bef27d54.png&quot; alt=&quot;&quot;&gt;
重点是，缓存级别一定要设置&lt;code&gt;绕过&lt;/code&gt;，缓存级别一定要设置&lt;code&gt;绕过&lt;/code&gt;，缓存级别一定要设置&lt;code&gt;绕过&lt;/code&gt;，否则就麻烦大了！&lt;/p&gt;
&lt;h4&gt;2、设置首页、分类、页面及文章页规则&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;规则名称&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://bigwind.cn/&quot;&gt;https://bigwind.cn/&lt;/a&gt;* ，&lt;strong&gt;注意：这个网址要改成你自己的&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;浏览器完整性检查&lt;/td&gt;
&lt;td&gt;开启&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;安全级别&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;缓存级别&lt;/td&gt;
&lt;td&gt;缓存所有内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;边缘缓存TTL&lt;/td&gt;
&lt;td&gt;2小时。就是每隔2小时CDN会回源到源站获取更新，免费计划最短只能设置2小时，一般足够了。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;浏览器缓存TTL&lt;/td&gt;
&lt;td&gt;就是访客浏览器缓存页面的时间，默认是30分钟，最短可以设置2分钟。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP地理位置表头&lt;/td&gt;
&lt;td&gt;开启&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;电子邮件混淆技术&lt;/td&gt;
&lt;td&gt;开启&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;如下图：&lt;/strong&gt;&lt;br&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c80bf300aa0.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4&gt;3、设置其他动态页面规则&lt;/h4&gt;
&lt;p&gt;例如评论、搜索等等。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;规则名称&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://waline-blog.bigwind.cn/&quot;&gt;https://waline-blog.bigwind.cn/&lt;/a&gt;* ，&lt;strong&gt;注意：这个网址要改成你自己的&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;浏览器完整性检查&lt;/td&gt;
&lt;td&gt;开启&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL&lt;/td&gt;
&lt;td&gt;严格&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;安全级别&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;缓存级别&lt;/td&gt;
&lt;td&gt;绕过&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP地理位置表头&lt;/td&gt;
&lt;td&gt;开启&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;电子邮件混淆技术&lt;/td&gt;
&lt;td&gt;开启&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;如下图：&lt;/strong&gt;&lt;br&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c80bf46a99b.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;重点也是缓存级别一定要设置&lt;code&gt;绕过&lt;/code&gt;，不过设置错了不像管理后台规则那么严重。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;以上我们就设置好了基本的网站页面规则，这时候可以保证网站的首页、分类、文章等页面都可以走CDN。这地方有个小技巧，设置完成以后自己到网站上把页面都点一遍，以触发页面缓存到CDN，等到真正的访客浏览网站时，就能秒开了！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;设置Cache Rules&lt;/h2&gt;
&lt;p&gt;由于Cloudflare免费计划最多只能设置3条页面规则，我们设置了1个静态页面和2个动态页面规则之后，就用完了。但是，网站除了以上页面外，还有很多&lt;code&gt;静态资源&lt;/code&gt;,比如图片、JS、CSS、字体等等，如果这些每次都从源站加载，还是会占用大量带宽，这时候&lt;code&gt;Cache Rules（缓存规则）&lt;/code&gt;就排上用场了。&lt;/p&gt;
&lt;p&gt;Cloudflare免费计划每个域名可以创建10条缓存规则，绰绰有余！下面我们就将静态资源加入到缓存中。&lt;/p&gt;
&lt;h3&gt;第一步、从Cloudflare主页选择你的域名，进入到域名功能界面&lt;/h3&gt;
&lt;h3&gt;第二步、展开左侧菜单，点击&lt;code&gt;缓存&lt;/code&gt;——&lt;code&gt;Cache Rules&lt;/code&gt;，进入缓存规则设置页面&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c809e558542.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;第三步、 点击&lt;code&gt;创建规则&lt;/code&gt;按钮，添加1条规则，如下&lt;/h3&gt;
&lt;h4&gt;方法一：可以在界面中添加多个&lt;code&gt;Or&lt;/code&gt;字段，表示符合其中任何一种就行。&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c809e6d7560.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4&gt;方法二、因为静态资源的类型比较多，也可以直接点击&lt;code&gt;编辑表达式&lt;/code&gt;，把下面的内容直接粘贴进去即可&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;(http.request.uri contains &amp;quot;.css&amp;quot;) or (http.request.uri contains &amp;quot;.js&amp;quot;) or (http.request.uri contains &amp;quot;.woff&amp;quot;) or (http.request.uri contains &amp;quot;.jpg&amp;quot;) or (http.request.uri contains &amp;quot;.png&amp;quot;) or (http.request.uri contains &amp;quot;.svg&amp;quot;) or (http.request.uri contains &amp;quot;.gif&amp;quot;) or (http.request.uri contains &amp;quot;.bmp&amp;quot;) or (http.request.uri contains &amp;quot;.ico&amp;quot;) or (http.request.uri contains &amp;quot;.jpeg&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c809e842d5d.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4&gt;博客首页和文章页缓存&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c80bf98a8f7.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;第四步、 其他设置&lt;/h3&gt;
&lt;p&gt;继续往下拉，对其他设置项进行设置。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4&gt;lsky 图床 - 图片缓存&lt;/h4&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c80bfb6046b.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;以上我们就设置好了静态资源的缓存规则，这时候并不是马上就能生效了，而是会随着你的网站被访问逐渐被缓存到CDN。与页面规则通用的小技巧，设置完成以后自己到网站上把页面都点一遍，以触发页面缓存到CDN，等到真正的访客浏览网站时，静态资源就能秒加载了！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;其他设置&lt;/h2&gt;
&lt;p&gt;除了页面规则和缓存规则设置，我们还可以充分利（白）用（嫖）Cloudflare的其他功能，以下几个功能建议开启：&lt;/p&gt;
&lt;h3&gt;1、Crawler Hints&lt;/h3&gt;
&lt;p&gt;当使用 Cloudflare 的站点更改内容时，Crawler Hints 会为搜索引擎和其他爬网程序提供高质量的数据。这样，爬网程序可以精确地抓取，避免浪费，同时可以普遍减少源服务器及其他 Internet 基础结构的资源消耗。&lt;br&gt;操作路径：&lt;code&gt;缓存&lt;/code&gt;——&lt;code&gt;配置&lt;/code&gt;——&lt;code&gt;Crawler Hints&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;2、Always Online™&lt;/h3&gt;
&lt;p&gt;源服务器不可用时让访问者仍可访问您的网站。Cloudflare 可通过 Internet Archive 的 Wayback Machine 提供有限的网页副本。&lt;br&gt;操作路径：&lt;code&gt;缓存&lt;/code&gt;——&lt;code&gt;配置&lt;/code&gt;——&lt;code&gt;Always Online™&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;3、Tiered Cache Topology&lt;/h3&gt;
&lt;p&gt;通过选择缓存拓扑，您可以控制源服务器与 Cloudflare 数据中心的连接方式，以确保缓存命中率更高、源服务器连接数更少，并且 Internet 延迟更短。&lt;br&gt;操作路径：&lt;code&gt;缓存&lt;/code&gt;——&lt;code&gt;Tiered Cache&lt;/code&gt;——&lt;code&gt;Tiered Cache Topology™&lt;/code&gt;，选择&lt;code&gt;Smart Tiered Caching Topology&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;清理缓存&lt;/h2&gt;
&lt;p&gt;最后，如果你修改了网站的主题或安装了新的插件或修改了代码等等，强烈建议你马上清理Cloudflare的CDN缓存，否则网站可能不能正常显示，或者各种错误。&lt;/p&gt;
&lt;p&gt;操作路径：&lt;code&gt;缓存&lt;/code&gt;——&lt;code&gt;配置&lt;/code&gt;，最顶上就有&lt;code&gt;清除缓存&lt;/code&gt;的操作按钮，支持自定义路径清除和清除所有内容，可按自己实际情况使用。&lt;br&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240823-66c809ed2eff3.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参考&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.huluohu.com/posts/425/&quot;&gt;🐤 建站神器：使用Cloudflare实现Wordpress全站CDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://herman-3600.xlog.app/zai-Cloudflare-she-zhi-huan-cun-gui-ze-quan-zhan-jia-su-WordPress-bo-ke-md?locale=en&quot;&gt;在Cloudflare设置缓存规则全站加速WordPress博客&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Fri, 23 Aug 2024 00:00:00 GMT</pubDate></item><item><title>C++基础入门(02)_引用</title><link>https://bigwind.cn/blog/cpp/c%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A802/</link><guid isPermaLink="true">https://bigwind.cn/blog/cpp/c%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A802/</guid><description>C++基础入门_C++引用_讲义分享</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/cpp/c%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A802/&quot;&gt;https://bigwind.cn/blog/cpp/c%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A802/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;01.引用的使用场景（重点）&lt;/h2&gt;
&lt;p&gt;1.引用作为函数参数&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//1.引用作为函数参数
void func(int &amp;amp;a, int &amp;amp;b)
{
    int sum = a + b;
    cout &amp;lt;&amp;lt; &amp;quot;sum=&amp;quot; &amp;lt;&amp;lt; sum &amp;lt;&amp;lt; endl;
}

void test01()
{
    int a = 10;
    int b = 20;
    func(a, b);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.引用作为函数的返回值&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//2.引用作为函数的返回值
int&amp;amp; func2()
{
    int b = 10;//注意1：不要返回局部变量的引用
    int &amp;amp;p = b;
    return p;
}
int &amp;amp;func3()
{
    static int b = 10;
    return b;
}
void test02()
{
    int &amp;amp;q = func2();
    q = 100;
    cout &amp;lt;&amp;lt; q &amp;lt;&amp;lt; endl;

    func2() = 200;
    cout &amp;lt;&amp;lt; q &amp;lt;&amp;lt; endl;
////---------上面的代码是错误，只是编译器没有检测出来
    cout &amp;lt;&amp;lt; &amp;quot;func2=&amp;quot;&amp;lt;&amp;lt;func2() &amp;lt;&amp;lt; endl;

    func3() = 100;//注意2：如果要函数当左值，那么该函数必须返回引用
    cout &amp;lt;&amp;lt; &amp;quot;func3()=&amp;quot; &amp;lt;&amp;lt; func3() &amp;lt;&amp;lt; endl;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;02.常量引用（了解）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int &amp;amp;ref=10;//err
const int &amp;amp;ref2=10;//ok
原理是:int tmp=10;const int &amp;amp;ref=tmp;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;03.内联函数（了解）&lt;/h2&gt;
&lt;p&gt;1.宏函数的缺陷&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#define ADD(x,y) x+y
//在普通函数前面加上inline是向编译器申请成为内联函数
//注意：加inline可能成为内联函数，可能不成为内联函数
inline int Add(int x, int y)
{
    return x + y;
}

void test()
{
    //10+20*2
    int ref = ADD(10, 20) * 2;
    cout &amp;lt;&amp;lt; &amp;quot;ref=&amp;quot; &amp;lt;&amp;lt; ref &amp;lt;&amp;lt; endl;

    int ref2 = Add(10, 20) * 2;
    cout &amp;lt;&amp;lt; &amp;quot;ref2=&amp;quot; &amp;lt;&amp;lt; ref2 &amp;lt;&amp;lt; endl;
}

#define COMAPD(x,y) ((x)&amp;lt;(y)?(x):(y))
inline int func(int x, int y)
{
    return x &amp;lt; y ? x : y;
}
void test02()
{
    int a = 1;
    int b = 3;
    //                        ((++a)&amp;lt;(b)?(++a):(b))      
    //cout &amp;lt;&amp;lt; &amp;quot;COMAPD(x,y)=&amp;quot; &amp;lt;&amp;lt; COMAPD(++a, b) &amp;lt;&amp;lt; endl;//3
    cout &amp;lt;&amp;lt; &amp;quot;func=&amp;quot; &amp;lt;&amp;lt; func(++a, b) &amp;lt;&amp;lt; endl;//2
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.什么情况不会成为内联函数&lt;/p&gt;
&lt;p&gt;​    1.存在过多的条件判断语句&lt;/p&gt;
&lt;p&gt;​    2.函数体过大&lt;/p&gt;
&lt;p&gt;​    3.对函数进行取址操作&lt;/p&gt;
&lt;p&gt;​    4.存在任何形式的循环语句&lt;/p&gt;
&lt;p&gt;3.内联函数的好处&lt;/p&gt;
&lt;p&gt;​    1.有宏函数的效率，没有宏函数的缺点&lt;/p&gt;
&lt;p&gt;​    2.类的成员函数默认加上inline&lt;/p&gt;
&lt;p&gt;4.在普通函数前面加上inline是申请成为内联函数&lt;/p&gt;
&lt;h2&gt;04.函数的默认参数（重点）&lt;/h2&gt;
&lt;p&gt;1.函数的默认参数就是给函数的形参赋值&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int myFunc(int a, int b = 0)//int b=0;这就是函数的默认参数，不一定是0
{
    return a + b;
}
void test01()
{
    //函数的默认参数的作用
    //当函数内常要用到形参的某个值，但偶尔要使用其他值
    //增加函数的灵活性
    cout &amp;lt;&amp;lt; myFunc(10, 20) &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; myFunc(10)&amp;lt;&amp;lt; endl;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.函数的默认参数的注意事项&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//注意1：函数的默认参数后面的参数必须都是默认参数
int myFunc2(int a, int b = 0, int c=2,int d=3)
{
    return a + b + c + d;
}
//注意2：函数的声明和实现不能同时有函数的默认参数
void myFunc3(int a, int b);
void myFunc3(int a, int b = 0)
{

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;05.函数的占位参数（了解）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//函数的占位参数,占位参数在后面运算符重载时区分前加加或后加加
void func(int a,int=10)//占位参数也有默认值
{

}

void test02()
{
    func(10);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;函数的默认参数和占位参数的混搭&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//占位参数和默认参数混搭
void func2(int=10, int a=20)
{

}
void test03()
{
    func2();
    func2(10);
    func2(10,30);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;06.函数重载（重点）&lt;/h2&gt;
&lt;p&gt;1.函数重载是：允许函数名相同，这种现象叫函数重载&lt;/p&gt;
&lt;p&gt;2.函数重载的作用：是为了方便使用函数名&lt;/p&gt;
&lt;p&gt;3.函数重载的条件：同一个作用域，参数的个数不同，参数的顺序不同，参数的类型不同&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//参数的个数不同
void func()
{
    cout &amp;lt;&amp;lt; &amp;quot;func()&amp;quot; &amp;lt;&amp;lt; endl;
}

void func(int a)
{
    cout &amp;lt;&amp;lt; &amp;quot;func(int a)&amp;quot; &amp;lt;&amp;lt; endl;
}

//参数的类型不同
void func(char c)
{
    cout &amp;lt;&amp;lt; &amp;quot;func(char c)&amp;quot; &amp;lt;&amp;lt; endl;
}
//参数的顺序不同
void func(int a, double b)
{
    cout &amp;lt;&amp;lt; &amp;quot;func(int a, double b)&amp;quot; &amp;lt;&amp;lt; endl;
}
void func(double b, int a)
{
    cout &amp;lt;&amp;lt; &amp;quot;func(double b, int a)&amp;quot; &amp;lt;&amp;lt; endl;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4.调用重载函数的注意：&lt;/p&gt;
&lt;p&gt;严格的类型匹配，如果类型不匹配，那么尝试转换，转换成功就掉用，失败就报错&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void test01()
{
    int a = 10;
    double b = 3.14;

    func();
    //func(b);// err double转换不了成为int或char
    func(a, b);
    func(b, a);
    char c = &amp;#39;c&amp;#39;;
    func(c);//char转换int成功，调用int参数的函数
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;5.函数重载和函数的默认参数一起使用，需要注意二义性问题&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//函数重载和函的默认参数一起使用
void myfunc(int a, int b = 0)
{
    cout &amp;lt;&amp;lt; &amp;quot;myfunc(int a, int b = 0)&amp;quot; &amp;lt;&amp;lt; endl;
}

void myfunc(int a)
{
    cout &amp;lt;&amp;lt; &amp;quot;myfunc(int a)&amp;quot; &amp;lt;&amp;lt; endl;
}

void test02()
{
    //myfunc(10); err,二义性问题，不知道调用哪个函数
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;6.函数的返回值不作为函数重载的条件&lt;/p&gt;
&lt;p&gt;编译器是通过你调用函数时，传入的参数来判断调用重载的哪个函数，我们调研函数时不需要写返回值，所以返回值不能成为函数重载的条件&lt;/p&gt;
&lt;h2&gt;07.函数重载的原理（重点）&lt;/h2&gt;
&lt;p&gt;1.函数重载的原理是在汇编时，给各个函数取别名，C语言不能重载的原因是没有取别名&lt;/p&gt;
&lt;p&gt;2.生成汇编文件:gcc -S test.c -o test.s         g++ -S test.cpp -o test2.s&lt;/p&gt;
&lt;p&gt;3.查看内容:type 文件名&lt;/p&gt;
&lt;h2&gt;08.C++调用C语言的函数（重点）&lt;/h2&gt;
&lt;p&gt;1.C++的函数在汇编时，会给函数取别名，C语言的不会，这时，如果C++来调用C语言的函数，C++会去找取了别名的函数，但是C语言没有取别名，这时会出错&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;test.h文件中

//这是告诉C++编译器，找下面的函数，要以C语言的方式去寻找
#ifdef __cplusplus
extern &amp;quot;C&amp;quot;
{
#endif
    void func();//C语言的函数声明


#ifdef __cplusplus
}
#endif
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;09.类和对象的概念（重点）&lt;/h2&gt;
&lt;p&gt;1.类是自定义数据类型，是C语言的结构体进化而成的&lt;/p&gt;
&lt;p&gt;2.对象是类实例化出的，用数据类型定义一个变量&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Maker//这个是类
{
public:
    int a;//成员属性（成员变量）
    void func()//成员方法（成员函数）
    {
        cout &amp;lt;&amp;lt; &amp;quot;func&amp;quot; &amp;lt;&amp;lt; endl;
    }
};

int main()
{
    Maker m;//m就是对象

    system(&amp;quot;pause&amp;quot;);
    return EXIT_SUCCESS;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;10.类的封装（重点）&lt;/h2&gt;
&lt;p&gt;1.封装是把属性（变量）和方法（函数）封装到类内，然后给这些数据赋予权限&lt;/p&gt;
&lt;p&gt;2.为什么要有封装&lt;/p&gt;
&lt;p&gt;​    1.防止乱调用函数和变量，出现错误&lt;/p&gt;
&lt;p&gt;​    2.维护代码更方便&lt;/p&gt;
&lt;p&gt;3.权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//封装：1,把属性和方法放到类中,2.给这些数据赋予权限
class Maker
{
public://公有权限
    void set(string Name,int Id)
    {
        id = Id;
        name = Name;
    }
    void printMaker()
    {
        cout &amp;lt;&amp;lt; &amp;quot;id=&amp;quot; &amp;lt;&amp;lt; id &amp;lt;&amp;lt; &amp;quot; name=&amp;quot; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; endl;
    }
private://私有
    int id;
    string name;

protected://保护
    int a;
};
//继承
class Son :public Maker
{
    void func()
    {
        a = 20;//子类的类内可以方法父类的保护权限的成员

    }
};
//类外不能访问私有权限的成员
//类外可以访问公有权限的成员
//类外不能访问保护权限的成员
//子类的类内可以方法父类的保护权限的成员
//类内是没有权限之分

void test()
{
    Maker m;
    m.set(&amp;quot;小花&amp;quot;,1);
    m.printMaker();


}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4.尽量把属性设置为私有权限&lt;/p&gt;
&lt;p&gt;1.可以控制属性的读写权限&lt;/p&gt;
&lt;p&gt;2.可赋予客户端访问数据的一致性&lt;/p&gt;
&lt;p&gt;3.可以保护属性的合法性&lt;/p&gt;
&lt;h2&gt;11.类和结构体的区别（了解）&lt;/h2&gt;
&lt;p&gt;结构体的默认权限是公有的，类的默认权限是私有的&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 21 Aug 2024 00:00:00 GMT</pubDate></item><item><title>JAVA 前端丢失大Long精度问题</title><link>https://bigwind.cn/blog/java/java-%E5%89%8D%E7%AB%AF%E4%B8%A2%E5%A4%B1%E5%A4%A7long%E7%B2%BE%E5%BA%A6%E9%97%AE%E9%A2%98/</link><guid isPermaLink="true">https://bigwind.cn/blog/java/java-%E5%89%8D%E7%AB%AF%E4%B8%A2%E5%A4%B1%E5%A4%A7long%E7%B2%BE%E5%BA%A6%E9%97%AE%E9%A2%98/</guid><description>工作中学习如何解决前端丢失大Long精度问题</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/java/java-%E5%89%8D%E7%AB%AF%E4%B8%A2%E5%A4%B1%E5%A4%A7long%E7%B2%BE%E5%BA%A6%E9%97%AE%E9%A2%98/&quot;&gt;https://bigwind.cn/blog/java/java-%E5%89%8D%E7%AB%AF%E4%B8%A2%E5%A4%B1%E5%A4%A7long%E7%B2%BE%E5%BA%A6%E9%97%AE%E9%A2%98/&lt;/a&gt;&lt;/blockquote&gt; &lt;blockquote&gt;
&lt;p&gt;使用JAVA开发Springboot项目,在后端使用LONG类型存储，前端获取数据会丢失精度&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最近在使用RuoYi前后端分离版本发现问题，数据库的主键设计为雪花ID随机生成后，LONG类型的主键数据数据发送给前端精度丢失了&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;例如后端主键数据:7231278613075632128
       前端展示:7231278613075600000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到前端数据的后几位变成了0，精度丢失&lt;/p&gt;
&lt;h4&gt;那么如何修复呢?&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;核心思想：将大LONG类型JSON数据序列化为String字符串再传给前端，由前端处理&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;局部解决&lt;/h2&gt;
&lt;p&gt;使用JSON序列化注解指定到具体字段&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Data
public class SysResource implements Serializable {
    /**
     * 主键id
     */
    @JsonSerialize(using = LongToStringConverter.class)
    private Long id;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Component
public class LongToStringConverter extends JsonSerializer&amp;lt;Long&amp;gt; {

    @Override
    public void serialize(Long aLong, JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(aLong.toString());
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;优点与问题&lt;/h3&gt;
&lt;p&gt;优点：只改变某个字段，影响可控且直观容易测试&lt;/p&gt;
&lt;p&gt;缺点：项目存在大量大LONG类型字段传给前端添加繁琐且易遗漏&lt;/p&gt;
&lt;h2&gt;整体统一解决&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;//统一将 Long 类型序列化为 String
@Configuration
public class JacksonConfiguration {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -&amp;gt; {
            // 把 Long 类型序列化为 String
            builder.serializerByType(Long.class, ToStringSerializer.instance);
        };
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;优点与问题&lt;/h3&gt;
&lt;p&gt;优点：整体统一改变序列化方式，可自定义，可通过排除代码来排除部分LONG序列化的字段&lt;/p&gt;
&lt;p&gt;缺点：项目框架可能有兼容问题，前端已完成部分需要改动，例如ruoyi框架的pageNumber是LONG类型，前端控制台会报错需要在前端做类型转换或者在序列化容器代码里排除&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;统一改变序列化方式解决前端丢失大Long精度问题更有自定义能力，可将部分字段排除，且符合SpringBoot的设计思想，但要注意项目本身的框架结构和已完成部分代码的影响，避免出现&lt;em&gt;&lt;strong&gt;类型冲突&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.yuque.com/leifengyang/live/npynf1w16qpbm0n3#C8XuN&quot;&gt;雷丰阳-项目开发中的小技巧&lt;/a&gt;&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Mon, 19 Aug 2024 00:00:00 GMT</pubDate></item><item><title>若依(ruoyi)前后端分离 代码生成如何实现自动导出字典字段值</title><link>https://bigwind.cn/blog/java/%E8%8B%A5%E4%BE%9Druoyi%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB-%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%8A%A8%E5%AF%BC%E5%87%BA%E5%AD%97%E5%85%B8%E5%AD%97%E6%AE%B5%E5%80%BC/</link><guid isPermaLink="true">https://bigwind.cn/blog/java/%E8%8B%A5%E4%BE%9Druoyi%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB-%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%8A%A8%E5%AF%BC%E5%87%BA%E5%AD%97%E5%85%B8%E5%AD%97%E6%AE%B5%E5%80%BC/</guid><description>代码生成如何实现自动表格导出字典字段值</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/java/%E8%8B%A5%E4%BE%9Druoyi%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB-%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%8A%A8%E5%AF%BC%E5%87%BA%E5%AD%97%E5%85%B8%E5%AD%97%E6%AE%B5%E5%80%BC/&quot;&gt;https://bigwind.cn/blog/java/%E8%8B%A5%E4%BE%9Druoyi%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB-%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%8A%A8%E5%AF%BC%E5%87%BA%E5%AD%97%E5%85%B8%E5%AD%97%E6%AE%B5%E5%80%BC/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;前提&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;了解框架的注解@Excel ，其中存在一个字段dictType&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;默认值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;dictType&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;如果是字典类型，请设置字典的type值 (如: sys_user_sex)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;笨蛋法-手动给每个实体类导出字段添加&lt;/h2&gt;
&lt;p&gt;在对应实体类的字段@Excel添加(dictType=&amp;quot;你的字典名&amp;quot;)&lt;/p&gt;
&lt;p&gt;eg:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;class PatientDemo extends BaseEntity{
    //@Excel(name = &amp;quot;手术切除程度&amp;quot;) 原来的样子 
    @Excel(name = &amp;quot;手术切除程度&amp;quot;,dictType = &amp;quot;doc_resection_extent&amp;quot;)  
    private String surgicalResection;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;自动法-利用代码生成器&lt;/h2&gt;
&lt;p&gt;手动一是要自己去找到字典名复制修改，二是容易遗漏，因此更推荐自动法&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;确保你的项目里已有代码生成模块 generator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;找到路径 src/main/resources/vm/java/domain.java.vm，找到如下代码&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;    @Excel(name = &amp;quot;${comment}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;替换为&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;    //如果该实体类字段有字典则导出字典对应解释值，否则导出原数据
    #if( &amp;quot;&amp;quot;!=$column.getDictType())
    @Excel(name = &amp;quot;${comment}&amp;quot;,dictType = &amp;quot;$column.getDictType()&amp;quot;)
    #else
    @Excel(name = &amp;quot;${comment}&amp;quot;)
    #end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重新启动项目，现在重新copy你的代码生成的实体类到项目里即可&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Mon, 19 Aug 2024 00:00:00 GMT</pubDate></item><item><title>云顶之弈/金铲铲 S12推荐阵容--堡垒学者阿狸</title><link>https://bigwind.cn/blog/life/%E4%BA%91%E9%A1%B6%E4%B9%8B%E5%BC%88s12%E6%8E%A8%E8%8D%90%E9%98%B5%E5%AE%B9--%E5%A0%A1%E5%9E%92%E5%AD%A6%E8%80%85%E9%98%BF%E7%8B%B8/</link><guid isPermaLink="true">https://bigwind.cn/blog/life/%E4%BA%91%E9%A1%B6%E4%B9%8B%E5%BC%88s12%E6%8E%A8%E8%8D%90%E9%98%B5%E5%AE%B9--%E5%A0%A1%E5%9E%92%E5%AD%A6%E8%80%85%E9%98%BF%E7%8B%B8/</guid><description>S12推荐阵容 近日上分首选 阿狸</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/life/%E4%BA%91%E9%A1%B6%E4%B9%8B%E5%BC%88s12%E6%8E%A8%E8%8D%90%E9%98%B5%E5%AE%B9--%E5%A0%A1%E5%9E%92%E5%AD%A6%E8%80%85%E9%98%BF%E7%8B%B8/&quot;&gt;https://bigwind.cn/blog/life/%E4%BA%91%E9%A1%B6%E4%B9%8B%E5%BC%88s12%E6%8E%A8%E8%8D%90%E9%98%B5%E5%AE%B9--%E5%A0%A1%E5%9E%92%E5%AD%A6%E8%80%85%E9%98%BF%E7%8B%B8/&lt;/a&gt;&lt;/blockquote&gt; &lt;blockquote&gt;
&lt;p&gt; 这是低费赌狗阵容 金铲铲强度略低t2左右，原因：阿里在铲的技能后摇长打假赛&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;什么时候推荐玩&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;以下条件满足任意其一&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;2-1时 手中对应阵容牌多 佐伊 波比 莉莉娅 阿狸 萨勒芬妮&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;可能独家&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2-1赌狗海克斯 备战席 黄金门票 小妮寇*2 天生2星(这个实测不咋地) 等&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;连败硬玩&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;装备推荐&lt;/h2&gt;
&lt;p&gt;主C阿狸 目前根据b站up花花九分享的数据&lt;/p&gt;
&lt;p&gt;推荐 双头盔+大帽&lt;/p&gt;
&lt;img src=&quot;https://i.p-i.vip/37/20240818-66c195dce29fb.png&quot;/&gt;
&lt;img title=&quot;&quot; src=&quot;https://i.p-i.vip/37/20240818-66c195a0cbe81.png&quot; alt=&quot;&quot;&gt;

&lt;p&gt;其他英雄推荐出装 优先出波比的 波比是主坦(来的少给莉莉娅换主坦)&lt;/p&gt;
&lt;p&gt;其次给瑞兹找装备 一定要给灼烧装，鬼书和红Buff都行，其次是电刀，瑞兹的技能群体伤害+灼烧+电刀能较快给对面挂debuff和给脆皮补刀&lt;/p&gt;
&lt;img title=&quot;&quot; src=&quot;https://i.p-i.vip/37/20240818-66c195cf0d947.png&quot; alt=&quot;&quot; width=&quot;509&quot;&gt;

&lt;blockquote&gt;
&lt;p&gt;佐伊在当前版本并不配吃装备，因为阿狸和佐伊都是单点爆发伤害，在作用上是重复的，而阿狸经常会出现打不死人丝血gg，所以需要瑞兹来带灼烧和减抗来大范围收割，其次佐伊的伤害依赖装备，而本阵容的装备数量在前中期并不够用，因此只有在中后期其他位置的装备满了或者实在适配佐伊，佐伊再吃是合理的决策&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;强化符文选择&lt;/h2&gt;
&lt;p&gt;没有也可以选择光明装备和神器，灵活变化&lt;/p&gt;
&lt;img title=&quot;&quot; src=&quot;https://i.p-i.vip/37/20240818-66c195c4c403b.png&quot; alt=&quot;&quot; width=&quot;585&quot;&gt;

&lt;h2&gt;站位推荐和英雄选择&lt;/h2&gt;
&lt;p&gt;站位原理：单顶坦克，让对面集中，使阿狸等技能一串多，阿狸技能两段，第一段配合佐伊/瑞兹电刀/主坦离子的减抗接近真伤和第二段自带真伤快速清理前排。而瑞兹范围伤害收割对方&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;高手：阿狸对准主坦，瑞兹对准对面主C 自行调整&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;第一种-傻瓜站位 莉莉娅先三推荐&lt;/h3&gt;
&lt;img title=&quot;&quot; src=&quot;https://i.p-i.vip/37/20240818-66c195b119b58.png&quot; alt=&quot;&quot; width=&quot;608&quot;&gt;

&lt;h3&gt;第二种-傻瓜站位 波比先三推荐&lt;/h3&gt;
&lt;img title=&quot;&quot; src=&quot;https://i.p-i.vip/37/20240818-66c195bce2cd2.png&quot; alt=&quot;&quot; width=&quot;586&quot;&gt;

&lt;h2&gt;运营思路&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2-1 不拉等级，前期留这几张牌 ，走连败最好，进野怪50块钱就是顺风，开香槟吧&lt;/li&gt;
&lt;/ul&gt;
&lt;img title=&quot;&quot; src=&quot;https://i.p-i.vip/37/20240818-66c195c92b494.png&quot; alt=&quot;&quot; width=&quot;387&quot;&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;2-7 打野怪前看一遍对手，确认有无同行，独家稳啦，一个能玩，两个看技术，三个跑路换其他赌狗阵容或卡30速拉等级到7转高费运营&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;打完野怪确认要玩，一波大递牌到30块&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;细节: 萨勒芬妮不卡其他牌可以留，三了可以用到瑞兹2再换，瑞兹装备全给萨勒芬妮过渡，给佐伊没拆拆就完啦；人马可以留一张避免格子不够用，2的快无视上一句。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;后面每回合都可以卡30元递，感觉来牌浪了可以多刷2下，但是切勿上头经济崩盘，1费3星两个等级升6，阿狸三了上等级，人马看缘分，2星后可以不留攒钱。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;细节：上面步骤英雄三星后升等级可以不考虑利息，连胜打压制给压力比经济重要&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;5级来人马且多，萨勒芬妮少或者没装备，可以下萨勒芬妮，先开2命运，也可以6级再开，命运选择器给阿狸(效果是3的英雄越多法强越高)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;期间可以多买点实惠法杖，尤其是给所有1费英雄和给复制器的，或者加金币和装备的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;后期8级来泽拉斯，命运选择器给泽拉斯(效果是买的法杖越多增伤越高)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;其他&lt;/h2&gt;
&lt;p&gt;前期有命运转/灵活摇摆建议玩高命运，选择器给携带命运转的英雄(效果是纹章/铲子越多伤害越高)&lt;/p&gt;
&lt;h4&gt;参考&lt;/h4&gt;
&lt;p&gt;b站手刃猫咪&lt;a href=&quot;https://www.bilibili.com/video/BV19S421X7Lc/?share_source=copy_web&amp;vd_source=78680c34221c88a733eb806ae847811a&quot;&gt;堡垒学者阿狸！版本更新后大数据登顶阵容玩法介绍&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;b站花花九&lt;a href=&quot;https://www.bilibili.com/video/BV1eE4m1R7mK/?spm_id_from=333.880.my_history.page.click&amp;vd_source=bbf8555464c14d1d733edf1c2dde8468&quot;&gt;【443阿狸】一个视频让你提高上限玩阿狸不在老八&lt;/a&gt;&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Sun, 18 Aug 2024 00:00:00 GMT</pubDate></item><item><title>C++基础入门(01)_初识</title><link>https://bigwind.cn/blog/cpp/c%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8/</link><guid isPermaLink="true">https://bigwind.cn/blog/cpp/c%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8/</guid><description>C++基础入门_C++初识_讲义分享</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/cpp/c%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8/&quot;&gt;https://bigwind.cn/blog/cpp/c%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;1 C++初识&lt;/h2&gt;
&lt;h3&gt;1.1  第一个C++程序&lt;/h3&gt;
&lt;p&gt;编写一个C++程序总共分为4个步骤&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建项目&lt;/li&gt;
&lt;li&gt;创建文件&lt;/li&gt;
&lt;li&gt;编写代码&lt;/li&gt;
&lt;li&gt;运行程序&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.1.1 创建项目&lt;/h4&gt;
&lt;p&gt;​	Visual Studio是我们用来编写C++程序的主要工具，我们先将它打开&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a637ef743.png&quot; alt=&quot;1541383178746&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a6398e88f.png&quot; alt=&quot;1541384366413&quot;&gt;&lt;/p&gt;
&lt;h4&gt;1.1.2 创建文件&lt;/h4&gt;
&lt;p&gt;右键源文件，选择添加-&amp;gt;新建项&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a63acece2.png&quot; alt=&quot;1541383817248&quot;&gt;&lt;/p&gt;
&lt;p&gt;给C++文件起个名称，然后点击添加即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a63c9165d.png&quot; alt=&quot;1541384140042&quot;&gt;&lt;/p&gt;
&lt;h4&gt;1.1.3 编写代码&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-c++&quot;&gt;#include&amp;lt;iostream&amp;gt;
using namespace std;

int main() {

	cout &amp;lt;&amp;lt; &amp;quot;Hello world&amp;quot; &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.1.4 运行程序&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a63e230af.png&quot; alt=&quot;1541384818688&quot;&gt;&lt;/p&gt;
&lt;h3&gt;1.2 注释&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;作用&lt;/strong&gt;：在代码中加一些说明和解释，方便自己或其他程序员程序员阅读代码&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;两种格式&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;单行注释&lt;/strong&gt;：&lt;code&gt;// 描述信息&lt;/code&gt; &lt;ul&gt;
&lt;li&gt;通常放在一行代码的上方，或者一条语句的末尾，==对该行代码说明==&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多行注释&lt;/strong&gt;： &lt;code&gt;/* 描述信息 */&lt;/code&gt;&lt;ul&gt;
&lt;li&gt;通常放在一段代码的上方，==对该段代码做整体说明==&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;提示：编译器在编译代码时，会忽略注释的内容&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1.3 变量&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;作用&lt;/strong&gt;：给一段指定的内存空间起名，方便操作这段内存&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;：&lt;code&gt;数据类型 变量名 = 初始值;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;#include&amp;lt;iostream&amp;gt;
using namespace std;

int main() {

	//变量的定义
	//语法：数据类型  变量名 = 初始值

	int a = 10;

	cout &amp;lt;&amp;lt; &amp;quot;a = &amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：C++在创建变量时，必须给变量一个初始值，否则会报错&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1.4  常量&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;作用&lt;/strong&gt;：用于记录程序中不可更改的数据&lt;/p&gt;
&lt;p&gt;C++定义常量两种方式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;#define&lt;/strong&gt; 宏常量： &lt;code&gt;#define 常量名 常量值&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;==通常在文件上方定义==，表示一个常量&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;const&lt;/strong&gt;修饰的变量 &lt;code&gt;const 数据类型 常量名 = 常量值&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;==通常在变量定义前加关键字const==，修饰该变量为常量，不可修改&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//1、宏常量
#define day 7

int main() {

	cout &amp;lt;&amp;lt; &amp;quot;一周里总共有 &amp;quot; &amp;lt;&amp;lt; day &amp;lt;&amp;lt; &amp;quot; 天&amp;quot; &amp;lt;&amp;lt; endl;
	//day = 8;  //报错，宏常量不可以修改

	//2、const修饰变量
	const int month = 12;
	cout &amp;lt;&amp;lt; &amp;quot;一年里总共有 &amp;quot; &amp;lt;&amp;lt; month &amp;lt;&amp;lt; &amp;quot; 个月份&amp;quot; &amp;lt;&amp;lt; endl;
	//month = 24; //报错，常量是不可以修改的
	
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.5 关键字&lt;/h3&gt;
&lt;p&gt;**作用：**关键字是C++中预先保留的单词（标识符）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;在定义变量或者常量时候，不要用关键字&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C++关键字如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;asm&lt;/th&gt;
&lt;th&gt;do&lt;/th&gt;
&lt;th&gt;if&lt;/th&gt;
&lt;th&gt;return&lt;/th&gt;
&lt;th&gt;typedef&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;auto&lt;/td&gt;
&lt;td&gt;double&lt;/td&gt;
&lt;td&gt;inline&lt;/td&gt;
&lt;td&gt;short&lt;/td&gt;
&lt;td&gt;typeid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bool&lt;/td&gt;
&lt;td&gt;dynamic_cast&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;signed&lt;/td&gt;
&lt;td&gt;typename&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;break&lt;/td&gt;
&lt;td&gt;else&lt;/td&gt;
&lt;td&gt;long&lt;/td&gt;
&lt;td&gt;sizeof&lt;/td&gt;
&lt;td&gt;union&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;case&lt;/td&gt;
&lt;td&gt;enum&lt;/td&gt;
&lt;td&gt;mutable&lt;/td&gt;
&lt;td&gt;static&lt;/td&gt;
&lt;td&gt;unsigned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;catch&lt;/td&gt;
&lt;td&gt;explicit&lt;/td&gt;
&lt;td&gt;namespace&lt;/td&gt;
&lt;td&gt;static_cast&lt;/td&gt;
&lt;td&gt;using&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;char&lt;/td&gt;
&lt;td&gt;export&lt;/td&gt;
&lt;td&gt;new&lt;/td&gt;
&lt;td&gt;struct&lt;/td&gt;
&lt;td&gt;virtual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;class&lt;/td&gt;
&lt;td&gt;extern&lt;/td&gt;
&lt;td&gt;operator&lt;/td&gt;
&lt;td&gt;switch&lt;/td&gt;
&lt;td&gt;void&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;const&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;private&lt;/td&gt;
&lt;td&gt;template&lt;/td&gt;
&lt;td&gt;volatile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;const_cast&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;protected&lt;/td&gt;
&lt;td&gt;this&lt;/td&gt;
&lt;td&gt;wchar_t&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;continue&lt;/td&gt;
&lt;td&gt;for&lt;/td&gt;
&lt;td&gt;public&lt;/td&gt;
&lt;td&gt;throw&lt;/td&gt;
&lt;td&gt;while&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;default&lt;/td&gt;
&lt;td&gt;friend&lt;/td&gt;
&lt;td&gt;register&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delete&lt;/td&gt;
&lt;td&gt;goto&lt;/td&gt;
&lt;td&gt;reinterpret_cast&lt;/td&gt;
&lt;td&gt;try&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;code&gt;提示：在给变量或者常量起名称时候，不要用C++得关键字，否则会产生歧义。&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;1.6 标识符命名规则&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;作用&lt;/strong&gt;：C++规定给标识符（变量、常量）命名时，有一套自己的规则&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标识符不能是关键字&lt;/li&gt;
&lt;li&gt;标识符只能由字母、数字、下划线组成&lt;/li&gt;
&lt;li&gt;第一个字符必须为字母或下划线&lt;/li&gt;
&lt;li&gt;标识符中字母区分大小写&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;建议：给标识符命名时，争取做到见名知意的效果，方便自己和他人的阅读&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;2 数据类型&lt;/h2&gt;
&lt;p&gt;C++规定在创建一个变量或者常量时，必须要指定出相应的数据类型，否则无法给变量分配内存&lt;/p&gt;
&lt;h3&gt;2.1 整型&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;作用&lt;/strong&gt;：整型变量表示的是==整数类型==的数据&lt;/p&gt;
&lt;p&gt;C++中能够表示整型的类型有以下几种方式，&lt;strong&gt;区别在于所占内存空间不同&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;数据类型&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;占用空间&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;取值范围&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;short(短整型)&lt;/td&gt;
&lt;td&gt;2字节&lt;/td&gt;
&lt;td&gt;(-2^15 ~ 2^15-1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int(整型)&lt;/td&gt;
&lt;td&gt;4字节&lt;/td&gt;
&lt;td&gt;(-2^31 ~ 2^31-1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;long(长整形)&lt;/td&gt;
&lt;td&gt;Windows为4字节，Linux为4字节(32位)，8字节(64位)&lt;/td&gt;
&lt;td&gt;(-2^31 ~ 2^31-1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;long long(长长整形)&lt;/td&gt;
&lt;td&gt;8字节&lt;/td&gt;
&lt;td&gt;(-2^63 ~ 2^63-1)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;2.2 sizeof关键字&lt;/h3&gt;
&lt;p&gt;**作用：**利用sizeof关键字可以==统计数据类型所占内存大小==&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt; &lt;code&gt;sizeof( 数据类型 / 变量)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	cout &amp;lt;&amp;lt; &amp;quot;short 类型所占内存空间为： &amp;quot; &amp;lt;&amp;lt; sizeof(short) &amp;lt;&amp;lt; endl;

	cout &amp;lt;&amp;lt; &amp;quot;int 类型所占内存空间为： &amp;quot; &amp;lt;&amp;lt; sizeof(int) &amp;lt;&amp;lt; endl;

	cout &amp;lt;&amp;lt; &amp;quot;long 类型所占内存空间为： &amp;quot; &amp;lt;&amp;lt; sizeof(long) &amp;lt;&amp;lt; endl;

	cout &amp;lt;&amp;lt; &amp;quot;long long 类型所占内存空间为： &amp;quot; &amp;lt;&amp;lt; sizeof(long long) &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;整型结论&lt;/strong&gt;：==short &amp;lt; int &amp;lt;= long &amp;lt;= long long==&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.3 实型（浮点型）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;作用&lt;/strong&gt;：用于==表示小数==&lt;/p&gt;
&lt;p&gt;浮点型变量分为两种：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;单精度float &lt;/li&gt;
&lt;li&gt;双精度double&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;两者的&lt;strong&gt;区别&lt;/strong&gt;在于表示的有效数字范围不同。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;数据类型&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;占用空间&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;有效数字范围&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;4字节&lt;/td&gt;
&lt;td&gt;7位有效数字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;double&lt;/td&gt;
&lt;td&gt;8字节&lt;/td&gt;
&lt;td&gt;15～16位有效数字&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	float f1 = 3.14f;
	double d1 = 3.14;

	cout &amp;lt;&amp;lt; f1 &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; d1&amp;lt;&amp;lt; endl;

	cout &amp;lt;&amp;lt; &amp;quot;float  sizeof = &amp;quot; &amp;lt;&amp;lt; sizeof(f1) &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;double sizeof = &amp;quot; &amp;lt;&amp;lt; sizeof(d1) &amp;lt;&amp;lt; endl;

	//科学计数法
	float f2 = 3e2; // 3 * 10 ^ 2 
	cout &amp;lt;&amp;lt; &amp;quot;f2 = &amp;quot; &amp;lt;&amp;lt; f2 &amp;lt;&amp;lt; endl;

	float f3 = 3e-2;  // 3 * 0.1 ^ 2
	cout &amp;lt;&amp;lt; &amp;quot;f3 = &amp;quot; &amp;lt;&amp;lt; f3 &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.4 字符型&lt;/h3&gt;
&lt;p&gt;**作用：**字符型变量用于显示单个字符&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;&lt;code&gt;char ch = &amp;#39;a&amp;#39;;&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意1：在显示字符型变量时，用单引号将字符括起来，不要用双引号&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;注意2：单引号内只能有一个字符，不可以是字符串&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;C和C++中字符型变量只占用==1个字节==。&lt;/li&gt;
&lt;li&gt;字符型变量并不是把字符本身放到内存中存储，而是将对应的ASCII编码放入到存储单元&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {
	
	char ch = &amp;#39;a&amp;#39;;
	cout &amp;lt;&amp;lt; ch &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; sizeof(char) &amp;lt;&amp;lt; endl;

	//ch = &amp;quot;abcde&amp;quot;; //错误，不可以用双引号
	//ch = &amp;#39;abcde&amp;#39;; //错误，单引号内只能引用一个字符

	cout &amp;lt;&amp;lt; (int)ch &amp;lt;&amp;lt; endl;  //查看字符a对应的ASCII码
	ch = 97; //可以直接用ASCII给字符型变量赋值
	cout &amp;lt;&amp;lt; ch &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ASCII码表格：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;ASCII&lt;/strong&gt;值&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;控制字符&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;ASCII&lt;/strong&gt;值&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;字符&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;ASCII&lt;/strong&gt;值&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;字符&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;ASCII&lt;/strong&gt;值&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;字符&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;NUT&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;(space)&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;@&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;、&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;SOH&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;!&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;STX&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;&amp;quot;&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;ETX&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;EOT&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;$&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;ENQ&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;%&lt;/td&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;e&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;ACK&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;&amp;amp;&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;f&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;BEL&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;,&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;G&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;BS&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;(&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;td&gt;h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;HT&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;)&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;i&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;LF&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;J&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;td&gt;j&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;VT&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;K&lt;/td&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;td&gt;k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;FF&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;,&lt;/td&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;108&lt;/td&gt;
&lt;td&gt;l&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;CR&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;109&lt;/td&gt;
&lt;td&gt;m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;SO&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;.&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;SI&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;111&lt;/td&gt;
&lt;td&gt;o&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;DLE&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;P&lt;/td&gt;
&lt;td&gt;112&lt;/td&gt;
&lt;td&gt;p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;DCI&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;Q&lt;/td&gt;
&lt;td&gt;113&lt;/td&gt;
&lt;td&gt;q&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;DC2&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;td&gt;114&lt;/td&gt;
&lt;td&gt;r&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;DC3&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;115&lt;/td&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;DC4&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;116&lt;/td&gt;
&lt;td&gt;t&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;NAK&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;U&lt;/td&gt;
&lt;td&gt;117&lt;/td&gt;
&lt;td&gt;u&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;SYN&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;td&gt;118&lt;/td&gt;
&lt;td&gt;v&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;TB&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;W&lt;/td&gt;
&lt;td&gt;119&lt;/td&gt;
&lt;td&gt;w&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;CAN&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;EM&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;td&gt;121&lt;/td&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;SUB&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;td&gt;122&lt;/td&gt;
&lt;td&gt;z&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;ESC&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;;&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;[&lt;/td&gt;
&lt;td&gt;123&lt;/td&gt;
&lt;td&gt;{&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;FS&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;&amp;lt;&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;124&lt;/td&gt;
&lt;td&gt;|&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;GS&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;td&gt;]&lt;/td&gt;
&lt;td&gt;125&lt;/td&gt;
&lt;td&gt;}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;RS&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;&amp;gt;&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;^&lt;/td&gt;
&lt;td&gt;126&lt;/td&gt;
&lt;td&gt;`&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;_&lt;/td&gt;
&lt;td&gt;127&lt;/td&gt;
&lt;td&gt;DEL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;ASCII 码大致由以下&lt;strong&gt;两部分组&lt;/strong&gt;成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ASCII 非打印控制字符： ASCII 表上的数字 &lt;strong&gt;0-31&lt;/strong&gt; 分配给了控制字符，用于控制像打印机等一些外围设备。&lt;/li&gt;
&lt;li&gt;ASCII 打印字符：数字 &lt;strong&gt;32-126&lt;/strong&gt; 分配给了能在键盘上找到的字符，当查看或打印文档时就会出现。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.5 转义字符&lt;/h3&gt;
&lt;p&gt;**作用：**用于表示一些==不能显示出来的ASCII字符==&lt;/p&gt;
&lt;p&gt;现阶段我们常用的转义字符有：&lt;code&gt; \n  \\  \t&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;转义字符&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;含义&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;ASCII&lt;/strong&gt;码值（十进制）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;\a&lt;/td&gt;
&lt;td&gt;警报&lt;/td&gt;
&lt;td&gt;007&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\b&lt;/td&gt;
&lt;td&gt;退格(BS) ，将当前位置移到前一列&lt;/td&gt;
&lt;td&gt;008&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\f&lt;/td&gt;
&lt;td&gt;换页(FF)，将当前位置移到下页开头&lt;/td&gt;
&lt;td&gt;012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;\n&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;换行(LF) ，将当前位置移到下一行开头&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;010&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\r&lt;/td&gt;
&lt;td&gt;回车(CR) ，将当前位置移到本行开头&lt;/td&gt;
&lt;td&gt;013&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;\t&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;水平制表(HT)  （跳到下一个TAB位置）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;009&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\v&lt;/td&gt;
&lt;td&gt;垂直制表(VT)&lt;/td&gt;
&lt;td&gt;011&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;\\&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;代表一个反斜线字符&amp;quot;&amp;quot;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;092&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;#39;&lt;/td&gt;
&lt;td&gt;代表一个单引号（撇号）字符&lt;/td&gt;
&lt;td&gt;039&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;&lt;/td&gt;
&lt;td&gt;代表一个双引号字符&lt;/td&gt;
&lt;td&gt;034&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;代表一个问号&lt;/td&gt;
&lt;td&gt;063&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\0&lt;/td&gt;
&lt;td&gt;数字0&lt;/td&gt;
&lt;td&gt;000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\ddd&lt;/td&gt;
&lt;td&gt;8进制转义字符，d范围0~7&lt;/td&gt;
&lt;td&gt;3位8进制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\xhh&lt;/td&gt;
&lt;td&gt;16进制转义字符，h范围0&lt;del&gt;9，a&lt;/del&gt;f，A~F&lt;/td&gt;
&lt;td&gt;3位16进制&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {
	
	
	cout &amp;lt;&amp;lt; &amp;quot;\\&amp;quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;\tHello&amp;quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot; &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.6 字符串型&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;作用&lt;/strong&gt;：用于表示一串字符&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;两种风格&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;C风格字符串&lt;/strong&gt;： &lt;code&gt;char 变量名[] = &amp;quot;字符串值&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

    char str1[] = &amp;quot;hello world&amp;quot;;
    cout &amp;lt;&amp;lt; str1 &amp;lt;&amp;lt; endl;
    
    system(&amp;quot;pause&amp;quot;);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：C风格的字符串要用双引号括起来&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;C++风格字符串&lt;/strong&gt;：  &lt;code&gt;string  变量名 = &amp;quot;字符串值&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

    string str = &amp;quot;hello world&amp;quot;;
    cout &amp;lt;&amp;lt; str &amp;lt;&amp;lt; endl;
    
    system(&amp;quot;pause&amp;quot;);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：C++风格字符串，需要加入头文件==#include&amp;lt;string&amp;gt;==&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.7 布尔类型 bool&lt;/h3&gt;
&lt;p&gt;**作用：**布尔数据类型代表真或假的值 &lt;/p&gt;
&lt;p&gt;bool类型只有两个值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;true  --- 真（本质是1）&lt;/li&gt;
&lt;li&gt;false --- 假（本质是0）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;bool类型占==1个字节==大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	bool flag = true;
	cout &amp;lt;&amp;lt; flag &amp;lt;&amp;lt; endl; // 1

	flag = false;
	cout &amp;lt;&amp;lt; flag &amp;lt;&amp;lt; endl; // 0

	cout &amp;lt;&amp;lt; &amp;quot;size of bool = &amp;quot; &amp;lt;&amp;lt; sizeof(bool) &amp;lt;&amp;lt; endl; //1
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.8 数据的输入&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;作用：用于从键盘获取数据&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**关键字：**cin&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt; &lt;code&gt;cin &amp;gt;&amp;gt; 变量 &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main(){

	//整型输入
	int a = 0;
	cout &amp;lt;&amp;lt; &amp;quot;请输入整型变量：&amp;quot; &amp;lt;&amp;lt; endl;
	cin &amp;gt;&amp;gt; a;
	cout &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;

	//浮点型输入
	double d = 0;
	cout &amp;lt;&amp;lt; &amp;quot;请输入浮点型变量：&amp;quot; &amp;lt;&amp;lt; endl;
	cin &amp;gt;&amp;gt; d;
	cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt; endl;

	//字符型输入
	char ch = 0;
	cout &amp;lt;&amp;lt; &amp;quot;请输入字符型变量：&amp;quot; &amp;lt;&amp;lt; endl;
	cin &amp;gt;&amp;gt; ch;
	cout &amp;lt;&amp;lt; ch &amp;lt;&amp;lt; endl;

	//字符串型输入
	string str;
	cout &amp;lt;&amp;lt; &amp;quot;请输入字符串型变量：&amp;quot; &amp;lt;&amp;lt; endl;
	cin &amp;gt;&amp;gt; str;
	cout &amp;lt;&amp;lt; str &amp;lt;&amp;lt; endl;

	//布尔类型输入
	bool flag = true;
	cout &amp;lt;&amp;lt; &amp;quot;请输入布尔型变量：&amp;quot; &amp;lt;&amp;lt; endl;
	cin &amp;gt;&amp;gt; flag;
	cout &amp;lt;&amp;lt; flag &amp;lt;&amp;lt; endl;
	system(&amp;quot;pause&amp;quot;);
	return EXIT_SUCCESS;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3 运算符&lt;/h2&gt;
&lt;p&gt;**作用：**用于执行代码的运算&lt;/p&gt;
&lt;p&gt;本章我们主要讲解以下几类运算符：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;运算符类型&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;作用&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;算术运算符&lt;/td&gt;
&lt;td&gt;用于处理四则运算&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;赋值运算符&lt;/td&gt;
&lt;td&gt;用于将表达式的值赋给变量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;比较运算符&lt;/td&gt;
&lt;td&gt;用于表达式的比较，并返回一个真值或假值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;逻辑运算符&lt;/td&gt;
&lt;td&gt;用于根据表达式的值返回真值或假值&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;3.1 算术运算符&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;作用&lt;/strong&gt;：用于处理四则运算 &lt;/p&gt;
&lt;p&gt;算术运算符包括以下符号：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;运算符&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;术语&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;结果&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;正号&lt;/td&gt;
&lt;td&gt;+3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;负号&lt;/td&gt;
&lt;td&gt;-3&lt;/td&gt;
&lt;td&gt;-3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;加&lt;/td&gt;
&lt;td&gt;10 + 5&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;减&lt;/td&gt;
&lt;td&gt;10 - 5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;乘&lt;/td&gt;
&lt;td&gt;10 * 5&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;除&lt;/td&gt;
&lt;td&gt;10 / 5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%&lt;/td&gt;
&lt;td&gt;取模(取余)&lt;/td&gt;
&lt;td&gt;10 % 3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;++&lt;/td&gt;
&lt;td&gt;前置递增&lt;/td&gt;
&lt;td&gt;a=2; b=++a;&lt;/td&gt;
&lt;td&gt;a=3; b=3;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;++&lt;/td&gt;
&lt;td&gt;后置递增&lt;/td&gt;
&lt;td&gt;a=2; b=a++;&lt;/td&gt;
&lt;td&gt;a=3; b=2;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;前置递减&lt;/td&gt;
&lt;td&gt;a=2; b=--a;&lt;/td&gt;
&lt;td&gt;a=1; b=1;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;后置递减&lt;/td&gt;
&lt;td&gt;a=2; b=a--;&lt;/td&gt;
&lt;td&gt;a=1; b=2;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;示例1：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//加减乘除
int main() {

	int a1 = 10;
	int b1 = 3;

	cout &amp;lt;&amp;lt; a1 + b1 &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; a1 - b1 &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; a1 * b1 &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; a1 / b1 &amp;lt;&amp;lt; endl;  //两个整数相除结果依然是整数

	int a2 = 10;
	int b2 = 20;
	cout &amp;lt;&amp;lt; a2 / b2 &amp;lt;&amp;lt; endl; 

	int a3 = 10;
	int b3 = 0;
	//cout &amp;lt;&amp;lt; a3 / b3 &amp;lt;&amp;lt; endl; //报错，除数不可以为0


	//两个小数可以相除
	double d1 = 0.5;
	double d2 = 0.25;
	cout &amp;lt;&amp;lt; d1 / d2 &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：在除法运算中，除数不能为0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;示例2：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//取模
int main() {

	int a1 = 10;
	int b1 = 3;

	cout &amp;lt;&amp;lt; 10 % 3 &amp;lt;&amp;lt; endl;

	int a2 = 10;
	int b2 = 20;

	cout &amp;lt;&amp;lt; a2 % b2 &amp;lt;&amp;lt; endl;

	int a3 = 10;
	int b3 = 0;

	//cout &amp;lt;&amp;lt; a3 % b3 &amp;lt;&amp;lt; endl; //取模运算时，除数也不能为0

	//两个小数不可以取模
	double d1 = 3.14;
	double d2 = 1.1;

	//cout &amp;lt;&amp;lt; d1 % d2 &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：只有整型变量可以进行取模运算&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;示例3：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//递增
int main() {

	//后置递增
	int a = 10;
	a++; //等价于a = a + 1
	cout &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl; // 11

	//前置递增
	int b = 10;
	++b;
	cout &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl; // 11

	//区别
	//前置递增先对变量进行++，再计算表达式
	int a2 = 10;
	int b2 = ++a2 * 10;
	cout &amp;lt;&amp;lt; b2 &amp;lt;&amp;lt; endl;

	//后置递增先计算表达式，后对变量进行++
	int a3 = 10;
	int b3 = a3++ * 10;
	cout &amp;lt;&amp;lt; b3 &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：前置递增先对变量进行++，再计算表达式，后置递增相反&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3.2 赋值运算符&lt;/h3&gt;
&lt;p&gt;**作用：**用于将表达式的值赋给变量&lt;/p&gt;
&lt;p&gt;赋值运算符包括以下几个符号：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;运算符&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;术语&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;结果&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;td&gt;赋值&lt;/td&gt;
&lt;td&gt;a=2; b=3;&lt;/td&gt;
&lt;td&gt;a=2; b=3;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+=&lt;/td&gt;
&lt;td&gt;加等于&lt;/td&gt;
&lt;td&gt;a=0; a+=2;&lt;/td&gt;
&lt;td&gt;a=2;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-=&lt;/td&gt;
&lt;td&gt;减等于&lt;/td&gt;
&lt;td&gt;a=5; a-=3;&lt;/td&gt;
&lt;td&gt;a=2;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;*=&lt;/td&gt;
&lt;td&gt;乘等于&lt;/td&gt;
&lt;td&gt;a=2; a*=2;&lt;/td&gt;
&lt;td&gt;a=4;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/=&lt;/td&gt;
&lt;td&gt;除等于&lt;/td&gt;
&lt;td&gt;a=4; a/=2;&lt;/td&gt;
&lt;td&gt;a=2;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%=&lt;/td&gt;
&lt;td&gt;模等于&lt;/td&gt;
&lt;td&gt;a=3; a%2;&lt;/td&gt;
&lt;td&gt;a=1;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	//赋值运算符

	// =
	int a = 10;
	a = 100;
	cout &amp;lt;&amp;lt; &amp;quot;a = &amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;

	// +=
	a = 10;
	a += 2; // a = a + 2;
	cout &amp;lt;&amp;lt; &amp;quot;a = &amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;

	// -=
	a = 10;
	a -= 2; // a = a - 2
	cout &amp;lt;&amp;lt; &amp;quot;a = &amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;

	// *=
	a = 10;
	a *= 2; // a = a * 2
	cout &amp;lt;&amp;lt; &amp;quot;a = &amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;

	// /=
	a = 10;
	a /= 2;  // a = a / 2;
	cout &amp;lt;&amp;lt; &amp;quot;a = &amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;

	// %=
	a = 10;
	a %= 2;  // a = a % 2;
	cout &amp;lt;&amp;lt; &amp;quot;a = &amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.3 比较运算符&lt;/h3&gt;
&lt;p&gt;**作用：**用于表达式的比较，并返回一个真值或假值&lt;/p&gt;
&lt;p&gt;比较运算符有以下符号：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;运算符&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;术语&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;结果&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;==&lt;/td&gt;
&lt;td&gt;相等于&lt;/td&gt;
&lt;td&gt;4 == 3&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;!=&lt;/td&gt;
&lt;td&gt;不等于&lt;/td&gt;
&lt;td&gt;4 != 3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;&lt;/td&gt;
&lt;td&gt;小于&lt;/td&gt;
&lt;td&gt;4 &amp;lt; 3&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;&lt;/td&gt;
&lt;td&gt;大于&lt;/td&gt;
&lt;td&gt;4 &amp;gt; 3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;=&lt;/td&gt;
&lt;td&gt;小于等于&lt;/td&gt;
&lt;td&gt;4 &amp;lt;= 3&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;=&lt;/td&gt;
&lt;td&gt;大于等于&lt;/td&gt;
&lt;td&gt;4 &amp;gt;= 1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	int a = 10;
	int b = 20;

	cout &amp;lt;&amp;lt; (a == b) &amp;lt;&amp;lt; endl; // 0 

	cout &amp;lt;&amp;lt; (a != b) &amp;lt;&amp;lt; endl; // 1

	cout &amp;lt;&amp;lt; (a &amp;gt; b) &amp;lt;&amp;lt; endl; // 0

	cout &amp;lt;&amp;lt; (a &amp;lt; b) &amp;lt;&amp;lt; endl; // 1

	cout &amp;lt;&amp;lt; (a &amp;gt;= b) &amp;lt;&amp;lt; endl; // 0

	cout &amp;lt;&amp;lt; (a &amp;lt;= b) &amp;lt;&amp;lt; endl; // 1
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：C和C++ 语言的比较运算中， ==“真”用数字“1”来表示， “假”用数字“0”来表示。== &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3.4 逻辑运算符&lt;/h3&gt;
&lt;p&gt;**作用：**用于根据表达式的值返回真值或假值&lt;/p&gt;
&lt;p&gt;逻辑运算符有以下符号：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;运算符&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;术语&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;结果&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;!&lt;/td&gt;
&lt;td&gt;非&lt;/td&gt;
&lt;td&gt;!a&lt;/td&gt;
&lt;td&gt;如果a为假，则!a为真；  如果a为真，则!a为假。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;amp;&amp;amp;&lt;/td&gt;
&lt;td&gt;与&lt;/td&gt;
&lt;td&gt;a &amp;amp;&amp;amp; b&lt;/td&gt;
&lt;td&gt;如果a和b都为真，则结果为真，否则为假。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;||&lt;/td&gt;
&lt;td&gt;或&lt;/td&gt;
&lt;td&gt;a || b&lt;/td&gt;
&lt;td&gt;如果a和b有一个为真，则结果为真，二者都为假时，结果为假。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;**示例1：**逻辑非&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//逻辑运算符  --- 非
int main() {

	int a = 10;

	cout &amp;lt;&amp;lt; !a &amp;lt;&amp;lt; endl; // 0

	cout &amp;lt;&amp;lt; !!a &amp;lt;&amp;lt; endl; // 1

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结： 真变假，假变真&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;**示例2：**逻辑与&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//逻辑运算符  --- 与
int main() {

	int a = 10;
	int b = 10;

	cout &amp;lt;&amp;lt; (a &amp;amp;&amp;amp; b) &amp;lt;&amp;lt; endl;// 1

	a = 10;
	b = 0;

	cout &amp;lt;&amp;lt; (a &amp;amp;&amp;amp; b) &amp;lt;&amp;lt; endl;// 0 

	a = 0;
	b = 0;

	cout &amp;lt;&amp;lt; (a &amp;amp;&amp;amp; b) &amp;lt;&amp;lt; endl;// 0

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：逻辑==与==运算符总结： ==同真为真，其余为假==&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;**示例3：**逻辑或&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c++&quot;&gt;//逻辑运算符  --- 或
int main() {

	int a = 10;
	int b = 10;

	cout &amp;lt;&amp;lt; (a || b) &amp;lt;&amp;lt; endl;// 1

	a = 10;
	b = 0;

	cout &amp;lt;&amp;lt; (a || b) &amp;lt;&amp;lt; endl;// 1 

	a = 0;
	b = 0;

	cout &amp;lt;&amp;lt; (a || b) &amp;lt;&amp;lt; endl;// 0

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;逻辑==或==运算符总结： ==同假为假，其余为真==&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;4 程序流程结构&lt;/h2&gt;
&lt;p&gt;C/C++支持最基本的三种程序运行结构：==顺序结构、选择结构、循环结构==&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;顺序结构：程序按顺序执行，不发生跳转&lt;/li&gt;
&lt;li&gt;选择结构：依据条件是否满足，有选择的执行相应功能&lt;/li&gt;
&lt;li&gt;循环结构：依据条件是否满足，循环多次执行某段代码&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.1 选择结构&lt;/h3&gt;
&lt;h4&gt;4.1.1 if语句&lt;/h4&gt;
&lt;p&gt;**作用：**执行满足条件的语句&lt;/p&gt;
&lt;p&gt;if语句的三种形式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;单行格式if语句&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;多行格式if语句&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;多条件的if语句&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;单行格式if语句：&lt;code&gt;if(条件){ 条件满足执行的语句 }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a63f13524.png&quot; alt=&quot;img&quot;&gt;&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

    //选择结构-单行if语句
    //输入一个分数，如果分数大于600分，视为考上一本大学，并在屏幕上打印

    int score = 0;
    cout &amp;lt;&amp;lt; &amp;quot;请输入一个分数：&amp;quot; &amp;lt;&amp;lt; endl;
    cin &amp;gt;&amp;gt; score;

    cout &amp;lt;&amp;lt; &amp;quot;您输入的分数为： &amp;quot; &amp;lt;&amp;lt; score &amp;lt;&amp;lt; endl;

    //if语句
    //注意事项，在if判断语句后面，不要加分号
    if (score &amp;gt; 600)
    {
        cout &amp;lt;&amp;lt; &amp;quot;我考上了一本大学！！！&amp;quot; &amp;lt;&amp;lt; endl;
    }

    system(&amp;quot;pause&amp;quot;);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：if条件表达式后不要加分号&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;多行格式if语句：&lt;code&gt;if(条件){ 条件满足执行的语句 }else{ 条件不满足执行的语句 };&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a63fd1dad.png&quot; alt=&quot;img&quot;&gt;&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	int score = 0;

	cout &amp;lt;&amp;lt; &amp;quot;请输入考试分数：&amp;quot; &amp;lt;&amp;lt; endl;

	cin &amp;gt;&amp;gt; score;

	if (score &amp;gt; 600)
	{
		cout &amp;lt;&amp;lt; &amp;quot;我考上了一本大学&amp;quot; &amp;lt;&amp;lt; endl;
	}
	else
	{
		cout &amp;lt;&amp;lt; &amp;quot;我未考上一本大学&amp;quot; &amp;lt;&amp;lt; endl;
	}

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;多条件的if语句：&lt;code&gt;if(条件1){ 条件1满足执行的语句 }else if(条件2){条件2满足执行的语句}... else{ 都不满足执行的语句}&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a640af295.png&quot; alt=&quot;img&quot;&gt;&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;	int main() {

	int score = 0;

	cout &amp;lt;&amp;lt; &amp;quot;请输入考试分数：&amp;quot; &amp;lt;&amp;lt; endl;

	cin &amp;gt;&amp;gt; score;

	if (score &amp;gt; 600)
	{
		cout &amp;lt;&amp;lt; &amp;quot;我考上了一本大学&amp;quot; &amp;lt;&amp;lt; endl;
	}
	else if (score &amp;gt; 500)
	{
		cout &amp;lt;&amp;lt; &amp;quot;我考上了二本大学&amp;quot; &amp;lt;&amp;lt; endl;
	}
	else if (score &amp;gt; 400)
	{
		cout &amp;lt;&amp;lt; &amp;quot;我考上了三本大学&amp;quot; &amp;lt;&amp;lt; endl;
	}
	else
	{
		cout &amp;lt;&amp;lt; &amp;quot;我未考上本科&amp;quot; &amp;lt;&amp;lt; endl;
	}

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;嵌套if语句&lt;/strong&gt;：在if语句中，可以嵌套使用if语句，达到更精确的条件判断&lt;/p&gt;
&lt;p&gt;案例需求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提示用户输入一个高考考试分数，根据分数做如下判断&lt;/li&gt;
&lt;li&gt;分数如果大于600分视为考上一本，大于500分考上二本，大于400考上三本，其余视为未考上本科；&lt;/li&gt;
&lt;li&gt;在一本分数中，如果大于700分，考入北大，大于650分，考入清华，大于600考入人大。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c++&quot;&gt;int main() {

	int score = 0;

	cout &amp;lt;&amp;lt; &amp;quot;请输入考试分数：&amp;quot; &amp;lt;&amp;lt; endl;

	cin &amp;gt;&amp;gt; score;

	if (score &amp;gt; 600)
	{
		cout &amp;lt;&amp;lt; &amp;quot;我考上了一本大学&amp;quot; &amp;lt;&amp;lt; endl;
		if (score &amp;gt; 700)
		{
			cout &amp;lt;&amp;lt; &amp;quot;我考上了北大&amp;quot; &amp;lt;&amp;lt; endl;
		}
		else if (score &amp;gt; 650)
		{
			cout &amp;lt;&amp;lt; &amp;quot;我考上了清华&amp;quot; &amp;lt;&amp;lt; endl;
		}
		else
		{
			cout &amp;lt;&amp;lt; &amp;quot;我考上了人大&amp;quot; &amp;lt;&amp;lt; endl;
		}
		
	}
	else if (score &amp;gt; 500)
	{
		cout &amp;lt;&amp;lt; &amp;quot;我考上了二本大学&amp;quot; &amp;lt;&amp;lt; endl;
	}
	else if (score &amp;gt; 400)
	{
		cout &amp;lt;&amp;lt; &amp;quot;我考上了三本大学&amp;quot; &amp;lt;&amp;lt; endl;
	}
	else
	{
		cout &amp;lt;&amp;lt; &amp;quot;我未考上本科&amp;quot; &amp;lt;&amp;lt; endl;
	}

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;练习案例：&lt;/strong&gt; 三只小猪称体重&lt;/p&gt;
&lt;p&gt;有三只小猪ABC，请分别输入三只小猪的体重，并且判断哪只小猪最重？&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a64262f10.jpg&quot; alt=&quot;三只小猪&quot;&gt;&lt;/p&gt;
&lt;h4&gt;4.1.2 三目运算符&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt; 通过三目运算符实现简单的判断&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;&lt;code&gt;表达式1 ? 表达式2 ：表达式3&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解释：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果表达式1的值为真，执行表达式2，并返回表达式2的结果；&lt;/p&gt;
&lt;p&gt;如果表达式1的值为假，执行表达式3，并返回表达式3的结果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	int a = 10;
	int b = 20;
	int c = 0;

	c = a &amp;gt; b ? a : b;
	cout &amp;lt;&amp;lt; &amp;quot;c = &amp;quot; &amp;lt;&amp;lt; c &amp;lt;&amp;lt; endl;

	//C++中三目运算符返回的是变量,可以继续赋值

	(a &amp;gt; b ? a : b) = 100;

	cout &amp;lt;&amp;lt; &amp;quot;a = &amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;b = &amp;quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;c = &amp;quot; &amp;lt;&amp;lt; c &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：和if语句比较，三目运算符优点是短小整洁，缺点是如果用嵌套，结构不清晰&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;4.1.3 switch语句&lt;/h4&gt;
&lt;p&gt;**作用：**执行多条件分支语句&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;switch(表达式)

{

	case 结果1：执行语句;break;

	case 结果2：执行语句;break;

	...

	default:执行语句;break;

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	//请给电影评分 
	//10 ~ 9   经典   
	// 8 ~ 7   非常好
	// 6 ~ 5   一般
	// 5分以下 烂片

	int score = 0;
	cout &amp;lt;&amp;lt; &amp;quot;请给电影打分&amp;quot; &amp;lt;&amp;lt; endl;
	cin &amp;gt;&amp;gt; score;

	switch (score)
	{
	case 10:
	case 9:
		cout &amp;lt;&amp;lt; &amp;quot;经典&amp;quot; &amp;lt;&amp;lt; endl;
		break;
	case 8:
		cout &amp;lt;&amp;lt; &amp;quot;非常好&amp;quot; &amp;lt;&amp;lt; endl;
		break;
	case 7:
	case 6:
		cout &amp;lt;&amp;lt; &amp;quot;一般&amp;quot; &amp;lt;&amp;lt; endl;
		break;
	default:
		cout &amp;lt;&amp;lt; &amp;quot;烂片&amp;quot; &amp;lt;&amp;lt; endl;
		break;
	}

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意1：switch语句中表达式类型只能是整型或者字符型&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;注意2：case里如果没有break，那么程序会一直向下执行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：与if语句比，对于多条件判断时，switch的结构清晰，执行效率高，缺点是switch不可以判断区间&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;4.2 循环结构&lt;/h3&gt;
&lt;h4&gt;4.2.1 while循环语句&lt;/h4&gt;
&lt;p&gt;**作用：**满足循环条件，执行循环语句&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;&lt;code&gt; while(循环条件){ 循环语句 }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解释：&lt;/strong&gt;==只要循环条件的结果为真，就执行循环语句==&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a643c4735.png&quot; alt=&quot;img&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	int num = 0;
	while (num &amp;lt; 10)
	{
		cout &amp;lt;&amp;lt; &amp;quot;num = &amp;quot; &amp;lt;&amp;lt; num &amp;lt;&amp;lt; endl;
		num++;
	}
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：在执行循环语句时候，程序必须提供跳出循环的出口，否则出现死循环&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;while循环练习案例：&lt;/strong&gt;==猜数字==&lt;/p&gt;
&lt;p&gt;**案例描述：**系统随机生成一个1到100之间的数字，玩家进行猜测，如果猜错，提示玩家数字过大或过小，如果猜对恭喜玩家胜利，并且退出游戏。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a644a5d3a.jpg&quot; alt=&quot;猜数字&quot;&gt;&lt;/p&gt;
&lt;h4&gt;4.2.2 do...while循环语句&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt; 满足循环条件，执行循环语句&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt; &lt;code&gt;do{ 循环语句 } while(循环条件);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;**注意：**与while的区别在于==do...while会先执行一次循环语句==，再判断循环条件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a645b2d57.png&quot; alt=&quot;img&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	int num = 0;

	do
	{
		cout &amp;lt;&amp;lt; num &amp;lt;&amp;lt; endl;
		num++;

	} while (num &amp;lt; 10);
	
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：与while循环区别在于，do...while先执行一次循环语句，再判断循环条件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;练习案例：水仙花数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**案例描述：**水仙花数是指一个 3 位数，它的每个位上的数字的 3次幂之和等于它本身&lt;/p&gt;
&lt;p&gt;例如：1^3 + 5^3+ 3^3 = 153&lt;/p&gt;
&lt;p&gt;请利用do...while语句，求出所有3位数中的水仙花数&lt;/p&gt;
&lt;h4&gt;4.2.3 for循环语句&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt; 满足循环条件，执行循环语句&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;&lt;code&gt; for(起始表达式;条件表达式;末尾循环体) { 循环语句; }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	for (int i = 0; i &amp;lt; 10; i++)
	{
		cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; endl;
	}
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;详解：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a6469ffb2.png&quot; alt=&quot;1541673704101&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：for循环中的表达式，要用分号进行分隔&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：while , do...while, for都是开发中常用的循环语句，for循环结构比较清晰，比较常用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;练习案例：敲桌子&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;案例描述：从1开始数到数字100， 如果数字个位含有7，或者数字十位含有7，或者该数字是7的倍数，我们打印敲桌子，其余数字直接打印输出。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a6478035e.gif&quot; alt=&quot;timg&quot;&gt;&lt;/p&gt;
&lt;h4&gt;4.2.4 嵌套循环&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt; 在循环体中再嵌套一层循环，解决一些实际问题&lt;/p&gt;
&lt;p&gt;例如我们想在屏幕中打印如下图片，就需要利用嵌套循环&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a64872f2a.png&quot; alt=&quot;1541676003486&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	//外层循环执行1次，内层循环执行1轮
	for (int i = 0; i &amp;lt; 10; i++)
	{
		for (int j = 0; j &amp;lt; 10; j++)
		{
			cout &amp;lt;&amp;lt; &amp;quot;*&amp;quot; &amp;lt;&amp;lt; &amp;quot; &amp;quot;;
		}
		cout &amp;lt;&amp;lt; endl;
	}

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**练习案例：**乘法口诀表&lt;/p&gt;
&lt;p&gt;案例描述：利用嵌套循环，实现九九乘法表&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a64995d05.jpg&quot; alt=&quot;0006018857256120_b&quot;&gt;&lt;/p&gt;
&lt;h3&gt;4.3 跳转语句&lt;/h3&gt;
&lt;h4&gt;4.3.1 break语句&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;作用:&lt;/strong&gt; 用于跳出==选择结构==或者==循环结构==&lt;/p&gt;
&lt;p&gt;break使用的时机：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;出现在switch条件语句中，作用是终止case并跳出switch&lt;/li&gt;
&lt;li&gt;出现在循环语句中，作用是跳出当前的循环语句&lt;/li&gt;
&lt;li&gt;出现在嵌套循环中，跳出最近的内层循环语句&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例1：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {
	//1、在switch 语句中使用break
	cout &amp;lt;&amp;lt; &amp;quot;请选择您挑战副本的难度：&amp;quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;1、普通&amp;quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;2、中等&amp;quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;3、困难&amp;quot; &amp;lt;&amp;lt; endl;

	int num = 0;

	cin &amp;gt;&amp;gt; num;

	switch (num)
	{
	case 1:
		cout &amp;lt;&amp;lt; &amp;quot;您选择的是普通难度&amp;quot; &amp;lt;&amp;lt; endl;
		break;
	case 2:
		cout &amp;lt;&amp;lt; &amp;quot;您选择的是中等难度&amp;quot; &amp;lt;&amp;lt; endl;
		break;
	case 3:
		cout &amp;lt;&amp;lt; &amp;quot;您选择的是困难难度&amp;quot; &amp;lt;&amp;lt; endl;
		break;
	}

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例2：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {
	//2、在循环语句中用break
	for (int i = 0; i &amp;lt; 10; i++)
	{
		if (i == 5)
		{
			break; //跳出循环语句
		}
		cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; endl;
	}

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例3：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {
	//在嵌套循环语句中使用break，退出内层循环
	for (int i = 0; i &amp;lt; 10; i++)
	{
		for (int j = 0; j &amp;lt; 10; j++)
		{
			if (j == 5)
			{
				break;
			}
			cout &amp;lt;&amp;lt; &amp;quot;*&amp;quot; &amp;lt;&amp;lt; &amp;quot; &amp;quot;;
		}
		cout &amp;lt;&amp;lt; endl;
	}
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4.3.2 continue语句&lt;/h4&gt;
&lt;p&gt;**作用：**在==循环语句==中，跳过本次循环中余下尚未执行的语句，继续执行下一次循环&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	for (int i = 0; i &amp;lt; 100; i++)
	{
		if (i % 2 == 0)
		{
			continue;
		}
		cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; endl;
	}
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：continue并没有使整个循环终止，而break会跳出循环&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;4.3.3 goto语句&lt;/h4&gt;
&lt;p&gt;**作用：**可以无条件跳转语句&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt; &lt;code&gt;goto 标记;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;**解释：**如果标记的名称存在，执行到goto语句时，会跳转到标记的位置&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	cout &amp;lt;&amp;lt; &amp;quot;1&amp;quot; &amp;lt;&amp;lt; endl;

	goto FLAG;

	cout &amp;lt;&amp;lt; &amp;quot;2&amp;quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;3&amp;quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;4&amp;quot; &amp;lt;&amp;lt; endl;

	FLAG:

	cout &amp;lt;&amp;lt; &amp;quot;5&amp;quot; &amp;lt;&amp;lt; endl;
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：在程序中不建议使用goto语句，以免造成程序流程混乱&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;5 数组&lt;/h2&gt;
&lt;h3&gt;5.1 概述&lt;/h3&gt;
&lt;p&gt;所谓数组，就是一个集合，里面存放了相同类型的数据元素&lt;/p&gt;
&lt;p&gt;**特点1：**数组中的每个==数据元素都是相同的数据类型==&lt;/p&gt;
&lt;p&gt;**特点2：**数组是由==连续的内存==位置组成的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a64af10cd.png&quot; alt=&quot;1541748375356&quot;&gt;&lt;/p&gt;
&lt;h3&gt;5.2 一维数组&lt;/h3&gt;
&lt;h4&gt;5.2.1 一维数组定义方式&lt;/h4&gt;
&lt;p&gt;一维数组定义的三种方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;数据类型  数组名[ 数组长度 ];&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;数据类型  数组名[ 数组长度 ] = { 值1，值2 ...};&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;数据类型  数组名[ ] = { 值1，值2 ...};&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;示例&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	//定义方式1
	//数据类型 数组名[元素个数];
	int score[10];

	//利用下标赋值
	score[0] = 100;
	score[1] = 99;
	score[2] = 85;

	//利用下标输出
	cout &amp;lt;&amp;lt; score[0] &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; score[1] &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; score[2] &amp;lt;&amp;lt; endl;


	//第二种定义方式
	//数据类型 数组名[元素个数] =  {值1，值2 ，值3 ...};
	//如果{}内不足10个数据，剩余数据用0补全
	int score2[10] = { 100, 90,80,70,60,50,40,30,20,10 };
	
	//逐个输出
	//cout &amp;lt;&amp;lt; score2[0] &amp;lt;&amp;lt; endl;
	//cout &amp;lt;&amp;lt; score2[1] &amp;lt;&amp;lt; endl;

	//一个一个输出太麻烦，因此可以利用循环进行输出
	for (int i = 0; i &amp;lt; 10; i++)
	{
		cout &amp;lt;&amp;lt; score2[i] &amp;lt;&amp;lt; endl;
	}

	//定义方式3
	//数据类型 数组名[] =  {值1，值2 ，值3 ...};
	int score3[] = { 100,90,80,70,60,50,40,30,20,10 };

	for (int i = 0; i &amp;lt; 10; i++)
	{
		cout &amp;lt;&amp;lt; score3[i] &amp;lt;&amp;lt; endl;
	}

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结1：数组名的命名规范与变量名命名规范一致，不要和变量重名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;总结2：数组中下标是从0开始索引&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;5.2.2 一维数组数组名&lt;/h4&gt;
&lt;p&gt;一维数组名称的&lt;strong&gt;用途&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;可以统计整个数组在内存中的长度&lt;/li&gt;
&lt;li&gt;可以获取数组在内存中的首地址&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	//数组名用途
	//1、可以获取整个数组占用内存空间大小
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	cout &amp;lt;&amp;lt; &amp;quot;整个数组所占内存空间为： &amp;quot; &amp;lt;&amp;lt; sizeof(arr) &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;每个元素所占内存空间为： &amp;quot; &amp;lt;&amp;lt; sizeof(arr[0]) &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;数组的元素个数为： &amp;quot; &amp;lt;&amp;lt; sizeof(arr) / sizeof(arr[0]) &amp;lt;&amp;lt; endl;

	//2、可以通过数组名获取到数组首地址
	cout &amp;lt;&amp;lt; &amp;quot;数组首地址为： &amp;quot; &amp;lt;&amp;lt; (int)arr &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;数组中第一个元素地址为： &amp;quot; &amp;lt;&amp;lt; (int)&amp;amp;arr[0] &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;数组中第二个元素地址为： &amp;quot; &amp;lt;&amp;lt; (int)&amp;amp;arr[1] &amp;lt;&amp;lt; endl;

	//arr = 100; 错误，数组名是常量，因此不可以赋值


	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：数组名是常量，不可以赋值&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;总结1：直接打印数组名，可以查看数组所占内存的首地址&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;总结2：对数组名进行sizeof，可以获取整个数组占内存空间的大小&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;练习案例1&lt;/strong&gt;：五只小猪称体重&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;案例描述：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在一个数组中记录了五只小猪的体重，如：int arr[5] = {300,350,200,400,250};&lt;/p&gt;
&lt;p&gt;找出并打印最重的小猪体重。&lt;/p&gt;
&lt;p&gt;**练习案例2：**数组元素逆置&lt;/p&gt;
&lt;p&gt;**案例描述：**请声明一个5个元素的数组，并且将元素逆置.&lt;/p&gt;
&lt;p&gt;(如原数组元素为：1,3,2,5,4;逆置后输出结果为:4,5,2,3,1);&lt;/p&gt;
&lt;h4&gt;5.2.3 冒泡排序&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt; 最常用的排序算法，对数组内元素进行排序&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;比较相邻的元素。如果第一个比第二个大，就交换他们两个。&lt;/li&gt;
&lt;li&gt;对每一对相邻元素做同样的工作，执行完毕后，找到第一个最大值。&lt;/li&gt;
&lt;li&gt;重复以上的步骤，每次比较次数-1，直到不需要比较&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a64c263b6.png&quot; alt=&quot;1541905327273&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt; 将数组 { 4,2,8,0,5,7,1,3,9 } 进行升序排序&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	int arr[9] = { 4,2,8,0,5,7,1,3,9 };

	for (int i = 0; i &amp;lt; 9 - 1; i++)
	{
		for (int j = 0; j &amp;lt; 9 - 1 - i; j++)
		{
			if (arr[j] &amp;gt; arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}

	for (int i = 0; i &amp;lt; 9; i++)
	{
		cout &amp;lt;&amp;lt; arr[i] &amp;lt;&amp;lt; endl;
	}
    
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.3 二维数组&lt;/h3&gt;
&lt;p&gt;二维数组就是在一维数组上，多加一个维度。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.p-i.vip/37/20240817-66c0a64e70f48.png&quot; alt=&quot;1541905559138&quot;&gt;&lt;/p&gt;
&lt;h4&gt;5.3.1 二维数组定义方式&lt;/h4&gt;
&lt;p&gt;二维数组定义的四种方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;数据类型  数组名[ 行数 ][ 列数 ];&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;数据类型  数组名[ 行数 ][ 列数 ] = { {数据1，数据2 } ，{数据3，数据4 } };&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;数据类型  数组名[ 行数 ][ 列数 ] = { 数据1，数据2，数据3，数据4};&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt; 数据类型  数组名[  ][ 列数 ] = { 数据1，数据2，数据3，数据4};&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;建议：以上4种定义方式，利用==第二种更加直观，提高代码的可读性==&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	//方式1  
	//数组类型 数组名 [行数][列数]
	int arr[2][3];
	arr[0][0] = 1;
	arr[0][1] = 2;
	arr[0][2] = 3;
	arr[1][0] = 4;
	arr[1][1] = 5;
	arr[1][2] = 6;

	for (int i = 0; i &amp;lt; 2; i++)
	{
		for (int j = 0; j &amp;lt; 3; j++)
		{
			cout &amp;lt;&amp;lt; arr[i][j] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;
		}
		cout &amp;lt;&amp;lt; endl;
	}

	//方式2 
	//数据类型 数组名[行数][列数] = { {数据1，数据2 } ，{数据3，数据4 } };
	int arr2[2][3] =
	{
		{1,2,3},
		{4,5,6}
	};

	//方式3
	//数据类型 数组名[行数][列数] = { 数据1，数据2 ,数据3，数据4  };
	int arr3[2][3] = { 1,2,3,4,5,6 }; 

	//方式4 
	//数据类型 数组名[][列数] = { 数据1，数据2 ,数据3，数据4  };
	int arr4[][3] = { 1,2,3,4,5,6 };
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：在定义二维数组时，如果初始化了数据，可以省略行数&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;5.3.2 二维数组数组名&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;查看二维数组所占内存空间&lt;/li&gt;
&lt;li&gt;获取二维数组首地址&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	//二维数组数组名
	int arr[2][3] =
	{
		{1,2,3},
		{4,5,6}
	};

	cout &amp;lt;&amp;lt; &amp;quot;二维数组大小： &amp;quot; &amp;lt;&amp;lt; sizeof(arr) &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;二维数组一行大小： &amp;quot; &amp;lt;&amp;lt; sizeof(arr[0]) &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;二维数组元素大小： &amp;quot; &amp;lt;&amp;lt; sizeof(arr[0][0]) &amp;lt;&amp;lt; endl;

	cout &amp;lt;&amp;lt; &amp;quot;二维数组行数： &amp;quot; &amp;lt;&amp;lt; sizeof(arr) / sizeof(arr[0]) &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;二维数组列数： &amp;quot; &amp;lt;&amp;lt; sizeof(arr[0]) / sizeof(arr[0][0]) &amp;lt;&amp;lt; endl;

	//地址
	cout &amp;lt;&amp;lt; &amp;quot;二维数组首地址：&amp;quot; &amp;lt;&amp;lt; arr &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;二维数组第一行地址：&amp;quot; &amp;lt;&amp;lt; arr[0] &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;二维数组第二行地址：&amp;quot; &amp;lt;&amp;lt; arr[1] &amp;lt;&amp;lt; endl;

	cout &amp;lt;&amp;lt; &amp;quot;二维数组第一个元素地址：&amp;quot; &amp;lt;&amp;lt; &amp;amp;arr[0][0] &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;二维数组第二个元素地址：&amp;quot; &amp;lt;&amp;lt; &amp;amp;arr[0][1] &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结1：二维数组名就是这个数组的首地址&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;总结2：对二维数组名进行sizeof时，可以获取整个二维数组占用的内存空间大小&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;&lt;strong&gt;5.3.3 二维数组应用案例&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;考试成绩统计：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;案例描述：有三名同学（张三，李四，王五），在一次考试中的成绩分别如下表，&lt;strong&gt;请分别输出三名同学的总成绩&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;语文&lt;/th&gt;
&lt;th&gt;数学&lt;/th&gt;
&lt;th&gt;英语&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;张三&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;李四&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;王五&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;参考答案：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	int scores[3][3] =
	{
		{100,100,100},
		{90,50,100},
		{60,70,80},
	};

	string names[3] = { &amp;quot;张三&amp;quot;,&amp;quot;李四&amp;quot;,&amp;quot;王五&amp;quot; };

	for (int i = 0; i &amp;lt; 3; i++)
	{
		int sum = 0;
		for (int j = 0; j &amp;lt; 3; j++)
		{
			sum += scores[i][j];
		}
		cout &amp;lt;&amp;lt; names[i] &amp;lt;&amp;lt; &amp;quot;同学总成绩为： &amp;quot; &amp;lt;&amp;lt; sum &amp;lt;&amp;lt; endl;
	}

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;6 函数&lt;/h2&gt;
&lt;h3&gt;6.1 概述&lt;/h3&gt;
&lt;p&gt;**作用：**将一段经常使用的代码封装起来，减少重复代码&lt;/p&gt;
&lt;p&gt;一个较大的程序，一般分为若干个程序块，每个模块实现特定的功能。&lt;/p&gt;
&lt;h3&gt;6.2 函数的定义&lt;/h3&gt;
&lt;p&gt;函数的定义一般主要有5个步骤：&lt;/p&gt;
&lt;p&gt;1、返回值类型 &lt;/p&gt;
&lt;p&gt;2、函数名&lt;/p&gt;
&lt;p&gt;3、参数表列&lt;/p&gt;
&lt;p&gt;4、函数体语句 &lt;/p&gt;
&lt;p&gt;5、return 表达式&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt; &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;返回值类型 函数名 （参数列表）
{

       函数体语句

       return表达式

}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;返回值类型 ：一个函数可以返回一个值。在函数定义中&lt;/li&gt;
&lt;li&gt;函数名：给函数起个名称&lt;/li&gt;
&lt;li&gt;参数列表：使用该函数时，传入的数据&lt;/li&gt;
&lt;li&gt;函数体语句：花括号内的代码，函数内需要执行的语句&lt;/li&gt;
&lt;li&gt;return表达式： 和返回值类型挂钩，函数执行完后，返回相应的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;**示例：**定义一个加法函数，实现两个数相加&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//函数定义
int add(int num1, int num2)
{
	int sum = num1 + num2;
	return sum;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.3 函数的调用&lt;/h3&gt;
&lt;p&gt;**功能：**使用定义好的函数&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;&lt;code&gt; 函数名（参数）&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//函数定义
int add(int num1, int num2) //定义中的num1,num2称为形式参数，简称形参
{
	int sum = num1 + num2;
	return sum;
}

int main() {

	int a = 10;
	int b = 10;
	//调用add函数
	int sum = add(a, b);//调用时的a，b称为实际参数，简称实参
	cout &amp;lt;&amp;lt; &amp;quot;sum = &amp;quot; &amp;lt;&amp;lt; sum &amp;lt;&amp;lt; endl;

	a = 100;
	b = 100;

	sum = add(a, b);
	cout &amp;lt;&amp;lt; &amp;quot;sum = &amp;quot; &amp;lt;&amp;lt; sum &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：函数定义里小括号内称为形参，函数调用时传入的参数称为实参&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;6.4 值传递&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;所谓值传递，就是函数调用时实参将数值传入给形参&lt;/li&gt;
&lt;li&gt;值传递时，==如果形参发生，并不会影响实参==&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;void swap(int num1, int num2)
{
	cout &amp;lt;&amp;lt; &amp;quot;交换前：&amp;quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;num1 = &amp;quot; &amp;lt;&amp;lt; num1 &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;num2 = &amp;quot; &amp;lt;&amp;lt; num2 &amp;lt;&amp;lt; endl;

	int temp = num1;
	num1 = num2;
	num2 = temp;

	cout &amp;lt;&amp;lt; &amp;quot;交换后：&amp;quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;num1 = &amp;quot; &amp;lt;&amp;lt; num1 &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;num2 = &amp;quot; &amp;lt;&amp;lt; num2 &amp;lt;&amp;lt; endl;

	//return ; 当函数声明时候，不需要返回值，可以不写return
}

int main() {

	int a = 10;
	int b = 20;

	swap(a, b);

	cout &amp;lt;&amp;lt; &amp;quot;mian中的 a = &amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;mian中的 b = &amp;quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结： 值传递时，形参是修饰不了实参的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;&lt;strong&gt;6.5 函数的常见样式&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;常见的函数样式有4种&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;无参无返&lt;/li&gt;
&lt;li&gt;有参无返&lt;/li&gt;
&lt;li&gt;无参有返&lt;/li&gt;
&lt;li&gt;有参有返&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//函数常见样式
//1、 无参无返
void test01()
{
	//void a = 10; //无类型不可以创建变量,原因无法分配内存
	cout &amp;lt;&amp;lt; &amp;quot;this is test01&amp;quot; &amp;lt;&amp;lt; endl;
	//test01(); 函数调用
}

//2、 有参无返
void test02(int a)
{
	cout &amp;lt;&amp;lt; &amp;quot;this is test02&amp;quot; &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;a = &amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;
}

//3、无参有返
int test03()
{
	cout &amp;lt;&amp;lt; &amp;quot;this is test03 &amp;quot; &amp;lt;&amp;lt; endl;
	return 10;
}

//4、有参有返
int test04(int a, int b)
{
	cout &amp;lt;&amp;lt; &amp;quot;this is test04 &amp;quot; &amp;lt;&amp;lt; endl;
	int sum = a + b;
	return sum;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.6 函数的声明&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt; 告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;函数的&lt;strong&gt;声明可以多次&lt;/strong&gt;，但是函数的&lt;strong&gt;定义只能有一次&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//声明可以多次，定义只能一次
//声明
int max(int a, int b);
int max(int a, int b);
//定义
int max(int a, int b)
{
	return a &amp;gt; b ? a : b;
}

int main() {

	int a = 100;
	int b = 200;

	cout &amp;lt;&amp;lt; max(a, b) &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.7 函数的分文件编写&lt;/h3&gt;
&lt;p&gt;**作用：**让代码结构更加清晰&lt;/p&gt;
&lt;p&gt;函数分文件编写一般有4个步骤&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建后缀名为.h的头文件  &lt;/li&gt;
&lt;li&gt;创建后缀名为.cpp的源文件&lt;/li&gt;
&lt;li&gt;在头文件中写函数的声明&lt;/li&gt;
&lt;li&gt;在源文件中写函数的定义&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//swap.h文件
#include&amp;lt;iostream&amp;gt;
using namespace std;

//实现两个数字交换的函数声明
void swap(int a, int b);
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//swap.cpp文件
#include &amp;quot;swap.h&amp;quot;

void swap(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;

	cout &amp;lt;&amp;lt; &amp;quot;a = &amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;b = &amp;quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//main函数文件
#include &amp;quot;swap.h&amp;quot;
int main() {

	int a = 100;
	int b = 200;
	swap(a, b);

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;7 指针&lt;/h2&gt;
&lt;h3&gt;7.1 指针的基本概念&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;指针的作用：&lt;/strong&gt; 可以通过指针间接访问内存&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;内存编号是从0开始记录的，一般用十六进制数字表示&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;可以利用指针变量保存地址&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.2 指针变量的定义和使用&lt;/h3&gt;
&lt;p&gt;指针变量定义语法： &lt;code&gt;数据类型 * 变量名；&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	//1、指针的定义
	int a = 10; //定义整型变量a
	
	//指针定义语法： 数据类型 * 变量名 ;
	int * p;

	//指针变量赋值
	p = &amp;amp;a; //指针指向变量a的地址
	cout &amp;lt;&amp;lt; &amp;amp;a &amp;lt;&amp;lt; endl; //打印数据a的地址
	cout &amp;lt;&amp;lt; p &amp;lt;&amp;lt; endl;  //打印指针变量p

	//2、指针的使用
	//通过*操作指针变量指向的内存
	cout &amp;lt;&amp;lt; &amp;quot;*p = &amp;quot; &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;指针变量和普通变量的区别&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;普通变量存放的是数据,指针变量存放的是地址&lt;/li&gt;
&lt;li&gt;指针变量可以通过&amp;quot; * &amp;quot;操作符，操作指针变量指向的内存空间，这个过程称为解引用&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;总结1： 我们可以通过 &amp;amp; 符号 获取变量的地址&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;总结2：利用指针可以记录地址&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;总结3：对指针变量解引用，可以操作指针指向的内存&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;7.3 指针所占内存空间&lt;/h3&gt;
&lt;p&gt;提问：指针也是种数据类型，那么这种数据类型占用多少内存空间？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	int a = 10;

	int * p;
	p = &amp;amp;a; //指针指向数据a的地址

	cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl; //* 解引用
	cout &amp;lt;&amp;lt; sizeof(p) &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; sizeof(char *) &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; sizeof(float *) &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; sizeof(double *) &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：所有指针类型在32位操作系统下是4个字节&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;7.4 空指针和野指针&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;空指针&lt;/strong&gt;：指针变量指向内存中编号为0的空间&lt;/p&gt;
&lt;p&gt;**用途：**初始化指针变量&lt;/p&gt;
&lt;p&gt;**注意：**空指针指向的内存是不可以访问的&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例1：空指针&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	//指针变量p指向内存地址编号为0的空间
	int * p = NULL;

	//访问空指针报错 
	//内存编号0 ~255为系统占用内存，不允许用户访问
	cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;野指针&lt;/strong&gt;：指针变量指向非法的内存空间&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例2：野指针&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	//指针变量p指向内存地址编号为0x1100的空间
	int * p = (int *)0x1100;

	//访问野指针报错 
	cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：空指针和野指针都不是我们申请的空间，因此不要访问。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;7.5 const修饰指针&lt;/h3&gt;
&lt;p&gt;const修饰指针有三种情况&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;const修饰指针   --- 常量指针&lt;/li&gt;
&lt;li&gt;const修饰常量   --- 指针常量&lt;/li&gt;
&lt;li&gt;const即修饰指针，又修饰常量&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c++&quot;&gt;int main() {

	int a = 10;
	int b = 10;

	//const修饰的是指针，指针指向可以改，指针指向的值不可以更改
	const int * p1 = &amp;amp;a; 
	p1 = &amp;amp;b; //正确
	//*p1 = 100;  报错
	

	//const修饰的是常量，指针指向不可以改，指针指向的值可以更改
	int * const p2 = &amp;amp;a;
	//p2 = &amp;amp;b; //错误
	*p2 = 100; //正确

    //const既修饰指针又修饰常量
	const int * const p3 = &amp;amp;a;
	//p3 = &amp;amp;b; //错误
	//*p3 = 100; //错误

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;技巧：看const右侧紧跟着的是指针还是常量, 是指针就是常量指针，是常量就是指针常量&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;7.6 指针和数组&lt;/h3&gt;
&lt;p&gt;**作用：**利用指针访问数组中元素&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;int main() {

	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

	int * p = arr;  //指向数组的指针

	cout &amp;lt;&amp;lt; &amp;quot;第一个元素： &amp;quot; &amp;lt;&amp;lt; arr[0] &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &amp;quot;指针访问第一个元素： &amp;quot; &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl;

	for (int i = 0; i &amp;lt; 10; i++)
	{
		//利用指针遍历数组
		cout &amp;lt;&amp;lt; *p &amp;lt;&amp;lt; endl;
		p++;
	}

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.7 指针和函数&lt;/h3&gt;
&lt;p&gt;**作用：**利用指针作函数参数，可以修改实参的值&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//值传递
void swap1(int a ,int b)
{
	int temp = a;
	a = b; 
	b = temp;
}
//地址传递
void swap2(int * p1, int *p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

int main() {

	int a = 10;
	int b = 20;
	swap1(a, b); // 值传递不会改变实参

	swap2(&amp;amp;a, &amp;amp;b); //地址传递会改变实参

	cout &amp;lt;&amp;lt; &amp;quot;a = &amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;

	cout &amp;lt;&amp;lt; &amp;quot;b = &amp;quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：如果不想修改实参，就用值传递，如果想修改实参，就用地址传递&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;7.8 指针、数组、函数&lt;/h3&gt;
&lt;p&gt;**案例描述：**封装一个函数，利用冒泡排序，实现对整型数组的升序排序&lt;/p&gt;
&lt;p&gt;例如数组：int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c++&quot;&gt;//冒泡排序函数
void bubbleSort(int * arr, int len)  //int * arr 也可以写为int arr[]
{
	for (int i = 0; i &amp;lt; len - 1; i++)
	{
		for (int j = 0; j &amp;lt; len - 1 - i; j++)
		{
			if (arr[j] &amp;gt; arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

//打印数组函数
void printArray(int arr[], int len)
{
	for (int i = 0; i &amp;lt; len; i++)
	{
		cout &amp;lt;&amp;lt; arr[i] &amp;lt;&amp;lt; endl;
	}
}

int main() {

	int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
	int len = sizeof(arr) / sizeof(int);

	bubbleSort(arr, len);

	printArray(arr, len);

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：当数组名传入到函数作为参数时，被退化为指向首元素的指针&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;8 结构体&lt;/h2&gt;
&lt;h3&gt;8.1 结构体基本概念&lt;/h3&gt;
&lt;p&gt;结构体属于用户==自定义的数据类型==，允许用户存储不同的数据类型&lt;/p&gt;
&lt;h3&gt;8.2 结构体定义和使用&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;&lt;code&gt;struct 结构体名 { 结构体成员列表 }；&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;通过结构体创建变量的方式有三种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;struct 结构体名 变量名&lt;/li&gt;
&lt;li&gt;struct 结构体名 变量名 = { 成员1值 ， 成员2值...}&lt;/li&gt;
&lt;li&gt;定义结构体时顺便创建变量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
}stu3; //结构体变量创建方式3 


int main() {

	//结构体变量创建方式1
	struct student stu1; //struct 关键字可以省略

	stu1.name = &amp;quot;张三&amp;quot;;
	stu1.age = 18;
	stu1.score = 100;
	
	cout &amp;lt;&amp;lt; &amp;quot;姓名：&amp;quot; &amp;lt;&amp;lt; stu1.name &amp;lt;&amp;lt; &amp;quot; 年龄：&amp;quot; &amp;lt;&amp;lt; stu1.age  &amp;lt;&amp;lt; &amp;quot; 分数：&amp;quot; &amp;lt;&amp;lt; stu1.score &amp;lt;&amp;lt; endl;

	//结构体变量创建方式2
	struct student stu2 = { &amp;quot;李四&amp;quot;,19,60 };

	cout &amp;lt;&amp;lt; &amp;quot;姓名：&amp;quot; &amp;lt;&amp;lt; stu2.name &amp;lt;&amp;lt; &amp;quot; 年龄：&amp;quot; &amp;lt;&amp;lt; stu2.age  &amp;lt;&amp;lt; &amp;quot; 分数：&amp;quot; &amp;lt;&amp;lt; stu2.score &amp;lt;&amp;lt; endl;


	stu3.name = &amp;quot;王五&amp;quot;;
	stu3.age = 18;
	stu3.score = 80;
	

	cout &amp;lt;&amp;lt; &amp;quot;姓名：&amp;quot; &amp;lt;&amp;lt; stu3.name &amp;lt;&amp;lt; &amp;quot; 年龄：&amp;quot; &amp;lt;&amp;lt; stu3.age  &amp;lt;&amp;lt; &amp;quot; 分数：&amp;quot; &amp;lt;&amp;lt; stu3.score &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结1：定义结构体时的关键字是struct，不可省略&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;总结2：创建结构体变量时，关键字struct可以省略&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;总结3：结构体变量利用操作符 &amp;#39;&amp;#39;.&amp;#39;&amp;#39;  访问成员&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;8.3 结构体数组&lt;/h3&gt;
&lt;p&gt;**作用：**将自定义的结构体放入到数组中方便维护&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;&lt;code&gt; struct  结构体名 数组名[元素个数] = {  {} , {} , ... {} }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
}

int main() {
	
	//结构体数组
	struct student arr[3]=
	{
		{&amp;quot;张三&amp;quot;,18,80 },
		{&amp;quot;李四&amp;quot;,19,60 },
		{&amp;quot;王五&amp;quot;,20,70 }
	};

	for (int i = 0; i &amp;lt; 3; i++)
	{
		cout &amp;lt;&amp;lt; &amp;quot;姓名：&amp;quot; &amp;lt;&amp;lt; arr[i].name &amp;lt;&amp;lt; &amp;quot; 年龄：&amp;quot; &amp;lt;&amp;lt; arr[i].age &amp;lt;&amp;lt; &amp;quot; 分数：&amp;quot; &amp;lt;&amp;lt; arr[i].score &amp;lt;&amp;lt; endl;
	}

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8.4 结构体指针&lt;/h3&gt;
&lt;p&gt;**作用：**通过指针访问结构体中的成员&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用操作符 &lt;code&gt;-&amp;gt; &lt;/code&gt;可以通过结构体指针访问结构体属性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};


int main() {
	
	struct student stu = { &amp;quot;张三&amp;quot;,18,100, };
	
	struct student * p = &amp;amp;stu;
	
	p-&amp;gt;score = 80; //指针通过 -&amp;gt; 操作符可以访问成员

	cout &amp;lt;&amp;lt; &amp;quot;姓名：&amp;quot; &amp;lt;&amp;lt; p-&amp;gt;name &amp;lt;&amp;lt; &amp;quot; 年龄：&amp;quot; &amp;lt;&amp;lt; p-&amp;gt;age &amp;lt;&amp;lt; &amp;quot; 分数：&amp;quot; &amp;lt;&amp;lt; p-&amp;gt;score &amp;lt;&amp;lt; endl;
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：结构体指针可以通过 -&amp;gt; 操作符 来访问结构体中的成员&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;8.5 结构体嵌套结构体&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt; 结构体中的成员可以是另一个结构体&lt;/p&gt;
&lt;p&gt;**例如：**每个老师辅导一个学员，一个老师的结构体中，记录一个学生的结构体&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//学生结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};

//教师结构体定义
struct teacher
{
    //成员列表
	int id; //职工编号
	string name;  //教师姓名
	int age;   //教师年龄
	struct student stu; //子结构体 学生
};


int main() {

	struct teacher t1;
	t1.id = 10000;
	t1.name = &amp;quot;老王&amp;quot;;
	t1.age = 40;

	t1.stu.name = &amp;quot;张三&amp;quot;;
	t1.stu.age = 18;
	t1.stu.score = 100;

	cout &amp;lt;&amp;lt; &amp;quot;教师 职工编号： &amp;quot; &amp;lt;&amp;lt; t1.id &amp;lt;&amp;lt; &amp;quot; 姓名： &amp;quot; &amp;lt;&amp;lt; t1.name &amp;lt;&amp;lt; &amp;quot; 年龄： &amp;quot; &amp;lt;&amp;lt; t1.age &amp;lt;&amp;lt; endl;
	
	cout &amp;lt;&amp;lt; &amp;quot;辅导学员 姓名： &amp;quot; &amp;lt;&amp;lt; t1.stu.name &amp;lt;&amp;lt; &amp;quot; 年龄：&amp;quot; &amp;lt;&amp;lt; t1.stu.age &amp;lt;&amp;lt; &amp;quot; 考试分数： &amp;quot; &amp;lt;&amp;lt; t1.stu.score &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**总结：**在结构体中可以定义另一个结构体作为成员，用来解决实际问题&lt;/p&gt;
&lt;h3&gt;8.6 结构体做函数参数&lt;/h3&gt;
&lt;p&gt;**作用：**将结构体作为参数向函数中传递&lt;/p&gt;
&lt;p&gt;传递方式有两种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;值传递&lt;/li&gt;
&lt;li&gt;地址传递&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//学生结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};

//值传递
void printStudent(student stu )
{
	stu.age = 28;
	cout &amp;lt;&amp;lt; &amp;quot;子函数中 姓名：&amp;quot; &amp;lt;&amp;lt; stu.name &amp;lt;&amp;lt; &amp;quot; 年龄： &amp;quot; &amp;lt;&amp;lt; stu.age  &amp;lt;&amp;lt; &amp;quot; 分数：&amp;quot; &amp;lt;&amp;lt; stu.score &amp;lt;&amp;lt; endl;
}

//地址传递
void printStudent2(student *stu)
{
	stu-&amp;gt;age = 28;
	cout &amp;lt;&amp;lt; &amp;quot;子函数中 姓名：&amp;quot; &amp;lt;&amp;lt; stu-&amp;gt;name &amp;lt;&amp;lt; &amp;quot; 年龄： &amp;quot; &amp;lt;&amp;lt; stu-&amp;gt;age  &amp;lt;&amp;lt; &amp;quot; 分数：&amp;quot; &amp;lt;&amp;lt; stu-&amp;gt;score &amp;lt;&amp;lt; endl;
}

int main() {

	student stu = { &amp;quot;张三&amp;quot;,18,100};
	//值传递
	printStudent(stu);
	cout &amp;lt;&amp;lt; &amp;quot;主函数中 姓名：&amp;quot; &amp;lt;&amp;lt; stu.name &amp;lt;&amp;lt; &amp;quot; 年龄： &amp;quot; &amp;lt;&amp;lt; stu.age &amp;lt;&amp;lt; &amp;quot; 分数：&amp;quot; &amp;lt;&amp;lt; stu.score &amp;lt;&amp;lt; endl;

	cout &amp;lt;&amp;lt; endl;

	//地址传递
	printStudent2(&amp;amp;stu);
	cout &amp;lt;&amp;lt; &amp;quot;主函数中 姓名：&amp;quot; &amp;lt;&amp;lt; stu.name &amp;lt;&amp;lt; &amp;quot; 年龄： &amp;quot; &amp;lt;&amp;lt; stu.age  &amp;lt;&amp;lt; &amp;quot; 分数：&amp;quot; &amp;lt;&amp;lt; stu.score &amp;lt;&amp;lt; endl;

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;总结：如果不想修改主函数中的数据，用值传递，反之用地址传递&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;8.7 结构体中 const使用场景&lt;/h3&gt;
&lt;p&gt;**作用：**用const来防止误操作&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//学生结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};

//const使用场景
void printStudent(const student *stu) //加const防止函数体中的误操作
{
	//stu-&amp;gt;age = 100; //操作失败，因为加了const修饰
	cout &amp;lt;&amp;lt; &amp;quot;姓名：&amp;quot; &amp;lt;&amp;lt; stu-&amp;gt;name &amp;lt;&amp;lt; &amp;quot; 年龄：&amp;quot; &amp;lt;&amp;lt; stu-&amp;gt;age &amp;lt;&amp;lt; &amp;quot; 分数：&amp;quot; &amp;lt;&amp;lt; stu-&amp;gt;score &amp;lt;&amp;lt; endl;

}

int main() {

	student stu = { &amp;quot;张三&amp;quot;,18,100 };

	printStudent(&amp;amp;stu);

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8.8 结构体案例&lt;/h3&gt;
&lt;h4&gt;8.8.1 案例1&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;案例描述：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;学校正在做毕设项目，每名老师带领5个学生，总共有3名老师，需求如下&lt;/p&gt;
&lt;p&gt;设计学生和老师的结构体，其中在老师的结构体中，有老师姓名和一个存放5名学生的数组作为成员&lt;/p&gt;
&lt;p&gt;学生的成员有姓名、考试分数，创建数组存放3名老师，通过函数给每个老师及所带的学生赋值&lt;/p&gt;
&lt;p&gt;最终打印出老师数据以及老师所带的学生数据。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;struct Student
{
	string name;
	int score;
};
struct Teacher
{
	string name;
	Student sArray[5];
};

void allocateSpace(Teacher tArray[] , int len)
{
	string tName = &amp;quot;教师&amp;quot;;
	string sName = &amp;quot;学生&amp;quot;;
	string nameSeed = &amp;quot;ABCDE&amp;quot;;
	for (int i = 0; i &amp;lt; len; i++)
	{
		tArray[i].name = tName + nameSeed[i];
		
		for (int j = 0; j &amp;lt; 5; j++)
		{
			tArray[i].sArray[j].name = sName + nameSeed[j];
			tArray[i].sArray[j].score = rand() % 61 + 40;
		}
	}
}

void printTeachers(Teacher tArray[], int len)
{
	for (int i = 0; i &amp;lt; len; i++)
	{
		cout &amp;lt;&amp;lt; tArray[i].name &amp;lt;&amp;lt; endl;
		for (int j = 0; j &amp;lt; 5; j++)
		{
			cout &amp;lt;&amp;lt; &amp;quot;\t姓名：&amp;quot; &amp;lt;&amp;lt; tArray[i].sArray[j].name &amp;lt;&amp;lt; &amp;quot; 分数：&amp;quot; &amp;lt;&amp;lt; tArray[i].sArray[j].score &amp;lt;&amp;lt; endl;
		}
	}
}

int main() {

	srand((unsigned int)time(NULL)); //随机数种子 头文件 #include &amp;lt;ctime&amp;gt;

	Teacher tArray[3]; //老师数组

	int len = sizeof(tArray) / sizeof(Teacher);

	allocateSpace(tArray, len); //创建数据

	printTeachers(tArray, len); //打印数据
	
	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;8.8.2 案例2&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;案例描述：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;设计一个英雄的结构体，包括成员姓名，年龄，性别;创建结构体数组，数组中存放5名英雄。&lt;/p&gt;
&lt;p&gt;通过冒泡排序的算法，将数组中的英雄按照年龄进行升序排序，最终打印排序后的结果。&lt;/p&gt;
&lt;p&gt;五名英雄信息如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;		{&amp;quot;刘备&amp;quot;,23,&amp;quot;男&amp;quot;},
		{&amp;quot;关羽&amp;quot;,22,&amp;quot;男&amp;quot;},
		{&amp;quot;张飞&amp;quot;,20,&amp;quot;男&amp;quot;},
		{&amp;quot;赵云&amp;quot;,21,&amp;quot;男&amp;quot;},
		{&amp;quot;貂蝉&amp;quot;,19,&amp;quot;女&amp;quot;},
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;//英雄结构体
struct hero
{
	string name;
	int age;
	string sex;
};
//冒泡排序
void bubbleSort(hero arr[] , int len)
{
	for (int i = 0; i &amp;lt; len - 1; i++)
	{
		for (int j = 0; j &amp;lt; len - 1 - i; j++)
		{
			if (arr[j].age &amp;gt; arr[j + 1].age)
			{
				hero temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
//打印数组
void printHeros(hero arr[], int len)
{
	for (int i = 0; i &amp;lt; len; i++)
	{
		cout &amp;lt;&amp;lt; &amp;quot;姓名： &amp;quot; &amp;lt;&amp;lt; arr[i].name &amp;lt;&amp;lt; &amp;quot; 性别： &amp;quot; &amp;lt;&amp;lt; arr[i].sex &amp;lt;&amp;lt; &amp;quot; 年龄： &amp;quot; &amp;lt;&amp;lt; arr[i].age &amp;lt;&amp;lt; endl;
	}
}

int main() {

	struct hero arr[5] =
	{
		{&amp;quot;刘备&amp;quot;,23,&amp;quot;男&amp;quot;},
		{&amp;quot;关羽&amp;quot;,22,&amp;quot;男&amp;quot;},
		{&amp;quot;张飞&amp;quot;,20,&amp;quot;男&amp;quot;},
		{&amp;quot;赵云&amp;quot;,21,&amp;quot;男&amp;quot;},
		{&amp;quot;貂蝉&amp;quot;,19,&amp;quot;女&amp;quot;},
	};

	int len = sizeof(arr) / sizeof(hero); //获取数组元素个数

	bubbleSort(arr, len); //排序

	printHeros(arr, len); //打印

	system(&amp;quot;pause&amp;quot;);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;/h1&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Sat, 17 Aug 2024 00:00:00 GMT</pubDate></item><item><title>Icacls 教程</title><link>https://bigwind.cn/blog/tutorial/icacls-%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bigwind.cn/blog/tutorial/icacls-%E6%95%99%E7%A8%8B/</guid><description>Windows下用命令批量权限管理</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/tutorial/icacls-%E6%95%99%E7%A8%8B/&quot;&gt;https://bigwind.cn/blog/tutorial/icacls-%E6%95%99%E7%A8%8B/&lt;/a&gt;&lt;/blockquote&gt; &lt;blockquote&gt;
&lt;h2&gt;Excerpt&lt;/h2&gt;
&lt;p&gt;如果您通过 Windows 文件资源管理器之类的工具检查和更改文件权限，则必须单击周围并打开/更改每个文件和文件夹的权限。如果您需要修改一两个权限，此方法就很好。但也许您想要确定和更改文件夹中一百个或更多文件的权限。让 icacls 命令作为解决方案。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;p&gt;如果您通过 Windows 文件资源管理器之类的工具检查和更改文件权限，则必须单击周围并打开/更改每个文件和文件夹的权限。如果您需要修改一两个权限，此方法就很好。但也许您想要确定和更改文件夹中一百个或更多文件的权限。让 icacls 命令作为解决方案。&lt;/p&gt;
&lt;p&gt;在本教程中，您将了解有关 icacls 命令如何允许您读取、保存、恢复文件和文件夹权限的所有内容。&lt;/p&gt;
&lt;p&gt;让我们开始吧！&lt;/p&gt;
&lt;h2&gt;先决条件&lt;/h2&gt;
&lt;p&gt;本教程包含分步说明。要继续操作，请确保您已具备以下条件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;具有管理员权限的 Windows 服务器或客户端 PC。&lt;/li&gt;
&lt;li&gt;如果您想了解如何更改远程计算机上的权限，请打开打开 Windows 文件和打印共享端口的远程 Windows 计算机。&lt;/li&gt;
&lt;li&gt;Microsoft 的 Process Explorer v16.42（可选）显示哪个程序打开了特定文件或目录。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;了解 &lt;code&gt;icacls&lt;/code&gt; 命令是什么及其工作原理&lt;/h2&gt;
&lt;p&gt;有时，用户无法访问或修改文件或文件夹，原因之一是缺乏对该对象的用户权限。 icacls 命令是一个命令行实用程序，用于查看或修改 Windows 文件系统上的文件或文件夹权限。&lt;/p&gt;
&lt;p&gt;但在使用 icacls 命令更改文件和文件夹权限之前，您必须首先了解访问控制列表 (ACL)。在此上下文中，ACL 包含用户或组对 NTFS 文件系统内的对象的权限列表。&lt;/p&gt;
&lt;p&gt;ACL 中的每个条目称为访问控制条目 (ACE)。 ACE 包含权限以及有关子对象如何继承这些权限的详细信息。 NTFS 权限可保护系统免受未经授权的访问。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;icacls&lt;/code&gt; 命令可以在高级安全设置页面中的文件或文件夹属性中设置许多精细的权限。这些权限包括允许或拒绝特定权限，以及基本的读/写权限。&lt;/p&gt;
&lt;p&gt;要查看文件或文件夹的高级权限：&lt;/p&gt;
&lt;p&gt;1. 打开文件资源管理器，右键单击文件或文件夹，然后从上下文菜单中选择&lt;strong&gt;属性&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/menu.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/menu.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2. 点击&lt;strong&gt;安全&lt;/strong&gt;选项卡 —&amp;gt; &lt;strong&gt;高级&lt;/strong&gt;访问文件或文件夹的高级安全设置。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/advanced_button.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/advanced_button.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在高级视图中，您将看到一个&lt;strong&gt;权限&lt;/strong&gt;选项卡以及构成该文件系统对象的 ACL 的每个 ACE。&lt;/p&gt;
&lt;p&gt;3. 双击列表中的任意ACE，弹出&lt;strong&gt;权限输入&lt;/strong&gt;对话框。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/Users.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/Users.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;4. 现在，单击&lt;strong&gt;显示高级权限&lt;/strong&gt;链接，深入了解该对象上设置的所有单独权限。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/basic.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/basic.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在下面，您可以看到授予或拒绝文件或文件夹的用户 ID 的所有高级权限。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/a.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/a.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;运行基本 &lt;code&gt;icacls&lt;/code&gt; 命令语法&lt;/h2&gt;
&lt;p&gt;现在您已经了解了查看和更改文件/文件夹权限所涉及的所有单击操作，现在让我们学习如何使用 icacls 命令来使用命令行。&lt;/p&gt;
&lt;p&gt;icacls 命令接受许多开关和参数来成功更改文件和文件夹权限，但让我们从运行基本的 icacls 命令语法开始。&lt;/p&gt;
&lt;p&gt;打开命令提示符并按原样输入 icacls 命令以查看其默认输出。您可以在下面看到&lt;code&gt;icacls&lt;/code&gt;命令的所有开关的帮助信息，并且默认显示参数。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T121002.764.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T121002.764.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;也许您想查看文件或文件夹的现有权限。如果是这样，基本的 icacls 命令语法命令就足够了。为了演示，创建一个文件夹，然后运行 icacls 来查看其权限，如下所示。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-nginx&quot;&gt;# Make a new folder named Folder1 md Folder1 # Checking permissions of the folder named Folder1 icacls Folder1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;icacls&lt;/code&gt; 返回分配给对象的 ACL；在本例中，&lt;code&gt;Folder&lt;/code&gt; 文件夹包含其中的所有 ACE。在下面，您可以看到 &lt;strong&gt;BUILTIN\Administrators&lt;/strong&gt; 和 &lt;strong&gt;NT AUTHORITY\SYSTEM&lt;/strong&gt; 用户 ID 拥有对象继承的完整 &lt;strong&gt;(F)&lt;/strong&gt; 权限 &lt;strong&gt;(OI)&lt;/strong&gt; 和容器继承**(CI)**。&lt;/p&gt;
&lt;p&gt;另一方面，&lt;strong&gt;BUILTIN\Users&lt;/strong&gt; 用户 ID 表示 PC 上的本地用户组具有对象继承**(OI)** 和容器继承**(CI)&amp;lt;** 启用，以及读取和执行访问权限。 &lt;strong&gt;（接收）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最后，两个 &lt;strong&gt;NT AUTHORITY\Authenticated Users&lt;/strong&gt; 用户 ID &lt;strong&gt;表明经过身份验证的用户组具有修改级别 (M) 访问权限，并且启用了对象继承 (OI) 和容器继承 (CI)。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T121236.888.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T121236.888.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;保存和恢复文件和文件夹的 ACL&lt;/h2&gt;
&lt;p&gt;更改文件和文件夹权限是一项敏感任务；一个错误的举动可能会扰乱用户访问或组访问。好消息是 icacls 命令允许您保存 ACL 文件。 ACL 文件包含文件和文件夹的 ACL。&lt;/p&gt;
&lt;p&gt;为了演示如何保存和恢复 ACL，我们首先创建一个名为 &lt;em&gt;C:\Temp\Folder1&lt;/em&gt; 的文件夹，并通过运行以下命令保存该文件夹的所有权限。&lt;/p&gt;
&lt;p&gt;1. 运行下面的 &lt;code&gt;icacls&lt;/code&gt; 命令以递归方式 (&lt;code&gt;/T&lt;/code&gt;) 备份文件和文件夹的 ACL (&lt;code&gt;c:\Temp\Folder1&lt;/code&gt;) 并将它们保存 (&lt;code&gt;/save&lt;/code&gt;) 到文件 (&lt;code&gt;C:\Folder1ACL&lt;/code&gt;) 中。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Make a new folder named Folder1 md c:\Temp\Folder1 # Save folder1&amp;#39;s permissions to a file named Folder1ACL icacls c:\Temp\Folder1 /save c:\Folder1ACL /T
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在下面，您可以看到您已经创建了一个新文件夹，并成功将该文件夹的 ACL 保存在 ACL 文件中。通过运行 &lt;code&gt;dir&lt;/code&gt; 命令确认 ACL 文件 (&lt;strong&gt;Folder1ACL&lt;/strong&gt;) 存在。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/temp_folder1.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/temp_folder1.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2. 现在，像之前一样访问_Folder1_的高级安全设置。下面，通过单击&lt;strong&gt;添加&lt;/strong&gt;按钮将新用户添加到文件夹权限。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/security_add.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/security_add.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3. 单击下面的&lt;strong&gt;选择主体&lt;/strong&gt;选项，选择要添加到_Folder1_权限的用户或组。在弹出窗口中输入要添加的用户或组 ID，然后单击&lt;strong&gt;检查名称&lt;/strong&gt;。找到用户或组 ID 后，单击&lt;strong&gt;确定&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/new_user1.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/new_user1.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;4. 通过选中&lt;strong&gt;完全控制&lt;/strong&gt;选项，授予新用户对_Folder1_的完全权限，然后单击&lt;strong&gt;确定&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/full_permission.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/full_permission.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在下面，您可以看到 &lt;strong&gt;User02&lt;/strong&gt; 已添加到 &lt;em&gt;Folder1&lt;/em&gt; 的权限中并被授予完全权限。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/added.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/added.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;5. 现在您已经更改了文件夹的权限，请使用之前保存的 ACL 文件恢复原始权限。&lt;/p&gt;
&lt;p&gt;在下面的命令中，您将恢复 (&lt;code&gt;/restore&lt;/code&gt;) &lt;em&gt;Folder1&lt;/em&gt; ACL，这些 ACL 保存在位于目录 (&lt;code&gt;Folder1ACL&lt;/code&gt;) 的文件 (&lt;code&gt;Folder1ACL&lt;/code&gt;) 中&lt;code&gt;c:\&lt;/code&gt;）。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;icacls c:\Temp\ /restore c:\Folder1ACL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T121737.305.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T121737.305.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;6. 最后，通过访问_Folder1_的高级安全设置来确认是否恢复了原始权限。&lt;/p&gt;
&lt;p&gt;下面可以看到之前添加的Usre02被删除了，说明ACL文件中原来的权限被恢复了。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/original.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/original.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;授予用户对文件和文件夹的权限&lt;/h2&gt;
&lt;p&gt;通过学习 icacls 命令的基本语法，现在可以为文件和文件夹设置一些基本权限。 &lt;code&gt;icacls&lt;/code&gt; 命令允许您通过开关授予、拒绝或删除文件或文件夹的权限。让我们介绍一下这些开关的使用方法。&lt;/p&gt;
&lt;p&gt;也许您无法访问或修改文件或文件夹。在这种情况下，您可以使用 &lt;code&gt;/grant&lt;/code&gt; 开关向用户授予适当的权限。&lt;/p&gt;
&lt;p&gt;下面，该命令将向用户 (&lt;code&gt;user01&lt;/code&gt;) 对 &lt;code&gt;myfile.txt 授予 (`/grant`) 完全权限 (`F`)&lt;/code&gt; 文件。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;也可以使用 Active Directory (AD) 或本地组名称来代替用户 ID (&lt;code&gt;user01&lt;/code&gt;)。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;icacls myfile.txt /grant user01:F
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;向用户授予对文件夹的权限与授予对文件的权限的方式不同。&lt;/p&gt;
&lt;p&gt;下面，该命令将向用户 (&lt;code&gt;user01&lt;/code&gt;) 对 &lt;code&gt;MyFolder&lt;/code&gt; 授予 (&lt;code&gt;/grant&lt;/code&gt;) 读取权限 (&lt;code&gt;R&lt;/code&gt;)代码&amp;gt; 文件夹。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;icacls Folder1 /grant user01:R
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T121929.038.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T121929.038.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;icacls&lt;/code&gt; 命令还允许您为文件或文件夹设置特殊权限。下面，您向用户 (&lt;code&gt;user01&lt;/code&gt;）位于文件夹 (&lt;code&gt;Folder1&lt;/code&gt;) 上。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;icacls Folder1 /grant user02:(D,RD)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;当您使用特殊权限（例如 RD，如下所示）时，必须将它们括在括号中。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T122000.554.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T122000.554.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;拒绝用户对文件和文件夹的权限&lt;/h2&gt;
&lt;p&gt;在某些情况下，您可能想要明确拒绝用户或组对文件或文件夹的访问。您可以使用 &lt;code&gt;/deny&lt;/code&gt; 开关来执行此操作。&lt;/p&gt;
&lt;p&gt;使用以下命令拒绝单个用户对文件和文件夹的完全权限。以下命令将确保 user01 无法访问 &lt;em&gt;MyFile.txt&lt;/em&gt; 文件和 &lt;em&gt;MyFolder&lt;/em&gt; 文件夹。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;# Deny (/deny) full permissions (F) for a user (user01) on a file (MyFile.txt) icacls MyFile.txt /deny user01:F # Deny (/deny) full permissions (F) for a user (user01) on a folder (MyFolder) icacls MyFolder /deny user01:(F)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;删除用户对文件和文件夹的权限&lt;/h2&gt;
&lt;p&gt;也许您想要删除用户当前对文件或文件夹拥有的所有权限。在这种情况下，请结合使用 &lt;code&gt;/remove&lt;/code&gt; 开关和 &lt;code&gt;icacls&lt;/code&gt; 命令。&lt;/p&gt;
&lt;p&gt;以下命令删除 &lt;code&gt;user01&lt;/code&gt; 对文件和文件夹的所有权限。命令完成后，user01 无法再访问或修改 &lt;em&gt;myfile.txt&lt;/em&gt; 文件和名为 &lt;em&gt;Folder1&lt;/em&gt; 的文件夹。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Removing all user01&amp;#39;s permissions from myfile.txt icacls myfile.txt /remove user01 # Removing all user01&amp;#39;s permissions from Folder1 icacls Folder1 /remove user01
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用完整性级别保护文件和文件夹&lt;/h2&gt;
&lt;p&gt;除了权限之外，Windows 中的所有对象（例如文件、文件夹、注册表项、正在运行的进程和用户会话）都包含完整性级别。&lt;/p&gt;
&lt;p&gt;您可以将完整性级别应用于任何具有安全描述符的对象。即使用户对文件或文件夹具有完全权限，完整性级别也可以为不太可信的对象设置更严格的权限。&lt;/p&gt;
&lt;p&gt;请参阅下表中的可以为 Windows 对象设置的完整性级别列表。&lt;/p&gt;
&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Integrity Level Name&lt;/td&gt;&lt;td&gt;Explanation&lt;/td&gt;&lt;td&gt;Example&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Untrusted&lt;/td&gt;&lt;td&gt;Processes that are launched automatically are marked as Untrusted.&lt;/td&gt;&lt;td&gt;Apps like Edge and chrome launch their update processes automatically. They are marked as untrusted.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Very restricted integrity level. Processes with low integrity level cannot write to registry and they have very limited access on files and folders.&lt;/td&gt;&lt;td&gt;Internet Explorer in protected mode has low integrity level.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;This is the integrity level that most of the objects will have. Standard or non-admin users get this medium integrity level. Also objects that are not marked as low or high will be in medium integrity level by default.&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;High&lt;/td&gt;&lt;td&gt;Admins have the high integrity level by default. With this admins can interact with other objects with high integrity levels and objects with medium and low integrity levels.&lt;/td&gt;&lt;td&gt;Processes started with “Run as Administrator” option or elevated.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;System&lt;/td&gt;&lt;td&gt;This integrity level is assigned to windows OS files and core services.&lt;/td&gt;&lt;td&gt;Windows Services that run under local service, network service or NT authority\system.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Installer&lt;/td&gt;&lt;td&gt;Installer integrity level is highest of all other integrity levels. Objects that has installer integrity level can also uninstall other objects as they are almost equal to High integrity level.&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;也许您很好奇为计算机上运行的每个 Windows 进程设置了哪个完整性级别。如果是这样，请启动 Microsoft Process Explorer，右键单击任意列标题，然后单击&lt;strong&gt;选择列&lt;/strong&gt;，如下所示。&lt;/p&gt;
&lt;p&gt;现在，通过选中&lt;strong&gt;选择列&lt;/strong&gt;弹出窗口中的&lt;strong&gt;完整性级别&lt;/strong&gt;选项，在表格列表中添加&lt;strong&gt;完整性&lt;/strong&gt;列，然后点击&lt;strong&gt;确定&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;请注意，&lt;strong&gt;完整性&lt;/strong&gt;列将显示在进程表列表的最右侧部分，您将在其中看到每个进程的完整性级别。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T122306.390.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T122306.390.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;限制非管理员用户修改文件或文件夹&lt;/h3&gt;
&lt;p&gt;在文件或文件夹上设置高完整性级别 当您想要限制其他用户修改文件或文件夹时，请在该文件或文件夹上设置高完整性级别。只有管理员才能访问和修改具有高完整性级别的文件和文件夹。&lt;/p&gt;
&lt;p&gt;让我们看看 icacls 命令如何实际设置完整性级别。&lt;/p&gt;
&lt;p&gt;1. 在当前目录中创建一个文本文件，并使用以下命令将文件的完整性级别设置为高。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Create a text file named demo.txt in the current directory echo . &amp;gt; demo.txt # Run icacls command to set the text file&amp;#39;s (demo.txt) integrity level to high (H) icacls demo.txt /setintegritylevel H
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T122412.178.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T122412.178.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2. 通过运行以下命令验证文件的完整性级别。在下面，您可以看到您拥有该文件的完全访问权限，但该文件的完整性级别设置为高。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-nginx&quot;&gt;icacls demo.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/verify.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/verify.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3. 现在，通过切换到 PC 上的非管理员帐户来测试文件的完整性级别，然后使用以下命令将文本添加到文本文件。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &amp;quot;Adding text to demo file&amp;quot; &amp;gt;&amp;gt; demo.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请注意，您将收到一条错误消息，指出&lt;strong&gt;访问被拒绝&lt;/strong&gt;。即使您拥有该文件的完全访问权限，您也只能使用管理员组中的用户帐户修改该文件。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T122854.524.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T122854.524.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;通过禁用继承来限制文件和文件夹修改&lt;/h2&gt;
&lt;p&gt;默认情况下，文件和文件夹继承其父文件夹的权限。也许您希望在创建新文件夹或文件时避免向用户提供不必要的访问权限。禁用继承是解决该问题的一种方法。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;您不必是管理员才能禁用继承，但您应该拥有该对象的完全权限。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;继承的一个示例是，当您创建文件夹 &lt;em&gt;C:\myfolder\testdata&lt;/em&gt; 时，它将继承父文件夹 &lt;em&gt;C:\myfolder&lt;/em&gt; 的权限。&lt;/p&gt;
&lt;p&gt;要了解继承以及禁用继承的效果，请在文件资源管理器中查看 &lt;em&gt;~\Desktop&lt;/em&gt; 文件夹中任何文件的权限。您将看到与下面类似的权限。请注意，该文件_继承_其父文件夹的权限。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T122928.617.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T122928.617.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;通过使用 &lt;code&gt;inheritance&lt;/code&gt; 参数运行以下命令，使用 icacls 禁用此文件的继承。下面的命令指定 &lt;code&gt;d&lt;/code&gt; 参数，该参数禁用继承并将继承转换为显式权限。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Disabling inheritance on a file named Myfile.txt icacls ~/Desktop/Myfile.txt /inheritance:d
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;您还可以使用 &lt;code&gt;inheritance&lt;/code&gt; 参数指定 &lt;code&gt;e&lt;/code&gt; 启用继承，指定 &lt;code&gt;r&lt;/code&gt; 禁用并删除对象中所有出现的继承 ACE ，例如，&lt;code&gt;/inheritance:e&lt;/code&gt; 或 &lt;code&gt;/inheritance:r&lt;/code&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;禁用继承后，您可以在下面看到 icacls 将每个继承 ACE 转换为显式权限（从无继承）。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T124018.751.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/Untitled-2021-08-08T124018.751.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;也许您希望在重新启用文件继承后删除这些显式权限。为此，您可以手动删除权限或重置文件的继承。重置文件的继承将删除所有权限，文件将继承父文件夹的权限。&lt;/p&gt;
&lt;p&gt;下面的命令重置 (&lt;code&gt;/reset&lt;/code&gt;) 文件 (&lt;code&gt;demo.txt&lt;/code&gt;) 继承，同时抑制成功消息 (&lt;code&gt;/q&lt;/code&gt;) 并忽略错误 ( &amp;lt;代码&amp;gt;/c）。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;icacls demo.txt /q /c /reset
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.a-d.site/common-images/icacls/reset.png&quot;&gt;&lt;img src=&quot;https://cn.a-d.site/common-images/icacls/reset.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;授予或拒绝不同继承级别的权限&lt;/h2&gt;
&lt;p&gt;NTFS 文件系统是一个大的文件夹层次结构，每个其他文件夹都有一个父文件夹，有时还有一个子文件夹。该层次结构有不同的“级别”。您可以在每个“级别”设置继承。例如，如果您有一个类似 &lt;em&gt;C:\Folder\Subfolder&lt;/em&gt; 的路径，则可以在 &lt;em&gt;C:\&lt;/em&gt;、&lt;em&gt;Folder&lt;/em&gt; 和 &amp;lt;子文件夹。&lt;/p&gt;
&lt;p&gt;当您使用 &lt;code&gt;icacls&lt;/code&gt; 设置文件夹权限时，&lt;code&gt;icacls&lt;/code&gt; 会自动设置该文件夹继承以将权限传播到其子文件夹。但也许您只想应用特定权限而不启用对该文件夹的子文件夹的继承？&lt;/p&gt;
&lt;p&gt;以下命令向用户 (&lt;code&gt;user02&lt;/code&gt;) 授予对 &lt;code&gt;mydemo&lt;/code&gt; 文件夹的完全权限 (&lt;code&gt;F&lt;/code&gt;)。但由于未指定继承选项，&lt;code&gt;icacls&lt;/code&gt; 仅授予对 &lt;code&gt;mydemo&lt;/code&gt; 文件夹的完全权限。如果没有指定继承选项，将自动应用默认选项 (&lt;code&gt;OI&lt;/code&gt;)。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;icacls mydemo /grant user02:(F)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也许您想向用户授予权限以及指定的继承。在这种情况下，请运行以下命令。&lt;/p&gt;
&lt;p&gt;下面，您向从 &lt;code&gt;申请的用户 (`user02`) 授予 (`/grant`) 只读权限 (`R`) &amp;gt;mydemo&lt;/code&gt; 文件夹及其文件和子文件夹 &lt;code&gt;(OI)(CI)&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;icacls mydemo /grant user02:(OI)(CI)(R)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以下是设置文件或文件夹继承级别的选项列表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OI&lt;/code&gt; - 对象继承 - 适用于此文件夹和文件。不会继承或传播到子文件夹。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CI&lt;/code&gt; - 容器继承 - 适用于该目录和子目录。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IO&lt;/code&gt; - 仅继承 - 不适用于当前文件或目录。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(OI)(CI)&lt;/code&gt; - 应用于此文件夹、子文件夹和文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(OI)(CI)(IO)&lt;/code&gt; - 仅适用于子文件夹和文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(CI)(IO)&lt;/code&gt; - 仅适用于子文件夹。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(OI)(IO)&lt;/code&gt; - 仅适用于文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;更改文件共享的文件权限&lt;/h2&gt;
&lt;p&gt;到目前为止，您已经了解了如何更改本地 PC 上的权限。但是 icacls 也可以设置远程文件的权限，尽管没有直接的方法来实现这一点。&lt;/p&gt;
&lt;p&gt;更改远程 PC 上的权限时，必须指定远程 PC 上文件的完整路径，如下所示。您还应该拥有实际文件夹、文件和共享路径的权限，以允许其他用户获得权限。&lt;/p&gt;
&lt;p&gt;下面，您向用户 (&lt;code&gt;) 授予 (`/grant`) 或拒绝 (`/deny`) 完全权限 (`F`) user02&lt;/code&gt;）位于远程 PC (&lt;code&gt;\\win10vm2&lt;/code&gt;) 的文本文件 (&lt;code&gt;\c$\temp\testfile.txt&lt;/code&gt;) 上。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Granting full permission to a user on a text file from a remote PC icacls \\win10vm2\c$\temp\testfile.txt /grant user02:F # Denying full permission to a user on a text file from a remote PC icacls \\win10vm2\c$\temp\testfile.txt /deny user02:F
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;在本指南中，您学习了如何运行 &lt;code&gt;icacls&lt;/code&gt; 命令来设置从基本到高级的权限。您还学会了在 AclFile 中备份文件和文件夹的 ACL，作为更改权限出错时的后备措施。&lt;/p&gt;
&lt;p&gt;原文章地址：&lt;a href=&quot;https://cn.a-d.site/?p=3625&quot;&gt;Icacls：终极指南&lt;/a&gt;&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Tue, 13 Aug 2024 00:00:00 GMT</pubDate></item><item><title>若依(ruoyi-cloud)脚手架解读</title><link>https://bigwind.cn/blog/java/%E8%8B%A5%E4%BE%9Druoyi-cloud%E8%84%9A%E6%89%8B%E6%9E%B6%E8%A7%A3%E8%AF%BB/</link><guid isPermaLink="true">https://bigwind.cn/blog/java/%E8%8B%A5%E4%BE%9Druoyi-cloud%E8%84%9A%E6%89%8B%E6%9E%B6%E8%A7%A3%E8%AF%BB/</guid><description>Windows下用命令批量权限管理</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/java/%E8%8B%A5%E4%BE%9Druoyi-cloud%E8%84%9A%E6%89%8B%E6%9E%B6%E8%A7%A3%E8%AF%BB/&quot;&gt;https://bigwind.cn/blog/java/%E8%8B%A5%E4%BE%9Druoyi-cloud%E8%84%9A%E6%89%8B%E6%9E%B6%E8%A7%A3%E8%AF%BB/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;一、教学目标&lt;/h1&gt;
&lt;h2&gt;1.1 前置知识点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Java WEB 知识体系&lt;/li&gt;
&lt;li&gt;Spring、SpringMVC、SpringBoot  传统MVC框架体系&lt;/li&gt;
&lt;li&gt;MyBatis 持久层框架体系&lt;/li&gt;
&lt;li&gt;SpringCloud Alibaba 微服务落地方案&lt;/li&gt;
&lt;li&gt;Maven、Git、Idea 常规开发工具&lt;/li&gt;
&lt;li&gt;MySQL、Redis 常见关系/非关系型数据库&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1.2 教学目标&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;掌握陌生项目解读技巧&lt;/li&gt;
&lt;li&gt;掌握若依(RuoYi-Cloud)框架&lt;/li&gt;
&lt;li&gt;掌握SpringCloud Alibaba体系项目开发套路&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;二、框架介绍&lt;/h1&gt;
&lt;h2&gt;2.1 简介&lt;/h2&gt;
&lt;p&gt;一直想做一款后台管理系统，看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序，如网站管理后台，网站会员中心，CMS，CRM，OA。所有前端后台代码封装过后十分精简易上手，出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。&lt;/p&gt;
&lt;p&gt;性别男，若依是给女儿取的名字（寓意：你若不离不弃，我必生死相依）&lt;/p&gt;
&lt;p&gt;若依是一套全部开源的快速开发平台，毫无保留给个人及企业免费使用。&lt;/p&gt;
&lt;h2&gt;2.2 内置功能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;用户管理：用户是系统操作者，该功能主要完成系统用户配置。&lt;/li&gt;
&lt;li&gt;部门管理：配置系统组织机构（公司、部门、小组），树结构展现支持数据权限。&lt;/li&gt;
&lt;li&gt;岗位管理：配置系统用户所属担任职务。&lt;/li&gt;
&lt;li&gt;菜单管理：配置系统菜单，操作权限，按钮权限标识等。&lt;/li&gt;
&lt;li&gt;角色管理：角色菜单权限分配、设置角色按机构进行数据范围权限划分。&lt;/li&gt;
&lt;li&gt;字典管理：对系统中经常使用的一些较为固定的数据进行维护。&lt;/li&gt;
&lt;li&gt;参数管理：对系统动态配置常用参数。&lt;/li&gt;
&lt;li&gt;通知公告：系统通知公告信息发布维护。&lt;/li&gt;
&lt;li&gt;操作日志：系统正常操作日志记录和查询；系统异常信息日志记录和查询。&lt;/li&gt;
&lt;li&gt;登录日志：系统登录日志记录查询包含登录异常。&lt;/li&gt;
&lt;li&gt;在线用户：当前系统中活跃用户状态监控。&lt;/li&gt;
&lt;li&gt;定时任务：在线（添加、修改、删除)任务调度包含执行结果日志。&lt;/li&gt;
&lt;li&gt;代码生成：前后端代码的生成（java、html、xml、sql）支持CRUD下载 。&lt;/li&gt;
&lt;li&gt;系统接口：根据业务代码自动生成相关的api接口文档。&lt;/li&gt;
&lt;li&gt;服务监控：监视当前系统CPU、内存、磁盘、堆栈等相关信息。&lt;/li&gt;
&lt;li&gt;缓存监控：对系统的缓存查询，删除、清空等操作。&lt;/li&gt;
&lt;li&gt;在线构建器：拖动表单元素生成相应的HTML代码。&lt;/li&gt;
&lt;li&gt;连接池监视：监视当前系统数据库连接池状态，可进行分析SQL找出系统性能瓶颈。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2.3 主要特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;完全响应式布局（支持电脑、平板、手机等所有主流设备）&lt;/li&gt;
&lt;li&gt;强大的一键生成功能（包括控制器、模型、视图、菜单等）&lt;/li&gt;
&lt;li&gt;支持多数据源，简单配置即可实现切换。&lt;/li&gt;
&lt;li&gt;支持按钮及数据权限，可自定义部门数据权限。&lt;/li&gt;
&lt;li&gt;对常用js插件进行二次封装，使js代码变得简洁，更加易维护&lt;/li&gt;
&lt;li&gt;完善的XSS防范及脚本过滤，彻底杜绝XSS攻击&lt;/li&gt;
&lt;li&gt;Maven多项目依赖，模块及插件分项目，尽量松耦合，方便模块升级、增减模块。&lt;/li&gt;
&lt;li&gt;国际化支持，服务端及客户端支持&lt;/li&gt;
&lt;li&gt;完善的日志记录体系简单注解即可实现&lt;/li&gt;
&lt;li&gt;支持服务监控，数据监控，缓存监控功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2.4 演示地址&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://demo.ruoyi.vip/login&quot;&gt;http://demo.ruoyi.vip/login&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;账号：admin 密码：admin123&lt;/p&gt;
&lt;h2&gt;2.5 分类&lt;/h2&gt;
&lt;h3&gt;2.5.1 &lt;strong&gt;传统版&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;2.5.1.1 源码地址&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://gitee.com/y_project/RuoYi&quot;&gt;https://gitee.com/y_project/RuoYi&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2.5.1.2 在线文档&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://doc.ruoyi.vip/ruoyi/&quot;&gt;http://doc.ruoyi.vip/ruoyi/&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2.5.1.3 技术选型&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/8e8a35041c602493b9121cf3fea6a39f.png&quot; alt=&quot;image-20230626185815229&quot;&gt;&lt;/p&gt;
&lt;h4&gt;2.5.1.4 代码结构&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;com.ruoyi     
├── common            // 工具类
│       └── annotation                    // 自定义注解
│       └── config                        // 全局配置
│       └── constant                      // 通用常量
│       └── core                          // 核心控制
│       └── enums                         // 通用枚举
│       └── exception                     // 通用异常
│       └── json                          // JSON数据处理
│       └── utils                         // 通用类处理
│       └── xss                           // XSS过滤处理
├── framework         // 框架核心
│       └── aspectj                       // 注解实现
│       └── config                        // 系统配置
│       └── datasource                    // 数据权限
│       └── interceptor                   // 拦截器
│       └── manager                       // 异步处理
│       └── shiro                         // 权限控制
│       └── web                           // 前端控制
├── ruoyi-generator   // 代码生成（不用可移除）
├── ruoyi-quartz      // 定时任务（不用可移除）
├── ruoyi-system      // 系统代码
├── ruoyi-admin       // 后台服务
├── ruoyi-xxxxxx      // 其他模块
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.5.2 前后端分离版本&lt;/h3&gt;
&lt;h4&gt;2.5.2.1 源码地址&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://gitee.com/y_project/RuoYi-Vue&quot;&gt;https://gitee.com/y_project/RuoYi-Vue&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2.5.2.2 在线文档&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://doc.ruoyi.vip/ruoyi-vue/&quot;&gt;http://doc.ruoyi.vip/ruoyi-vue/&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2.5.2.3 技术选型&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/131a26f0143ab568f712f6e8e0c43091.png&quot; alt=&quot;image-20230626190400192&quot;&gt;&lt;/p&gt;
&lt;h4&gt;2.5.2.4 代码结构&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;后端结构&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;com.ruoyi     
├── common            // 工具类
│       └── annotation                    // 自定义注解
│       └── config                        // 全局配置
│       └── constant                      // 通用常量
│       └── core                          // 核心控制
│       └── enums                         // 通用枚举
│       └── exception                     // 通用异常
│       └── filter                        // 过滤器处理
│       └── utils                         // 通用类处理
├── framework         // 框架核心
│       └── aspectj                       // 注解实现
│       └── config                        // 系统配置
│       └── datasource                    // 数据权限
│       └── interceptor                   // 拦截器
│       └── manager                       // 异步处理
│       └── security                      // 权限控制
│       └── web                           // 前端控制
├── ruoyi-generator   // 代码生成（可移除）
├── ruoyi-quartz      // 定时任务（可移除）
├── ruoyi-system      // 系统代码
├── ruoyi-admin       // 后台服务
├── ruoyi-xxxxxx      // 其他模块
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;前端结构&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;├── build                      // 构建相关  
├── bin                        // 执行脚本
├── public                     // 公共文件
│   ├── favicon.ico            // favicon图标
│   └── index.html             // html模板
│   └── robots.txt             // 反爬虫
├── src                        // 源代码
│   ├── api                    // 所有请求
│   ├── assets                 // 主题 字体等静态资源
│   ├── components             // 全局公用组件
│   ├── directive              // 全局指令
│   ├── layout                 // 布局
│   ├── plugins                // 通用方法
│   ├── router                 // 路由
│   ├── store                  // 全局 store管理
│   ├── utils                  // 全局公用方法
│   ├── views                  // view
│   ├── App.vue                // 入口页面
│   ├── main.js                // 入口 加载组件 初始化等
│   ├── permission.js          // 权限管理
│   └── settings.js            // 系统配置
├── .editorconfig              // 编码格式
├── .env.development           // 开发环境配置
├── .env.production            // 生产环境配置
├── .env.staging               // 测试环境配置
├── .eslintignore              // 忽略语法检查
├── .eslintrc.js               // eslint 配置项
├── .gitignore                 // git 忽略项
├── babel.config.js            // babel.config.js
├── package.json               // package.json
└── vue.config.js              // vue.config.js
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.5.3 微服务版本&lt;/h3&gt;
&lt;h4&gt;2.5.3.1 源码地址&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://gitee.com/y_project/RuoYi-Cloud&quot;&gt;https://gitee.com/y_project/RuoYi-Cloud&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2.5.3.2 在线文档&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://doc.ruoyi.vip/ruoyi-cloud/&quot;&gt;http://doc.ruoyi.vip/ruoyi-cloud/&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2.5.3.3 技术选型&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/66dd57ec69e1e9bd2c1d6d3aa726e8cb.png&quot; alt=&quot;image-20230626190728296&quot;&gt;&lt;/p&gt;
&lt;h4&gt;2.5.3.4 代码结构&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;后端结构&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;com.ruoyi     
├── ruoyi-ui              // 前端框架 [80]
├── ruoyi-gateway         // 网关模块 [8080]
├── ruoyi-auth            // 认证中心 [9200]
├── ruoyi-api             // 接口模块
│       └── ruoyi-api-system                          // 系统接口
├── ruoyi-common          // 通用模块
│       └── ruoyi-common-core                         // 核心模块
│       └── ruoyi-common-datascope                    // 权限范围
│       └── ruoyi-common-datasource                   // 多数据源
│       └── ruoyi-common-log                          // 日志记录
│       └── ruoyi-common-redis                        // 缓存服务
│       └── ruoyi-common-seata                        // 分布式事务
│       └── ruoyi-common-security                     // 安全模块
│       └── ruoyi-common-swagger                      // 系统接口
├── ruoyi-modules         // 业务模块
│       └── ruoyi-system                              // 系统模块 [9201]
│       └── ruoyi-gen                                 // 代码生成 [9202]
│       └── ruoyi-job                                 // 定时任务 [9203]
│       └── ruoyi-file                                // 文件服务 [9300]
├── ruoyi-visual          // 图形化管理模块
│       └── ruoyi-visual-monitor                      // 监控中心 [9100]
├──pom.xml                // 公共依赖
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;前端结构&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;├── build                      // 构建相关  
├── bin                        // 执行脚本
├── public                     // 公共文件
│   ├── favicon.ico            // favicon图标
│   └── index.html             // html模板
├── src                        // 源代码
│   ├── api                    // 所有请求
│   ├── assets                 // 主题 字体等静态资源
│   ├── components             // 全局公用组件
│   ├── directive              // 全局指令
│   ├── layout                 // 布局
│   ├── plugins                // 通用方法
│   ├── router                 // 路由
│   ├── store                  // 全局 store管理
│   ├── utils                  // 全局公用方法
│   ├── views                  // view
│   ├── App.vue                // 入口页面
│   ├── main.js                // 入口 加载组件 初始化等
│   ├── permission.js          // 权限管理
│   └── settings.js            // 系统配置
├── .editorconfig              // 编码格式
├── .env.development           // 开发环境配置
├── .env.production            // 生产环境配置
├── .env.staging               // 测试环境配置
├── .eslintignore              // 忽略语法检查
├── .eslintrc.js               // eslint 配置项
├── .gitignore                 // git 忽略项
├── babel.config.js            // babel.config.js
├── package.json               // package.json
└── vue.config.js              // vue.config.js
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.5.4 移动版&lt;/h3&gt;
&lt;h4&gt;2.5.4.1 源码地址&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://gitee.com/y_project/RuoYi-App&quot;&gt;https://gitee.com/y_project/RuoYi-App&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2.5.4.2 在线文档&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://doc.ruoyi.vip/ruoyi-app/&quot;&gt;http://doc.ruoyi.vip/ruoyi-app/&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2.5.4.3 技术选型&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/27110678e74765a984e0fa76fcb46aba.png&quot; alt=&quot;image-20230626191035895&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;2.5.4.4 代码结构&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;├── api                        // 所有请求  
├── components                 // 全局公用组件
├── pages                      // 页面文件
├── plugins                    // 通用方法
├── store                      // 全局 store管理
├── utils                      // 公用方法
├── static                     // 公共文件
│   ├── favicon.ico            // favicon图标
│   └── index.html             // html模板
│   └── logo.png               // logo图片
├── uni_modules                // uniui组件
│   ├── uni-badge              // 数字角标
│   ├── .........              // ........
│   ├── .........              // ........
├── App.vue                    // 应用配置
├── config.js                  // 环境配置
├── main.js                    // Vue初始化入口文件
├── manifest.json              // 配置打包
├── pages.json                 // 配置页面路由
├── permission.js              // 权限拦截
├── uni.scss                   // 全局样式变量
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;三、源码下载&lt;/h1&gt;
&lt;h2&gt;3.1 说明&lt;/h2&gt;
&lt;p&gt;本教程以若依微服版(RuoYi-Cloud)为解读蓝本，所有源码、文件、截图、演示均为该版本。&lt;/p&gt;
&lt;h2&gt;3.2 下载&lt;/h2&gt;
&lt;p&gt;国内：&lt;a href=&quot;https://gitee.com/y_project/RuoYi-Cloud&quot;&gt;https://gitee.com/y_project/RuoYi-Cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;国外：&lt;a href=&quot;https://github.com/yangzongzhuan/RuoYi-Cloud&quot;&gt;https://github.com/yangzongzhuan/RuoYi-Cloud&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;3.3 Idea克隆&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/686d1e54ae9ace5898b753eb7d59cc87.png&quot; alt=&quot;image-20230626193023708&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/0c54f41515590e9a8e49064144cdf9bc.png&quot; alt=&quot;image-20230626193052882&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/98cce654b8a02c7728a8bb5914e2b178.png&quot; alt=&quot;image-20230626193121648&quot;&gt;&lt;/p&gt;
&lt;h1&gt;四、项目上手技巧&lt;/h1&gt;
&lt;h2&gt;4.1 标准开源项目&lt;/h2&gt;
&lt;p&gt;标准开源项目：指符合特定标准和规范的开源软件项目。这些标准和规范通常由开源社区、行业组织或相关标准制定机构定义和推广。标准开源项目的目的是提供一致的质量标准和最佳实践，以促进开源软件的可靠性、互操作性和可持续发展。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;大白话：代码、文件、教程等各种配套都齐全的项目。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;4.1.1 看README.md&lt;/h3&gt;
&lt;p&gt;标准开源项目，都是有一个README.md这种文档，这个文档是项目的简介，一般会用大白话方式讲清楚项目背景，项目技术点，项目具体使用等。&lt;/p&gt;
&lt;h3&gt;4.1.2 看演示项目&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://vue.ruoyi.vip/login?redirect=%2Findex&quot;&gt;http://vue.ruoyi.vip/login?redirect=%2Findex&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;好处：快速了解项目具体功能，能做啥，实现效果怎么样。&lt;/p&gt;
&lt;h3&gt;4.1.3 看文档&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://doc.ruoyi.vip/ruoyi-cloud/&quot;&gt;http://doc.ruoyi.vip/ruoyi-cloud/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;好处：该有的都有了&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个问题：看文档，看哪些内容？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;0&amp;gt;视频教程(如果有)&lt;/p&gt;
&lt;p&gt;1&amp;gt;项目结构/架构(如果有)&lt;/p&gt;
&lt;p&gt;2&amp;gt;技术选型&lt;/p&gt;
&lt;p&gt;3&amp;gt;功能模块&lt;/p&gt;
&lt;p&gt;4&amp;gt;项目部署&lt;/p&gt;
&lt;p&gt;5&amp;gt;项目其他&lt;/p&gt;
&lt;h2&gt;4.2 非标准开源项目&lt;/h2&gt;
&lt;p&gt;非标准开源项目是指没有遵循特定标准或规范的开源软件项目。这些项目可能是由个人、小团队或组织开发，其开发方式和治理模式可能与传统的标准开源项目有所不同。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;大白话：代码、文件、教程等各种配套都不齐全的项目。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;4.2.1 看README.md&lt;/h3&gt;
&lt;p&gt;如果有，必须看。但一般情况，都是下面这种：啥都是没有&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/af878173fb4acfda52f1c95a8576c5c7.png&quot; alt=&quot;image-20230626195720645&quot;&gt;&lt;/p&gt;
&lt;h3&gt;4.2.2 看Jar依赖&lt;/h3&gt;
&lt;p&gt;没有使用Maven/Gradle传统项目，比如Java SE/JavaWeb项目，Jar依赖一般放置在lib文件夹，优先找它&lt;/p&gt;
&lt;p&gt;如果使用Maven/Gradle常规项目，找pom.xml文件或build.gradle&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个问题：看Jar依赖目的是啥？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1&amp;gt;大体把握项目技术栈&lt;/p&gt;
&lt;p&gt;​    要求：结合技术栈，YY一下代码可能的结构，后续项目解读时有参照蓝本。&lt;/p&gt;
&lt;p&gt;​    比如： 
​         MyBatis---domain----mapper.java-----mapper.xml&lt;/p&gt;
&lt;p&gt;​         Springboot----Spring----Springmvc----Controller----启动类&lt;/p&gt;
&lt;p&gt;​		 SpringCloud Alibaba-----8个基本组件&lt;/p&gt;
&lt;p&gt;2&amp;gt;大体推测项目有哪些功能&lt;/p&gt;
&lt;p&gt;​    要求：常见的功能jar有熟悉，不认识，可以搜。&lt;/p&gt;
&lt;p&gt;​     比如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;springfox-swagger-ui&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${swagger.fox.version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.jsonwebtoken&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jjwt&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.2.3 看代码结构&lt;/h3&gt;
&lt;p&gt;没有文档的帮助，只能借助代码结构名称大体推测项目可能具有模块，拥有的功能。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/544cfa42ec0b152701254308600ded20.png&quot; alt=&quot;image-20230626205452813&quot;&gt;&lt;/p&gt;
&lt;h3&gt;4.2.4 YY联想&lt;/h3&gt;
&lt;p&gt;非开源项目最麻烦一个点就是文件不齐全，少文档，少sql数据库，甚至代码不完整。这时候想解读通这代码就需要很丰富的想象能力。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;类似一拳超人中地表最强的男人：King ！哥的厉害全靠你想象&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/637091d69dd26b3ea72f7a213fb3d3de.&quot; alt=&quot;img&quot;&gt;&lt;/p&gt;
&lt;p&gt;这个得结合个人开发经验，项目经验，生活阅历，连蒙靠猜推测去补齐项目逻辑啦。&lt;/p&gt;
&lt;p&gt;比如： &lt;/p&gt;
&lt;p&gt;缺SQL：找Mapper.xml/domain实体补齐&lt;/p&gt;
&lt;p&gt;缺Jar包：根据项目启动报错信息，缺哪个补哪个&lt;/p&gt;
&lt;p&gt;缺配置文件：项目依赖用到哪些jar，结合常规配置，补齐配置&lt;/p&gt;
&lt;p&gt;缺少各种环境：结合个人开发经验，尝试补齐。&lt;/p&gt;
&lt;h2&gt;4.3 若依初探&lt;/h2&gt;
&lt;p&gt;若依脚手架算是一个较为标准的开源项目了，那它阶段就按照标准项目方式解读即可。&lt;/p&gt;
&lt;h3&gt;4.3.1 标准开源项目&lt;/h3&gt;
&lt;h4&gt;4.3.1.1 看README.md&lt;/h4&gt;
&lt;p&gt;--了解项目整体&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/774992adc7fba8f2b4236b4238da9776.png&quot; alt=&quot;image-20230626210024682&quot;&gt;&lt;/p&gt;
&lt;h4&gt;4.3.1.2 看演示项目&lt;/h4&gt;
&lt;p&gt;--了解项目效果&lt;/p&gt;
&lt;p&gt;地址：&lt;a href=&quot;http://vue.ruoyi.vip/index&quot;&gt;http://vue.ruoyi.vip/index&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;账号密码：admin/admin123&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/a3ae2a5aab43fb8b222590afccfe01aa.png&quot; alt=&quot;image-20230626210112384&quot;&gt;&lt;/p&gt;
&lt;h4&gt;4.3.1.3 看文档&lt;/h4&gt;
&lt;p&gt;--了解项目细节&lt;/p&gt;
&lt;p&gt;地址：&lt;a href=&quot;http://doc.ruoyi.vip/ruoyi-cloud/&quot;&gt;http://doc.ruoyi.vip/ruoyi-cloud/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/aca49b5e850b09614064eca8674955f6.png&quot; alt=&quot;image-20230626210146701&quot;&gt;&lt;/p&gt;
&lt;h3&gt;4.3.2 架构设计图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/d5ff8836e317f6c019b2e82c727a03cc.png&quot; alt=&quot;ruoyi-cloud&quot;&gt;&lt;/p&gt;
&lt;p&gt;从图中解析出RuoYi-Cloud 使用微服务技术栈&lt;/p&gt;
&lt;p&gt;网关：Gateway&lt;/p&gt;
&lt;p&gt;远程调用：Ribbon/Feign&lt;/p&gt;
&lt;p&gt;注册中心：Nacos Discovery&lt;/p&gt;
&lt;p&gt;熔断降级：Sentinel&lt;/p&gt;
&lt;p&gt;配置中心：Nacos Config&lt;/p&gt;
&lt;p&gt;链路追踪：Sleuth+ZipKin/SkyWalking   （没有集成，需要自己加）&lt;/p&gt;
&lt;h3&gt;4.3.3 代码结构&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;com.ruoyi     
├── ruoyi-ui              // 前端框架 [80]
├── ruoyi-gateway         // 网关模块 [8080]
├── ruoyi-auth            // 认证中心 [9200]
├── ruoyi-api             // 接口模块
│       └── ruoyi-api-system                          // 系统接口
├── ruoyi-common          // 通用模块
│       └── ruoyi-common-core                         // 核心模块
│       └── ruoyi-common-datascope                    // 权限范围
│       └── ruoyi-common-datasource                   // 多数据源
│       └── ruoyi-common-log                          // 日志记录
│       └── ruoyi-common-redis                        // 缓存服务
│       └── ruoyi-common-seata                        // 分布式事务
│       └── ruoyi-common-security                     // 安全模块
│       └── ruoyi-common-swagger                      // 系统接口
├── ruoyi-modules         // 业务模块
│       └── ruoyi-system                              // 系统模块 [9201]
│       └── ruoyi-gen                                 // 代码生成 [9202]
│       └── ruoyi-job                                 // 定时任务 [9203]
│       └── ruoyi-file                                // 文件服务 [9300]
├── ruoyi-visual          // 图形化管理模块
│       └── ruoyi-visual-monitor                      // 监控中心 [9100]
├──pom.xml                // 公共依赖
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;五、环境准备&lt;/h1&gt;
&lt;p&gt;项目运行前提需要准备环境，如果项目提供文档，直接看文档操作即可，如果没有文档，就结合开发经验/项目经验来配置。一般来说，项目环境准备都按照下面几个步骤。&lt;/p&gt;
&lt;h2&gt;5.1 语言环境&lt;/h2&gt;
&lt;p&gt;项目运行离不开语言支持，若依(RuoYi-Cloud)后端为Java项目，需要java环境，前端为Vue项目，需要Node.js环境，运行若依前需要将这些环境安装成功。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;5.1.1 Java环境&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/3a23c6ee2d50a9edfc1456473dac3b2c.png&quot; alt=&quot;image-20230626232309233&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;5.1.2 &lt;strong&gt;node.js环境&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;一个node.js环境，一个事npm 软件安装工具&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/50e222b59f0a6dfa68617f016d45db59.png&quot; alt=&quot;image-20230626232356403&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;5.2 数据库环境&lt;/h2&gt;
&lt;p&gt;若依(RuoYi-Cloud)目前使用的数据库暂时只有MySQL跟Redis，后续可以根据项目需要添加其他数据库，比如MongoDB，Elasticsearch等。&lt;/p&gt;
&lt;h3&gt;5.2.1 &lt;strong&gt;MySQL环境&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/43ae1aca74c8d0a8e457553bcf8a05a0.png&quot; alt=&quot;image-20230626232942516&quot;&gt;&lt;/p&gt;
&lt;h3&gt;5.2.2 &lt;strong&gt;Redis环境&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/a1350d5b7ab811782ae0e0a42aec1bfa.png&quot; alt=&quot;image-20230626233013340&quot;&gt;&lt;/p&gt;
&lt;h2&gt;5.3 组件环境&lt;/h2&gt;
&lt;p&gt;若依(RuoYi-Cloud)使用的是SpringCloud Alibaba体系微服务落地方法，那就得安装2个必须组件：Nacos跟Sentinel。&lt;/p&gt;
&lt;h3&gt;5.3.1 &lt;strong&gt;Nacos环境&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;若依(RuoYi-Cloud)使用Nacos做注册中心与配置中心，所以需要提前准备该环境。&lt;/p&gt;
&lt;p&gt;下载路径：&lt;a href=&quot;https://github.com/alibaba/nacos/releases&quot;&gt;https://github.com/alibaba/nacos/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这里注意，若依(RuoYi-Cloud)要求是Nacos 2.x版本，不要下错&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/8e38a909bc02b0270172f98e7bf24b37.png&quot; alt=&quot;image-20230626233557839&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;进入bin目录启动，执行startup.cmd命令，注意需要使用单例模式启动，否则闪退&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;使用cmd 命令，进入命令框，执行下面命令
startup.cmd -m standalone
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/2b3762be49b444ef2a7e43a008f03d71.png&quot; alt=&quot;image-20230626233834740&quot;&gt;&lt;/p&gt;
&lt;h3&gt;5.3.2 &lt;strong&gt;Sentinel环境&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;若依(RuoYi-Cloud)使用Sentinel熔断降级组件，那么项目启动前，需要提前准备好&lt;/p&gt;
&lt;p&gt;下载地址：&lt;a href=&quot;https://github.com/alibaba/Sentinel/releases&quot;&gt;https://github.com/alibaba/Sentinel/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载完之后是一个jar包：sentinel-dashboard-1.8.0.jar， 使用java 命令执行就行&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.3.3 &lt;strong&gt;Seata环境&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;若依(RuoYi-Cloud)支持Seata实现分布式事务，如果需要，项目启动前就应该提前准备好&lt;/p&gt;
&lt;p&gt;下载地址：&lt;a href=&quot;https://github.com/seata/seata/releases&quot;&gt;https://github.com/seata/seata/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/9e514c69c82aa313fc32b89e35d97309.png&quot; alt=&quot;image-20230626234855831&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;进入bin目录启动，执行seata-server.bat命令&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;seata-server.bat --add-opens=java.base/java.lang=ALL-UNNAMED
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;六、项目配置与启动&lt;/h1&gt;
&lt;p&gt;当上面环境全部准备好之后，接下来就是项目配置。需要将项目相关配置修改成当前相关环境。&lt;/p&gt;
&lt;h2&gt;6.1 后端配置&lt;/h2&gt;
&lt;h3&gt;6.1.1 数据库&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;新建数据库：ry-cloud&lt;/strong&gt;   存储常规数据&lt;/p&gt;
&lt;p&gt;字符编码：utf8mb4&lt;/p&gt;
&lt;p&gt;导入SQL：sql/ry_20230223.sql       sql/quartz.sql(可选--需要定时任务操作必须导入)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/566cf55eb4392ccfaa3a1ccd7b903751.png&quot; alt=&quot;image-20230626235621833&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/8cebcb518380f34d2d2bbb154fa57e01.png&quot; alt=&quot;image-20230626235633293&quot;&gt;&lt;/p&gt;
&lt;p&gt;一个bug补充&lt;/p&gt;
&lt;p&gt;MySQL5.6 数据库 quartz.sql 语句导入异常：&lt;strong&gt;Specified key was too long; max key length is 767 bytes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**原因：**msyql5.6及以前版本， 默认索引最大长度767bytes，若使用utf8mb4格式编码（utf8字符占用3字节，utf8mb4字符占用4字节）， 则单个字段长度不能超过191， 5.7及之后版本， 限制放开到3072 bytes。&lt;/p&gt;
&lt;p&gt;解决方案：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案1&lt;/strong&gt;：放弃使用utf8mb4，直接使用utf8！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案2&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;1、在my.ini中修改配置：&lt;/p&gt;
&lt;p&gt;永久改动&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;innodb_large_prefix = ON   #这个属性在5.6上是默认关闭的，而在5.7上是默认开启的。
innodb_file_format = Barracuda 
innodb_file_per_table = ON
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;临时改动&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SET GLOBAL INNODB_LARGE_PREFIX = ON;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2、在create中添加row_format=dynamic&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;create table sql_test(
id int ,
name VARCHAR(200),
server_id VARCHAR(30),
id_num1 VARCHAR(30),
id_num2 VARCHAR(30),
link VARCHAR(500),
PRIMARY KEY (id),
KEY sql_test_name (name)) 
engine=innodb row_format=dynamic;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;方案3&lt;/strong&gt;：使用MySQL5.7 版本&lt;/p&gt;
&lt;p&gt;**新建数据库：ry-config **   存储nacos配置数据&lt;/p&gt;
&lt;p&gt;字符编码：utf8mb4&lt;/p&gt;
&lt;p&gt;导入SQL：sql/ry_config_20220929.sql&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/e44c2ac7d22d1b63fc519fe13d51129e.png&quot; alt=&quot;image-20230626235725038&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/69e42a4d8332a3ad45d653fae056d2cc.png&quot; alt=&quot;image-20230626235845669&quot;&gt;&lt;/p&gt;
&lt;h3&gt;6.1.2 Nacos配置&lt;/h3&gt;
&lt;p&gt;若依(RuoYi-Cloud) 配置中心的项目配置文件，持久化在&lt;strong&gt;ry-config.config_info&lt;/strong&gt;  表中，项目启动需要将这些配置文件加载到配置中心，所以需要额外配置一下Nacos，以增加对mysql数据源的支持。&lt;/p&gt;
&lt;p&gt;进入nacos-server-2.2.2/conf 目录找：application.properties&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/d81ec4e3cd8219dbd5963d305c237061.png&quot; alt=&quot;image-20230627001017623&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;修改配置&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;# db mysql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/ry-config?characterEncoding=utf8&amp;amp;connectTimeout=1000&amp;amp;socketTimeout=3000&amp;amp;autoReconnect=true&amp;amp;useUnicode=true&amp;amp;useSSL=false&amp;amp;serverTimezone=UTC
db.user=数据库账号
db.password=数据库密码
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/815211c0d62bec0e4a6a58316bc0c95d.png&quot; alt=&quot;image-20230627001136980&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;6.1.3 项目配置文件&lt;/h3&gt;
&lt;p&gt;Nacos配置好之后，启动成功后访问：&lt;a href=&quot;http://localhost:8848/nacos&quot;&gt;http://localhost:8848/nacos&lt;/a&gt;   账号/密码  nacos/nacos&lt;/p&gt;
&lt;p&gt;修改下面画红线的服务配置文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/50a97331b1ec5761d8cf7a4ff4964c6c.png&quot; alt=&quot;image-20230627002316239&quot;&gt;&lt;/p&gt;
&lt;p&gt;主要改动：&lt;/p&gt;
&lt;p&gt;Redis 的ip，端口，密码&lt;/p&gt;
&lt;p&gt;MySQL ip，端口，账号，密码，数据库等。&lt;/p&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/e3a2bdd8b32545a99f238463586fabba.png&quot; alt=&quot;image-20230627002521102&quot;&gt;&lt;/p&gt;
&lt;h2&gt;6.2 后端启动&lt;/h2&gt;
&lt;p&gt;打开项目，执行XxxxApplication的启动类（启动没有先后顺序）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RuoYiGatewayApplication&lt;/strong&gt; （网关模块 必须）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RuoYiAuthApplication&lt;/strong&gt; （认证模块 必须）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RuoYiSystemApplication&lt;/strong&gt; （系统模块 必须）&lt;/li&gt;
&lt;li&gt;RuoYiMonitorApplication （监控中心 可选）&lt;/li&gt;
&lt;li&gt;RuoYiGenApplication （代码生成 可选）&lt;/li&gt;
&lt;li&gt;RuoYiJobApplication （定时任务 可选）&lt;/li&gt;
&lt;li&gt;RuoYFileApplication （文件服务 可选）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/cff17f0e662084f19a880150300067b7.png&quot; alt=&quot;image-20230627002804791&quot;&gt;&lt;/p&gt;
&lt;p&gt;加粗的启动即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/40ddc0096c87b4eb28c3550a31bba50c.png&quot; alt=&quot;image-20230627003033653&quot;&gt;&lt;/p&gt;
&lt;h2&gt;6.3 前端配置与启动&lt;/h2&gt;
&lt;p&gt;若依(RuoYi-Cloud) 项目前端跟后端是保存在同一个目录夹的。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/4e54371a6f29cc8b01699d43bc2b8001.png&quot; alt=&quot;image-20230627003152676&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;先进入这个目录，然后使用前端编辑工具打开即可，这里使用Visual Studio Code 打开&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/5cae7f09de628085a8822d6fa5fc7fe4.png&quot; alt=&quot;image-20230627003442203&quot;&gt;&lt;/p&gt;
&lt;p&gt;进入vscode之后，打开项目README.md文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/198d57ee0725db1ea418fd050e8eecbd.png&quot; alt=&quot;image-20230627003552149&quot;&gt;&lt;/p&gt;
&lt;p&gt;打开vscode 的终端，执行上面命令&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/60d612a59c658d0b2c0cc3af54fdc4d8.png&quot; alt=&quot;image-20230627003631614&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/5174cd63f0a1e139ffc2e11f9d773b1a.png&quot; alt=&quot;image-20230627004845629&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;6.4 访问&lt;/h2&gt;
&lt;p&gt;当后端，前端都启动成功之后，若依(RuoYi-Cloud) 项目就算运行成功啦。&lt;/p&gt;
&lt;p&gt;访问地址：&lt;a href=&quot;http://localhost/&quot;&gt;http://localhost/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/a37f8789ca15598eac26a958aa2a05f7.png&quot; alt=&quot;image-20230627005030844&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/688438c18af8f8376f0034ecabca1e7d.png&quot; alt=&quot;image-20230627005050272&quot;&gt;&lt;/p&gt;
&lt;h1&gt;七、模块解读&lt;/h1&gt;
&lt;p&gt;项目解读可以说分为2部分： 1&amp;gt;项目结构解读(静态解读)   2&amp;gt;业务模块解读(动态解读)&lt;/p&gt;
&lt;p&gt;前面种种都属于项目结构范畴，解下来就是业务模块解读，这里选择鉴权，网关，代码生成器3个核心模块讲解若依(RuoYi-Cloud)脚手架的使用。&lt;/p&gt;
&lt;h2&gt;7.1 解读技巧&lt;/h2&gt;
&lt;p&gt;只要是Java Web项目，流程主干线永远不变： &lt;strong&gt;发起请求---处理请求----响应请求&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;找一个业务逻辑相对简单的模块，围绕主线去追踪即可。根据以往的经验，请求到响应大体流程图如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/39b15b188ae3674326c12b66de77ddb7.png&quot; alt=&quot;image-20230627024232636&quot;&gt;&lt;/p&gt;
&lt;p&gt;把上面流程具体化之后就是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;前端&lt;/p&gt;
&lt;p&gt;客户端如何发起请求（关注路径/方式/参数），一般使用浏览器的F12查看&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;后端&lt;/p&gt;
&lt;p&gt;接口接收请求，处理请求，响应请求。(关注：单个服务操作/多服务协同操作)，一般追踪请求流程。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​       简单流程：网关---过滤器---拦截器--微服务(请求处理)&lt;/p&gt;
&lt;p&gt;​       复杂流程：网关---上游过滤器---上游拦截器--上游微服务(处理)-----下游过滤器---下游拦截器--下游微服务(处理)&lt;/p&gt;
&lt;h2&gt;7.2 请求闭环&lt;/h2&gt;
&lt;p&gt;这里结合上面主线，走一个完整的请求闭环，以获取登录验证码获取为例子。&lt;/p&gt;
&lt;h3&gt;7.2.1 前端&lt;/h3&gt;
&lt;p&gt;项目进入第一个页面是登录页面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/134c7c6d57504787a68a08aecdf34d59.png&quot; alt=&quot;image-20230627025010494&quot;&gt;&lt;/p&gt;
&lt;p&gt;浏览器F12，查看到第一个接口：&lt;a href=&quot;http://localhost/dev-api/code&quot;&gt;http://localhost/dev-api/code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/41baf9f135148a760966ca6e9661b486.png&quot; alt=&quot;image-20230627025050988&quot;&gt;&lt;/p&gt;
&lt;p&gt;**localhost：**前端项目启动默认访问ip， 为本地&lt;/p&gt;
&lt;p&gt;**端口：**没有端口，默认端口为80&lt;/p&gt;
&lt;p&gt;**dev-api：**若依框架约定的开发环境使用上下文，可以在.env.development中配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/63cc55ab07c99e9b2b1e40d3ace2707d.png&quot; alt=&quot;image-20230627082907769&quot;&gt;&lt;/p&gt;
&lt;p&gt;**code：**请求路径&lt;/p&gt;
&lt;p&gt;完整的：&lt;a href=&quot;http://locallhost:80/dev-api/code&quot;&gt;http://locallhost:80/dev-api/code&lt;/a&gt; 是由下面异步请求发起的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/d65379de773dafa327e1ece9cb997949.png&quot; alt=&quot;image-20230627083244710&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/128c0795be5f424aea892b8cab681d39.png&quot; alt=&quot;image-20230627083540269&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/217f7a6a839c83f754acb3096c964396.png&quot; alt=&quot;image-20230627083650541&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/16704082ac289bb501cf2b3f508bff86.png&quot; alt=&quot;image-20230627083726062&quot;&gt;&lt;/p&gt;
&lt;p&gt;当前端发起请求后，就到后端接收请求处理，处理请求，与响应请求啦。&lt;/p&gt;
&lt;h3&gt;7.2.2 后端&lt;/h3&gt;
&lt;p&gt;前端发起请求，后端接收请求，那请求最先去到哪呢？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/d5ff8836e317f6c019b2e82c727a03cc.png&quot; alt=&quot;ruoyi-cloud&quot;&gt;&lt;/p&gt;
&lt;p&gt;看若依(RuoYi-Cloud)框架的架构图，请求最先进入的网关。当然也可以通过前端代理服务配置定位到请求会转发到网关服务。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/e19b03ff3d6dcb8800aa6d3f8e2e6047.png&quot; alt=&quot;image-20230627085133404&quot;&gt;&lt;/p&gt;
&lt;p&gt;当确认请求入口之后，只需快速定位ruoyi-gateway即可。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/1142d8688f463e4b1c692224cf504458.png&quot; alt=&quot;image-20230627084350851&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;此时还存在一个问题，网关哪个类处理/code请求？&lt;/p&gt;
&lt;p&gt;如果有WebFlux编程经验，大体能猜到RouterFunctionConfiguration类&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Configuration
public class RouterFunctionConfiguration
{
    @Autowired
    private ValidateCodeHandler validateCodeHandler;

    @SuppressWarnings(&amp;quot;rawtypes&amp;quot;)
    @Bean
    public RouterFunction routerFunction()
    {
        return RouterFunctions.route(
                RequestPredicates.GET(&amp;quot;/code&amp;quot;).and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                validateCodeHandler);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;RouterFunction 是 Spring WebFlux 中定义路由的函数式编程方式。&lt;/p&gt;
&lt;p&gt;在 Spring WebFlux 中，我们可以使用 &lt;code&gt;RouterFunction&lt;/code&gt; 来定义路由规则，将请求映射到相应的处理器函数上。&lt;/p&gt;
&lt;p&gt;上面代码意思是前端发过来/code由validateCodeHandler 来处理&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Component
public class ValidateCodeHandler implements HandlerFunction&amp;lt;ServerResponse&amp;gt;
{
    @Autowired
    private ValidateCodeService validateCodeService;

    @Override
    public Mono&amp;lt;ServerResponse&amp;gt; handle(ServerRequest serverRequest)
    {
        AjaxResult ajax;
        try
        {
            //构建验证码，封装成AjaxResult对象
            ajax = validateCodeService.createCaptcha();
        }
        catch (CaptchaException | IOException e)
        {
            return Mono.error(e);
        }
        return ServerResponse.status(HttpStatus.OK).body(BodyInserters.fromValue(ajax));
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Override
public AjaxResult createCaptcha() throws IOException, CaptchaException
{
    AjaxResult ajax = AjaxResult.success();
    boolean captchaEnabled = captchaProperties.getEnabled();
    ajax.put(&amp;quot;captchaEnabled&amp;quot;, captchaEnabled);
    ....
    ajax.put(&amp;quot;uuid&amp;quot;, uuid);
    ajax.put(&amp;quot;img&amp;quot;, Base64.encode(os.toByteArray()));
    return ajax;
        
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最终将生成的验证码封装在AjaxResult 响应回客户端。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/43ff002bd98de242e73f7fecdf85080d.png&quot; alt=&quot;image-20230627085805996&quot;&gt;&lt;/p&gt;
&lt;p&gt;那如果说没有Spring WebFlux经验怎么办？很简单，使用idea 搜/code 字符，然后借助ChatGPT猜测代码啥意思&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/868aedd4f6f60a1ab19bce664f4d2474.png&quot; alt=&quot;image-20230627090056877&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/99aa0a3fcacc55ce6979d83dcf9548d5.png&quot; alt=&quot;image-20230627090235025&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/a6b19aba8d228ad214045fc4cf7ef301.png&quot; alt=&quot;image-20230627090412040&quot;&gt;&lt;/p&gt;
&lt;p&gt;到这，一个完整请求闭环就完成了，后续其他请求便是同理可得。&lt;/p&gt;
&lt;h2&gt;7.3 网关模块&lt;/h2&gt;
&lt;p&gt;网关为项目入口，若依(RuoYi-Cloud)项目入口结构可以简化为这样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/8d1a571a767b103833290779dd5edf01.png&quot; alt=&quot;image-20230627115900446&quot;&gt;&lt;/p&gt;
&lt;p&gt;在ruoyi-gateway网关微服务中配置了所有微服务路由映射&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/5bae29f0f012a56a9af77c74395fb9ba.png&quot; alt=&quot;image-20230627102732901&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;spring:
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
      routes:
        # 认证中心
        - id: ruoyi-auth
          uri: lb://ruoyi-auth
          predicates:
            - Path=/auth/**
          filters:
            # 验证码处理
            - CacheRequestFilter
            - ValidateCodeFilter
            - StripPrefix=1
        # 代码生成
        - id: ruoyi-gen
          uri: lb://ruoyi-gen
          predicates:
            - Path=/code/**
          filters:
            - StripPrefix=1
        # 定时任务
        - id: ruoyi-job
          uri: lb://ruoyi-job
          predicates:
            - Path=/schedule/**
          filters:
            - StripPrefix=1
        # 系统模块
        - id: ruoyi-system
          uri: lb://ruoyi-system
          predicates:
            - Path=/system/**
          filters:
            - StripPrefix=1
        # 文件服务
        - id: ruoyi-file
          uri: lb://ruoyi-file
          predicates:
            - Path=/file/**
          filters:
            - StripPrefix=1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;前端发起所有请都统一经过网关，再借由网关路由统一转发。&lt;/p&gt;
&lt;p&gt;访问ruoyi-file微服务路径规则：   &lt;a href=&quot;http://localhost:80/dev-api/file/&quot;&gt;http://localhost:80/dev-api/file/&lt;/a&gt;**&lt;/p&gt;
&lt;p&gt;访问ruoyi-gen微服务路径规则：   &lt;a href=&quot;http://localhost:80/dev-api/code/&quot;&gt;http://localhost:80/dev-api/code/&lt;/a&gt;**&lt;/p&gt;
&lt;p&gt;访问ruoyi-job微服务路径规则：   &lt;a href=&quot;http://localhost:80/dev-api/schedule/&quot;&gt;http://localhost:80/dev-api/schedule/&lt;/a&gt;**&lt;/p&gt;
&lt;p&gt;访问ruoyi-system微服务路径规则：   &lt;a href=&quot;http://localhost:80/dev-api/system/&quot;&gt;http://localhost:80/dev-api/system/&lt;/a&gt;**&lt;/p&gt;
&lt;p&gt;访问ruoyi-auth微服务路径规则：   &lt;a href=&quot;http://localhost:80/dev-api/auth/&quot;&gt;http://localhost:80/dev-api/auth/&lt;/a&gt;**&lt;/p&gt;
&lt;h2&gt;7.4 鉴权模块&lt;/h2&gt;
&lt;p&gt;若依(RuoYi-Cloud)鉴权模块涉及到这几个组件&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/5e8cb5e28fc88ca3348a5b3b099db1bf.png&quot; alt=&quot;image-20230627120634170&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;若依(RuoYi-Cloud)框架登录鉴权有2种模式：&lt;/p&gt;
&lt;p&gt;外部鉴权：客户端访问服务端(微服务)，以JWT令牌为判断依据，有且合法放行，没有或不合法`&lt;/p&gt;
&lt;p&gt;内部鉴权：上游微服务访问下游微服务，以请求头标记：&lt;strong&gt;from-source=inner&lt;/strong&gt;有无位依据，有放行，没有拒绝&lt;/p&gt;
&lt;h3&gt;7.4.1 外部鉴权&lt;/h3&gt;
&lt;h4&gt;7.4.1.1 &lt;strong&gt;步骤1：JWT获取&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;登录页面点击登录发起：&lt;a href=&quot;http://localhost/dev-api/auth/login&quot;&gt;http://localhost/dev-api/auth/login&lt;/a&gt; 请求&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/8c27c4927a2ca47f40bb2d3b95926492.png&quot; alt=&quot;image-20230627102627157&quot;&gt;&lt;/p&gt;
&lt;p&gt;请求中auth前缀为网关配置ry-auth服务路由映射&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/5bae29f0f012a56a9af77c74395fb9ba.png&quot; alt=&quot;image-20230627102732901&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/3aa635724f687d176ffd0915206586fc.png&quot; alt=&quot;image-20230627102800679&quot;&gt;&lt;/p&gt;
&lt;p&gt;借助网格路由，进入ry-auth微服务，TokenController请求处理类&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RestController
public class TokenController
{
    @PostMapping(&amp;quot;login&amp;quot;)
    public R&amp;lt;?&amp;gt; login(@RequestBody LoginBody form)
    {
        // 用户登录
        LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
        // 获取登录token
        return R.ok(tokenService.createToken(userInfo));
    }
}    
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;    /**
     * 创建令牌
     */
    public Map&amp;lt;String, Object&amp;gt; createToken(LoginUser loginUser)
    {
        String token = IdUtils.fastUUID();
        Long userId = loginUser.getSysUser().getUserId();
        String userName = loginUser.getSysUser().getUserName();
        loginUser.setToken(token);
        loginUser.setUserid(userId);
        loginUser.setUsername(userName);
        loginUser.setIpaddr(IpUtils.getIpAddr());
        refreshToken(loginUser);  //redis缓存令牌

        // Jwt存储信息
        Map&amp;lt;String, Object&amp;gt; claimsMap = new HashMap&amp;lt;String, Object&amp;gt;();
        claimsMap.put(SecurityConstants.USER_KEY, token);
        claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
        claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);

        // 接口返回信息
        Map&amp;lt;String, Object&amp;gt; rspMap = new HashMap&amp;lt;String, Object&amp;gt;();
        rspMap.put(&amp;quot;access_token&amp;quot;, JwtUtils.createToken(claimsMap));
        rspMap.put(&amp;quot;expires_in&amp;quot;, expireTime);
        return rspMap;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;响应返回：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/5ef028459b79a5ef6332a7e2acd00b18.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4&gt;7.4.1.2 &lt;strong&gt;步骤2：JWT鉴权&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;当客户登录成功之后，后续请求进入网关，网关转发到对应的微服务，该微服务会引用：ruoyi-common-security 鉴权模块，请求进来后，切面判断请求持有的JWT令牌，有且合法放行，没有或不合法拒绝&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/b6cd448eae842dc632762c3ecce7555b.png&quot; alt=&quot;image-20230627103917494&quot;&gt;&lt;/p&gt;
&lt;h4&gt;7.4.1.3 &lt;strong&gt;步骤3：JWT鉴权实现&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Aspect
@Component
public class PreAuthorizeAspect
{
    /**
     * 构建
     */
    public PreAuthorizeAspect()
    {
    }

    /**
     * 定义AOP签名 (切入所有使用鉴权注解的方法)
     */
    public static final String POINTCUT_SIGN = &amp;quot; @annotation(com.ruoyi.common.security.annotation.RequiresLogin) || &amp;quot;
            + &amp;quot;@annotation(com.ruoyi.common.security.annotation.RequiresPermissions) || &amp;quot;
            + &amp;quot;@annotation(com.ruoyi.common.security.annotation.RequiresRoles)&amp;quot;;

    /**
     * 声明AOP签名
     */
    @Pointcut(POINTCUT_SIGN)
    public void pointcut()
    {
    }

    /**
     * 环绕切入
     * 
     * @param joinPoint 切面对象
     * @return 底层方法执行后的返回值
     * @throws Throwable 底层方法抛出的异常
     */
    @Around(&amp;quot;pointcut()&amp;quot;)
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable
    {
        // 注解鉴权
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        checkMethodAnnotation(signature.getMethod());
        try
        {
            // 执行原有逻辑
            Object obj = joinPoint.proceed();
            return obj;
        }
        catch (Throwable e)
        {
            throw e;
        }
    }

    /**
     * 对一个Method对象进行注解检查
     */
    public void checkMethodAnnotation(Method method)
    {
        // 校验 @RequiresLogin 注解
        RequiresLogin requiresLogin = method.getAnnotation(RequiresLogin.class);
        if (requiresLogin != null)
        {
            AuthUtil.checkLogin();
        }

        // 校验 @RequiresRoles 注解
        RequiresRoles requiresRoles = method.getAnnotation(RequiresRoles.class);
        if (requiresRoles != null)
        {
            AuthUtil.checkRole(requiresRoles);
        }

        // 校验 @RequiresPermissions 注解
        RequiresPermissions requiresPermissions = method.getAnnotation(RequiresPermissions.class);
        if (requiresPermissions != null)
        {
            AuthUtil.checkPermi(requiresPermissions);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;阅读上面的切面代码，最终得出&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/8589257382551a693c943bbf38a84459.png&quot; alt=&quot;image-20230627112200912&quot;&gt;&lt;/p&gt;
&lt;p&gt;只要接口方法只要贴有上面3个注解，都需要进行外部鉴权。比如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
* 获取用户列表
*/
@RequiresPermissions(&amp;quot;system:user:list&amp;quot;)
@GetMapping(&amp;quot;/list&amp;quot;)
public TableDataInfo list(SysUser user)
{
    startPage();
    List&amp;lt;SysUser&amp;gt; list = userService.selectUserList(user);
    return getDataTable(list);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.4.2 内部鉴权&lt;/h3&gt;
&lt;p&gt;内部鉴权是微服务与微服务间鉴权，发生在上游微服务访问下游微服务，以请求头标记：&lt;strong&gt;from-source=inner&lt;/strong&gt;有无位依据，有放行，没有拒绝，其目的是实现网络隔离。&lt;/p&gt;
&lt;p&gt;来自网关请求，以JWT进行鉴权，来自内部远程调用请求，以&lt;strong&gt;from-source=inner&lt;/strong&gt;进行鉴权，其他非法请求直接拒绝。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/29335cf968447e9716279a8ba20e81e2.png&quot; alt=&quot;image-20230627104552698&quot;&gt;&lt;/p&gt;
&lt;p&gt;还是以ry-auth微服务的TokenController类的登录方法为案例&lt;/p&gt;
&lt;h4&gt;7.4.2.1 &lt;strong&gt;步骤1：远程调用过程&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;登录请求，先到TokenController类login方法&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RestController
public class TokenController
{
    @Autowired
    private TokenService tokenService;

    @Autowired
    private SysLoginService sysLoginService;

    @PostMapping(&amp;quot;login&amp;quot;)
    public R&amp;lt;?&amp;gt; login(@RequestBody LoginBody form)
    {
        // 用户登录
        LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
        // 获取登录token
        return R.ok(tokenService.createToken(userInfo));
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;login方法中用到：SysLoginService接口login逻辑&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;private SysLoginService sysLoginService;
sysLoginService.login(form.getUsername(), form.getPassword());
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;观察SysLoginService类，里面引用了接口：RemoteUserService&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Component
public class SysLoginService
{
    @Autowired
    private RemoteUserService remoteUserService;

    /**
     * 登录
     */
    public LoginUser login(String username, String password)
    {
        ......
        // 查询用户信息
        R&amp;lt;LoginUser&amp;gt; userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
		......
       
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;观察RemoteUserService接口所在位置，明显与TokenController/SysLoginService不在同一微服务。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/92438ad7c3e57247f04539733bc10d8b.png&quot; alt=&quot;image-20230627105220746&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;RemoteUserService 属于ry-system微服务，而TokenController类属于ry-auth微服务，那么此处的remoteUserService.getUserInfo为远程调用。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个问题：既然为远程调用，跟普通接口调用有啥区别？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;定义区别：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用feign组件，定义远程接口&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@FeignClient(contextId = &amp;quot;remoteUserService&amp;quot;, value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
public interface RemoteUserService
{
    /**
     * 通过用户名查询用户信息
     *
     * @param username 用户名
     * @param source 请求来源
     * @return 结果
     */
    @GetMapping(&amp;quot;/user/info/{username}&amp;quot;)
    public R&amp;lt;LoginUser&amp;gt; getUserInfo(@PathVariable(&amp;quot;username&amp;quot;) String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接口定义，除了正常的username参数之外，多了一个请求头&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestHeader(SecurityConstants.FROM_SOURCE) String source
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;调用区别：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用Feign组件发起远程接口调用，需要多传一个&lt;strong&gt;SecurityConstants.INNER&lt;/strong&gt; 参数&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;remoteUserService.getUserInfo(username, SecurityConstants.INNER);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是为何？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SecurityConstants.INNER&lt;/strong&gt;为内部微服务间远程调用请求头标识，上游微服务调用时，添加该标识的请求头，下游微服务接收请求前，进行请求头校验。&lt;/p&gt;
&lt;p&gt;即：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;定义是指定请求头key：SecurityConstants.FROM_SOURCE&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;getUserInfo(
      @PathVariable(&amp;quot;username&amp;quot;) String username,
      @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;调用时，指定请求头value：&lt;strong&gt;SecurityConstants.INNER&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;remoteUserService.getUserInfo(username, SecurityConstants.INNER);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最终合并&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SecurityConstants.FROM_SOURCE = SecurityConstants.INNER&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from-source = inner
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.4.2.2 &lt;strong&gt;步骤2：远程正式调用&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;上面定义的远程接口，最终通过feign方式调用到ruoyi-system微服务SysUserController类的info接口&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/29d7d3d7e26b8c9c2917958b17d28792.png&quot; alt=&quot;image-20230627110341990&quot;&gt;&lt;/p&gt;
&lt;p&gt;SysUserController类的info接口&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RestController
@RequestMapping(&amp;quot;/user&amp;quot;)
public class SysUserController extends BaseController
{    /**
     * 获取当前用户信息
     */
    @InnerAuth
    @GetMapping(&amp;quot;/info/{username}&amp;quot;)
    public R&amp;lt;LoginUser&amp;gt; info(@PathVariable(&amp;quot;username&amp;quot;) String username)
    {
        SysUser sysUser = userService.selectUserByUserName(username);
        if (StringUtils.isNull(sysUser))
        {
            return R.fail(&amp;quot;用户名或密码错误&amp;quot;);
        }
        // 角色集合
        Set&amp;lt;String&amp;gt; roles = permissionService.getRolePermission(sysUser);
        // 权限集合
        Set&amp;lt;String&amp;gt; permissions = permissionService.getMenuPermission(sysUser);
        LoginUser sysUserVo = new LoginUser();
        sysUserVo.setSysUser(sysUser);
        sysUserVo.setRoles(roles);
        sysUserVo.setPermissions(permissions);
        return R.ok(sysUserVo);
    }
}    
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里留意，info方法上面有个**@InnerAuth** 注解，表示当前info方法为远程调用方法，需要进行远程校验，也即：内部鉴权。&lt;/p&gt;
&lt;h4&gt;7.4.2.3 &lt;strong&gt;步骤3：内部鉴权&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Aspect
@Component
public class InnerAuthAspect implements Ordered
{
    @Around(&amp;quot;@annotation(innerAuth)&amp;quot;)
    public Object innerAround(ProceedingJoinPoint point, InnerAuth innerAuth) throws Throwable
    {
        String source = ServletUtils.getRequest().getHeader(SecurityConstants.FROM_SOURCE);
        // 内部请求验证
        if (!StringUtils.equals(SecurityConstants.INNER, source))
        {
            throw new InnerAuthException(&amp;quot;没有内部访问权限，不允许访问&amp;quot;);
        }

        String userid = ServletUtils.getRequest().getHeader(SecurityConstants.DETAILS_USER_ID);
        String username = ServletUtils.getRequest().getHeader(SecurityConstants.DETAILS_USERNAME);
        // 用户信息验证
        if (innerAuth.isUser() &amp;amp;&amp;amp; (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)))
        {
            throw new InnerAuthException(&amp;quot;没有设置用户信息，不允许访问 &amp;quot;);
        }
        return point.proceed();
    }

    /**
     * 确保在权限认证aop执行前执行
     */
    @Override
    public int getOrder()
    {
        return Ordered.HIGHEST_PRECEDENCE + 1;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;阅读上面的切面代码，发起切面是切入点事贴有@InnerAuth接口方法。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/afa3f82e7e72191f1cdb1408b058148e.png&quot; alt=&quot;image-20230627112424706&quot;&gt;&lt;/p&gt;
&lt;h2&gt;7.5 代码生成模块&lt;/h2&gt;
&lt;p&gt;若依(RuoYi-Cloud)代码生成模块是一个简单模块，功能顾名思义，用于构建若依体系的代码。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/c9865a2952a0f0ed7fd2a134249cf191.png&quot; alt=&quot;image-20230627121400569&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;启动后，访问页面：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/bd80de65670663e063aca966a8f191b2.png&quot; alt=&quot;image-20230627121447698&quot;&gt;&lt;/p&gt;
&lt;p&gt;这里演示一下代码生成器使用过程。&lt;/p&gt;
&lt;h3&gt;7.5.1 步骤1：创建表&lt;/h3&gt;
&lt;p&gt;在ry-cloud库中创建一个Employee表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE TABLE `sys_employee` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT &amp;#39;主键&amp;#39;,
  `name` varchar(255) DEFAULT NULL COMMENT &amp;#39;名称&amp;#39;,
  `age` int DEFAULT NULL COMMENT &amp;#39;年龄&amp;#39;,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  COMMENT=&amp;#39;员工表&amp;#39;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.5.2 步骤2：导入新建表&lt;/h3&gt;
&lt;p&gt;在代码生成界面导入新建表&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/884fe285c09f54ff7ecf0ffc96a38a5d.png&quot; alt=&quot;image-20230627122048884&quot;&gt;&lt;/p&gt;
&lt;h3&gt;7.5.3 &lt;strong&gt;步骤3：定制代码信息&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;7.5.3.1 &lt;strong&gt;基本信息&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/f7322efe69d8a39d8f8cfc200350fd5b.png&quot; alt=&quot;image-20230627122210064&quot;&gt;&lt;/p&gt;
&lt;h4&gt;7.5.3.2 &lt;strong&gt;字段信息&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/1f8fb3ad3912124ba581bfe07843a730.png&quot; alt=&quot;image-20230627122308878&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;字段列名&lt;/strong&gt;：表中列的名称&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;字段描述&lt;/strong&gt;：生成实体类属性注释&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;物理类型&lt;/strong&gt;：表中列的类型&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Java类型&lt;/strong&gt;：生成实体类属性变量类型&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Java属性&lt;/strong&gt;：生成实体类属性名&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;插入&lt;/strong&gt;：定义添加操作模态框表单控件，选中表示模态框有这个输入空间&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;编辑&lt;/strong&gt;：定义编辑操作模态框表单控件，选中表示模态框有这个输入空间&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;列表&lt;/strong&gt;：表中数据在列表时，该列数据是否显示，选中为要显示&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;查询&lt;/strong&gt;：该列是否作为列表的查询条件，选中为需要作为查询条件&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;查询方式&lt;/strong&gt;：作为查询条件时，使用匹配方式&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;显示类型&lt;/strong&gt;：查询条件输入类型&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;字典类型&lt;/strong&gt;：查询条件显示类型如果是下拉框，使用字典类型，实现下拉选择&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/795c039b4be8d741be9268bc1114c152.png&quot; alt=&quot;image-20230627123010822&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/3ac48130cc01a73bc5b3310ad9168bef.png&quot; alt=&quot;image-20230627123031957&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/e0fddf16de2a3e8a48faee4679333e03.png&quot; alt=&quot;image-20230627122956279&quot;&gt;&lt;/p&gt;
&lt;h4&gt;7.5.3.3 生成信息&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/ed32d280dbaa34884eac388e8bd6b17f.png&quot; alt=&quot;image-20230627123327479&quot;&gt;&lt;/p&gt;
&lt;p&gt;生成模板：一般不动，以单表操作为主&lt;/p&gt;
&lt;p&gt;生成包路径：指定当前代码生成根包路径&lt;/p&gt;
&lt;p&gt;生成模块名：该功能所属模块，落地到代码就是所在微服务名称，ruoyi-gateway配置的路由映射路径名&lt;/p&gt;
&lt;p&gt;生成业务名：该功能英文名，落地到代码就是controller中操作资源名， 比如：/employee&lt;/p&gt;
&lt;p&gt;生成功能名：该功能中文名称&lt;/p&gt;
&lt;p&gt;上级菜单：该功能页面展示菜单连接挂载在哪个上级菜单。&lt;/p&gt;
&lt;h4&gt;7.5.3.4 预览&lt;/h4&gt;
&lt;p&gt;配置上面各种信息成功之后，可以点击预览，根据需要微调&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/c14f3b6c22e8fe978b026e8f9a8f95f8.png&quot; alt=&quot;image-20230627124027839&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/16f295f2cc17737c47544df6029dbdba.png&quot; alt=&quot;image-20230627124112142&quot;&gt;&lt;/p&gt;
&lt;h4&gt;7.5.3.5 生成代码&lt;/h4&gt;
&lt;p&gt;确定无误之后，直接点生成代码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/7908cec22f41039cc959c24d792facac.png&quot; alt=&quot;image-20230627124158525&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/20f6757878dd45cce027098d80f1fbb7.png&quot; alt=&quot;image-20230627124216989&quot;&gt;&lt;/p&gt;
&lt;h3&gt;7.5.4 步骤4：使用代码&lt;/h3&gt;
&lt;p&gt;压缩包解压得到几个文件：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/74e2b1fddccb4f81593f2a3e54c6996e.png&quot; alt=&quot;image-20230627125016476&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;7.5.4.1 &lt;strong&gt;employeeMenu.sql&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt; 涉及要添加的菜单，菜单权限，在navicat中执行即可。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- 菜单 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values(&amp;#39;员工&amp;#39;, &amp;#39;1&amp;#39;, &amp;#39;1&amp;#39;, &amp;#39;employee&amp;#39;, &amp;#39;system/employee/index&amp;#39;, 1, 0, &amp;#39;C&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;system:employee:list&amp;#39;, &amp;#39;#&amp;#39;, &amp;#39;admin&amp;#39;, sysdate(), &amp;#39;&amp;#39;, null, &amp;#39;员工菜单&amp;#39;);

-- 按钮父菜单ID
SELECT @parentId := LAST_INSERT_ID();

-- 按钮 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values(&amp;#39;员工查询&amp;#39;, @parentId, &amp;#39;1&amp;#39;,  &amp;#39;#&amp;#39;, &amp;#39;&amp;#39;, 1, 0, &amp;#39;F&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;system:employee:query&amp;#39;,        &amp;#39;#&amp;#39;, &amp;#39;admin&amp;#39;, sysdate(), &amp;#39;&amp;#39;, null, &amp;#39;&amp;#39;);

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values(&amp;#39;员工新增&amp;#39;, @parentId, &amp;#39;2&amp;#39;,  &amp;#39;#&amp;#39;, &amp;#39;&amp;#39;, 1, 0, &amp;#39;F&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;system:employee:add&amp;#39;,          &amp;#39;#&amp;#39;, &amp;#39;admin&amp;#39;, sysdate(), &amp;#39;&amp;#39;, null, &amp;#39;&amp;#39;);

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values(&amp;#39;员工修改&amp;#39;, @parentId, &amp;#39;3&amp;#39;,  &amp;#39;#&amp;#39;, &amp;#39;&amp;#39;, 1, 0, &amp;#39;F&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;system:employee:edit&amp;#39;,         &amp;#39;#&amp;#39;, &amp;#39;admin&amp;#39;, sysdate(), &amp;#39;&amp;#39;, null, &amp;#39;&amp;#39;);

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values(&amp;#39;员工删除&amp;#39;, @parentId, &amp;#39;4&amp;#39;,  &amp;#39;#&amp;#39;, &amp;#39;&amp;#39;, 1, 0, &amp;#39;F&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;system:employee:remove&amp;#39;,       &amp;#39;#&amp;#39;, &amp;#39;admin&amp;#39;, sysdate(), &amp;#39;&amp;#39;, null, &amp;#39;&amp;#39;);

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values(&amp;#39;员工导出&amp;#39;, @parentId, &amp;#39;5&amp;#39;,  &amp;#39;#&amp;#39;, &amp;#39;&amp;#39;, 1, 0, &amp;#39;F&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;system:employee:export&amp;#39;,       &amp;#39;#&amp;#39;, &amp;#39;admin&amp;#39;, sysdate(), &amp;#39;&amp;#39;, null, &amp;#39;&amp;#39;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行成功后，刷新前端项目，可以看到菜单&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/3b13b5c95c723d5ce0e1518920410b7f.png&quot; alt=&quot;image-20230627124525020&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;7.5.4.2 &lt;strong&gt;vue&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;ruoyi-ui前端employee这个模块设计到vue页面，与js&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/48a9574aa4ee2ec0708d18029e0d3382.png&quot; alt=&quot;image-20230627124648578&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;分别拷贝到项目api目录，跟views目录&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/4c6761c876cec0570b6494880860b5a4.png&quot; alt=&quot;image-20230627124844264&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;刷新之后，点击员工菜单，缺少后端接口&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/ed3af4a8da1b1ea0164b8ec044484286.png&quot; alt=&quot;image-20230627124922670&quot;&gt;&lt;/p&gt;
&lt;h4&gt;7.5.4.3 &lt;strong&gt;main&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;后端接口代码，将main代码拷贝到ruoyi-system  main目录中即可&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/5a740db860451c453aa4b2da09fa6a75.png&quot; alt=&quot;image-20230627125254678&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;然后，重启ruoyi-system服务，再访问。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/3d9fe73c86fdbd2e007ad8168d1b1309.png&quot; alt=&quot;image-20230627125740228&quot;&gt;&lt;/p&gt;
&lt;h1&gt;八、定制微服务&lt;/h1&gt;
&lt;h2&gt;8.1 需求&lt;/h2&gt;
&lt;p&gt;定制微服务-ruoyi-modules-test&lt;/p&gt;
&lt;h2&gt;8.2 代码结构&lt;/h2&gt;
&lt;p&gt;对外api：ruoyi-api-test&lt;/p&gt;
&lt;p&gt;微服务：ruoyi-modules-test&lt;/p&gt;
&lt;h2&gt;8.3 实现步骤&lt;/h2&gt;
&lt;h3&gt;8.3.1 步骤1：定义ruoyi-api-test&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/70e82e380b8dcebfaf773aa0b0a8bcfe.png&quot; alt=&quot;image-20230627130527413&quot;&gt;&lt;/p&gt;
&lt;p&gt;导入依赖参考ruoyi-api-system&lt;/p&gt;
&lt;p&gt;创建包结构参考ruoyi-api-system&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/01cb6ae0372c8cbcc02cb0531acb7a66.png&quot; alt=&quot;image-20230627131059710&quot;&gt;&lt;/p&gt;
&lt;p&gt;这里注意包命名规则：&lt;/p&gt;
&lt;p&gt;com.ruoyi-----公司域名倒写&lt;/p&gt;
&lt;p&gt;system------微服务名&lt;/p&gt;
&lt;p&gt;api------模块名&lt;/p&gt;
&lt;h3&gt;8.3.2 步骤2：等级ruoyi-api-test依赖&lt;/h3&gt;
&lt;p&gt;去父项目ruoyi  pom.xml文件中登记新建的api&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;!-- test接口 --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.ruoyi&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;ruoyi-api-test&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${ruoyi.version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8.3.3 步骤3：定义ruoyi-modules-test&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/8c8b9efc2914e1346c48efe331d64d01.png&quot; alt=&quot;image-20230627131334808&quot;&gt;&lt;/p&gt;
&lt;p&gt;导入依赖参考，ruoyi-system 注意要导入ruoyi-api-test依赖&lt;/p&gt;
&lt;p&gt;创建包结构参考ruoyi-system&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/6bb2fbe2d42f5909810642ca37648357.png&quot; alt=&quot;image-20230627132033109&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;8.3.4 步骤4：定制微服务配置文件&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/a6e8c38ba9479a2eb4c5ec9f9becc23c.png&quot; alt=&quot;image-20230627132159224&quot;&gt;&lt;/p&gt;
&lt;p&gt;nacos克隆一份配置文件--克隆自ruoyi-system-dev.yml&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/cb4d7425197684d9a45d9f2d156005bc.png&quot; alt=&quot;image-20230627132356925&quot;&gt;&lt;/p&gt;
&lt;h3&gt;8.3.5 步骤5：定制网关微服务路由&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/08b17caccc93ab2b333972a6bc384f2d.png&quot; alt=&quot;image-20230627132509241&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/96572c540733fb53538c26423f8e9d94.png&quot; alt=&quot;image-20230627132552907&quot;&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;到这，定制微服务就结束了，剩下操作就是常规crud了。&lt;/p&gt;
&lt;h1&gt;九、小结&lt;/h1&gt;
&lt;p&gt;将整篇教程总结一下：若依(Ruoyi-Cloud)版本使用&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;启动&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1&amp;gt;官网克隆项目到idea&lt;/p&gt;
&lt;p&gt;2&amp;gt;按照文档，建库，建表，配置nacos&lt;/p&gt;
&lt;p&gt;3&amp;gt;准备各种环境，修改本地配置&lt;/p&gt;
&lt;p&gt;4&amp;gt;前后端启动，测试。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模块解读&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1&amp;gt;网关模块，所有请求入口&lt;/p&gt;
&lt;p&gt;2&amp;gt;鉴权模块，外部鉴权，内部鉴权&lt;/p&gt;
&lt;p&gt;3&amp;gt;代码生成模块，先建表，再定制，后覆盖&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;微服务定制&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1&amp;gt;拷贝模仿现有api/modules&lt;/p&gt;
&lt;p&gt;2&amp;gt;配置中心加配置文件&lt;/p&gt;
&lt;p&gt;3&amp;gt;网关配置转发路由&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Tue, 13 Aug 2024 00:00:00 GMT</pubDate></item><item><title>如何使用呼叫转移拦截骚扰电话</title><link>https://bigwind.cn/blog/life/%E6%8B%A6%E6%88%AA%E9%AA%9A%E6%89%B0%E7%94%B5%E8%AF%9D/</link><guid isPermaLink="true">https://bigwind.cn/blog/life/%E6%8B%A6%E6%88%AA%E9%AA%9A%E6%89%B0%E7%94%B5%E8%AF%9D/</guid><description>烦人的骚扰电话</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/life/%E6%8B%A6%E6%88%AA%E9%AA%9A%E6%89%B0%E7%94%B5%E8%AF%9D/&quot;&gt;https://bigwind.cn/blog/life/%E6%8B%A6%E6%88%AA%E9%AA%9A%E6%89%B0%E7%94%B5%E8%AF%9D/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;拦截骚扰电话&lt;/h1&gt;
&lt;p&gt;我拦截骚扰电话一般使用空号回应，效果最好，&lt;/p&gt;
&lt;h2&gt;首先在三家运营商那里开启呼叫转移功能，功能是免费的，&lt;/h2&gt;
&lt;p&gt;只有呼转成功才收费，然后，在手机的通话设置中，找到呼叫转移，将其中的遇忙转移，转移到一个运营商级别的空号，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;移动呼转到+8613800000000&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;联通呼转到+8613000000000 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;电信呼转到+8618100000000&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;请按照运营商设置，别妄想想着设置别的运营商的号码，没用。&lt;/p&gt;
&lt;p&gt;在设置之前，如果骚扰电话打过来，你挂断，对方听到的是用户正忙或者正在通话中，对方就知道这个号码一定有人用，如果你设置了上面的号码，你挂断，对方听到的就是空号的提示。&lt;/p&gt;
&lt;h2&gt;另外，为了防止误伤，例如你正在通话，你的熟人打电话过来，可能直接听到的也是空号，需要在运营商那里打开呼叫等待功能，功能也是免费，&lt;/h2&gt;
&lt;p&gt;然后拨号盘输入*43#按拨号键打开，打开后你正在通话，你的熟人打电话给你，听到的就是，请不要挂机，您拨打的电话正在通话中，降低误伤。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;最后，因为现在运营商已经大量关闭2G和3G网络，现在手机通话基本上是通过VoLTE和VoNR进行，在2G/3G模式下只要手机有信号，就可以设置，但是VoLTE模式下，并不是所有手机都可以设置，例如小米5，支持联通VoLTE，但是无法在联通VoLTE状态下设置联通的呼叫转移，到了小米6才解决，因为4G和5G时代设置呼叫转移，手机的运营商配置文件必须支持才可以，不支持就别想了，而且设置的时候，必须打开数据流量开关，不然绝对不会成功。如果自己手机设置不成功，那就换别人手机试试，只要设置好了就行。 反正我是用这个方法，拦截了很多骚扰电话，对方听到空号，基本不会打过来，会认为是个无效号码&lt;/em&gt;&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Fri, 09 Aug 2024 00:00:00 GMT</pubDate></item><item><title>Spring Cache笔记</title><link>https://bigwind.cn/blog/java/springboot-cache/</link><guid isPermaLink="true">https://bigwind.cn/blog/java/springboot-cache/</guid><description>Spring Cache笔记</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/java/springboot-cache/&quot;&gt;https://bigwind.cn/blog/java/springboot-cache/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Spring Cache&lt;/p&gt;
&lt;h4&gt;2.1.1 介绍&lt;/h4&gt;
&lt;p&gt;Spring Cache 是一个框架，实现了基于注解的缓存功能，只需要简单地加一个注解，就能实现缓存功能。&lt;/p&gt;
&lt;p&gt;Spring Cache 提供了一层抽象，底层可以切换不同的缓存实现，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EHCache&lt;/li&gt;
&lt;li&gt;Caffeine&lt;/li&gt;
&lt;li&gt;Redis(常用)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;起步依赖：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-cache&amp;lt;/artifactId&amp;gt;                                          &amp;lt;version&amp;gt;2.7.3&amp;lt;/version&amp;gt; 
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2.1.2 常用注解&lt;/h4&gt;
&lt;p&gt;在SpringCache中提供了很多缓存操作的注解，常见的是以下的几个：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;注解&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;@EnableCaching&lt;/td&gt;
&lt;td&gt;开启缓存注解功能，通常加在启动类上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@Cacheable&lt;/td&gt;
&lt;td&gt;在方法执行前先查询缓存中是否有数据，如果有数据，则直接返回缓存数据；如果没有缓存数据，调用方法并将方法返回值放到缓存中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@CachePut&lt;/td&gt;
&lt;td&gt;将方法的返回值放到缓存中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@CacheEvict&lt;/td&gt;
&lt;td&gt;将一条或多条数据从缓存中删除&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;在spring boot项目中，使用缓存技术只需在项目中导入相关缓存技术的依赖包，并在启动类上使用@EnableCaching开启缓存支持即可。&lt;/p&gt;
&lt;p&gt;例如，使用Redis作为缓存技术，只需要导入Spring data Redis的maven坐标即可。&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Thu, 01 Aug 2024 00:00:00 GMT</pubDate></item><item><title>操作系统导论</title><link>https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%80-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AF%BC%E8%AE%BA/</link><guid isPermaLink="true">https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%80-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AF%BC%E8%AE%BA/</guid><description>计算机操作系统学习笔记(一)</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%80-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AF%BC%E8%AE%BA/&quot;&gt;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%80-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AF%BC%E8%AE%BA/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;计算机操作系统学习笔记(一)-操作系统导论&lt;/h1&gt;
&lt;h2&gt;操作系统导论&lt;/h2&gt;
&lt;h3&gt;1）计算机操作系统的主要目标？&lt;/h3&gt;
&lt;p&gt;计算机操作系统的主要目标包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;方便性&lt;/strong&gt;：使计算机系统易于使用，提供友好的用户界面和操作方式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;有效性&lt;/strong&gt;：提高系统资源的利用率和系统的吞吐量，以便更多的任务可以在更短的时间内完成。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;可扩充性&lt;/strong&gt;：为适应计算机硬件、体系结构以及计算机应用发展的要求，容易升级。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;开放性&lt;/strong&gt;：系统能遵循世界标准规范，特别是遵循开放系统互连 (OSI)国际标准。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2）操作系统的基本特征是什么？&lt;/h3&gt;
&lt;p&gt;操作系统的四个基本特征是：并发性、共享性、虚拟性和异步性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;并发性&lt;/strong&gt;：指两个或多个事件在同一时间间隔内发生。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;共享性&lt;/strong&gt;：指系统中的资源可供内存中多个并发执行的进程共同使用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;虚拟性&lt;/strong&gt;：指通过某种技术把一个物理实体变成若干个逻辑上的对应物。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;异步性&lt;/strong&gt;：即不确定性。在多道程序设计中，各个程序之间存在着直接或间接的联系，程序的推进速度受它的运行环境的影响。 这时同一程序和数据的多次运行可能得到不同的结果；程序的运行时间、运行顺序也具有不确定性；外部输入的请求、运行故障发生的时间难以预测。 这些都是不确定性的表现。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3）多道批处理、分时系统，实时系统的概念，特点&lt;/h3&gt;
&lt;p&gt;多道批处理系统、分时系统和实时系统是操作系统的三种基本类型。&lt;/p&gt;
&lt;p&gt;1. &lt;strong&gt;多道批处理&lt;/strong&gt;：是操作系统的一种运行方式，它允许内存中同时存放多个程序，并轮流占有CPU，交替执行，当某个程序因某种原因如IO操作时二不能继续执行而放弃CPU时，操作系统调度另一程序允许，这样以达到提高系统效率的作用&lt;/p&gt;
&lt;p&gt;其主要特点包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;多道性&lt;/strong&gt;：内存中同时存放多个作业，一个时刻只有一个作业运行，这些作业共享CPU和外部设备等资源。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;宏观上并行，微观上串行&lt;/strong&gt;：内存中多道程序轮流占有CPU，交替执行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;资源利用率高&lt;/strong&gt;：当某道程序因某种原因如执行I/O操作时而不能继续运行放弃CPU时，操作系统便调度另一程序运行，这样CPU就尽量忙碌，达到提高系统效率的目的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;平均周转时间长&lt;/strong&gt;：由于多道程序系统中有多个作业在内存中，因此每个作业的处理时间会相对较长。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;无交互能力&lt;/strong&gt;：多道程序系统中的作业是批量提交的，因此用户无法与系统进行交互。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2. &lt;strong&gt;分时系统&lt;/strong&gt;：在一台主机上连接了多个带有显示器和键盘的终端，同时允许多个用户通过自己的终端，以交互方式使用计算机，共享主机中的资源。&lt;/p&gt;
&lt;p&gt;其主要特点包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;多路性&lt;/strong&gt;：指一台计算机与若干台终端相连接，终端上的这些用户可以按照分时原则共享计算机资源。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;独立性&lt;/strong&gt;：指用户和用户之间都是独立操作系统的，在同时操作时并不会发生冲突、破坏、混淆等现象。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;及时性&lt;/strong&gt;：指系统能以最快的速度将结果显示给用户。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;交互性&lt;/strong&gt;：指用户可以通过终端进行&lt;strong&gt;广泛&lt;/strong&gt;的人机交互。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;3. &lt;strong&gt;实时系统&lt;/strong&gt;：系统能及时响应外部事件的请求，在规定的时间内完成对该事件的处理，并控制所有实时任务协调一致的运行。&lt;/p&gt;
&lt;p&gt;其主要特点包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;多路性&lt;/strong&gt;：信息查询系统表现为系统按分时原则为多个终端用户服务；实时控制系统表现为系统周期的对多路现场信息进行采集，以及对多个对象或执行机构进行控制&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;独立性&lt;/strong&gt;：信息查询系统表现为用户终端查询互相干扰，实时控制系统表现为采集和控制功能互不干扰&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;及时性&lt;/strong&gt;：指系统能够在规定的时间响应外部事件并返回处理结果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;交互性&lt;/strong&gt;：指用户可以通过终端进行&lt;strong&gt;有限&lt;/strong&gt;的人机交互。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate></item><item><title>处理机调度和死锁</title><link>https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%89-%E5%A4%84%E7%90%86%E6%9C%BA%E8%B0%83%E5%BA%A6%E5%92%8C%E6%AD%BB%E9%94%81/</link><guid isPermaLink="true">https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%89-%E5%A4%84%E7%90%86%E6%9C%BA%E8%B0%83%E5%BA%A6%E5%92%8C%E6%AD%BB%E9%94%81/</guid><description>计算机操作系统学习笔记(三)</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%89-%E5%A4%84%E7%90%86%E6%9C%BA%E8%B0%83%E5%BA%A6%E5%92%8C%E6%AD%BB%E9%94%81/&quot;&gt;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%89-%E5%A4%84%E7%90%86%E6%9C%BA%E8%B0%83%E5%BA%A6%E5%92%8C%E6%AD%BB%E9%94%81/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;计算机操作系统学习笔记（三）-处理机调度和死锁&lt;/h1&gt;
&lt;h2&gt;处理机调度和死锁&lt;/h2&gt;
&lt;h3&gt;1、阐述动态分区分配的分区回收机制？&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;如果回收分区与插入点的前一个空闲分区f1相邻接，将两个空闲分区合并成一个大的空闲分区，新分区的首址为f1的首址，大小为两者之和。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;如果回收分区与插入点的后一个空闲分区f2相邻接，将两个空闲分区合并成一个大的空闲分区，新分区的首址为回收分区的首址，大小为两者之和。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;如果回收分区同时与插入点的前后两个分区邻接，将三个空闲分区合并成一个大的空闲分区，新分区的首址为f1的首址，大小为三者之和。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;如果回收分区既不与前一个分区邻接，也不与后一个分区邻接，为回收分区单独建立一个新表项，新分区的首址为回收分区的首址，大小为回收分区大小，将表项插入到空闲分区链表合适位置中。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2、死锁的定义是什么，其必要条件有那些？&lt;/h3&gt;
&lt;p&gt;操作系统中一组进程的每一个进程都在等待由且仅有该组进程的其他进程才能引发的事件，则该组进程死锁&lt;/p&gt;
&lt;p&gt;死锁的产生需要满足以下 4 个条件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;互斥条件&lt;/strong&gt;：指运进程对所分配到的资源具有排它性，也就是说在一段时间内某个锁资源只能被一个进程所占用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;请求和保持条件&lt;/strong&gt;：指进程已经保持至少一个资源，但又提出了新的资源请求，而该资源已被其它进程占有，此时请求进程阻塞，但又对自己已获得的其它资源保持不放。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;不可剥夺条件&lt;/strong&gt;：指进程已获得的资源，在未使用完之前，不能被剥夺。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;循环等待条件&lt;/strong&gt;：指在发生死锁时，必然存在运算单元和资源的环形链，即进程正在等待另一个进程占用的资源，而对方又在等待自己占用的资源，从而造成环路等待的情况。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3、什么是高级、中级、低级调度？优先级倒置概念是什么？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;高级调度&lt;/strong&gt;（作业调度）按某种算法从外存上处于后备队列的作业中挑选一个（或多个）作业调度进入内存。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;中级调度&lt;/strong&gt;（内存调度）为了使内存中的进程过多，将一些暂时不能运行的进程从内存中对换到外存中等待。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;低级调度&lt;/strong&gt;（进程调度）主要任务是按照某种方法和策略从就绪队列中选取一个进程，将处理机分配给它。进程调度是操作系统中最基本的一种调度，在一般的操作系统中都必须配置进程调度。进程调度的频率很高，一般几十毫秒一次。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优先级倒置&lt;/strong&gt;是高优先级的进程（线程）被一个低优先级进程（线程）延迟或堵塞。&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate></item><item><title>文件管理</title><link>https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%83-%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86/</link><guid isPermaLink="true">https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%83-%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86/</guid><description>计算机操作系统学习笔记(七)</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%83-%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86/&quot;&gt;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%83-%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;计算机操作系统学习笔记（七）-文件管理&lt;/h1&gt;
&lt;h2&gt;文件管理&lt;/h2&gt;
&lt;h3&gt;1、文件的定义&lt;/h3&gt;
&lt;p&gt;文件是记录在外存上的相关信息的命名组合。从用户角度来看，文件是逻辑外存的最小分配单元，也就是说，数据只有通过文件才能写到外存。通常，文件表示程序（源形式和目标形式）和数据。数据文件可以是数字的、字符的、字符数字的或二进制的。文件可以是自由形式的，例如文本文件，或者可以是具有严格格式的。通常，文件为位、字节、行或记录的序列，其含义由文件的创建者和用户定义。因此，文件概念非常通用。文件信息由创建者定义。文件可存储许多不同类型的信息，如源程序或可执行程序、数字或文本数据、照片、音乐、视频等。文件具有某种定义的结构，这取决于其类型。比如：文本文件为按行（可能还有页）组织的字符序列；源文件为函数序列，而每个函数包括声明和可执行语句；可执行文件为一系列代码段，以供加载程序调入内存并执行。文件的属性因操作系统而异，但通常包括：名称、标识符、类型、位置、尺寸、保护、时间、日期和用户标识等&lt;/p&gt;
&lt;h3&gt;2、目录的定义，文件系统对目录管理有什么要求？&lt;/h3&gt;
&lt;p&gt;文件系统中的目录是一种特殊的文件，用于存储其他文件的信息。目录中的每个条目都包含有关文件的信息，例如文件名、大小、创建日期和位置等。目录可以帮助用户组织和管理文件，使其更容易找到所需的文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;文件系统对目录管理要求：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;实现“按名存取”&lt;/strong&gt;。即用户只需提供所需访问文件的名称，便能快速准确地找到指定文件在外存上的存储位置。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;提高对目录的检索速度&lt;/strong&gt;。通过合理地组织目录结构的方法，可加快对目录的检索速度，从而提高对文件的存取速度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;文件共享&lt;/strong&gt;。在多用户系统中，应允许多个用户共享一个文件。这样就须在外存中只保留一份该文件的副本，供不同用户使用，以节省大量的存储空间，并方便用户和提高文件利用率。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;允许文件重名&lt;/strong&gt;。系统应允许不同用户对不同文件采用相同的名称，以便于用户按照自己的习惯给文件命名和使用文件。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3、文件的逻辑结构、物理结构的概念是什么，常见文件逻辑结构的基本特点？&lt;/h3&gt;
&lt;p&gt;文件的&lt;strong&gt;逻辑结构&lt;/strong&gt;是指文件在用户面前所呈现的形式，即用户可以直接处理的数据及其结构，它独立于文件的物理特性，又称为文件组织。&lt;/p&gt;
&lt;p&gt;文件的&lt;strong&gt;物理结构&lt;/strong&gt;，又称为文件的存储结构，是指文件在外存上的存储组织形式，这不仅与存储介质的存储性能有关，而且与所采用的外存分配方式有关。&lt;/p&gt;
&lt;p&gt;文件的逻辑结构有两种形式：记录式文件和字符流式文件。其中，记录式文件是由一系列的记录组成的，记录的长度可分为定长和不定长两类。定长记录指文件中所有记录的长度都是相同的，所有记录中的各数据项都处在记录中相同的位置，具有相同的顺序和长度。变长记录指文件中各记录的长度不相同。&lt;/p&gt;
&lt;p&gt;常见的文件逻辑结构的&lt;strong&gt;基本特点&lt;/strong&gt;包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;提高检索速度&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;便于用户修改&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;降低文件的存储费用&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate></item><item><title>进程的描述和控制</title><link>https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%BA%8C-%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%8F%8F%E8%BF%B0%E5%92%8C%E6%8E%A7%E5%88%B6/</link><guid isPermaLink="true">https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%BA%8C-%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%8F%8F%E8%BF%B0%E5%92%8C%E6%8E%A7%E5%88%B6/</guid><description>计算机操作系统学习笔记(二)</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%BA%8C-%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%8F%8F%E8%BF%B0%E5%92%8C%E6%8E%A7%E5%88%B6/&quot;&gt;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%BA%8C-%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%8F%8F%E8%BF%B0%E5%92%8C%E6%8E%A7%E5%88%B6/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;计算机操作系统学习笔记（二）-进程的描述和控制&lt;/h1&gt;
&lt;h2&gt;进程的描述和控制&lt;/h2&gt;
&lt;h3&gt;1）程序顺序执行、并发执行的特征是什么，同步、异步的概念是什么？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;顺序执行：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;顺序性：程序严格按照顺序执行，前一个程序结束后一个程序才能执行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;封闭性：程序在封闭环境下运行，程序运行时独占资源，各种资源的状态（除初始状态）仅由本程序·才能改变，程序一旦开始运行，其结果不受外界因素影响。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;可再现性：程序重复执行时，只要程序执行的环境和初始条件相同，无论执行方式是连续还是间断，程序结果相同。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;并发执行：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;间断性：程序因并发执行共享资源，以及为完成某一任务相互合作，使这些并发执行的程序之间存在相互制约的关系。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;失去封闭性：当系统中存在多个并发执行的程序，因其共享资源，致使这些资源被改变时，其任一程序受其影响。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;不可再现性：因失去封闭性，重复执行的程序不一定有相同的执行结果。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;同步&lt;/strong&gt;：同步是指一个进程在执行某个请求的时候，如果该请求需要一段时间才能返回信息，那么这个进程会一直等待下去，直到收到返回信息才继续执行下去。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;异步&lt;/strong&gt;：异步是指进程不需要一直等待下去，而是继续执行下面的操作，不管其他进程的状态，当有信息返回的时候会通知进程进行处理&lt;/p&gt;
&lt;h3&gt;2）进程同步控制应遵循那些原则？&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;空闲让进&lt;/strong&gt;：当无进程处于临界区时，表明临界资源处于空闲状态，应允许一个请求进入临界区的进程立即进入自己的临界区，以有效地利用临界资源。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;忙则等待&lt;/strong&gt;：当已有进程进入临界区时，表明临界资源正在被访问，因而其它试图进入临界区的进程必须等待，以保证对临界资源的互斥访问。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;有限等待&lt;/strong&gt;：对要求访问临界资源的进程，应保证在有限时间内能进入自己的临界区，避免陷入 “死等” 状态。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;让权等待&lt;/strong&gt;：当进程不能进入自己的临界区时，应立即释放处理机，避免进程陷入 “忙等” 状态。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3）进程的概念，进程实体由什么构成&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;进程&lt;/strong&gt;是进程实体的运行过程，是系统进行资源和调度的一个独立单位。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;进程实体&lt;/strong&gt;由程序段、数据段和进程控制块（PCB）三部分组成。其中，程序段是指进程所执行的程序代码，数据段是指进程所使用的数据及堆栈等，PCB是进程控制块的缩写，是操作系统用来管理进程的数据结构，包含了进程的各种信息，如进程状态、进程优先级、进程ID等。&lt;/p&gt;
&lt;h3&gt;4）管程的定义和组成是什么？&lt;/h3&gt;
&lt;h4&gt;管程是由代表共享资源的一组数据以及对该共享数据结构实施一组过程所组成的资源管理程序共同构成的一个操作系统的资源管理模块。&lt;/h4&gt;
&lt;h4&gt;管程由以下四部分组成:&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;管程的名称&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;局部于管程的共享数据结构说明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;对该数据结构进行操作的一组过程&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;对局部于管程的共享数据设置初始值的语句&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;5）进程的三种基本状态是什么？&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;就绪 (Ready) 状态：当进程已分配到除 CPU 以外的所有必要的资源，只要获得 CPU 便可立即执行，这时的进程状态称为就绪状态。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;执行（Running）状态：当进程已获得 CPU，其程序正在 CPU 上执行，此时的进程状态称为执行状态。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;阻塞（Blocked）状态：当进程由于某些原因无法执行时，如等待某个事件的发生或等待某个资源的释放，此时的进程状态称为阻塞状态。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6）进程的五种状态是什么？为什么要引入挂起?&lt;/h3&gt;
&lt;p&gt;进程的五种状态:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;新建（New）状态：进程被创建但尚未进入就绪队列。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;就绪（Ready）状态：进程已分配到除 CPU 以外的所有必要的资源，只要获得 CPU 便可立即执行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;运行（Running）状态：进程已获得 CPU，其程序正在 CPU 上执行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;阻塞（Blocked）状态：进程由于某些原因无法执行，如等待某个事件的发生或等待某个资源的释放。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;终止（Exit）状态：进程已完成任务或出现无法克服的错误而异常终止。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;引入挂起状态是因为五种不同的需要：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;终端用户需要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;父进程请求&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;负荷调节需要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;操作系统需要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;对换需要&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;7）解释PCB,TCB&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;PCB&lt;/strong&gt;是进程控制块（Process Control Block）的缩写，是操作系统用来管理进程的数据结构，包含了进程的各种信息，如进程状态、进程优先级、进程ID等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TCB&lt;/strong&gt;是线程控制块（Thread Control Block）的缩写，是系统为每个线程配置的一个线程控制块，用于控制和管理线程的信息，如线程标识符、线程运行状态、优先级等。&lt;/p&gt;
&lt;h3&gt;8）线程的概念是什么？与进程比较各自的特点&lt;/h3&gt;
&lt;p&gt;线程是操作系统调度和分配的基本单位&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;比较特点&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;均有并发性&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;进程拥有更多的系统资源&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;线程独立性小&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;线程切换比进程切换系统开销小&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;均支持多处理机&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate></item><item><title>虚拟存储器</title><link>https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%BA%94-%E8%99%9A%E6%8B%9F%E5%AD%98%E5%82%A8%E5%99%A8/</link><guid isPermaLink="true">https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%BA%94-%E8%99%9A%E6%8B%9F%E5%AD%98%E5%82%A8%E5%99%A8/</guid><description>计算机操作系统学习笔记(五)</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%BA%94-%E8%99%9A%E6%8B%9F%E5%AD%98%E5%82%A8%E5%99%A8/&quot;&gt;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%BA%94-%E8%99%9A%E6%8B%9F%E5%AD%98%E5%82%A8%E5%99%A8/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;计算机操作系统学习笔记（五）-虚拟存储器&lt;/h1&gt;
&lt;h2&gt;虚拟存储器&lt;/h2&gt;
&lt;h3&gt;1、什么是虚拟存储器？&lt;/h3&gt;
&lt;p&gt;指具有调入功能和置换功能，能从逻辑上对内存容量进行扩充的一种存储器系统&lt;/p&gt;
&lt;h3&gt;2、局部性原理是什么？什么是时间局限性，什么是空间局限性？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;局部性原理&lt;/strong&gt;是指程序在执行时呈现出局部性规律，即在一段时间内，整个程序的执行仅限于程序中的某一部分。相应地，执行所访问的存储空间也局限于某个内存区域。局部性原理又表现为：时间局部性和空间局部性。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;时间局部性&lt;/strong&gt;是指如果程序中的某条指令一旦执行，则不久之后该指令可能再次被执行；如果某数据被访问，则不久之后该数据可能再次被访问。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;空间局部性&lt;/strong&gt;是指一旦程序访问了某个存储单元，则不久之后，其附近的存储单元也将被访问&lt;/p&gt;
&lt;h3&gt;3、什么是系统抖动？&lt;/h3&gt;
&lt;p&gt;系统抖动是指在请求分页存储管理中，从主存中刚刚换出某一页面，根据请求马上又换入该页，这种反复换出换入的现象叫系统抖动&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate></item><item><title>磁盘存储器的管理</title><link>https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%85%AB-%E7%A3%81%E7%9B%98%E5%AD%98%E5%82%A8%E5%99%A8%E7%9A%84%E7%AE%A1%E7%90%86/</link><guid isPermaLink="true">https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%85%AB-%E7%A3%81%E7%9B%98%E5%AD%98%E5%82%A8%E5%99%A8%E7%9A%84%E7%AE%A1%E7%90%86/</guid><description>计算机操作系统学习笔记(八)</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%85%AB-%E7%A3%81%E7%9B%98%E5%AD%98%E5%82%A8%E5%99%A8%E7%9A%84%E7%AE%A1%E7%90%86/&quot;&gt;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%85%AB-%E7%A3%81%E7%9B%98%E5%AD%98%E5%82%A8%E5%99%A8%E7%9A%84%E7%AE%A1%E7%90%86/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;计算机操作系统学习笔记（八）-磁盘存储器的管理&lt;/h1&gt;
&lt;h2&gt;磁盘存储器的管理&lt;/h2&gt;
&lt;h3&gt;1、成组链接法的特点？&lt;/h3&gt;
&lt;p&gt;成组链接法是一种文件存储空间管理方法，它将空闲块分成若干组，每组的第一个空闲块登记了下一组空闲块的物理盘块号和空闲块总数。如果一组的第一个空闲块号等于0，则有特殊的含义，意味着该组是最后一组，即无下一个空闲块。成组链接法的优点是可以有效地降低问题的复杂度，提高问题的解决效率。通过将问题划分为若干个组，并对每个组内的元素进行排序和连接，可以将原本复杂的问题转化为简单的子问题，从而简化了问题的求解过程。&lt;/p&gt;
&lt;h2&gt;2、位示图法盘块如何定位，举例说明&lt;/h2&gt;
&lt;p&gt;位示图法是一种文件存储空间管理方法，用于记录磁盘中的空闲块和已分配块的使用情况。在位示图法中，每个盘块都有一个二进制位与之对应，这样，由所有盘块所对应的位构成一个集合，称为位示图。当其值为“0”时，表示对应的盘块空闲；为“1”时，表示已经分配。盘块的分配过程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;顺序扫描位示图，找到一个或一组代表空闲盘块的二进制位（如果是0代表空闲盘块就找0，如果1代表空闲盘块就找1）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;将所找到的一个或一组二进制位的行号和列号转换成相应的盘块号。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;将位示图对应的一个或一组二进制位修改为代表已分配盘块的二进制位（如果1代表已分配，就修改为1，如果0代表已分配，就修改为0）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;盘块的回收过程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;将要回收的盘块号转换成对应的行号和列号。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;修改位示图，令对应的二进制位为代表空闲盘块的二进制位（如果0代表空闲盘块就修改为0，如果1代表空闲盘块就修改为1）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3、FAT12、FAT16、FAT32技术能够管理的盘块数量和磁盘空间大小的换算，试举例说明&lt;/h3&gt;
&lt;p&gt;FAT12、FAT16和FAT32是三种常见的文件系统，它们都使用了FAT表来管理磁盘空间。FAT12适用于小容量的磁盘，FAT16适用于中等容量的磁盘，而FAT32适用于大容量的磁盘。下面是它们能够管理的盘块数量和磁盘空间大小的换算123:&lt;/p&gt;
&lt;p&gt;FAT12：最大容量为32MB，最大盘块数为4084个。&lt;/p&gt;
&lt;p&gt;FAT16：最大容量为2GB，最大盘块数为65536个。&lt;/p&gt;
&lt;p&gt;FAT32：最大容量为2TB，最大盘块数为268435456个。&lt;/p&gt;
&lt;p&gt;如果需要将盘块数量转换为磁盘空间大小，可以使用以下公式：&lt;/p&gt;
&lt;p&gt;对于FAT12和FAT16：磁盘空间大小 = 盘块数量 × 盘块大小&lt;/p&gt;
&lt;p&gt;对于FAT32：磁盘空间大小 = 盘块数量 × 4KB&lt;/p&gt;
&lt;p&gt;其中，盘块大小为512字节。&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate></item><item><title>存储器管理</title><link>https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%9B%9B-%E5%AD%98%E5%82%A8%E5%99%A8%E7%AE%A1%E7%90%86/</link><guid isPermaLink="true">https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%9B%9B-%E5%AD%98%E5%82%A8%E5%99%A8%E7%AE%A1%E7%90%86/</guid><description>计算机操作系统学习笔记(四)</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%9B%9B-%E5%AD%98%E5%82%A8%E5%99%A8%E7%AE%A1%E7%90%86/&quot;&gt;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%9B%9B-%E5%AD%98%E5%82%A8%E5%99%A8%E7%AE%A1%E7%90%86/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;计算机操作系统学习笔记（四）-存储器管理&lt;/h1&gt;
&lt;h2&gt;存储器管理&lt;/h2&gt;
&lt;h3&gt;1、分页存储中页、块、页表、快表定义是什么？在地址变换过程中的作用；&lt;/h3&gt;
&lt;p&gt;分页存储是操作系统中的一种内存管理方式。在分页存储中，物理内存被划分为大小固定的块，即页面。每个页面都有自己的页号和页长，页内地址是相对地址。每个进程的地址空间被分成若干逻辑段，每段又被划分成若干大小固定的页。页表记录了每个页在内存中的起始位置（又称“基址”）和页的长度。快表是存放在高速缓存存储器中的部分页表，用于加速地址变换过程，减少直接访问主存的次数。下面是它们的定义和作用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;页：将用户进程的（逻辑）地址空间划分为固定且大小相等的一个个区域。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;块：物理内存被划分为大小固定的块，即页面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;页表：记录了每个页在内存中的起始位置（又称“基址”）和页的长度，用于实现逻辑地址到物理地址的映射关系。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;快表：存放在高速缓存存储器中的部分页表，用于加速地址变换过程，减少直接访问主存的次数。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在地址变换过程中，页表和快表的作用如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;页表：在用动态重定位方式装入作业时，利用页表做地址转换工作。当CPU访问一个逻辑地址时，通过页表将逻辑地址转换为物理地址。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;快表：存放最近访问的页所对应的页框号，用于加速地址变换过程，减少直接访问主存的次数。当CPU访问一个逻辑地址时，先在快表中查找，如果找到则直接得到物理地址；否则再在页表中查找，得到物理地址后将其存入快表中，以便下次访问时直接得到物理地址。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2、分段与分页存储的对比有什么差异？&lt;/h3&gt;
&lt;p&gt;分段和分页是操作系统中的两种内存管理方式。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;分页存储的&lt;strong&gt;页是物理单位&lt;/strong&gt;，分页存储是离散型分配；分段存储中的&lt;strong&gt;段是信息的逻辑单位&lt;/strong&gt;，通常包含一组相对完整的信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;分段是将程序分为若干个段，&lt;strong&gt;每个段的大小不固定&lt;/strong&gt;，逻辑上连续的地址空间被划分为一个个段，每个段都有自己的段号和段长，段内地址是相对地址。分页是将程序分为若干个页，每&lt;strong&gt;个页的大小固定&lt;/strong&gt;，物理上不连续的地址空间被划分为一个个页，每个页都有自己的页号和页长，页内地址是相对地址。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;分段的作业地址空间是&lt;strong&gt;二维&lt;/strong&gt;的，在标识一个地址时，既需给出段名，又需给出段内地址；分页的作业地址空间&lt;strong&gt;是一维&lt;/strong&gt;的，只须利用一个记忆符，即可表示一地址。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;分段的优点是能够更好地实现信息的共享，因为段的大小不固定，可以根据需要动态地分配内存，而且段表比页表短，可以缩短查找时间，提高访问速度；&lt;/p&gt;
&lt;p&gt;分页的优点是能够更好地利用内存，因为页的大小固定，不会产生外碎片，更有效地利用了内存，但会产生一些内碎片，即分配给进程的最后一个页往往不能正好用完。&lt;/p&gt;
&lt;h3&gt;3、分段的地址结构是1维的吗？段的大小是否必须相等？&lt;/h3&gt;
&lt;p&gt;分段是操作系统中的一种内存管理方式，其地址结构是&lt;strong&gt;二维的&lt;/strong&gt;。程序员在标识一个地址时，既需给出段名，又需给出段内地址。&lt;strong&gt;段的大小不必相等&lt;/strong&gt;，可以根据需要动态地分配内存。&lt;/p&gt;
&lt;h3&gt;4、段页式存储管理中，物理内存是被划分为段，还是被划分为块来分配？&lt;/h3&gt;
&lt;p&gt;段页式存储管理中，物理内存是被划分为&lt;strong&gt;块&lt;/strong&gt;来分配。在段页式存储管理中，一个进程的地址空间首先被分成若干逻辑段，每段都有自己的段号，然后再将每一段划分成若干大小固定的页。对内存空间的管理仍然和分页存储管理一样，将其分成若干和页面大小相同的存储块，&lt;em&gt;&lt;strong&gt;对内存的分配以存储块为单位&lt;/strong&gt;&lt;/em&gt;。因此，物理内存是被划分为块，而不是被划分为段来分配。&lt;/p&gt;
&lt;h3&gt;5、已知某分页系统，主存容量为128KB，分成64块，对一个4页大的作业，其0、1、2、3页分别被分配到主存的2、5、7、11块中。该系统的分页大小为多少？作业的总长度是多少？将逻辑地址2023、5500转换成物理地址是多少？&lt;/h3&gt;
&lt;p&gt;该分页系统的分页大小为 &lt;strong&gt;2KB&lt;/strong&gt;。作业的总长度为 &lt;strong&gt;16KB&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;逻辑地址2023转换成物理地址得到 &lt;strong&gt;11019&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;将逻辑地址5500转换成物理地址得到 &lt;strong&gt;28676&lt;/strong&gt;&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate></item><item><title>输入输出系统</title><link>https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%85%AD-%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%B3%BB%E7%BB%9F/</link><guid isPermaLink="true">https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%85%AD-%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%B3%BB%E7%BB%9F/</guid><description>计算机操作系统学习笔记(六)</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%85%AD-%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%B3%BB%E7%BB%9F/&quot;&gt;https://bigwind.cn/blog/computer/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%85%AD-%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%B3%BB%E7%BB%9F/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;计算机操作系统学习笔记（六）-输入输出系统&lt;/h1&gt;
&lt;h2&gt;输入输出系统&lt;/h2&gt;
&lt;h3&gt;1、什么是字符设备，什么是块设备，试举例常见的字符设备和块设备&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;字符设备&lt;/strong&gt;是一种按字符流的方式被有序访问的设备，例如键盘和串口。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;块设备&lt;/strong&gt;是一种可以随机访问固定大小数据片（chunks）的设备，例如硬盘、软盘驱动器、CD-ROM驱动器和闪存等等许多其他块设备.&lt;/p&gt;
&lt;p&gt;下面是一些常见的字符设备和块设备：&lt;/p&gt;
&lt;p&gt;字符设备：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;键盘&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;鼠标&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;串口&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;声卡&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;打印机&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;块设备：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;硬盘&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;固态硬盘&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;U盘&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CD-ROM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DVD-ROM&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2、I/O的基本控制方式由那些，各有什么特点？&lt;/h3&gt;
&lt;p&gt;I/O的基本控制方式有四种：使用轮询的可编程IO方式、使用中断的可编程IO方式、DMA（直接存储器访问）方式和通道控制方式.&lt;/p&gt;
&lt;p&gt;这些方式各有不同的特点：&lt;/p&gt;
&lt;p&gt;使用轮询的可编程IO方式：CPU需要不断地测试I/O设备的状态，造成了CPU资源的极大浪费。CPU和I/O设备只能串行化工作，CPU利用率很低。&lt;/p&gt;
&lt;p&gt;使用中断的可编程IO方式：I/O控制器会通过中断信号主动报告I/O已完成，CPU不再需要不停的轮询。CPU和I/O设备可并行工作，CPU利用率得到明显提升。&lt;/p&gt;
&lt;p&gt;DMA方式：数据传输效率以“块”为单位，仅在传送一个或多个数据块的开始和结束时，才需要CPU的干预，CPU的介入性进一步降低。CPU和I/O设备的并行性进一步提升。&lt;/p&gt;
&lt;p&gt;通道控制方式：CPU、通道、I/O设备可并行工作，资源利用率极高。实现复杂，需要专门的通道硬件支持。&lt;/p&gt;
&lt;h3&gt;3、什么是设备独立性，虚拟设备、逻辑设备，物理设备的概念是什么？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;设备独立性&lt;/strong&gt;是指应用程序独立于具体使用的物理设备。为了实现设备独立性，引入了逻辑设备和物理设备这两个概念。在应用程序中，使用逻辑设备名称来请求使用某类设备；而系统在实际执行时，还必须使用物理设备名称。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;逻辑设备&lt;/strong&gt;是指应用程序中使用的设备名称&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;物理设备&lt;/strong&gt;是指实际的硬件设备&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;虚拟设备&lt;/strong&gt;是指由操作系统模拟出来的设备，例如虚拟内存、虚拟磁盘等。&lt;/p&gt;
&lt;h3&gt;4、SPOOLing系统的概念，其组成是什么？&lt;/h3&gt;
&lt;p&gt;SPOOLing系统是一种&lt;strong&gt;假脱机&lt;/strong&gt;系统，它可以在联机的情况下实现外围操作。&lt;/p&gt;
&lt;p&gt;SPOOLing系统由以下几个部分&lt;strong&gt;组成&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;输入井和输出井&lt;/strong&gt;：输入井和输出井的存储区域是在磁盘上开辟出来的。输入输出井中的数据一般以文件的形式组织管理，这些文件称之为井文件。一个文件仅存放某一个进程的输入或输出数据，所有进程的数据输入或输出文件链接成一个输入输出队列。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;输入缓存区和输出缓存区&lt;/strong&gt;：输入缓冲区和输出缓冲区的存储区域是在内存中开辟出来的。主要用于缓和CPU和磁盘之间速度不匹配的矛盾。输入缓冲区用于暂存有输入设备传送的数据，之后再传送到输入井；输出缓冲区同理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;输入进程和输出进程&lt;/strong&gt;：输入进程也称为预输入进程，用于模拟脱机输入时的外围控制机，将用户要求的数据从输入设备传送到输入缓冲区，再放到输入井。当CPU需要的时候，直接从输入井将数据读入内存。反之，输出的同理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;井管理程序&lt;/strong&gt;：用于控制作业与磁盘井之间信息的交换。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;5、设备从磁盘驱动器中读出一块数据主要由那几步时间花销构成？&lt;/h3&gt;
&lt;p&gt;设备从磁盘驱动器中读出一块数据主要由以下&lt;strong&gt;三个步骤&lt;/strong&gt;构成:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;寻道时间&lt;/strong&gt;：磁头移动到指定磁道所需的时间。寻道时间包括启动磁臂的时间和磁头移动n条磁道所花费的时间之和。寻道时间是磁盘读写数据所花费的时间中最长的部分。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;旋转延迟时间&lt;/strong&gt;：指定扇区移动到磁头下面所经历的时间。旋转延迟时间取决于磁盘的转速，通常为4-12毫秒。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;传输时间&lt;/strong&gt;：从磁盘读出或将数据写入磁盘的时间。传输时间取决于数据传输速率和数据块大小。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6、假定当前磁头在100号磁道上，并正在由里向外移动，目前有下面的请求访问磁盘磁道的序列：79、58、110、138、65、148、18、45。请写出：（1）用最短寻道时间优先（SSTF），电梯算法、循环扫描、先来先服务等算法，列出响应的磁道次序，并计算平均寻道长度。&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;最短寻道时间优先算法（SSTF）的响应磁道次序：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;79&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;65&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;58&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;45&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;110&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;138&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;148&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;平均寻道长度为：&lt;strong&gt;34.875&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;循环扫描算法的响应磁道次序：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;110&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;138&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;148&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;45&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;58&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;65&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;79&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;平均寻道长度为：&lt;strong&gt;33.375&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;电梯算法的响应磁道次序：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;79&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;58&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;45&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;65&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;110&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;138&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;148&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;平均寻道长度为：&lt;strong&gt;34.375&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;先来先服务算法的响应磁道次序：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;79&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;58&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;110&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;138&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;65&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;148&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;45&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;平均寻道长度为：&lt;strong&gt;34.25&lt;/strong&gt;&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate></item><item><title>Git 如何将fork的GitHub项目与原项目同步极客教程</title><link>https://bigwind.cn/blog/tutorial/git-%E5%A6%82%E4%BD%95%E5%B0%86fork%E7%9A%84github%E9%A1%B9%E7%9B%AE%E4%B8%8E%E5%8E%9F%E9%A1%B9%E7%9B%AE%E5%90%8C%E6%AD%A5%E6%9E%81%E5%AE%A2%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://bigwind.cn/blog/tutorial/git-%E5%A6%82%E4%BD%95%E5%B0%86fork%E7%9A%84github%E9%A1%B9%E7%9B%AE%E4%B8%8E%E5%8E%9F%E9%A1%B9%E7%9B%AE%E5%90%8C%E6%AD%A5%E6%9E%81%E5%AE%A2%E6%95%99%E7%A8%8B/</guid><description>git</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/tutorial/git-%E5%A6%82%E4%BD%95%E5%B0%86fork%E7%9A%84github%E9%A1%B9%E7%9B%AE%E4%B8%8E%E5%8E%9F%E9%A1%B9%E7%9B%AE%E5%90%8C%E6%AD%A5%E6%9E%81%E5%AE%A2%E6%95%99%E7%A8%8B/&quot;&gt;https://bigwind.cn/blog/tutorial/git-%E5%A6%82%E4%BD%95%E5%B0%86fork%E7%9A%84github%E9%A1%B9%E7%9B%AE%E4%B8%8E%E5%8E%9F%E9%A1%B9%E7%9B%AE%E5%90%8C%E6%AD%A5%E6%9E%81%E5%AE%A2%E6%95%99%E7%A8%8B/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;Git 如何将fork的GitHub项目与原项目同步&lt;/h2&gt;
&lt;p&gt;在本文中，我们将介绍如何使用Git将fork的GitHub项目与原项目进行同步。当我们在GitHub上fork一个项目后，我们可以通过同步操作来跟踪和合并原项目的更新。这样我们就能保持我们fork出来的项目与原项目保持同步，同时还能享受到原项目的更新和改进。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;阅读更多：&lt;a href=&quot;https://geek-docs.com/git&quot;&gt;Git 教程&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;1. 配置远程仓库&lt;/h2&gt;
&lt;p&gt;首先，我们需要配置本地仓库与fork的远程仓库和原项目的远程仓库的连接。在命令行中进入本地仓库所在的目录，并执行以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Bash&quot;&gt;git remote -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这会列出本地仓库当前配置的远程仓库。通常情况下，我们会看到两个远程仓库，一个是fork的远程仓库（origin），另一个是原项目的远程仓库（upstream）。&lt;/p&gt;
&lt;p&gt;如果我们没有配置原项目的远程仓库，我们可以通过以下 &amp;lt;原项目仓库的URL&amp;gt;&lt;/p&gt;
&lt;p&gt;这样，我们就成功地配置了本地仓库与原项目的远程仓库的链接。&lt;/p&gt;
&lt;h2&gt;2. 同步原项目的更新&lt;/h2&gt;
&lt;p&gt;当原项目有新的更新时，我们需要将这些更新同步到我们自己的forked项目中。以下是同步的步骤：&lt;/p&gt;
&lt;h3&gt;步骤1：拉取原项目的更新&lt;/h3&gt;
&lt;p&gt;这个命令会从原项目的远程仓库中获取最新的更新。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git fetch upstream
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;步骤2：切换到主分支&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确保我们在主分支上进行同步操作。&lt;/p&gt;
&lt;h3&gt;步骤3：合并更新&lt;/h3&gt;
&lt;p&gt;这个命令会将原项目的更新与我们自己的forked项目进行合并。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git merge upstream/master
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;步骤4：推送到forked远程仓库&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将合并后的更新推送到我们自己的forked远程仓库。&lt;/p&gt;
&lt;h2&gt;3. 同步我们的forked项目&lt;/h2&gt;
&lt;p&gt;在我们将原项目的更新同步到我们自己的forked项目后，我们也可能在我们自己的forked项目中进行了一些修改。接下来，我们将学习如何将我们自己的修改同步回原项目。&lt;/p&gt;
&lt;h3&gt;步骤1：切换到主分支&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确保我们在主分支上进行同步操作。&lt;/p&gt;
&lt;h3&gt;步骤2：拉取forked项目的更新&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git pull origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个命令将获取我们自己的forked项目的最新更新。&lt;/p&gt;
&lt;h3&gt;步骤3：推送到原项目的远程仓库&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push upstream master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过这个命令，我们将修改推送到原项目的远程仓库。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过Git，我们可以方便地将fork的GitHub项目与原项目进行同步。配置远程仓库，拉取原项目的更新，合并更新，推送到我们自己的forked项目，以及将我们自己的修改同步回原项目，是同步forked项目与原项目的基本步骤。掌握这些技巧，可以使我们更好地跟踪和合并原项目的更新，同时还能将我们自己的修改和改进回馈到原项目中。通过这样的同步操作，我们可以更好地参与到开源项目中，为其发展做出贡献。&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate></item><item><title>在HBuilderX中添加Yarn npm pnpm命令</title><link>https://bigwind.cn/blog/web/add-yarn-npm-and-pnpm-commands-in-hbuilderx/</link><guid isPermaLink="true">https://bigwind.cn/blog/web/add-yarn-npm-and-pnpm-commands-in-hbuilderx/</guid><description>为避坑而生的教程</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/web/add-yarn-npm-and-pnpm-commands-in-hbuilderx/&quot;&gt;https://bigwind.cn/blog/web/add-yarn-npm-and-pnpm-commands-in-hbuilderx/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;在HBuilderX中添加Yarn/npm/pnpm命令&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;首先，确保你已经正确安装了Yarn。如果还没有安装，你可以从Yarn官方网站下载对应的安装包，并按照提示进行安装。安装完成后，可以在终端或命令提示符窗口运行&lt;code&gt;yarn --version&lt;/code&gt;命令，如果成功显示Yarn的版本号，说明安装成功。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/07/028179ab45a5ad848e5158b6cbab22a7.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;接下来，在HBuilderX中添加Yarn的外部命令。打开HBuilderX，在菜单栏中选择“工具”-&amp;quot;外部命令&amp;quot;-&amp;quot;自定义外部命令&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/07/e2b8d2df0d365b82e4ea32505699b775.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在&amp;quot;用户设置&amp;quot;窗口中添加如下命令代码，保存配置。这样，HBuilderX就会有Yarn作为外部命令。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/07/7f6de3b6fca8a40a9d17eac7b849e829.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;[
 {
        &amp;quot;name&amp;quot;:&amp;quot;Yarn install&amp;quot;,
        &amp;quot;command&amp;quot;:&amp;quot;yarn install&amp;quot;,
        &amp;quot;type&amp;quot;: &amp;quot;terminal&amp;quot;,
        &amp;quot;workingDir&amp;quot; : &amp;quot;${projectDir}&amp;quot;
    },
    {
           &amp;quot;name&amp;quot;:&amp;quot;Yarn run dev&amp;quot;,
           &amp;quot;command&amp;quot;:&amp;quot;yarn run dev&amp;quot;,
           &amp;quot;type&amp;quot;: &amp;quot;terminal&amp;quot;,
            &amp;quot;workingDir&amp;quot; : &amp;quot;${projectDir}&amp;quot;
       },
    {
           &amp;quot;name&amp;quot;:&amp;quot;Yarn run build:prod&amp;quot;,
           &amp;quot;command&amp;quot;:&amp;quot;yarn run build:prod&amp;quot;,
           &amp;quot;type&amp;quot;: &amp;quot;terminal&amp;quot;,
            &amp;quot;workingDir&amp;quot; : &amp;quot;${projectDir}&amp;quot;
       }   
]
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在项目中测试配置是否生效。自己打开或者新建一个项目，先使用yarn install 再使用yarn run dev 命令&lt;/p&gt;
&lt;img title=&quot;&quot; src=&quot;https://my-img.bigwind.cn/img/2024/07/acec247c7f7e1bdd711e23cc3f8df022.png&quot; alt=&quot;&quot; width=&quot;409&quot; data-align=&quot;center&quot;&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;看到项目运行成功，web网页链接出现&lt;/p&gt;
&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/07/454c019389ea2ffcd3e33643e0ac1a85.png&quot; title=&quot;&quot; alt=&quot;&quot; data-align=&quot;inline&quot;&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;其他yarn命令或pnpm命令可自行配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PS: 网上一堆关于HbulidX的教程害人不浅，最终决定自己写一个&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate></item><item><title>Windows搭建Typecho个人博客并发布公网访问【内网穿透】</title><link>https://bigwind.cn/blog/web/windows%E6%90%AD%E5%BB%BAtypecho%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%B9%B6%E5%8F%91%E5%B8%83%E5%85%AC%E7%BD%91%E8%AE%BF%E9%97%AE%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/</link><guid isPermaLink="true">https://bigwind.cn/blog/web/windows%E6%90%AD%E5%BB%BAtypecho%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%B9%B6%E5%8F%91%E5%B8%83%E5%85%AC%E7%BD%91%E8%AE%BF%E9%97%AE%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/</guid><description>Windows搭建Typecho个人博客并发布公网访问【内网穿透】</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/web/windows%E6%90%AD%E5%BB%BAtypecho%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%B9%B6%E5%8F%91%E5%B8%83%E5%85%AC%E7%BD%91%E8%AE%BF%E9%97%AE%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/&quot;&gt;https://bigwind.cn/blog/web/windows%E6%90%AD%E5%BB%BAtypecho%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%B9%B6%E5%8F%91%E5%B8%83%E5%85%AC%E7%BD%91%E8%AE%BF%E9%97%AE%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Typecho是一款PHP语言编写的开源博客程序，它是一个轻量级的内容管理系统，专注于博客领域。支持多用户、多站点、多语言等功能，可以满足不同用户的需求。&lt;/p&gt;
&lt;p&gt;同时，Typecho还有丰富的插件和模板资源，用户可以根据自己的需要自由选择和配置。&lt;/p&gt;
&lt;p&gt;Typecho的安装非常简单，用户只需要将Typecho的安装包上传到自己的服务器上，然后通过浏览器访问相应的URL进行安装即可。&lt;/p&gt;
&lt;p&gt;cpolar内网穿透工具主要是将本地端口转发到公网环境,通过此工具我们很容易将本地服务转发到公网.&lt;/p&gt;
&lt;p&gt;下面介绍在windwos系统搭建typecho博客+cpolar内网穿透工具将博客发布到公共网络环境,实现远程也可以访问和操作。&lt;/p&gt;
&lt;h2&gt;1. 环境安装&lt;/h2&gt;
&lt;p&gt;Typecho博客是PHP语言写的,运行它需要安装一系列环境,如PHP,数据库和运行web容器等,为了方便搭建那些环境,我们使用一个第三方工具XAMPP,这个工具集成了我们所需的工具环境,一键即可安装,减少了繁琐的配置,这是下载地址:&lt;a href=&quot;https://www.apachefriends.org/&quot;&gt;https://www.apachefriends.org/&lt;/a&gt;,我们选择windwos版本安装.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324105521061.png&quot; alt=&quot;image-20230324105521061&quot;&gt;&lt;/p&gt;
&lt;p&gt;安装时候点击next即可,安装路径可以自定义设置,安装后,我们打开,点击界面启动apache测试:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324142239632.png&quot; alt=&quot;image-20230324142239632&quot;&gt;&lt;/p&gt;
&lt;p&gt;启动服务后,在浏览器输入localhost:80,即可看到apache的欢迎页面,然后停止Apache&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324142304127.png&quot; alt=&quot;image-20230324142304127&quot;&gt;&lt;/p&gt;
&lt;h2&gt;2.安装Typecho&lt;/h2&gt;
&lt;p&gt;进入&lt;a href=&quot;https://typecho.org/download&quot;&gt;Typecho&lt;/a&gt; 官网下载,&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230323151443954.png&quot; alt=&quot;image-20230323151443954&quot;&gt;&lt;/p&gt;
&lt;p&gt;下载好后,我们找一个叫htdocs的文件夹,这个文件夹就是apache的web访问目录,点击XAMPP右边Explorer&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324142559609.png&quot; alt=&quot;image-20230324142559609&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后找到htdocs文件夹&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324142720598.png&quot; alt=&quot;image-20230324142720598&quot;&gt;&lt;/p&gt;
&lt;p&gt;先把htdocs里面的文件全部删除,我们把Typecho的压缩包解压到htdocs的文件夹下.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324142858480.png&quot; alt=&quot;image-20230324142858480&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后我们再次启动apache,在浏览器输入localhost:80,自动跳转到了typecho页面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324143027486.png&quot; alt=&quot;image-20230324143027486&quot;&gt;&lt;/p&gt;
&lt;h2&gt;3.安装cpolar内网穿透&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;cpolar官网：&lt;a href=&quot;https://www.cpolar.com/&quot;&gt;https://www.cpolar.com/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;访问cpolar官网，注册一个账号，然后下载并安装客户端，具体安装教程可以参考官网文档教程。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;windows系统：在官网下载安装包后，双击安装包一路默认安装即可。&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;linux系统：支持一键自动安装脚本，详细请参考官网文档——&lt;a href=&quot;https://www.cpolar.com/docs&quot;&gt;入门指南&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com/img/-Synology20230130105715.png&quot; alt=&quot;20230130105715&quot;&gt;&lt;/p&gt;
&lt;p&gt;cpolar安装成功后，在浏览器上访问本地9200端口【&lt;a href=&quot;http://localhost:9200/&quot;&gt;http://localhost:9200&lt;/a&gt;】，使用cpolar账号登录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com/img/-Synology20230130105810.png&quot; alt=&quot;20230130105810&quot;&gt;&lt;/p&gt;
&lt;p&gt;点击左侧仪表盘的隧道管理——创建隧道，创建一个80端口 http隧道,即Apache 的端口&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;隧道名称：可自定义命名，注意不要与已有的隧道名称重复&lt;/li&gt;
&lt;li&gt;协议：选择http&lt;/li&gt;
&lt;li&gt;本地地址：80&lt;/li&gt;
&lt;li&gt;域名类型：免费选择随机域名&lt;/li&gt;
&lt;li&gt;地区：选择China vip&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;点击&lt;code&gt;创建&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324144017545.png&quot; alt=&quot;image-20230324144017545&quot;&gt;&lt;/p&gt;
&lt;p&gt;隧道创建成功后，点击左侧的状态——在线隧道列表,查看所生成的公网地址，然后复制地址&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324144047261.png&quot; alt=&quot;image-20230324144047261&quot;&gt;&lt;/p&gt;
&lt;p&gt;打开浏览器,使用上面公网地址进行连访问,即可看到typecho博客欢迎页,此时即可使用公网地址进行远程访问&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324144153374.png&quot; alt=&quot;image-20230324144153374&quot;&gt;&lt;/p&gt;
&lt;h2&gt;4. 固定公网地址&lt;/h2&gt;
&lt;p&gt;由于以上使用cpolar所创建的隧道使用的是随机公网地址，24小时内会随机变化，不利于长期远程访问。因此我们可以为其配置二级子域名，该地址为固定地址，不会随机变化【ps：cpolar.cn已备案】&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意需要将cpolar套餐升级至基础套餐或以上，且每个套餐对应的带宽不一样。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;登录cpolar官网，点击左侧的预留，选择保留二级子域名，设置一个二级子域名名称，点击保留,保留成功后复制保留的二级子域名名称&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324144519095.png&quot; alt=&quot;image-20230324144519095&quot;&gt;&lt;/p&gt;
&lt;p&gt;保留成功后复制保留的二级子域名地址&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324144553685.png&quot; alt=&quot;image-20230324144553685&quot;&gt;&lt;/p&gt;
&lt;p&gt;访问&lt;a href=&quot;http://127.0.0.1:9200/%EF%BC%8C%E7%99%BB%E5%BD%95cpolar&quot;&gt;http://127.0.0.1:9200/，登录cpolar&lt;/a&gt; web UI管理界面，点击左侧仪表盘的隧道管理——隧道列表，找到所要配置的80端口隧道，点击右侧的编辑&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324144621225.png&quot; alt=&quot;image-20230324144621225&quot;&gt;&lt;/p&gt;
&lt;p&gt;修改隧道信息，将保留成功的二级子域名配置到隧道中&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;域名类型：选择二级子域名&lt;/li&gt;
&lt;li&gt;Sub Domain：填写保留成功的二级子域名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;点击&lt;code&gt;更新&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324144704784.png&quot; alt=&quot;image-20230324144704784&quot;&gt;&lt;/p&gt;
&lt;p&gt;更新完成后,打开在线隧道列表,此时可以看到公网地址已经发生变化,地址名称也变成了保留过的二级子域名名称,将其复制下来&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324144934391.png&quot; alt=&quot;image-20230324144934391&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后使用固定https地址打开浏览器访问,同样访问成功,且域名不会发生变化,然后下面typecho继续配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324144958466.png&quot; alt=&quot;image-20230324144958466&quot;&gt;&lt;/p&gt;
&lt;h2&gt;5.配置Typecho&lt;/h2&gt;
&lt;p&gt;点击开始下一步,然后出现数据库配置,&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324145214179.png&quot; alt=&quot;image-20230324145214179&quot;&gt;&lt;/p&gt;
&lt;p&gt;在XAMPP启动数据库&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324150333142.png&quot; alt=&quot;image-20230324150333142&quot;&gt;&lt;/p&gt;
&lt;p&gt;启动后,点击Admin,进入数据库管理界面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324151450974.png&quot; alt=&quot;image-20230324151450974&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后我们添加一个数据库,名字叫”typecho”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324152919471.png&quot; alt=&quot;image-20230324152919471&quot;&gt;&lt;/p&gt;
&lt;p&gt;创建好后,我们打开typecho数据库设置页面,填写参数,由于是本地数据库,没有设置密码,所以我们不需要填写密码,填写好后我们确认开始安装&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324153133053.png&quot; alt=&quot;image-20230324153133053&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后,到了设置用户名和密码页面,还有一个邮箱信息,设置完后,点击继续安装&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324153418156.png&quot; alt=&quot;image-20230324153418156&quot;&gt;&lt;/p&gt;
&lt;p&gt;安装成功,在页面显示了登陆用户名和密码,然后点击用户名和密码下面的字样访问控制面板&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324153542071.png&quot; alt=&quot;image-20230324153542071&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后配置完成,即可愉快写文章啦,且支持远程访问&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.cpolar.com//img/image-20230324153725747.png&quot; alt=&quot;image-20230324153725747&quot;&gt;&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate></item><item><title>How to customize code box</title><link>https://bigwind.cn/blog/tutorial/how-to-customize-code-box/</link><guid isPermaLink="true">https://bigwind.cn/blog/tutorial/how-to-customize-code-box/</guid><description>Modify the code box style</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/tutorial/how-to-customize-code-box/&quot;&gt;https://bigwind.cn/blog/tutorial/how-to-customize-code-box/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../../components/mdx/Collapse.astro&amp;quot;;
import Diff from &amp;quot;../../../components/mdx/Diff.astro&amp;quot;;
import Error from &amp;quot;../../../components/mdx/Error.astro&amp;quot;;
import Info from &amp;quot;../../../components/mdx/Info.astro&amp;quot;;
import Kbd from &amp;quot;../../../components/mdx/Kbd.astro&amp;quot;;
import Success from &amp;quot;../../../components/mdx/Success.astro&amp;quot;;
import Warning from &amp;quot;../../../components/mdx/Warning.astro&amp;quot;;
import TimeLine from &amp;quot;../../../components/mdx/TimeLine.astro&amp;quot;;
import LinkCard from &amp;quot;../../../components/mdx/LinkCard.astro&amp;quot;;&lt;/p&gt;
&lt;h2&gt;添加行号&lt;/h2&gt;
&lt;Warning&gt;
  此方法仅在 `Shiki` 中可用， `Prism` 无法通过 CSS 直接生成行号。
&lt;/Warning&gt;

&lt;p&gt;&lt;Info&gt;在 &lt;code&gt;v2.2.1&lt;/code&gt; 更新后默认添加行号。&lt;/Info&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;src\styles\global.scss&lt;/code&gt; 中添加以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-scss&quot;&gt;pre .line {
  counter-increment: line;
  padding-left: 2.5em;
}

pre :not(:last-child).line::before {
  content: counter(line);
  position: absolute;
  left: 0;
  width: 3em;
  text-align: right;
  margin-right: 10px;
  color: #888;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;改变主题&lt;/h2&gt;
&lt;p&gt;Frosti 使用 &lt;code&gt;Shiki&lt;/code&gt; 来渲染代码框， &lt;code&gt;Shiki&lt;/code&gt; 已经提供了足够多的主题，不推荐使用 &lt;code&gt;Prism&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;有关于 &lt;code&gt;Shiki&lt;/code&gt; 的主题详见：&lt;a href=&quot;https://shiki.style/themes&quot;&gt;https://shiki.style/themes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 中修改内容：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;markdown: {
  shikiConfig: {
    themes: {
      light: &amp;#39;github-light&amp;#39;,
      dark: &amp;#39;github-dark&amp;#39;,
    },
  },
},
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Thu, 18 Jul 2024 00:00:00 GMT</pubDate></item><item><title>Using mdx in Frosti</title><link>https://bigwind.cn/blog/frosti-mdx/</link><guid isPermaLink="true">https://bigwind.cn/blog/frosti-mdx/</guid><description>Using MDX in Frosti to enrich article content with more components</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/frosti-mdx/&quot;&gt;https://bigwind.cn/blog/frosti-mdx/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../components/mdx/Collapse.astro&amp;quot;;
import Diff from &amp;quot;../../components/mdx/Diff.astro&amp;quot;;
import Error from &amp;quot;../../components/mdx/Error.astro&amp;quot;;
import Info from &amp;quot;../../components/mdx/Info.astro&amp;quot;;
import Kbd from &amp;quot;../../components/mdx/Kbd.astro&amp;quot;;
import Success from &amp;quot;../../components/mdx/Success.astro&amp;quot;;
import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;
import TimeLine from &amp;quot;../../components/mdx/TimeLine.astro&amp;quot;;
import LinkCard from &amp;quot;../../components/mdx/LinkCard.astro&amp;quot;;&lt;/p&gt;
&lt;h2&gt;Preface&lt;/h2&gt;
&lt;p&gt;This article describes how to use the components provided by Frosti in &lt;code&gt;mdx&lt;/code&gt; to realize the functions that can&amp;#39;t be realized by normal &lt;code&gt;md&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Main text&lt;/h2&gt;
&lt;h3&gt;Getting started&lt;/h3&gt;
&lt;p&gt;First you need to create an &lt;code&gt;mdx&lt;/code&gt; file, which is as simple as changing the extension to &lt;code&gt;.mdx&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Introducing&lt;/h3&gt;
&lt;p&gt;The components provided by Frosti are placed in the &lt;code&gt;/mdx&lt;/code&gt; folders. Write something under the document properties (frontmatter):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;import Collapse from &amp;quot;../../components/mdx/Collapse.astro&amp;quot;;
import Diff from &amp;quot;../../components/mdx/Diff.astro&amp;quot;;
import Error from &amp;quot;../../components/mdx/Error.astro&amp;quot;;
import Info from &amp;quot;../../components/mdx/Info.astro&amp;quot;;
import Kbd from &amp;quot;../../components/mdx/Kbd.astro&amp;quot;;
import Success from &amp;quot;../../components/mdx/Success.astro&amp;quot;;
import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;
import TimeLine from &amp;quot;../../components/mdx/TimeLine.astro&amp;quot;;
import LinkCard from &amp;quot;../../components/mdx/LinkCard.astro&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;h4&gt;Collapse&lt;/h4&gt;
&lt;Collapse title=&quot;This is an example text.&quot;&gt;
  This is the hidden content!
&lt;/Collapse&gt;

&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Collapse title=&amp;quot;This is an example text.&amp;quot;&amp;gt;
  This is the hidden content!
&amp;lt;/Collapse&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Diff&lt;/h4&gt;
&lt;Diff l=&quot;https://bigwind.cn/image/l.png&quot; r=&quot;https://bigwind.cn/image/r.png&quot; /&gt;

&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Diff l=&amp;quot;/image/l.png&amp;quot; r=&amp;quot;/image/r.png&amp;quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Error&lt;/h4&gt;
&lt;p&gt;&lt;Error&gt;Maybe something went wrong?&lt;/Error&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Error&amp;gt;Maybe something went wrong? &amp;lt;/Error&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Warning&lt;/h4&gt;
&lt;p&gt;&lt;Warning&gt;Hey! Watch out for potholes! &lt;/Warning&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Warning&amp;gt;Hey! Watch out for potholes! &amp;lt;/Warning&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Message&lt;/h4&gt;
&lt;p&gt;&lt;Info&gt;It&amp;#39;s just a message. &lt;/Info&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Info&amp;gt;It&amp;#39;s just a message. &amp;lt;/Info&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Success&lt;/h4&gt;
&lt;p&gt;&lt;Success&gt;Congratulations on your successful deployment! &lt;/Success&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Success&amp;gt;Congratulations on your successful deployment! &amp;lt;/Success&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Kbd&lt;/h4&gt;
&lt;p&gt;&lt;Kbd&gt;Ctrl&lt;/Kbd&gt; + &lt;Kbd&gt;C&lt;/Kbd&gt; to copy the text.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Kbd&amp;gt;Ctrl&amp;lt;/Kbd&amp;gt; + &amp;lt;Kbd&amp;gt;C&amp;lt;/Kbd&amp;gt; to copy the text.
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;TimeLine&lt;/h4&gt;
&lt;p&gt;&amp;lt;TimeLine
  items={[
    { year: &amp;quot;1984&amp;quot;, event: &amp;quot;First Macintosh computer&amp;quot; },
    { year: &amp;quot;1998&amp;quot;, event: &amp;quot;iMac&amp;quot; },
    { year: &amp;quot;2001&amp;quot;, event: &amp;quot;iPod&amp;quot; },
    { year: &amp;quot;2007&amp;quot;, event: &amp;quot;iPhone&amp;quot; },
    { year: &amp;quot;2015&amp;quot;, event: &amp;quot;Apple Watch&amp;quot; },
  ]}
/&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;TimeLine
  items={[
    { year: &amp;quot;1984&amp;quot;, event: &amp;quot;First Macintosh computer&amp;quot; },
    { year: &amp;quot;1998&amp;quot;, event: &amp;quot;iMac&amp;quot; },
    { year: &amp;quot;2001&amp;quot;, event: &amp;quot;iPod&amp;quot; },
    { year: &amp;quot;2007&amp;quot;, event: &amp;quot;iPhone&amp;quot; },
    { year: &amp;quot;2015&amp;quot;, event: &amp;quot;Apple Watch&amp;quot; },
  ]}
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;LinkCard&lt;/h4&gt;
&lt;p&gt;&lt;LinkCard
  title=&quot;Frosti&quot;
  desc=&quot;My blog project!&quot;
  url=&quot;https://github.com/EveSunMaple/Frosti&quot;
  img=&quot;https://bigwind.cn/logo.png&quot;
/&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;LinkCard
  title=&amp;quot;Frosti&amp;quot;
  desc=&amp;quot;My blog project!&amp;quot;
  url=&amp;quot;https://github.com/EveSunMaple/Frosti&amp;quot;
  img=&amp;quot;/logo.png&amp;quot;
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Fri, 12 Jul 2024 00:00:00 GMT</pubDate></item><item><title>PowerDesigner安装教程（含下载+汉化+去试用）</title><link>https://bigwind.cn/blog/tutorial/powerdesigner%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B%E5%90%AB%E4%B8%8B%E8%BD%BD%E6%B1%89%E5%8C%96%E5%8E%BB%E8%AF%95%E7%94%A8/</link><guid isPermaLink="true">https://bigwind.cn/blog/tutorial/powerdesigner%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B%E5%90%AB%E4%B8%8B%E8%BD%BD%E6%B1%89%E5%8C%96%E5%8E%BB%E8%AF%95%E7%94%A8/</guid><description>PowerDesigner安装教程（含下载+汉化+去试用）</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/tutorial/powerdesigner%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B%E5%90%AB%E4%B8%8B%E8%BD%BD%E6%B1%89%E5%8C%96%E5%8E%BB%E8%AF%95%E7%94%A8/&quot;&gt;https://bigwind.cn/blog/tutorial/powerdesigner%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B%E5%90%AB%E4%B8%8B%E8%BD%BD%E6%B1%89%E5%8C%96%E5%8E%BB%E8%AF%95%E7%94%A8/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;PowerDesigner安装教程（含下载+汉化+去试用）&lt;/h1&gt;
&lt;h3&gt;1.准备工作，下载安装包及其他文件&lt;/h3&gt;
&lt;h3&gt;2、PowerDesigner安装图文教程：&lt;/h3&gt;
&lt;p&gt;1、解压下载的压缩文件，进入解压文件夹，并双击PowerDesigner.exe；&lt;/p&gt;
&lt;p&gt;2、欢迎来到PowerDesigner安装界面，点击 Next；&lt;/p&gt;
&lt;p&gt;3.4、选择Hong Kong，点击I AGREE，再点击Next；&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/85a5e80d1e45842e8d655cc3cf2e59dd.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;5、选择一个安装目录，默认是安装在C盘。再点击Next；&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/84ddaf940746a060af39a2d1925454f0.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;6、这一步直接Next；&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/2d17fd0b0fe4612ae4ae32266bcc956d.png&quot; alt=&quot;&quot;&gt;点击General和Notaion，再点击Next；&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/05f7f1843c45f4484dd3e3ea4879634d.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;点击Next开始安装&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/591254ba495d0fd9d03bb5795f0411ad.png&quot; alt=&quot;&quot;&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/1d981284e769330a0a53df812e6c93e5.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/20a94fae9e0e13beebc84ce1488aa1ec.png&quot; alt=&quot;&quot;&gt;打开软件，点击help&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/2f3802760dec9593a1d06902da49ac52.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/31f739ae7470644ba9fb7a2e4d0ae298.png&quot; alt=&quot;&quot;&gt;可以看到试用期为15天&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/5f40a1d4b18df3d21d15272a9e609098.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;PowerDesigner破解步骤：&lt;/h3&gt;
&lt;p&gt;1、先关闭软件，进入刚才的解压文件夹，将“PowerDesigner破解文件”文件夹下的“pdflm16.dll”复制；&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/c8daee1046eafa2d0625481ec426f1c8.png&quot; alt=&quot;&quot;&gt;2.粘贴并覆盖到你软件安装的目录中，可能需要管理员权限，同意即可；&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/3fa3733383e8ef5b613c92da247bbcd2.png&quot; alt=&quot;&quot;&gt;3.这时我们再打开软件发现已经没有了试用期限；&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/71c4e53bae6ce97254447bfc5c6f120a.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;PowerDesigner汉化步骤：&lt;/h3&gt;
&lt;p&gt;1、先关闭软件，进入刚才的解压文件夹，将PowerDesigner汉化文件”文件夹下的所有文件全选复制；&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/9707cd69c0b31c7c0e8b2fcfbd5372a2.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;2、粘贴并覆盖到你软件安装的目录中，可能需要管理员权限，同意即可；&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/6af687b620ec39e72c33717286924d26.png&quot; alt=&quot;&quot;&gt;重新打开软件汉化成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://my-img.bigwind.cn/img/2024/08/2dbe23dcbd774a888244b84f0bc520cd.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Fri, 12 Jul 2024 00:00:00 GMT</pubDate></item><item><title>Using mdx in Frosti</title><link>https://bigwind.cn/blog/tutorial/frosti-mdx/</link><guid isPermaLink="true">https://bigwind.cn/blog/tutorial/frosti-mdx/</guid><description>Using MDX in Frosti to enrich article content with more components</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/tutorial/frosti-mdx/&quot;&gt;https://bigwind.cn/blog/tutorial/frosti-mdx/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../../components/mdx/Collapse.astro&amp;quot;;
import Diff from &amp;quot;../../../components/mdx/Diff.astro&amp;quot;;
import Error from &amp;quot;../../../components/mdx/Error.astro&amp;quot;;
import Info from &amp;quot;../../../components/mdx/Info.astro&amp;quot;;
import Kbd from &amp;quot;../../../components/mdx/Kbd.astro&amp;quot;;
import Success from &amp;quot;../../../components/mdx/Success.astro&amp;quot;;
import Warning from &amp;quot;../../../components/mdx/Warning.astro&amp;quot;;
import TimeLine from &amp;quot;../../../components/mdx/TimeLine.astro&amp;quot;;
import LinkCard from &amp;quot;../../../components/mdx/LinkCard.astro&amp;quot;;&lt;/p&gt;
&lt;h2&gt;Preface&lt;/h2&gt;
&lt;p&gt;This article describes how to use the components provided by Frosti in &lt;code&gt;mdx&lt;/code&gt; to realize the functions that can&amp;#39;t be realized by normal &lt;code&gt;md&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Main text&lt;/h2&gt;
&lt;h3&gt;Getting started&lt;/h3&gt;
&lt;p&gt;First you need to create an &lt;code&gt;mdx&lt;/code&gt; file, which is as simple as changing the extension to &lt;code&gt;.mdx&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Introducing&lt;/h3&gt;
&lt;p&gt;The components provided by Frosti are placed in the &lt;code&gt;/blog&lt;/code&gt; and &lt;code&gt;/page&lt;/code&gt; folders. Write something under the document properties (frontmatter):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;import Collapse from &amp;quot;../../components/mdx/Collapse.astro&amp;quot;;
import Diff from &amp;quot;../../components/mdx/Diff.astro&amp;quot;;
import Error from &amp;quot;../../components/mdx/Error.astro&amp;quot;;
import Info from &amp;quot;../../components/mdx/Info.astro&amp;quot;;
import Kbd from &amp;quot;../../components/mdx/Kbd.astro&amp;quot;;
import Success from &amp;quot;../../components/mdx/Success.astro&amp;quot;;
import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;
import TimeLine from &amp;quot;../../components/mdx/TimeLine.astro&amp;quot;;
import LinkCard from &amp;quot;../../components/mdx/LinkCard.astro&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;h4&gt;Collapse&lt;/h4&gt;
&lt;Collapse title=&quot;This is an example text.&quot;&gt;
  This is the hidden content!
&lt;/Collapse&gt;

&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Collapse title=&amp;quot;This is an example text.&amp;quot;&amp;gt;
  This is the hidden content!
&amp;lt;/Collapse&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Diff&lt;/h4&gt;
&lt;p&gt;&lt;Diff r=&quot;https://bigwind.cn/image/r.png&quot; l=&quot;https://bigwind.cn/image/l.png&quot;&gt;&lt;/Diff&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Diff r=&amp;quot;/image/r.png&amp;quot; l=&amp;quot;/image/l.png&amp;quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Error&lt;/h4&gt;
&lt;p&gt;&lt;Error&gt;Maybe something went wrong? &lt;a href=&quot;https://www.baidu.com&quot;&gt;www.baidu.com&lt;/a&gt;&lt;/Error&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Error&amp;gt;Maybe something went wrong? &amp;lt;/Error&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Warning&lt;/h4&gt;
&lt;p&gt;&lt;Warning&gt;Hey! Watch out for potholes! &lt;/Warning&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Warning&amp;gt;Hey! Watch out for potholes! &amp;lt;/Warning&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Message&lt;/h4&gt;
&lt;p&gt;&lt;Info&gt;It&amp;#39;s just a message. &lt;/Info&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Info&amp;gt;It&amp;#39;s just a message. &amp;lt;/Info&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Success&lt;/h4&gt;
&lt;p&gt;&lt;Success&gt;Congratulations on your successful deployment! &lt;/Success&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Success&amp;gt;Congratulations on your successful deployment! &amp;lt;/Success&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Kbd&lt;/h4&gt;
&lt;p&gt;&lt;Kbd&gt;Ctrl&lt;/Kbd&gt; + &lt;Kbd&gt;C&lt;/Kbd&gt; to copy the text.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;Kbd&amp;gt;Ctrl&amp;lt;/Kbd&amp;gt; + &amp;lt;Kbd&amp;gt;C&amp;lt;/Kbd&amp;gt; to copy the text.
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;TimeLine&lt;/h4&gt;
&lt;p&gt;&amp;lt;TimeLine
  items={[
    { year: &amp;quot;1984&amp;quot;, event: &amp;quot;First Macintosh computer&amp;quot; },
    { year: &amp;quot;1998&amp;quot;, event: &amp;quot;iMac&amp;quot; },
    { year: &amp;quot;2001&amp;quot;, event: &amp;quot;iPod&amp;quot; },
    { year: &amp;quot;2007&amp;quot;, event: &amp;quot;iPhone&amp;quot; },
    { year: &amp;quot;2015&amp;quot;, event: &amp;quot;Apple Watch&amp;quot; },
  ]}
/&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;TimeLine
  items={[
    { year: &amp;quot;1984&amp;quot;, event: &amp;quot;First Macintosh computer&amp;quot; },
    { year: &amp;quot;1998&amp;quot;, event: &amp;quot;iMac&amp;quot; },
    { year: &amp;quot;2001&amp;quot;, event: &amp;quot;iPod&amp;quot; },
    { year: &amp;quot;2007&amp;quot;, event: &amp;quot;iPhone&amp;quot; },
    { year: &amp;quot;2015&amp;quot;, event: &amp;quot;Apple Watch&amp;quot; },
  ]}
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;LinkCard&lt;/h4&gt;
&lt;p&gt;&lt;LinkCard
  title=&quot;Frosti&quot;
  desc=&quot;My blog project!&quot;
  url=&quot;https://github.com/EveSunMaple/Frosti&quot;
  img=&quot;https://bigwind.cn/favicon.ico&quot;
/&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;&amp;lt;LinkCard
  title=&amp;quot;Frosti&amp;quot;
  desc=&amp;quot;My blog project!&amp;quot;
  url=&amp;quot;https://github.com/EveSunMaple/Frosti&amp;quot;
  img=&amp;quot;/favicon.ico&amp;quot;
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Fri, 12 Jul 2024 00:00:00 GMT</pubDate></item><item><title>测试文档</title><link>https://bigwind.cn/blog/tutorial/using-mdx-copy/</link><guid isPermaLink="true">https://bigwind.cn/blog/tutorial/using-mdx-copy/</guid><description>这是一个用于测试的Markdown文档</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/tutorial/using-mdx-copy/&quot;&gt;https://bigwind.cn/blog/tutorial/using-mdx-copy/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;标题&lt;/h2&gt;
&lt;p&gt;Markdown 支持多级标题，使用 &lt;code&gt;#&lt;/code&gt; 符号表示。一个 &lt;code&gt;#&lt;/code&gt; 表示一级标题，两个 &lt;code&gt;#&lt;/code&gt; 表示二级标题，以此类推。&lt;/p&gt;
&lt;h3&gt;三级标题&lt;/h3&gt;
&lt;p&gt;这是一个三级标题。&lt;/p&gt;
&lt;h2&gt;列表&lt;/h2&gt;
&lt;h3&gt;无序列表&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;项目一&lt;/li&gt;
&lt;li&gt;项目二&lt;/li&gt;
&lt;li&gt;项目三&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;有序列表&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;第一项&lt;/li&gt;
&lt;li&gt;第二项&lt;/li&gt;
&lt;li&gt;第三项&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;格式化文本&lt;/h2&gt;
&lt;p&gt;你可以使用&lt;strong&gt;加粗&lt;/strong&gt;和&lt;em&gt;斜体&lt;/em&gt;来格式化文本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;加粗示例&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;斜体示例&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;删除线示例&lt;/del&gt;&lt;/p&gt;
&lt;h2&gt;链接&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.example.com&quot;&gt;这是一个链接&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;图片&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://bigwind.cn/image/image4.jpg&quot; alt=&quot;这是一个示例图片&quot;&gt;&lt;/p&gt;
&lt;h2&gt;代码&lt;/h2&gt;
&lt;p&gt;你可以在文档中插入代码片段：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def hello_world():
    print(&amp;quot;Hello, world!&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Tue, 02 Jul 2024 00:00:00 GMT</pubDate></item><item><title>Mathematics Examples</title><link>https://bigwind.cn/blog/mathematics-examples/</link><guid isPermaLink="true">https://bigwind.cn/blog/mathematics-examples/</guid><description>Examples of mathematical notation and equations that can be used in blog posts with proper formatting.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/mathematics-examples/&quot;&gt;https://bigwind.cn/blog/mathematics-examples/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;This post demonstrates various mathematical notations and equations that can be used in blog posts.&lt;/p&gt;
&lt;h2&gt;Basic Mathematical Notation&lt;/h2&gt;
&lt;h3&gt;Inline Math&lt;/h3&gt;
&lt;p&gt;You can include inline mathematical expressions like $E = mc^2$ or $\pi \approx 3.14159$.&lt;/p&gt;
&lt;h3&gt;Block Math&lt;/h3&gt;
&lt;p&gt;For larger equations, use block math:&lt;/p&gt;
&lt;p&gt;$$
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
$$&lt;/p&gt;
&lt;h2&gt;Common Mathematical Formulas&lt;/h2&gt;
&lt;h3&gt;Quadratic Formula&lt;/h3&gt;
&lt;p&gt;$$
x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
$$&lt;/p&gt;
&lt;h3&gt;Euler&amp;#39;s Identity&lt;/h3&gt;
&lt;p&gt;$$
e^{i\pi} + 1 = 0
$$&lt;/p&gt;
&lt;h3&gt;Summation&lt;/h3&gt;
&lt;p&gt;$$
\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}
$$&lt;/p&gt;
&lt;h2&gt;Matrix Operations&lt;/h2&gt;
&lt;h3&gt;Matrix Multiplication&lt;/h3&gt;
&lt;h1&gt;$$
\begin{bmatrix}
a &amp;amp; b \
c &amp;amp; d
\end{bmatrix}
\begin{bmatrix}
e &amp;amp; f \
g &amp;amp; h
\end{bmatrix}&lt;/h1&gt;
&lt;p&gt;\begin{bmatrix}
ae + bg &amp;amp; af + bh \
ce + dg &amp;amp; cf + dh
\end{bmatrix}
$$&lt;/p&gt;
&lt;h3&gt;Determinant&lt;/h3&gt;
&lt;p&gt;$$
\det(A) = \begin{vmatrix}
a &amp;amp; b \
c &amp;amp; d
\end{vmatrix} = ad - bc
$$&lt;/p&gt;
&lt;h2&gt;Calculus Examples&lt;/h2&gt;
&lt;h3&gt;Derivative&lt;/h3&gt;
&lt;p&gt;$$
\frac{d}{dx} \left( x^n \right) = nx^{n-1}
$$&lt;/p&gt;
&lt;h3&gt;Integral&lt;/h3&gt;
&lt;p&gt;$$
\int x^n dx = \frac{x^{n+1}}{n+1} + C \quad \text{for } n \neq -1
$$&lt;/p&gt;
&lt;h3&gt;Limit&lt;/h3&gt;
&lt;p&gt;$$
\lim_{x \to 0} \frac{\sin(x)}{x} = 1
$$&lt;/p&gt;
&lt;h2&gt;Statistics&lt;/h2&gt;
&lt;h3&gt;Normal Distribution&lt;/h3&gt;
&lt;p&gt;$$
f(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2}
$$&lt;/p&gt;
&lt;h3&gt;Standard Deviation&lt;/h3&gt;
&lt;p&gt;$$
\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)^2}
$$&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;These examples show how to properly format mathematical expressions in blog posts. Make sure to use the appropriate delimiters for inline ($...$) and block ($$...$$) math expressions.&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Mon, 01 Jul 2024 00:00:00 GMT</pubDate></item><item><title>Markdown Style Guide</title><link>https://bigwind.cn/blog/markdown-style-guide/</link><guid isPermaLink="true">https://bigwind.cn/blog/markdown-style-guide/</guid><description>Here is a sample of some basic Markdown syntax that can be used when writing Markdown content in Astro.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/markdown-style-guide/&quot;&gt;https://bigwind.cn/blog/markdown-style-guide/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Here is a sample of some basic Markdown syntax that can be used when writing Markdown content in Astro.&lt;/p&gt;
&lt;h2&gt;Headings&lt;/h2&gt;
&lt;p&gt;The following HTML &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;—&lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; elements represent six levels of section headings. &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; is the highest section level while &lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; is the lowest.&lt;/p&gt;
&lt;h1&gt;H1&lt;/h1&gt;
&lt;h2&gt;H2&lt;/h2&gt;
&lt;h3&gt;H3&lt;/h3&gt;
&lt;h4&gt;H4&lt;/h4&gt;
&lt;h5&gt;H5&lt;/h5&gt;
&lt;h6&gt;H6&lt;/h6&gt;
&lt;h2&gt;Paragraph&lt;/h2&gt;
&lt;p&gt;Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.&lt;/p&gt;
&lt;p&gt;Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.&lt;/p&gt;
&lt;h2&gt;Images&lt;/h2&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![Alt text](./full/or/relative/path/of/image)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://bigwind.cn/logo.png&quot; alt=&quot;blog placeholder&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Blockquotes&lt;/h2&gt;
&lt;p&gt;The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a &lt;code&gt;footer&lt;/code&gt; or &lt;code&gt;cite&lt;/code&gt; element, and optionally with in-line changes such as annotations and abbreviations.&lt;/p&gt;
&lt;h3&gt;Blockquote without attribution&lt;/h3&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;gt; Tiam, ad mint andaepu dandae nostion secatur sequo quae.
&amp;gt; **Note** that you can use _Markdown syntax_ within a blockquote.
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Tiam, ad mint andaepu dandae nostion secatur sequo quae.
&lt;strong&gt;Note&lt;/strong&gt; that you can use &lt;em&gt;Markdown syntax&lt;/em&gt; within a blockquote.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Blockquote with attribution&lt;/h3&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;gt; Don&amp;#39;t communicate by sharing memory, share memory by communicating.&amp;lt;br&amp;gt;
&amp;gt; — &amp;lt;cite&amp;gt;Rob Pike[^1]&amp;lt;/cite&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&amp;#39;t communicate by sharing memory, share memory by communicating.&lt;br&gt;
— &lt;cite&gt;Rob Pike[^1]&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;[^1]: The above quote is excerpted from Rob Pike&amp;#39;s &lt;a href=&quot;https://www.youtube.com/watch?v=PAAkCSZUG1c&quot;&gt;talk&lt;/a&gt; during Gopherfest, November 18, 2015.&lt;/p&gt;
&lt;h2&gt;Tables&lt;/h2&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;| Italics   | Bold     | Code   |
| --------- | -------- | ------ |
| _italics_ | **bold** | `code` |
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Italics&lt;/th&gt;
&lt;th&gt;Bold&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;em&gt;italics&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;bold&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;code&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Code Blocks&lt;/h2&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;p&gt;we can use 3 backticks ``` in new line and write snippet and close with 3 backticks on new line and to highlight language specific syntac, write one word of language name after first 3 backticks, for eg. html, javascript, css, markdown, typescript, txt, bash&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;```cpp
#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;
const int N = 1e5 + 5;
int n, k, a[N];
long long ans;
vector&amp;lt;int&amp;gt; v[N];
int main()
{
    scanf(&amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;k);
    for (int i = 1; i &amp;lt;= n; i++)
    {
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;a[i]);
        v[i % k].push_back(a[i]);
    }
    for (int i = 0; i &amp;lt; k; i++)
        sort(v[i].rbegin(), v[i].rend());
    for (int i = 0; i &amp;lt; k; i++)
    {
        for (int j = 0; j + 1 &amp;lt; v[i].size(); j += 2)
        {
            ans += v[i][j] + v[i][j + 1];
        }
    }
    printf(&amp;quot;%lld\n&amp;quot;, ans);
    return 0;
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;
const int N = 1e5 + 5;
int n, k, a[N];
long long ans;
vector&amp;lt;int&amp;gt; v[N];
int main()
{
    scanf(&amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;k);
    for (int i = 1; i &amp;lt;= n; i++)
    {
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;a[i]);
        v[i % k].push_back(a[i]);
    }
    for (int i = 0; i &amp;lt; k; i++)
        sort(v[i].rbegin(), v[i].rend());
    for (int i = 0; i &amp;lt; k; i++)
    {
        for (int j = 0; j + 1 &amp;lt; v[i].size(); j += 2)
        {
            ans += v[i][j] + v[i][j + 1];
        }
    }
    printf(&amp;quot;%lld\n&amp;quot;, ans);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;List Types&lt;/h2&gt;
&lt;h3&gt;Ordered List&lt;/h3&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;1. First item
2. Second item
3. Third item
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;First item&lt;/li&gt;
&lt;li&gt;Second item&lt;/li&gt;
&lt;li&gt;Third item&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Unordered List&lt;/h3&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- List item
- Another item
- And another item
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;List item&lt;/li&gt;
&lt;li&gt;Another item&lt;/li&gt;
&lt;li&gt;And another item&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Nested list&lt;/h3&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- Fruit
  - Apple
  - Orange
  - Banana
- Dairy
  - Milk
  - Cheese
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fruit&lt;ul&gt;
&lt;li&gt;Apple&lt;/li&gt;
&lt;li&gt;Orange&lt;/li&gt;
&lt;li&gt;Banana&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dairy&lt;ul&gt;
&lt;li&gt;Milk&lt;/li&gt;
&lt;li&gt;Cheese&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Other Elements&lt;/h2&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;lt;abbr title=&amp;quot;Graphics Interchange Format&amp;quot;&amp;gt;GIF&amp;lt;/abbr&amp;gt; is a bitmap image format.

H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O

X&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; + Y&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; = Z&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;

Press &amp;lt;kbd&amp;gt;CTRL&amp;lt;/kbd&amp;gt;+&amp;lt;kbd&amp;gt;ALT&amp;lt;/kbd&amp;gt;+&amp;lt;kbd&amp;gt;Delete&amp;lt;/kbd&amp;gt; to end the session.

Most &amp;lt;mark&amp;gt;salamanders&amp;lt;/mark&amp;gt; are nocturnal, and hunt for insects, worms, and other small creatures.
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;p&gt;&lt;abbr title=&quot;Graphics Interchange Format&quot;&gt;GIF&lt;/abbr&gt; is a bitmap image format.&lt;/p&gt;
&lt;p&gt;H&lt;sub&gt;2&lt;/sub&gt;O&lt;/p&gt;
&lt;p&gt;X&lt;sup&gt;n&lt;/sup&gt; + Y&lt;sup&gt;n&lt;/sup&gt; = Z&lt;sup&gt;n&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Press &lt;kbd&gt;CTRL&lt;/kbd&gt;+&lt;kbd&gt;ALT&lt;/kbd&gt;+&lt;kbd&gt;Delete&lt;/kbd&gt; to end the session.&lt;/p&gt;
&lt;p&gt;Most &lt;mark&gt;salamanders&lt;/mark&gt; are nocturnal, and hunt for insects, worms, and other small creatures.&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Mon, 01 Jul 2024 00:00:00 GMT</pubDate></item><item><title>Markdown Style Guide</title><link>https://bigwind.cn/blog/tutorial/markdown-style-guide/</link><guid isPermaLink="true">https://bigwind.cn/blog/tutorial/markdown-style-guide/</guid><description>Here is a sample of some basic Markdown syntax that can be used when writing Markdown content in Astro.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/tutorial/markdown-style-guide/&quot;&gt;https://bigwind.cn/blog/tutorial/markdown-style-guide/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Here is a sample of some basic Markdown syntax that can be used when writing Markdown content in Astro.&lt;/p&gt;
&lt;h2&gt;Headings&lt;/h2&gt;
&lt;p&gt;The following HTML &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;—&lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; elements represent six levels of section headings. &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; is the highest section level while &lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; is the lowest.&lt;/p&gt;
&lt;h1&gt;H1&lt;/h1&gt;
&lt;h2&gt;H2&lt;/h2&gt;
&lt;h3&gt;H3&lt;/h3&gt;
&lt;h4&gt;H4&lt;/h4&gt;
&lt;h5&gt;H5&lt;/h5&gt;
&lt;h6&gt;H6&lt;/h6&gt;
&lt;h2&gt;Paragraph&lt;/h2&gt;
&lt;p&gt;Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.&lt;/p&gt;
&lt;p&gt;Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.&lt;/p&gt;
&lt;h2&gt;Images&lt;/h2&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![Alt text](./full/or/relative/path/of/image)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://bigwind.cn/home.webp&quot; alt=&quot;blog placeholder&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Blockquotes&lt;/h2&gt;
&lt;p&gt;The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a &lt;code&gt;footer&lt;/code&gt; or &lt;code&gt;cite&lt;/code&gt; element, and optionally with in-line changes such as annotations and abbreviations.&lt;/p&gt;
&lt;h3&gt;Blockquote without attribution&lt;/h3&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;gt; Tiam, ad mint andaepu dandae nostion secatur sequo quae.  
&amp;gt; **Note** that you can use _Markdown syntax_ within a blockquote.
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Tiam, ad mint andaepu dandae nostion secatur sequo quae.&lt;br&gt;&lt;strong&gt;Note&lt;/strong&gt; that you can use &lt;em&gt;Markdown syntax&lt;/em&gt; within a blockquote.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Blockquote with attribution&lt;/h3&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;gt; Don&amp;#39;t communicate by sharing memory, share memory by communicating.&amp;lt;br&amp;gt;
&amp;gt; — &amp;lt;cite&amp;gt;Rob Pike[^1]&amp;lt;/cite&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&amp;#39;t communicate by sharing memory, share memory by communicating.&lt;br&gt;
— &lt;cite&gt;Rob Pike[^1]&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;[^1]: The above quote is excerpted from Rob Pike&amp;#39;s &lt;a href=&quot;https://www.youtube.com/watch?v=PAAkCSZUG1c&quot;&gt;talk&lt;/a&gt; during Gopherfest, November 18, 2015.&lt;/p&gt;
&lt;h2&gt;Tables&lt;/h2&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;| Italics   | Bold     | Code   |
| --------- | -------- | ------ |
| _italics_ | **bold** | `code` |
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Italics&lt;/th&gt;
&lt;th&gt;Bold&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;em&gt;italics&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;bold&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;code&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Code Blocks&lt;/h2&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;p&gt;we can use 3 backticks ``` in new line and write snippet and close with 3 backticks on new line and to highlight language specific syntac, write one word of language name after first 3 backticks, for eg. html, javascript, css, markdown, typescript, txt, bash&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;```cpp
#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;
const int N = 1e5 + 5;
int n, k, a[N];
long long ans;
vector&amp;lt;int&amp;gt; v[N];
int main()
{
    scanf(&amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;k);
    for (int i = 1; i &amp;lt;= n; i++)
    {
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;a[i]);
        v[i % k].push_back(a[i]);
    }
    for (int i = 0; i &amp;lt; k; i++)
        sort(v[i].rbegin(), v[i].rend());
    for (int i = 0; i &amp;lt; k; i++)
    {
        for (int j = 0; j + 1 &amp;lt; v[i].size(); j += 2)
        {
            ans += v[i][j] + v[i][j + 1];
        }
    }
    printf(&amp;quot;%lld\n&amp;quot;, ans);
    return 0;
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;
const int N = 1e5 + 5;
int n, k, a[N];
long long ans;
vector&amp;lt;int&amp;gt; v[N];
int main()
{
    scanf(&amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;k);
    for (int i = 1; i &amp;lt;= n; i++)
    {
        scanf(&amp;quot;%d&amp;quot;, &amp;amp;a[i]);
        v[i % k].push_back(a[i]);
    }
    for (int i = 0; i &amp;lt; k; i++)
        sort(v[i].rbegin(), v[i].rend());
    for (int i = 0; i &amp;lt; k; i++)
    {
        for (int j = 0; j + 1 &amp;lt; v[i].size(); j += 2)
        {
            ans += v[i][j] + v[i][j + 1];
        }
    }
    printf(&amp;quot;%lld\n&amp;quot;, ans);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;List Types&lt;/h2&gt;
&lt;h3&gt;Ordered List&lt;/h3&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;1. First item
2. Second item
3. Third item
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;First item&lt;/li&gt;
&lt;li&gt;Second item&lt;/li&gt;
&lt;li&gt;Third item&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Unordered List&lt;/h3&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- List item
- Another item
- And another item
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;List item&lt;/li&gt;
&lt;li&gt;Another item&lt;/li&gt;
&lt;li&gt;And another item&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Nested list&lt;/h3&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- Fruit
  - Apple
  - Orange
  - Banana
- Dairy
  - Milk
  - Cheese
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fruit&lt;ul&gt;
&lt;li&gt;Apple&lt;/li&gt;
&lt;li&gt;Orange&lt;/li&gt;
&lt;li&gt;Banana&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dairy&lt;ul&gt;
&lt;li&gt;Milk&lt;/li&gt;
&lt;li&gt;Cheese&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Other Elements — abbr, sub, sup, kbd, mark&lt;/h2&gt;
&lt;h4&gt;Syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;lt;abbr title=&amp;quot;Graphics Interchange Format&amp;quot;&amp;gt;GIF&amp;lt;/abbr&amp;gt; is a bitmap image format.

H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O

X&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; + Y&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; = Z&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;

Press &amp;lt;kbd&amp;gt;&amp;lt;kbd&amp;gt;CTRL&amp;lt;/kbd&amp;gt;+&amp;lt;kbd&amp;gt;ALT&amp;lt;/kbd&amp;gt;+&amp;lt;kbd&amp;gt;Delete&amp;lt;/kbd&amp;gt;&amp;lt;/kbd&amp;gt; to end the session.

Most &amp;lt;mark&amp;gt;salamanders&amp;lt;/mark&amp;gt; are nocturnal, and hunt for insects, worms, and other small creatures.
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;p&gt;&lt;abbr title=&quot;Graphics Interchange Format&quot;&gt;GIF&lt;/abbr&gt; is a bitmap image format.&lt;/p&gt;
&lt;p&gt;H&lt;sub&gt;2&lt;/sub&gt;O&lt;/p&gt;
&lt;p&gt;X&lt;sup&gt;n&lt;/sup&gt; + Y&lt;sup&gt;n&lt;/sup&gt; = Z&lt;sup&gt;n&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Press &lt;kbd&gt;&lt;kbd&gt;CTRL&lt;/kbd&gt;+&lt;kbd&gt;ALT&lt;/kbd&gt;+&lt;kbd&gt;Delete&lt;/kbd&gt;&lt;/kbd&gt; to end the session.&lt;/p&gt;
&lt;p&gt;Most &lt;mark&gt;salamanders&lt;/mark&gt; are nocturnal, and hunt for insects, worms, and other small creatures.&lt;/p&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Mon, 01 Jul 2024 00:00:00 GMT</pubDate></item><item><title>Using MDX</title><link>https://bigwind.cn/blog/using-mdx/</link><guid isPermaLink="true">https://bigwind.cn/blog/using-mdx/</guid><description>Lorem ipsum dolor sit amet</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/using-mdx/&quot;&gt;https://bigwind.cn/blog/using-mdx/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;This theme comes with the &lt;a href=&quot;https://docs.astro.build/en/guides/integrations-guide/mdx/&quot;&gt;@astrojs/mdx&lt;/a&gt; integration installed and configured in your &lt;code&gt;astro.config.mjs&lt;/code&gt; config file. If you prefer not to use MDX, you can disable support by removing the integration from your config file.&lt;/p&gt;
&lt;h2&gt;Why MDX?&lt;/h2&gt;
&lt;p&gt;MDX is a special flavor of Markdown that supports embedded JavaScript &amp;amp; JSX syntax. This unlocks the ability to &lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#mdx-features&quot;&gt;mix JavaScript and UI Components into your Markdown content&lt;/a&gt; for things like interactive charts or alerts.&lt;/p&gt;
&lt;p&gt;If you have existing content authored in MDX, this integration will hopefully make migrating to Astro a breeze.&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;Here is how you import and use a UI component inside of MDX.&lt;br&gt;When you open this page in the browser, you should see the clickable button below.&lt;/p&gt;
&lt;h2&gt;More Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mdxjs.com/docs/what-is-mdx&quot;&gt;MDX Syntax Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#markdown-and-mdx-pages&quot;&gt;Astro Usage Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;a href=&quot;https://docs.astro.build/en/reference/directives-reference/#client-directives&quot;&gt;Client Directives&lt;/a&gt; are still required to create interactive components. Otherwise, all components in your MDX will render as static HTML (no JavaScript) by default.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Sat, 02 Jul 2022 00:00:00 GMT</pubDate></item><item><title>Using MDX</title><link>https://bigwind.cn/blog/tutorial/using-mdx/</link><guid isPermaLink="true">https://bigwind.cn/blog/tutorial/using-mdx/</guid><description>Lorem ipsum dolor sit amet</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/tutorial/using-mdx/&quot;&gt;https://bigwind.cn/blog/tutorial/using-mdx/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;This theme comes with the &lt;a href=&quot;https://docs.astro.build/en/guides/integrations-guide/mdx/&quot;&gt;@astrojs/mdx&lt;/a&gt; integration installed and configured in your &lt;code&gt;astro.config.mjs&lt;/code&gt; config file. If you prefer not to use MDX, you can disable support by removing the integration from your config file.&lt;/p&gt;
&lt;h2&gt;Why MDX?&lt;/h2&gt;
&lt;p&gt;MDX is a special flavor of Markdown that supports embedded JavaScript &amp;amp; JSX syntax. This unlocks the ability to &lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#mdx-features&quot;&gt;mix JavaScript and UI Components into your Markdown content&lt;/a&gt; for things like interactive charts or alerts.&lt;/p&gt;
&lt;p&gt;If you have existing content authored in MDX, this integration will hopefully make migrating to Astro a breeze.&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;Here is how you import and use a UI component inside of MDX.&lt;br&gt;When you open this page in the browser, you should see the clickable button below.&lt;/p&gt;
&lt;h2&gt;More Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mdxjs.com/docs/what-is-mdx&quot;&gt;MDX Syntax Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#markdown-and-mdx-pages&quot;&gt;Astro Usage Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;a href=&quot;https://docs.astro.build/en/reference/directives-reference/#client-directives&quot;&gt;Client Directives&lt;/a&gt; are still required to create interactive components. Otherwise, all components in your MDX will render as static HTML (no JavaScript) by default.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Sat, 02 Jul 2022 00:00:00 GMT</pubDate></item><item><title>CSDN新版Markdown编辑器(Alpha 2.0版) 使用示例</title><link>https://bigwind.cn/blog/tutorial/welcome_to_use_csdn-markdown_editor_new/</link><guid isPermaLink="true">https://bigwind.cn/blog/tutorial/welcome_to_use_csdn-markdown_editor_new/</guid><description>CSDN新版Markdown编辑器(Alpha 2.0版) 使用示例</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://bigwind.cn/blog/tutorial/welcome_to_use_csdn-markdown_editor_new/&quot;&gt;https://bigwind.cn/blog/tutorial/welcome_to_use_csdn-markdown_editor_new/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Kbd from &amp;quot;../../../components/mdx/Kbd.astro&amp;quot;;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;具体更新:&lt;/strong&gt;
CSDN 新版 Markdown 编辑器（Alpha 2.0 版）使用须知-CSDN 论坛
&lt;a href=&quot;https://bbs.csdn.net/topics/392449440&quot;&gt;https://bbs.csdn.net/topics/392449440&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;@&lt;a href=&quot;%E8%BF%99%E9%87%8C%E5%86%99%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9B%AE%E5%BD%95%E6%A0%87%E9%A2%98&quot;&gt;TOC&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;欢迎使用 Markdown 编辑器&lt;/h1&gt;
&lt;p&gt;你好！ 这是你第一次使用 &lt;strong&gt;Markdown 编辑器&lt;/strong&gt; 所展示的欢迎页。如果你想学习如何使用 Markdown 编辑器, 可以仔细阅读这篇文章，了解一下 Markdown 的基本语法知识。&lt;/p&gt;
&lt;h2&gt;新的改变&lt;/h2&gt;
&lt;p&gt;我们对 Markdown 编辑器进行了一些功能拓展与语法支持，除了标准的 Markdown 编辑器功能，我们增加了如下几点新功能，帮助你用它写博客：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;全新的界面设计&lt;/strong&gt; ，将会带来全新的写作体验；&lt;/li&gt;
&lt;li&gt;在创作中心设置你喜爱的代码高亮样式，Markdown &lt;strong&gt;将代码片显示选择的高亮样式&lt;/strong&gt; 进行展示；&lt;/li&gt;
&lt;li&gt;增加了 &lt;strong&gt;图片拖拽&lt;/strong&gt; 功能，你可以将本地的图片直接拖拽到编辑区域直接展示；&lt;/li&gt;
&lt;li&gt;全新的 &lt;strong&gt;KaTeX 数学公式&lt;/strong&gt; 语法；&lt;/li&gt;
&lt;li&gt;增加了支持&lt;strong&gt;甘特图的 mermaid 语法[^1]&lt;/strong&gt; 功能；&lt;/li&gt;
&lt;li&gt;增加了 &lt;strong&gt;多屏幕编辑&lt;/strong&gt; Markdown 文章功能；&lt;/li&gt;
&lt;li&gt;增加了 &lt;strong&gt;焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置&lt;/strong&gt; 等功能，功能按钮位于编辑区域与预览区域中间；&lt;/li&gt;
&lt;li&gt;增加了 &lt;strong&gt;检查列表&lt;/strong&gt; 功能。
[^1]: &lt;a href=&quot;https://mermaidjs.github.io/&quot;&gt;mermaid 语法说明&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;功能快捷键&lt;/h2&gt;
&lt;p&gt;撤销：&lt;Kbd&gt;Ctrl/Command&lt;/Kbd&gt; + &lt;Kbd&gt;Z&lt;/Kbd&gt;&lt;/p&gt;
&lt;p&gt;重做：&lt;Kbd&gt;Ctrl/Command&lt;/Kbd&gt; + &lt;Kbd&gt;Y&lt;/Kbd&gt;&lt;/p&gt;
&lt;p&gt;加粗：&lt;Kbd&gt;Ctrl/Command&lt;/Kbd&gt; + &lt;Kbd&gt;Shift&lt;/Kbd&gt; + &lt;Kbd&gt;B&lt;/Kbd&gt;&lt;/p&gt;
&lt;p&gt;斜体：&lt;Kbd&gt;Ctrl/Command&lt;/Kbd&gt; + &lt;Kbd&gt;Shift&lt;/Kbd&gt; + &lt;Kbd&gt;I&lt;/Kbd&gt;&lt;/p&gt;
&lt;p&gt;标题：&lt;Kbd&gt;Ctrl/Command&lt;/Kbd&gt; + &lt;Kbd&gt;Shift&lt;/Kbd&gt; + &lt;Kbd&gt;H&lt;/Kbd&gt;&lt;/p&gt;
&lt;p&gt;删除线：&lt;Kbd&gt;Ctrl/Command&lt;/Kbd&gt; + &lt;Kbd&gt;Shift&lt;/Kbd&gt; + &lt;Kbd&gt;S&lt;/Kbd&gt;&lt;/p&gt;
&lt;p&gt;无序列表：&lt;Kbd&gt;Ctrl/Command&lt;/Kbd&gt; + &lt;Kbd&gt;Shift&lt;/Kbd&gt; + &lt;Kbd&gt;U&lt;/Kbd&gt;&lt;/p&gt;
&lt;p&gt;有序列表：&lt;Kbd&gt;Ctrl/Command&lt;/Kbd&gt; + &lt;Kbd&gt;Shift&lt;/Kbd&gt; + &lt;Kbd&gt;O&lt;/Kbd&gt;&lt;/p&gt;
&lt;p&gt;检查列表：&lt;Kbd&gt;Ctrl/Command&lt;/Kbd&gt; + &lt;Kbd&gt;Shift&lt;/Kbd&gt; + &lt;Kbd&gt;C&lt;/Kbd&gt;&lt;/p&gt;
&lt;p&gt;插入代码：&lt;Kbd&gt;Ctrl/Command&lt;/Kbd&gt; + &lt;Kbd&gt;Shift&lt;/Kbd&gt; + &lt;Kbd&gt;K&lt;/Kbd&gt;&lt;/p&gt;
&lt;p&gt;插入链接：&lt;Kbd&gt;Ctrl/Command&lt;/Kbd&gt; + &lt;Kbd&gt;Shift&lt;/Kbd&gt; + &lt;Kbd&gt;L&lt;/Kbd&gt;&lt;/p&gt;
&lt;p&gt;插入图片：&lt;Kbd&gt;Ctrl/Command&lt;/Kbd&gt; + &lt;Kbd&gt;Shift&lt;/Kbd&gt; + &lt;Kbd&gt;G&lt;/Kbd&gt;&lt;/p&gt;
&lt;h2&gt;合理的创建标题，有助于目录的生成&lt;/h2&gt;
&lt;p&gt;直接输入 1 次&lt;Kbd&gt;#&lt;/Kbd&gt;，并按下&lt;Kbd&gt;space&lt;/Kbd&gt;后，将生成 1 级标题。
输入 2 次&lt;Kbd&gt;#&lt;/Kbd&gt;，并按下&lt;Kbd&gt;space&lt;/Kbd&gt;后，将生成 2 级标题。
以此类推，我们支持 6 级标题。有助于使用&lt;code&gt;TOC&lt;/code&gt;语法后生成一个完美的目录。&lt;/p&gt;
&lt;h2&gt;如何改变文本的样式&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;强调文本&lt;/em&gt; &lt;em&gt;强调文本&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;加粗文本&lt;/strong&gt; &lt;strong&gt;加粗文本&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;==标记文本==&lt;/p&gt;
&lt;p&gt;&lt;del&gt;删除文本&lt;/del&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;引用文本&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;H&lt;del&gt;2&lt;/del&gt;O is 是液体。&lt;/p&gt;
&lt;p&gt;2^10^ 运算结果是 1024.&lt;/p&gt;
&lt;h2&gt;插入链接与图片&lt;/h2&gt;
&lt;p&gt;链接: &lt;a href=&quot;https://mp.csdn.net&quot;&gt;link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;图片: &lt;img src=&quot;https://avatar.csdn.net/7/7/B/1_ralf_hx163com.jpg&quot; alt=&quot;Alt&quot;&gt;&lt;/p&gt;
&lt;p&gt;带尺寸的图片: ![Alt](&lt;a href=&quot;https://avatar.csdn.net/7/7/B/1_ralf_hx163com.jpg&quot;&gt;https://avatar.csdn.net/7/7/B/1_ralf_hx163com.jpg&lt;/a&gt; =30x30)&lt;/p&gt;
&lt;p&gt;当然，我们为了让用户更加便捷，我们增加了图片拖拽功能。&lt;/p&gt;
&lt;h2&gt;如何插入一段漂亮的代码片&lt;/h2&gt;
&lt;p&gt;去&lt;a href=&quot;https://mp.csdn.net/configure&quot;&gt;博客设置&lt;/a&gt;页面，选择一款你喜欢的代码片高亮样式，下面展示同样高亮的 &lt;code&gt;代码片&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// An highlighted block
var foo = &amp;quot;bar&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;生成一个适合你的列表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;项目&lt;ul&gt;
&lt;li&gt;项目&lt;ul&gt;
&lt;li&gt;项目&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;项目 1&lt;/li&gt;
&lt;li&gt;项目 2&lt;/li&gt;
&lt;li&gt;项目 3&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 计划任务&lt;/li&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 完成任务&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;创建一个表格&lt;/h2&gt;
&lt;p&gt;一个简单的表格是这么创建的：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;电脑&lt;/td&gt;
&lt;td&gt;$1600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;手机&lt;/td&gt;
&lt;td&gt;$12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;导管&lt;/td&gt;
&lt;td&gt;$1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;设定内容居中、居左、居右&lt;/h3&gt;
&lt;p&gt;使用&lt;code&gt;:---------:&lt;/code&gt;居中&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;:----------&lt;/code&gt;居左&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;----------:&lt;/code&gt;居右&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;第一列&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;第二列&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;第三列&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;第一列文本居中&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;第二列文本居右&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;第三列文本居左&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;SmartyPants&lt;/h3&gt;
&lt;p&gt;SmartyPants 将 ASCII 标点字符转换为“智能”印刷标点 HTML 实体。例如：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TYPE&lt;/th&gt;
&lt;th&gt;ASCII&lt;/th&gt;
&lt;th&gt;HTML&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Single backticks&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;#39;Isn&amp;#39;t this fun?&amp;#39;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;#39;Isn&amp;#39;t this fun?&amp;#39;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quotes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;quot;Isn&amp;#39;t this fun?&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;quot;Isn&amp;#39;t this fun?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dashes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-- is en-dash, --- is em-dash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-- is en-dash, --- is em-dash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;创建一个自定义列表&lt;/h2&gt;
&lt;p&gt;Markdown
: Text-to-HTML conversion tool&lt;/p&gt;
&lt;p&gt;Authors
: John
: Luke&lt;/p&gt;
&lt;h2&gt;如何创建一个注脚&lt;/h2&gt;
&lt;p&gt;一个具有注脚的文本。&lt;a href=&quot;%E6%B3%A8%E8%84%9A%E7%9A%84%E8%A7%A3%E9%87%8A&quot;&gt;^2&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;注释也是必不可少的&lt;/h2&gt;
&lt;p&gt;Markdown 将文本转换为 HTML。&lt;/p&gt;
&lt;p&gt;*[HTML]: 超文本标记语言&lt;/p&gt;
&lt;h2&gt;KaTeX 数学公式&lt;/h2&gt;
&lt;p&gt;您可以使用渲染 LaTeX 数学表达式 &lt;a href=&quot;https://khan.github.io/KaTeX/&quot;&gt;KaTeX&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Gamma 公式展示 $\Gamma(n) = (n-1)!\quad\forall
n\in\mathbb N$ 是通过欧拉积分&lt;/p&gt;
&lt;p&gt;$$
\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt,.
$$&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;你可以找到更多关于的信息 &lt;strong&gt;LaTeX&lt;/strong&gt; 数学表达式[here][1].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;新的甘特图功能，丰富你的文章&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 现有任务
        已完成               :done,    des1, 2014-01-06,2014-01-08
        进行中               :active,  des2, 2014-01-09, 3d
        计划一               :         des3, after des2, 5d
        计划二               :         des4, after des3, 5d
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;关于 &lt;strong&gt;甘特图&lt;/strong&gt; 语法，参考 [这儿][2],&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;UML 图表&lt;/h2&gt;
&lt;p&gt;可以使用 UML 图表进行渲染。 &lt;a href=&quot;https://mermaidjs.github.io/&quot;&gt;Mermaid&lt;/a&gt;. 例如下面产生的一个序列图：:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;sequenceDiagram
张三 -&amp;gt;&amp;gt; 李四: 你好！李四, 最近怎么样?
李四--&amp;gt;&amp;gt;王五: 你最近怎么样，王五？
李四--x 张三: 我很好，谢谢!
李四-x 王五: 我很好，谢谢!
Note right of 王五: 李四想了很长时间, 文字太长了&amp;lt;br/&amp;gt;不适合放在一行.

李四--&amp;gt;&amp;gt;张三: 打量着王五...
张三-&amp;gt;&amp;gt;王五: 很好... 王五, 你怎么样?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将产生一个流程图。:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
A[长方形] -- 链接 --&amp;gt; B((圆))
A --&amp;gt; C(圆角长方形)
B --&amp;gt; D{菱形}
C --&amp;gt; D
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;关于 &lt;strong&gt;Mermaid&lt;/strong&gt; 语法，参考 [这儿][3],&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FLowchart 流程图&lt;/h2&gt;
&lt;p&gt;我们依旧会支持 flowchart 的流程图：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchat
st=&amp;gt;start: 开始
e=&amp;gt;end: 结束
op=&amp;gt;operation: 我的操作
cond=&amp;gt;condition: 确认？

st-&amp;gt;op-&amp;gt;cond
cond(yes)-&amp;gt;e
cond(no)-&amp;gt;op
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;关于 &lt;strong&gt;Flowchart 流程图&lt;/strong&gt; 语法，参考 [这儿][4].&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>BigWind</dc:creator><pubDate>Fri, 01 Jul 2022 00:00:00 GMT</pubDate></item></channel></rss>