{
    "version": "https://jsonfeed.org/version/1",
    "title": "GardenHamster",
    "subtitle": "记录一些个人笔记,踩坑记录等",
    "icon": "https://gardenhamster.cn/assets/favicon.ico",
    "description": "花园仓鼠的博客",
    "home_page_url": "https://gardenhamster.cn",
    "items": [
        {
            "id": "https://gardenhamster.cn/computer-science/mysql/exercises/",
            "url": "https://gardenhamster.cn/computer-science/mysql/exercises/",
            "title": "习题-数据库原理与技术(13009)",
            "background": "cover.jpg",
            "backgroundPosition": "30% 35%",
            "backgroundOpacity": 0.88,
            "coverPosition": "30% 35%",
            "date_published": "2026-09-24T16:00:00.000Z",
            "content_html": "<h2 id=\"习题1\"><a class=\"anchor\" href=\"#习题1\">#</a> 习题 1</h2>\n<h3 id=\"选择题\"><a class=\"anchor\" href=\"#选择题\">#</a> 选择题</h3>\n<ol>\n<li class=\"quiz show\">\n<p>下面不属于数据模型要素的是<span class=\"gap\"></span></p>\n<ul class=\"options\">\n<li>数据结构</li>\n<li>数据操作</li>\n<li class=\"correct right\">数据控制</li>\n<li>完整性约束</li>\n</ul>\n</li>\n<li class=\"quiz show\">\n<p>数据库 (DB)、数据库系统 (DBS) 和数据库管理系统 (DBMS) 的关系是<span class=\"gap\"></span></p>\n<ul class=\"options\">\n<li>DBMS 包括 DBS 和 DB</li>\n<li class=\"correct right\">DBS 包括 DBMS 和 DB</li>\n<li>DB 包括 DBS 和 DBMS</li>\n<li>DBS 就是 DBMS, 也就是 DB</li>\n</ul>\n</li>\n<li class=\"quiz show\">\n<p>能唯一标识实体的最小属性集称为<span class=\"gap\"></span></p>\n<ul class=\"options\">\n<li>候选码</li>\n<li>外码</li>\n<li>联系</li>\n<li class=\"correct right\">码</li>\n</ul>\n</li>\n<li class=\"quiz show\">\n<p>在数据模型中，概念模型是<span class=\"gap\"></span></p>\n<ul class=\"options\">\n<li>依赖于计算机的硬件</li>\n<li class=\"correct right\">独立于 DBMS</li>\n<li>依赖于 DBMS</li>\n<li>依赖于计算机的硬件和 DBMS</li>\n</ul>\n</li>\n<li class=\"quiz show\">\n<p>概念模型最著名和最常用的表示方法是<span class=\"gap\"></span></p>\n<ul class=\"options\">\n<li class=\"correct right\">E-R 图</li>\n<li>概念模型</li>\n<li>数据模型</li>\n<li>范式分析</li>\n</ul>\n</li>\n<li class=\"quiz show\">\n<p>数据库设计人员和用户之间沟通信息的桥梁是<span class=\"gap\"></span></p>\n<ul class=\"options\">\n<li>程序流程图</li>\n<li>模块结构图</li>\n<li class=\"correct right\">实体联系图</li>\n<li>数据结构图</li>\n</ul>\n</li>\n</ol>\n<h3 id=\"填空题\"><a class=\"anchor\" href=\"#填空题\">#</a> 填空题</h3>\n<ol>\n<li class=\"quiz fill show\">\n<p>数据库的特性包括共享性、独立性、完整性和<span class=\"gap\">减少数据冗余</span></p>\n</li>\n<li class=\"quiz fill show\">\n<p>数据模型是对现实世界数据特征的抽象，它是用来描述数据、组织数据和<span class=\"gap\">对数据进行操作</span></p>\n</li>\n<li class=\"quiz fill show\">\n<p>数据模型一般由数据结构、数据操作、<span class=\"gap\">数据完整性约束</span>三部分组成</p>\n</li>\n<li class=\"quiz fill show\">\n<p>数据模型按应用层次可分为三类：概念模型、<span class=\"gap\">逻辑模型</span>、物理模型</p>\n<blockquote>\n<p>概念模型 = E-R 设计图<br />\n逻辑模型 = 表结构设计图<br />\n物理模型 = 具体到 mysql 中建立的每个表</p>\n</blockquote>\n</li>\n<li class=\"quiz fill show\">\n<p>数据库应用中三种主要的逻辑模型有层次模型、网状模型、关系模型，<span class=\"gap\"> 关系模型</span>是应用最广泛、最重要的一种逻辑模型</p>\n</li>\n<li class=\"quiz fill show\">\n<p>大数据指<span class=\"gap\">海量或巨量数据</span>，大数据以新的计算模式为手段，获取、存储、管理、处理并提炼 数据以帮助使用者决策</p>\n</li>\n<li class=\"quiz fill show\">\n<p>大数据的技术支撑有计算速度的提高、存储成本的下降和对<span class=\"gap\">人工智能</span>的需求</p>\n</li>\n<li class=\"quiz fill show\">\n<p>NoSQL 数据库泛指<span class=\"gap\">非关系型</span>的数据库，NoSQL 指其在设计上和传统的关系数据库不同</p>\n</li>\n</ol>\n",
            "tags": [
                "计算机科学与技术",
                "数据库原理与技术(13009)",
                "习题"
            ]
        },
        {
            "id": "https://gardenhamster.cn/computer-science/mysql/note01/",
            "url": "https://gardenhamster.cn/computer-science/mysql/note01/",
            "title": "笔记-数据库原理与技术(13009)",
            "background": "cover.jpg",
            "backgroundPosition": "80% 30%",
            "backgroundOpacity": 0.76,
            "date_published": "2026-09-20T16:00:00.000Z",
            "content_html": "<h2 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h2>\n<ul>\n<li>记录一下学习过程中的笔记，方便日后复习 / 查询，部分笔记收录自 AI，如有理解错误的地方欢迎指正</li>\n</ul>\n<h2 id=\"参考教材\"><a class=\"anchor\" href=\"#参考教材\">#</a> 参考教材</h2>\n<ul>\n<li>数据库原理与应用 - 基于 MySQL (赵明渊)</li>\n</ul>\n<h2 id=\"db-dbs-dbms\"><a class=\"anchor\" href=\"#db-dbs-dbms\">#</a> DB、DBS、DBMS</h2>\n<ul>\n<li><code>DB（数据库）</code> ：长期存储在计算机内、有组织的、可共享的大量数据集合。</li>\n<li><code>DBMS（数据库管理系统）</code> ：位于用户与操作系统之间的一层数据管理软件，是用户与数据库之间的接口。</li>\n<li><code>DBS（数据库系统）</code> ：在计算机系统中引入数据库后的完整系统构成，是一个整合了所有资源的生态系统。</li>\n<li><strong>DBS = DB + DBMS + 应用程序 + 硬件 + 人员</strong></li>\n<li><strong>DB 是 DBMS 的管理对象</strong>：数据库是数据的集合，DBMS 是操作这些数据的工具。</li>\n<li><strong>DBMS 是 DBS 的核心组件</strong>：数据库管理系统是数据库系统中承上启下的关键软件层。</li>\n<li><strong>DBS 包含 DB 和 DBMS</strong>：数据库系统是顶层概念，整合了数据、软件、硬件和人员，形成一个可运行的完整体系。</li>\n</ul>\n<h2 id=\"数据库模型概念模型-逻辑模型-物理模型\"><a class=\"anchor\" href=\"#数据库模型概念模型-逻辑模型-物理模型\">#</a> 数据库模型（概念模型、逻辑模型、物理模型）</h2>\n<ul>\n<li>数据库模型按照<strong>应用层次</strong>可分为三类 <code>概念模型</code>  --&gt; <code>逻辑模型</code>  --&gt; <code>物理模型</code> ，三者是从抽象到具体、层层细化的关系</li>\n</ul>\n<h3 id=\"概念模型\"><a class=\"anchor\" href=\"#概念模型\">#</a> 概念模型</h3>\n<ul>\n<li>对应 E-R 图（实体 - 关系图）设计阶段</li>\n</ul>\n<h3 id=\"逻辑模型\"><a class=\"anchor\" href=\"#逻辑模型\">#</a> 逻辑模型</h3>\n<ul>\n<li>对应数据库各个表设计阶段（包括：表结构、字段、约束等）</li>\n<li>逻辑模型又分为：<strong>层次模型</strong>、<strong>网状模型</strong>、<strong>关系模型</strong></li>\n<li><strong>关系模型</strong>是应用最广泛、最重要的一种逻辑模型</li>\n<li><img loading=\"lazy\" data-src=\"20260927-175849.jpg\" alt=\"\" /></li>\n</ul>\n<h3 id=\"物理模型\"><a class=\"anchor\" href=\"#物理模型\">#</a> 物理模型</h3>\n<ul>\n<li>对应表设计导入到具体数据库（Mysql/Oracle/SqlServer）后的建表阶段</li>\n</ul>\n<h2 id=\"e-r图entity-relationship\"><a class=\"anchor\" href=\"#e-r图entity-relationship\">#</a> E-R 图 (Entity-Relationship)</h2>\n<ul>\n<li>全称为实体 - 关系图（英文：Entity-Relationship Diagram）</li>\n<li>一对一 <code>（1：1）</code> ，一对多 <code>（1：n）</code> ，多对多 <code>（m：n）</code></li>\n<li><code>矩形框</code> ：表示实体</li>\n<li><code>椭圆框</code> ：表示属性</li>\n<li><code>菱形框</code> ：表示实体间的联系<br />\n<img loading=\"lazy\" data-src=\"20260921-233253.jpg\" alt=\"image\" /><br />\n<img loading=\"lazy\" data-src=\"20260921-233532.jpg\" alt=\"image\" /></li>\n</ul>\n<h2 id=\"三级模式结构\"><a class=\"anchor\" href=\"#三级模式结构\">#</a> 三级模式结构</h2>\n<h3 id=\"外模式\"><a class=\"anchor\" href=\"#外模式\">#</a> 外模式</h3>\n<ul>\n<li>也称为用户模式 / 子模式，对应用户级，一个数据库可以有多个外模式</li>\n<li>简单理解为数据库视图（View），用于向用户展示数据库中他需要的一部分数据，或者有权限读取的一部分数据</li>\n</ul>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">-- 创建一个视图提供给应用查询</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">VIEW</span> v_customer_orders <span class=\"token keyword\">AS</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">SELECT</span> id<span class=\"token punctuation\">,</span> customerId<span class=\"token punctuation\">,</span> code<span class=\"token punctuation\">,</span> createDate<span class=\"token punctuation\">,</span> price <span class=\"token keyword\">FROM</span> <span class=\"token identifier\"><span class=\"token punctuation\">`</span>order<span class=\"token punctuation\">`</span></span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token comment\">-- 应用从视图中查询需要的数据</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">SELECT</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">FROM</span> v_customer_orders <span class=\"token keyword\">WHERE</span> customerId <span class=\"token operator\">=</span> <span class=\"token number\">114514</span> <span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> id <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><h3 id=\"模式\"><a class=\"anchor\" href=\"#模式\">#</a> 模式</h3>\n<ul>\n<li>也称为概念模式 / 逻辑模式，对应概念级，一个数据库只有一个模式</li>\n<li>简单理解为数据库中的所有表结构（Table）</li>\n</ul>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> <span class=\"token identifier\"><span class=\"token punctuation\">`</span>order<span class=\"token punctuation\">`</span></span>  <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>id<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">int</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">AUTO_INCREMENT</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>storeId<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">int</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'门店Id'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>customerId<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">int</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'客户Id'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>concatId<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">int</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'客户联系人Id'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>createUserId<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">int</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'开单用户Id'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>code<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">varchar</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">CHARACTER</span> <span class=\"token keyword\">SET</span> utf8mb4 <span class=\"token keyword\">COLLATE</span> utf8mb4_0900_ai_ci <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'订单号'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>price<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">decimal</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'订单原价格/折前价格'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>discountPrice<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">decimal</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'订单折后价格'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>createDate<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">datetime</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'开单日期'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>updateDate<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">datetime</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'最后修改日期'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>deliveryDate<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">datetime</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'交货日期'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>concatName<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">varchar</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">CHARACTER</span> <span class=\"token keyword\">SET</span> utf8mb4 <span class=\"token keyword\">COLLATE</span> utf8mb4_0900_ai_ci <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'联系人名称'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>finishCode<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">varchar</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">CHARACTER</span> <span class=\"token keyword\">SET</span> utf8mb4 <span class=\"token keyword\">COLLATE</span> utf8mb4_0900_ai_ci <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'成品编号'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>isChecked<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">bit</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'是否已审核'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>isPacked<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">bit</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'是否已包装'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>isInStock<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">bit</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'是否已入库'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>isOutStock<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">bit</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'是否已出库'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>isCancelPrint<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">bit</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'是否已取消印刷'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>  <span class=\"token identifier\"><span class=\"token punctuation\">`</span>isDeleted<span class=\"token punctuation\">`</span></span> <span class=\"token keyword\">bit</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span> <span class=\"token keyword\">COMMENT</span> <span class=\"token string\">'是否已删除'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>  <span class=\"token keyword\">PRIMARY</span> <span class=\"token keyword\">KEY</span> <span class=\"token punctuation\">(</span><span class=\"token identifier\"><span class=\"token punctuation\">`</span>id<span class=\"token punctuation\">`</span></span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">USING</span> <span class=\"token keyword\">BTREE</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre><span class=\"token punctuation\">)</span> <span class=\"token keyword\">ENGINE</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">InnoDB</span> <span class=\"token keyword\">CHARACTER</span> <span class=\"token keyword\">SET</span> <span class=\"token operator\">=</span> utf8mb4 <span class=\"token keyword\">COLLATE</span> <span class=\"token operator\">=</span> utf8mb4_0900_ai_ci <span class=\"token keyword\">COMMENT</span> <span class=\"token operator\">=</span> <span class=\"token string\">'订单表'</span> ROW_FORMAT <span class=\"token operator\">=</span> DYNAMIC<span class=\"token punctuation\">;</span></pre></td></tr></table></figure><h3 id=\"内模式\"><a class=\"anchor\" href=\"#内模式\">#</a> 内模式</h3>\n<ul>\n<li>也称为存储模式，对应物理级，一个数据库只有一个内模式</li>\n<li>简单理解为 Mysql 数据库的存储引擎（myisam/innodb）, 对应数据在硬盘上存储方式</li>\n<li>具体表现为物理数据文件（如 InnoDB 的.ibd 文件）、日志文件（Redo Log, Undo Log）、B + 树索引结构、数据页、表空间等。</li>\n</ul>\n<h2 id=\"二级映像功能\"><a class=\"anchor\" href=\"#二级映像功能\">#</a> 二级映像功能</h2>\n<h3 id=\"外模式模式映像\"><a class=\"anchor\" href=\"#外模式模式映像\">#</a> 外模式 / 模式映像</h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">要素</th>\n<th style=\"text-align:left\">说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\">是什么</td>\n<td style=\"text-align:left\">外模式与模式之间的映射规则</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">谁维护</td>\n<td style=\"text-align:left\">数据库管理员（DBA）</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">保证什么</td>\n<td style=\"text-align:left\">逻辑独立性 —— 模式被改变后，保证外模式不受影响</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">好处</td>\n<td style=\"text-align:left\">降低应用程序的维护成本，提升系统灵活性</td>\n</tr>\n</tbody>\n</table>\n<ul>\n<li>例：假如 Order 表中字段名 <code>code</code>  需要修改为 <code>orderCode</code> ，修改后应用读取视图 <code>v_customer_orders</code>  就会报错</li>\n</ul>\n<blockquote>\n<p>Error: 1356 - View 'store.v_customer_orders' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them</p>\n</blockquote>\n<ul>\n<li>此时为了外部应用程序不需要修改代码也能正常使用，DBA 可以修正视图，将现在的 <code>orderCode</code>  重新映射回原本视图中的 <code>code</code></li>\n</ul>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">ALTER</span> <span class=\"token keyword\">VIEW</span> v_customer_orders <span class=\"token keyword\">AS</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">SELECT</span> id<span class=\"token punctuation\">,</span> customerId<span class=\"token punctuation\">,</span> orderCode <span class=\"token keyword\">AS</span> code<span class=\"token punctuation\">,</span> createDate<span class=\"token punctuation\">,</span> price <span class=\"token keyword\">FROM</span> <span class=\"token identifier\"><span class=\"token punctuation\">`</span>order<span class=\"token punctuation\">`</span></span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><h3 id=\"模式内模式映像\"><a class=\"anchor\" href=\"#模式内模式映像\">#</a> 模式 / 内模式映像</h3>\n<ul>\n<li>模式 / 内模式映像本质是定义 “全局逻辑结构（模式）” 与 “物理存储结构（内模式）” 之间对应关系的转换规则，其核心作用是保证数据的 <code>物理独立性</code> 。</li>\n<li>例：假如数据库存储引擎从 <code>myisam</code>  修改为 <code>innodb</code> ，那么 Order 表对应的物理存储文件将从原来三个文件 <code>order.sdi </code> , <code>order.MYD</code> , <code>order.MYI</code>  变为了单个文件 <code>order.ibd</code>  锁机制从原来的 <code>表级锁</code> 变成了 <code>行级锁</code> ，但是执行同样的 SQL 查询语句依然能查询出同样的结果</li>\n</ul>\n",
            "tags": [
                "计算机科学与技术",
                "数据库原理与技术(13009)",
                "笔记"
            ]
        },
        {
            "id": "https://gardenhamster.cn/note/Python/note01/",
            "url": "https://gardenhamster.cn/note/Python/note01/",
            "title": "Python笔记",
            "background": "cover.jpg",
            "backgroundPosition": "80% 12%",
            "backgroundOpacity": 0.88,
            "coverPosition": "80% 13%",
            "date_published": "2026-09-03T16:00:00.000Z",
            "content_html": "<h2 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h2>\n<ul>\n<li>记录一下学习 Python 过程中的笔记，方便日后查找 / 复习</li>\n</ul>\n<h2 id=\"python的诞生\"><a class=\"anchor\" href=\"#python的诞生\">#</a> Python 的诞生</h2>\n<ul>\n<li>Python 是著名的 “龟叔” Guido van Rossum 在 1989 年圣诞节期间，为了打发无聊的圣诞节而编写的一个编程语言。</li>\n</ul>\n<h2 id=\"python的优点\"><a class=\"anchor\" href=\"#python的优点\">#</a> Python 的优点</h2>\n<ul>\n<li>拥有丰富的生态和大量覆盖各个领域的第三方库，这使得 Python 拥有极高的开发效率</li>\n<li>跨平台兼容运行、Windows、macOS、Linux</li>\n<li>适用领域：AI 和大模型，网络爬虫，自动化运维，Web 后端，数据分析等</li>\n</ul>\n<h2 id=\"python的缺点\"><a class=\"anchor\" href=\"#python的缺点\">#</a> Python 的缺点</h2>\n<ul>\n<li>Python 是解释型语言，运行性能较低，代码执行前需要翻译成机器码，执行速度约为 C++ 的 1/50、Java 的 1/20，不适合高频交易、实时图像处理等高性能场景</li>\n<li>不适用于大型项目，不适用于高并发，不适用于多线程程序，不利于大型项目维护</li>\n<li>源码无法加密，解析型语言发布应用相当于发布源码</li>\n<li>内存消耗大，处理大量数据时内存占用较高。</li>\n<li>移动端开发弱，缺乏主流 APP 原生支持</li>\n</ul>\n<h2 id=\"python解释器\"><a class=\"anchor\" href=\"#python解释器\">#</a> Python 解释器</h2>\n<p>注：同一份 Python 代码在不同的解析器环境中运行结果可能会有所不同</p>\n<ul>\n<li><code>CPython</code> ：Python 官网默认安装解释器</li>\n<li><code>IPython</code> ：基于 CPython 之上的一个交互式解释器，只是在交互方式上有所增强</li>\n<li><code>PyPy</code> ：特点是执行速度，采用 JIT 技术，对 Python 代码进行动态编译（注意不是解释），所以可以显著提高 Python 代码的执行速度</li>\n<li><code>Jython</code> ：运行在 Java 平台上的 Python 解释器，可以直接把 Python 代码编译成 Java 字节码执行</li>\n<li><code>IronPython</code> ：运行在微软.Net 平台上的 Python 解释器，可以直接把 Python 代码编译成.Net 的字节码</li>\n</ul>\n<h2 id=\"ioinputoutput\"><a class=\"anchor\" href=\"#ioinputoutput\">#</a> IO(Input/Output)</h2>\n<ul>\n<li>输入和输出的统称，Input/Output</li>\n</ul>\n<h2 id=\"参考教程\"><a class=\"anchor\" href=\"#参考教程\">#</a> 参考教程</h2>\n<ul>\n<li><a href=\"https://liaoxuefeng.com/books/python/introduction/index.html\">廖雪峰的 Python 教程</a></li>\n</ul>\n",
            "tags": [
                "笔记",
                "Python"
            ]
        },
        {
            "id": "https://gardenhamster.cn/other/problem/problem01/",
            "url": "https://gardenhamster.cn/other/problem/problem01/",
            "title": "Win10重启后桌面被重置的解决方法",
            "background": "cover.jpg",
            "backgroundPosition": "10% 50%",
            "backgroundOpacity": 0.8,
            "date_published": "2025-09-04T16:00:00.000Z",
            "content_html": "<h2 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h2>\n<ul>\n<li>今天在捣鼓某个软件的时候炸内存了，导致后续各种操作都变得很慢，索性就重启了一下 (就是很正常的重启没有直接按关机键或者拔电源的那种)，重启以后发现桌面被重置了，具体表现如下：</li>\n</ul>\n<ul>\n<li>\n<p>桌面的图标和文件都没了只剩下我的电脑之类的这么几个图标</p>\n</li>\n<li>\n<p>左下角的菜单栏也被还原了，磁贴中的图标都没了</p>\n</li>\n<li>\n<p>壁纸被重置变成了默认的 window 壁纸</p>\n</li>\n<li>\n<p>磁盘的空间和盘符没有变化，各个磁盘里面的文件都还在</p>\n</li>\n<li>\n<p>打开 <code>我的电脑</code>  --&gt; 左侧栏 <code>桌面</code>  --&gt; 右键 <code>属性</code>  --&gt; <code>位置</code> ，可以发现桌面的路径变成了 <code>C:\\Users\\Temp\\Desktop</code></p>\n</li>\n</ul>\n<h2 id=\"解决办法\"><a class=\"anchor\" href=\"#解决办法\">#</a> 解决办法</h2>\n<ul>\n<li>\n<p>按 <code>Win</code> + <code>R</code> , 输入 <code>regedit</code>  打开注册表</p>\n</li>\n<li>\n<p>定位 <code>计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList</code></p>\n</li>\n<li>\n<p>可以发现下面有一个类似  <code>S-1-5-21-436428660-3606591947-2857460249-500</code>  这种格式名的项目，下面还会有一个与其同名的 <code>.bak</code>  项目</p>\n</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240905162741.jpg\" alt=\"image\" /></p>\n<ul>\n<li>\n<p>如果存在 <code>.bak</code>  的项目，删除两个同名项目中不包含 <code>.bak</code>  那一项，然后删除剩下那一项中名字 <code>.bak</code></p>\n</li>\n<li>\n<p>如果不存在，那么需要把右边的 <code>ProfileImagePath</code>  修改为自己的正常路径</p>\n</li>\n<li>\n<p>接着重启电脑，可以发现桌面壁纸图标文件磁贴菜单都恢复成原来的样子了</p>\n</li>\n</ul>\n",
            "tags": [
                "其他"
            ]
        },
        {
            "id": "https://gardenhamster.cn/note/CSharp/util/",
            "url": "https://gardenhamster.cn/note/CSharp/util/",
            "title": "C#工具类",
            "date_published": "2025-04-17T16:00:00.000Z",
            "content_html": "<h1 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h1>\n<p>记录一些平时整理的工具类，方便日后查找使用</p>\n<h2 id=\"excel工具类npoi\"><a class=\"anchor\" href=\"#excel工具类npoi\">#</a> Excel 工具类 (NPOI)</h2>\n<figure class=\"highlight csharp\"><figcaption data-lang=\"C#\"><span>ExcelHelper.cs</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ExcelHelper</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">FileInfo</span> <span class=\"token generic-method\"><span class=\"token function\">ExportExcel</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>TSource<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\">List<span class=\"token punctuation\">&lt;</span>TSource<span class=\"token punctuation\">></span></span> sources<span class=\"token punctuation\">,</span> <span class=\"token class-name\">ExcelColumn<span class=\"token punctuation\">&lt;</span>TSource<span class=\"token punctuation\">></span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span> columns<span class=\"token punctuation\">,</span> <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> saveDirPath<span class=\"token punctuation\">,</span> <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> fileName <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>        <span class=\"token class-name\">IWorkbook</span> workbook <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">XSSFWorkbook</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token comment\">// 创建 xlsx</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>        <span class=\"token class-name\">ISheet</span> sheet <span class=\"token operator\">=</span> workbook<span class=\"token punctuation\">.</span><span class=\"token function\">CreateSheet</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Sheet1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>        <span class=\"token class-name\">IRow</span> headerRow <span class=\"token operator\">=</span> sheet<span class=\"token punctuation\">.</span><span class=\"token function\">CreateRow</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token keyword\">int</span></span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> columns<span class=\"token punctuation\">.</span>Length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>            <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> column <span class=\"token operator\">=</span> columns<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>            headerRow<span class=\"token punctuation\">.</span><span class=\"token function\">CreateCell</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">SetCellValue</span><span class=\"token punctuation\">(</span>column<span class=\"token punctuation\">.</span>Title<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token keyword\">int</span></span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> sources<span class=\"token punctuation\">.</span>Count<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>        <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>            <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> source <span class=\"token operator\">=</span> sources<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>            <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> row <span class=\"token operator\">=</span> sheet<span class=\"token punctuation\">.</span><span class=\"token function\">CreateRow</span><span class=\"token punctuation\">(</span>i <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>            row<span class=\"token punctuation\">.</span><span class=\"token function\">FillRow</span><span class=\"token punctuation\">(</span>source<span class=\"token punctuation\">,</span> columns<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>        <span class=\"token keyword\">using</span> <span class=\"token class-name\">MemoryStream</span> stream <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">MemoryStream</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>        workbook<span class=\"token punctuation\">.</span><span class=\"token function\">Write</span><span class=\"token punctuation\">(</span>stream<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>        <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> buf <span class=\"token operator\">=</span> stream<span class=\"token punctuation\">.</span><span class=\"token function\">ToArray</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>Directory<span class=\"token punctuation\">.</span><span class=\"token function\">Exists</span><span class=\"token punctuation\">(</span>saveDirPath<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>        <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>            Directory<span class=\"token punctuation\">.</span><span class=\"token function\">CreateDirectory</span><span class=\"token punctuation\">(</span>saveDirPath<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">string</span><span class=\"token punctuation\">.</span><span class=\"token function\">IsNullOrWhiteSpace</span><span class=\"token punctuation\">(</span>fileName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>        <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>            fileName <span class=\"token operator\">=</span> <span class=\"token interpolation-string\"><span class=\"token string\">$\"</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span><span class=\"token expression language-csharp\">DateTime<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">.</span><span class=\"token function\">ToFileNameString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></span><span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">.xlsx\"</span></span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>        <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> fullSavePath <span class=\"token operator\">=</span> Path<span class=\"token punctuation\">.</span><span class=\"token function\">Combine</span><span class=\"token punctuation\">(</span>saveDirPath<span class=\"token punctuation\">,</span> fileName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>        <span class=\"token keyword\">using</span> <span class=\"token class-name\">FileStream</span> fs <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">FileStream</span><span class=\"token punctuation\">(</span>fullSavePath<span class=\"token punctuation\">,</span> FileMode<span class=\"token punctuation\">.</span>Create<span class=\"token punctuation\">,</span> FileAccess<span class=\"token punctuation\">.</span>Write<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>        fs<span class=\"token punctuation\">.</span><span class=\"token function\">Write</span><span class=\"token punctuation\">(</span>buf<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> buf<span class=\"token punctuation\">.</span>Length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>        fs<span class=\"token punctuation\">.</span><span class=\"token function\">Flush</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">FileInfo</span><span class=\"token punctuation\">(</span>fullSavePath<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>    <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token generic-method\"><span class=\"token function\">FillRow</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>TSource<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\">IRow</span> row<span class=\"token punctuation\">,</span> <span class=\"token class-name\">TSource</span> source<span class=\"token punctuation\">,</span> <span class=\"token class-name\">ExcelColumn<span class=\"token punctuation\">&lt;</span>TSource<span class=\"token punctuation\">></span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span> columns<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre>        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token keyword\">int</span></span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> columns<span class=\"token punctuation\">.</span>Length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre>        <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"43\"></td><td><pre>            <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> column <span class=\"token operator\">=</span> columns<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre>            <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> <span class=\"token keyword\">value</span> <span class=\"token operator\">=</span> source<span class=\"token punctuation\">.</span><span class=\"token function\">ToStringValue</span><span class=\"token punctuation\">(</span>column<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre>            row<span class=\"token punctuation\">.</span><span class=\"token function\">CreateCell</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">SetCellType</span><span class=\"token punctuation\">(</span>CellType<span class=\"token punctuation\">.</span>String<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">SetCellValue</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">value</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"46\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"47\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"48\"></td><td><pre></pre></td></tr><tr><td data-num=\"49\"></td><td><pre>    <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> <span class=\"token generic-method\"><span class=\"token function\">ToStringValue</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>TSource<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\">TSource</span> source<span class=\"token punctuation\">,</span> <span class=\"token class-name\">ExcelColumn<span class=\"token punctuation\">&lt;</span>TSource<span class=\"token punctuation\">></span></span> column<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"50\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"51\"></td><td><pre>        <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> <span class=\"token keyword\">value</span> <span class=\"token operator\">=</span> column<span class=\"token punctuation\">.</span><span class=\"token function\">Selector</span><span class=\"token punctuation\">(</span>source<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"52\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">value</span> <span class=\"token keyword\">is</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"53\"></td><td><pre>        <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"54\"></td><td><pre>            <span class=\"token keyword\">return</span> <span class=\"token keyword\">string</span><span class=\"token punctuation\">.</span>Empty<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"55\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"56\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>source <span class=\"token keyword\">is</span> <span class=\"token class-name\">DateTime</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"57\"></td><td><pre>        <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"58\"></td><td><pre>            <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>DateTime<span class=\"token punctuation\">)</span><span class=\"token keyword\">value</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"yyyy-MM-dd HH:mm:ss\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"59\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"60\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">value</span><span class=\"token punctuation\">.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"61\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"62\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><figure class=\"highlight csharp\"><figcaption data-lang=\"C#\"><span>ExcelColumn.cs</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">public</span> <span class=\"token keyword\">record</span> <span class=\"token class-name\">ExcelColumn<span class=\"token punctuation\">&lt;</span>TSource<span class=\"token punctuation\">></span></span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> Title <span class=\"token punctuation\">&#123;</span> <span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\">Func<span class=\"token punctuation\">&lt;</span>TSource<span class=\"token punctuation\">,</span> <span class=\"token keyword\">object</span><span class=\"token punctuation\">></span></span> Selector <span class=\"token punctuation\">&#123;</span> <span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token function\">ExcelColumn</span><span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token keyword\">string</span></span> title<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Func<span class=\"token punctuation\">&lt;</span>TSource<span class=\"token punctuation\">,</span> <span class=\"token keyword\">object</span><span class=\"token punctuation\">></span></span> selector<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>Title <span class=\"token operator\">=</span> title<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>Selector <span class=\"token operator\">=</span> selector<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><figure class=\"highlight csharp\"><figcaption data-lang=\"C#\"><span>使用示例</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token punctuation\">(</span>FileInfo<span class=\"token punctuation\">,</span> <span class=\"token keyword\">string</span><span class=\"token punctuation\">)</span></span> <span class=\"token function\">CreateExcel</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">List<span class=\"token punctuation\">&lt;</span>InvoiceRequestDto<span class=\"token punctuation\">></span></span> datas<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> columns <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">ExcelColumn<span class=\"token punctuation\">&lt;</span>InvoiceRequestDto<span class=\"token punctuation\">></span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"发票号\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>o<span class=\"token punctuation\">.</span>InvoiceCode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"客户编号\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>o<span class=\"token punctuation\">.</span>CustomerCode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"类型\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>o<span class=\"token punctuation\">.</span>Type<span class=\"token punctuation\">.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"名称\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>o<span class=\"token punctuation\">.</span>Name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Tin\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>o<span class=\"token punctuation\">.</span>Tin<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Brn\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>o<span class=\"token punctuation\">.</span>Brn<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Tel\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>o<span class=\"token punctuation\">.</span>Tel<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Email\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>o<span class=\"token punctuation\">.</span>Email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"地址\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>o<span class=\"token punctuation\">.</span>Address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"邮编\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>o<span class=\"token punctuation\">.</span>PostCode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"州属\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>o<span class=\"token punctuation\">.</span>StateName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"申请人\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>o<span class=\"token punctuation\">.</span>UserName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>        <span class=\"token keyword\">new</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"发票链接\"</span><span class=\"token punctuation\">,</span>o<span class=\"token operator\">=></span>BusinessHelper<span class=\"token punctuation\">.</span><span class=\"token function\">GetEInvoiceUrl</span><span class=\"token punctuation\">(</span>o<span class=\"token punctuation\">.</span>Uuid<span class=\"token punctuation\">,</span>o<span class=\"token punctuation\">.</span>LongId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>    <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> excelDirPath <span class=\"token operator\">=</span> FilePath<span class=\"token punctuation\">.</span><span class=\"token function\">GetExcelDirPath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> fileInfo <span class=\"token operator\">=</span> datas<span class=\"token punctuation\">.</span><span class=\"token function\">ExportExcel</span><span class=\"token punctuation\">(</span>columns<span class=\"token punctuation\">,</span> excelDirPath<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>    <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> relativePath <span class=\"token operator\">=</span> fileInfo<span class=\"token punctuation\">.</span><span class=\"token function\">ToRelativePath</span><span class=\"token punctuation\">(</span>excelDirPath<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>fileInfo<span class=\"token punctuation\">,</span> relativePath<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><h2 id=\"datetime工具类\"><a class=\"anchor\" href=\"#datetime工具类\">#</a> DateTime 工具类</h2>\n<figure class=\"highlight csharp\"><figcaption data-lang=\"C#\"><span>DateTimeHelper.cs</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">DateTimeHelper</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token comment\">/// yyyy-MM-dd HH:mm:ss</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>    <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">readonly</span> <span class=\"token class-name\">DateTimeFormatInfo</span> SimpleDateTimeFormat <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTimeFormatInfo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>        ShortDatePattern <span class=\"token operator\">=</span> <span class=\"token string\">\"yyyy-MM-dd HH:mm:ss\"</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>    <span class=\"token comment\">/// 接收一个日期字符串，返回当天 00:00:00 的日期</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"dateStr\">&lt;/param></span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetDayStart</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> dateStr<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>        <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> dt <span class=\"token operator\">=</span> Convert<span class=\"token punctuation\">.</span><span class=\"token function\">ToDateTime</span><span class=\"token punctuation\">(</span>dateStr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span>dt<span class=\"token punctuation\">.</span>Year<span class=\"token punctuation\">,</span> dt<span class=\"token punctuation\">.</span>Month<span class=\"token punctuation\">,</span> dt<span class=\"token punctuation\">.</span>Day<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>    <span class=\"token comment\">/// 接收一个日期字符串，返回当天 23:59:59 的日期</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"dateStr\">&lt;/param></span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetDayEnd</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> dateStr<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>        <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> dt <span class=\"token operator\">=</span> Convert<span class=\"token punctuation\">.</span><span class=\"token function\">ToDateTime</span><span class=\"token punctuation\">(</span>dateStr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span>dt<span class=\"token punctuation\">.</span>Year<span class=\"token punctuation\">,</span> dt<span class=\"token punctuation\">.</span>Month<span class=\"token punctuation\">,</span> dt<span class=\"token punctuation\">.</span>Day<span class=\"token punctuation\">,</span> <span class=\"token number\">23</span><span class=\"token punctuation\">,</span> <span class=\"token number\">59</span><span class=\"token punctuation\">,</span> <span class=\"token number\">59</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>    <span class=\"token comment\">/// 接收一个日期字符串，返回当天 00:00:00 的日期字符串</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"dateStr\">&lt;/param></span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> <span class=\"token function\">GetDayStartStr</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> dateStr<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token function\">GetDayStart</span><span class=\"token punctuation\">(</span>dateStr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"yyyy-MM-dd 00:00:00\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre></pre></td></tr><tr><td data-num=\"43\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre>    <span class=\"token comment\">/// 接收一个日期字符串，返回当天 23:59:59 的日期字符串</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"46\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"dateStr\">&lt;/param></span></pre></td></tr><tr><td data-num=\"47\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"48\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> <span class=\"token function\">GetDayEndStr</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> dateStr<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"49\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"50\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token function\">GetDayEnd</span><span class=\"token punctuation\">(</span>dateStr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"yyyy-MM-dd 23:59:59\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"51\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"52\"></td><td><pre></pre></td></tr><tr><td data-num=\"53\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"54\"></td><td><pre>    <span class=\"token comment\">/// 获取今天开始时间</span></pre></td></tr><tr><td data-num=\"55\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"56\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"57\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetTodayStart</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"58\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"59\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> now <span class=\"token operator\">=</span> DateTime<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"60\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span>Year<span class=\"token punctuation\">,</span> now<span class=\"token punctuation\">.</span>Month<span class=\"token punctuation\">,</span> now<span class=\"token punctuation\">.</span>Day<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"61\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"62\"></td><td><pre></pre></td></tr><tr><td data-num=\"63\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"64\"></td><td><pre>    <span class=\"token comment\">/// 获取今天结束时间</span></pre></td></tr><tr><td data-num=\"65\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"66\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"67\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetTodayEnd</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"68\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"69\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> now <span class=\"token operator\">=</span> DateTime<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"70\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span>Year<span class=\"token punctuation\">,</span> now<span class=\"token punctuation\">.</span>Month<span class=\"token punctuation\">,</span> now<span class=\"token punctuation\">.</span>Day<span class=\"token punctuation\">,</span> <span class=\"token number\">23</span><span class=\"token punctuation\">,</span> <span class=\"token number\">59</span><span class=\"token punctuation\">,</span> <span class=\"token number\">59</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"71\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"72\"></td><td><pre></pre></td></tr><tr><td data-num=\"73\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"74\"></td><td><pre>    <span class=\"token comment\">/// 获取本周开始时间</span></pre></td></tr><tr><td data-num=\"75\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"76\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"77\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetWeekStart</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"78\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"79\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> now <span class=\"token operator\">=</span> DateTime<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"80\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> temp <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span>Year<span class=\"token punctuation\">,</span> now<span class=\"token punctuation\">.</span>Month<span class=\"token punctuation\">,</span> now<span class=\"token punctuation\">.</span>Day<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"81\"></td><td><pre>        <span class=\"token class-name\"><span class=\"token keyword\">int</span></span> count <span class=\"token operator\">=</span> now<span class=\"token punctuation\">.</span>DayOfWeek <span class=\"token operator\">-</span> DayOfWeek<span class=\"token punctuation\">.</span>Monday<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"82\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>count <span class=\"token operator\">==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> count <span class=\"token operator\">=</span> <span class=\"token number\">6</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"83\"></td><td><pre>        <span class=\"token keyword\">return</span> temp<span class=\"token punctuation\">.</span><span class=\"token function\">AddDays</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span>count<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"84\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"85\"></td><td><pre></pre></td></tr><tr><td data-num=\"86\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"87\"></td><td><pre>    <span class=\"token comment\">/// 获取本周结束时间</span></pre></td></tr><tr><td data-num=\"88\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"89\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"90\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetWeekEnd</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"91\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"92\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> now <span class=\"token operator\">=</span> DateTime<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"93\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> temp <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span>Year<span class=\"token punctuation\">,</span> now<span class=\"token punctuation\">.</span>Month<span class=\"token punctuation\">,</span> now<span class=\"token punctuation\">.</span>Day<span class=\"token punctuation\">,</span> <span class=\"token number\">23</span><span class=\"token punctuation\">,</span> <span class=\"token number\">59</span><span class=\"token punctuation\">,</span> <span class=\"token number\">59</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"94\"></td><td><pre>        <span class=\"token class-name\"><span class=\"token keyword\">int</span></span> count <span class=\"token operator\">=</span> now<span class=\"token punctuation\">.</span>DayOfWeek <span class=\"token operator\">-</span> DayOfWeek<span class=\"token punctuation\">.</span>Sunday<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"95\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>count <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> count <span class=\"token operator\">=</span> <span class=\"token number\">7</span> <span class=\"token operator\">-</span> count<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"96\"></td><td><pre>        <span class=\"token keyword\">return</span> temp<span class=\"token punctuation\">.</span><span class=\"token function\">AddDays</span><span class=\"token punctuation\">(</span>count<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"97\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"98\"></td><td><pre></pre></td></tr><tr><td data-num=\"99\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"100\"></td><td><pre>    <span class=\"token comment\">/// 获取本周开始时间</span></pre></td></tr><tr><td data-num=\"101\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"102\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"103\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetMonthStart</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"104\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"105\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> now <span class=\"token operator\">=</span> DateTime<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"106\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span>Year<span class=\"token punctuation\">,</span> now<span class=\"token punctuation\">.</span>Month<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"107\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"108\"></td><td><pre></pre></td></tr><tr><td data-num=\"109\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"110\"></td><td><pre>    <span class=\"token comment\">/// 获取本周结束时间</span></pre></td></tr><tr><td data-num=\"111\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"112\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"113\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetMonthEnd</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"114\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"115\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> now <span class=\"token operator\">=</span> DateTime<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"116\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> temp <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span>Year<span class=\"token punctuation\">,</span> now<span class=\"token punctuation\">.</span>Month<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">23</span><span class=\"token punctuation\">,</span> <span class=\"token number\">59</span><span class=\"token punctuation\">,</span> <span class=\"token number\">59</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"117\"></td><td><pre>        <span class=\"token keyword\">return</span> temp<span class=\"token punctuation\">.</span><span class=\"token function\">AddMonths</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">AddDays</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"118\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"119\"></td><td><pre></pre></td></tr><tr><td data-num=\"120\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"121\"></td><td><pre>    <span class=\"token comment\">/// 获取本年开始时间</span></pre></td></tr><tr><td data-num=\"122\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"123\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"124\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetYearStart</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"125\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"126\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> now <span class=\"token operator\">=</span> DateTime<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"127\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span>Year<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"128\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"129\"></td><td><pre></pre></td></tr><tr><td data-num=\"130\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"131\"></td><td><pre>    <span class=\"token comment\">/// 获取本年结束时间</span></pre></td></tr><tr><td data-num=\"132\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"133\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"134\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetYearEnd</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"135\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"136\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> now <span class=\"token operator\">=</span> DateTime<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"137\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span>Year<span class=\"token punctuation\">,</span> <span class=\"token number\">12</span><span class=\"token punctuation\">,</span> <span class=\"token number\">31</span><span class=\"token punctuation\">,</span> <span class=\"token number\">23</span><span class=\"token punctuation\">,</span> <span class=\"token number\">59</span><span class=\"token punctuation\">,</span> <span class=\"token number\">59</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"138\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"139\"></td><td><pre></pre></td></tr><tr><td data-num=\"140\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"141\"></td><td><pre>    <span class=\"token comment\">/// 获取昨天开始时间</span></pre></td></tr><tr><td data-num=\"142\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"143\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"144\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetYesterdayStart</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"145\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"146\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token function\">GetTodayStart</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">AddDays</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"147\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"148\"></td><td><pre></pre></td></tr><tr><td data-num=\"149\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"150\"></td><td><pre>    <span class=\"token comment\">/// 获取昨天结束时间</span></pre></td></tr><tr><td data-num=\"151\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"152\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"153\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetYesterdayEnd</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"154\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"155\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token function\">GetTodayEnd</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">AddDays</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"156\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"157\"></td><td><pre></pre></td></tr><tr><td data-num=\"158\"></td><td><pre>    <span class=\"token comment\">// &lt;summary></span></pre></td></tr><tr><td data-num=\"159\"></td><td><pre>    <span class=\"token comment\">/// 获取上周开始时间</span></pre></td></tr><tr><td data-num=\"160\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"161\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"162\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetLastWeekStart</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"163\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"164\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token function\">GetWeekStart</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">AddDays</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">7</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"165\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"166\"></td><td><pre></pre></td></tr><tr><td data-num=\"167\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"168\"></td><td><pre>    <span class=\"token comment\">/// 获取上周结束时间</span></pre></td></tr><tr><td data-num=\"169\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"170\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"171\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetLastWeekEnd</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"172\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"173\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token function\">GetWeekEnd</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">AddDays</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">7</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"174\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"175\"></td><td><pre></pre></td></tr><tr><td data-num=\"176\"></td><td><pre>    <span class=\"token comment\">// &lt;summary></span></pre></td></tr><tr><td data-num=\"177\"></td><td><pre>    <span class=\"token comment\">/// 获取上月开始时间</span></pre></td></tr><tr><td data-num=\"178\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"179\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"180\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetLastMonthStart</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"181\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"182\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> now <span class=\"token operator\">=</span> DateTime<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"183\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> temp <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span>Year<span class=\"token punctuation\">,</span> now<span class=\"token punctuation\">.</span>Month<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"184\"></td><td><pre>        <span class=\"token keyword\">return</span> temp<span class=\"token punctuation\">.</span><span class=\"token function\">AddMonths</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"185\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"186\"></td><td><pre></pre></td></tr><tr><td data-num=\"187\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"188\"></td><td><pre>    <span class=\"token comment\">/// 获取上月结束时间</span></pre></td></tr><tr><td data-num=\"189\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"190\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"191\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetLastMonthEnd</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"192\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"193\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> now <span class=\"token operator\">=</span> DateTime<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"194\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> temp <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span>Year<span class=\"token punctuation\">,</span> now<span class=\"token punctuation\">.</span>Month<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">23</span><span class=\"token punctuation\">,</span> <span class=\"token number\">59</span><span class=\"token punctuation\">,</span> <span class=\"token number\">59</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"195\"></td><td><pre>        <span class=\"token keyword\">return</span> temp<span class=\"token punctuation\">.</span><span class=\"token function\">AddDays</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"196\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"197\"></td><td><pre></pre></td></tr><tr><td data-num=\"198\"></td><td><pre></pre></td></tr><tr><td data-num=\"199\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"200\"></td><td><pre>    <span class=\"token comment\">/// 根据一个总秒数，返回 \"时：分：秒\" 格式字符串</span></pre></td></tr><tr><td data-num=\"201\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"202\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"totalSecond\">&lt;/param></span></pre></td></tr><tr><td data-num=\"203\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"204\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> <span class=\"token function\">GetTimeStrBySeconds</span><span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token keyword\">int</span></span> totalSecond<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"205\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"206\"></td><td><pre>        <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> hour <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>totalSecond <span class=\"token operator\">/</span> <span class=\"token number\">3600</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">PadLeft</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token char\">'0'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"207\"></td><td><pre>        <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> minute <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>totalSecond <span class=\"token operator\">%</span> <span class=\"token number\">3600</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">60</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">PadLeft</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token char\">'0'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"208\"></td><td><pre>        <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> second <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>totalSecond <span class=\"token operator\">%</span> <span class=\"token number\">60</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">PadLeft</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token char\">'0'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"209\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">string</span><span class=\"token punctuation\">.</span><span class=\"token function\">Format</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"&#123;0&#125;:&#123;1&#125;:&#123;2&#125;\"</span><span class=\"token punctuation\">,</span> hour<span class=\"token punctuation\">,</span> minute<span class=\"token punctuation\">,</span> second<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"210\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"211\"></td><td><pre></pre></td></tr><tr><td data-num=\"212\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"213\"></td><td><pre>    <span class=\"token comment\">/// 获取两个日期的秒数差值</span></pre></td></tr><tr><td data-num=\"214\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"215\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"timeStart\">&lt;/param></span></pre></td></tr><tr><td data-num=\"216\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"timeEnd\">&lt;/param></span></pre></td></tr><tr><td data-num=\"217\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"218\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">int</span></span> <span class=\"token function\">SecondDiff</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\">DateTime</span> timeEnd<span class=\"token punctuation\">,</span> <span class=\"token class-name\">DateTime</span> timeStart<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"219\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"220\"></td><td><pre>        <span class=\"token class-name\">TimeSpan</span> timeSpanStart <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">TimeSpan</span><span class=\"token punctuation\">(</span>timeStart<span class=\"token punctuation\">.</span>Ticks<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"221\"></td><td><pre>        <span class=\"token class-name\">TimeSpan</span> timeSpanEnd <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">TimeSpan</span><span class=\"token punctuation\">(</span>timeEnd<span class=\"token punctuation\">.</span>Ticks<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"222\"></td><td><pre>        <span class=\"token class-name\">TimeSpan</span> timeDiff <span class=\"token operator\">=</span> timeSpanEnd<span class=\"token punctuation\">.</span><span class=\"token function\">Subtract</span><span class=\"token punctuation\">(</span>timeSpanStart<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"223\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>timeDiff<span class=\"token punctuation\">.</span>TotalSeconds<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"224\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"225\"></td><td><pre></pre></td></tr><tr><td data-num=\"226\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"227\"></td><td><pre>    <span class=\"token comment\">/// 获取两个日期的秒数差值</span></pre></td></tr><tr><td data-num=\"228\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"229\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"timeStart\">&lt;/param></span></pre></td></tr><tr><td data-num=\"230\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"timeEnd\">&lt;/param></span></pre></td></tr><tr><td data-num=\"231\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"232\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">TimeSpan</span> <span class=\"token function\">GetTimeSpanDiff</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">DateTime</span> timeStart<span class=\"token punctuation\">,</span> <span class=\"token class-name\">DateTime</span> timeEnd<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"233\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"234\"></td><td><pre>        <span class=\"token class-name\">TimeSpan</span> timeSpanStart <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">TimeSpan</span><span class=\"token punctuation\">(</span>timeStart<span class=\"token punctuation\">.</span>Ticks<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"235\"></td><td><pre>        <span class=\"token class-name\">TimeSpan</span> timeSpanEnd <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">TimeSpan</span><span class=\"token punctuation\">(</span>timeEnd<span class=\"token punctuation\">.</span>Ticks<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"236\"></td><td><pre>        <span class=\"token keyword\">return</span> timeSpanEnd<span class=\"token punctuation\">.</span><span class=\"token function\">Subtract</span><span class=\"token punctuation\">(</span>timeSpanStart<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"237\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"238\"></td><td><pre></pre></td></tr><tr><td data-num=\"239\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"240\"></td><td><pre>    <span class=\"token comment\">/// 获取两个日期的天数差值</span></pre></td></tr><tr><td data-num=\"241\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"242\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"timeStart\">&lt;/param></span></pre></td></tr><tr><td data-num=\"243\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"timeEnd\">&lt;/param></span></pre></td></tr><tr><td data-num=\"244\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"245\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">int</span></span> <span class=\"token function\">GetDayDiff</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">DateTime</span> timeStart<span class=\"token punctuation\">,</span> <span class=\"token class-name\">DateTime</span> timeEnd<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"246\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"247\"></td><td><pre>        <span class=\"token class-name\">TimeSpan</span> timeSpanStart <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">TimeSpan</span><span class=\"token punctuation\">(</span>timeStart<span class=\"token punctuation\">.</span>Ticks<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"248\"></td><td><pre>        <span class=\"token class-name\">TimeSpan</span> timeSpanEnd <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">TimeSpan</span><span class=\"token punctuation\">(</span>timeEnd<span class=\"token punctuation\">.</span>Ticks<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"249\"></td><td><pre>        <span class=\"token class-name\">TimeSpan</span> timeDiff <span class=\"token operator\">=</span> timeSpanEnd<span class=\"token punctuation\">.</span><span class=\"token function\">Subtract</span><span class=\"token punctuation\">(</span>timeSpanStart<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"250\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>timeDiff<span class=\"token punctuation\">.</span>TotalDays<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"251\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"252\"></td><td><pre></pre></td></tr><tr><td data-num=\"253\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"254\"></td><td><pre>    <span class=\"token comment\">/// 获取当前时间 n 秒后的实例</span></pre></td></tr><tr><td data-num=\"255\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"256\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"minutes\">&lt;/param></span></pre></td></tr><tr><td data-num=\"257\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"258\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">GetDateTimeAfterMinutes</span><span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token keyword\">int</span></span> minutes<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"259\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"260\"></td><td><pre>        <span class=\"token keyword\">return</span> DateTime<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">.</span><span class=\"token function\">AddMinutes</span><span class=\"token punctuation\">(</span>minutes<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"261\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"262\"></td><td><pre></pre></td></tr><tr><td data-num=\"263\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"264\"></td><td><pre>    <span class=\"token comment\">/// DateTime 转换为 Unix 时间戳 (秒)</span></pre></td></tr><tr><td data-num=\"265\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"266\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"dateTime\">&lt;/param></span></pre></td></tr><tr><td data-num=\"267\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"268\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">long</span></span> <span class=\"token function\">ToTimeStamp</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\">DateTime</span> dateTime<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"269\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"270\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> startTime <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span><span class=\"token number\">1970</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> DateTimeKind<span class=\"token punctuation\">.</span>Utc<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"271\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>dateTime<span class=\"token punctuation\">.</span><span class=\"token function\">ToUniversalTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> startTime<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>TotalSeconds<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"272\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"273\"></td><td><pre></pre></td></tr><tr><td data-num=\"274\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"275\"></td><td><pre>    <span class=\"token comment\">/// Unix 时间戳 (秒) 转 DateTime</span></pre></td></tr><tr><td data-num=\"276\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"277\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"timeStamp\">&lt;/param></span></pre></td></tr><tr><td data-num=\"278\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"279\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime</span> <span class=\"token function\">ToDateTime</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\"><span class=\"token keyword\">long</span></span> timeStamp<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"280\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"281\"></td><td><pre>        <span class=\"token class-name\">DateTime</span> dateTime <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTime</span><span class=\"token punctuation\">(</span><span class=\"token number\">1970</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> DateTimeKind<span class=\"token punctuation\">.</span>Utc<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"282\"></td><td><pre>        dateTime <span class=\"token operator\">=</span> dateTime<span class=\"token punctuation\">.</span><span class=\"token function\">AddSeconds</span><span class=\"token punctuation\">(</span>timeStamp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">ToLocalTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"283\"></td><td><pre>        <span class=\"token keyword\">return</span> dateTime<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"284\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"285\"></td><td><pre></pre></td></tr><tr><td data-num=\"286\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"287\"></td><td><pre>    <span class=\"token comment\">/// 获取当天是本星期的第几天</span></pre></td></tr><tr><td data-num=\"288\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"289\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"290\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">int</span></span> <span class=\"token function\">GetDayOfWeek</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"291\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"292\"></td><td><pre>        <span class=\"token class-name\">DayOfWeek</span> dayOfWeek <span class=\"token operator\">=</span> DateTime<span class=\"token punctuation\">.</span>Today<span class=\"token punctuation\">.</span>DayOfWeek<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"293\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>dayOfWeek <span class=\"token operator\">==</span> DayOfWeek<span class=\"token punctuation\">.</span>Monday<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"294\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>dayOfWeek <span class=\"token operator\">==</span> DayOfWeek<span class=\"token punctuation\">.</span>Tuesday<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"295\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>dayOfWeek <span class=\"token operator\">==</span> DayOfWeek<span class=\"token punctuation\">.</span>Wednesday<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"296\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>dayOfWeek <span class=\"token operator\">==</span> DayOfWeek<span class=\"token punctuation\">.</span>Thursday<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token number\">4</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"297\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>dayOfWeek <span class=\"token operator\">==</span> DayOfWeek<span class=\"token punctuation\">.</span>Friday<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"298\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>dayOfWeek <span class=\"token operator\">==</span> DayOfWeek<span class=\"token punctuation\">.</span>Saturday<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token number\">6</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"299\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>dayOfWeek <span class=\"token operator\">==</span> DayOfWeek<span class=\"token punctuation\">.</span>Sunday<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token number\">7</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"300\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"301\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"302\"></td><td><pre></pre></td></tr><tr><td data-num=\"303\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"304\"></td><td><pre>    <span class=\"token comment\">/// 将一个 DateTime 格式化为时间字符串</span></pre></td></tr><tr><td data-num=\"305\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"306\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"datetime\">&lt;/param></span></pre></td></tr><tr><td data-num=\"307\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"308\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> <span class=\"token function\">ToSimpleString</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\">DateTime</span> datetime<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"309\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"310\"></td><td><pre>        <span class=\"token keyword\">return</span> datetime<span class=\"token punctuation\">.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"yyyy-MM-dd HH:mm:ss\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"311\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"312\"></td><td><pre></pre></td></tr><tr><td data-num=\"313\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"314\"></td><td><pre>    <span class=\"token comment\">/// 将一个 DateTime 格式化为时间字符串</span></pre></td></tr><tr><td data-num=\"315\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"316\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"datetime\">&lt;/param></span></pre></td></tr><tr><td data-num=\"317\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"318\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> <span class=\"token function\">ToFileNameString</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\">DateTime</span> datetime<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"319\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"320\"></td><td><pre>        <span class=\"token keyword\">return</span> datetime<span class=\"token punctuation\">.</span><span class=\"token function\">ToString</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"yyyyMMddHHmmssffffff\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"321\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"322\"></td><td><pre></pre></td></tr><tr><td data-num=\"323\"></td><td><pre>    <span class=\"token comment\">/// &lt;summary></span></pre></td></tr><tr><td data-num=\"324\"></td><td><pre>    <span class=\"token comment\">/// 将一个字符串转换为 DateTime</span></pre></td></tr><tr><td data-num=\"325\"></td><td><pre>    <span class=\"token comment\">/// &lt;/summary></span></pre></td></tr><tr><td data-num=\"326\"></td><td><pre>    <span class=\"token comment\">/// &lt;param name=\"datetime\">&lt;/param></span></pre></td></tr><tr><td data-num=\"327\"></td><td><pre>    <span class=\"token comment\">/// &lt;returns>&lt;/returns></span></pre></td></tr><tr><td data-num=\"328\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">DateTime<span class=\"token punctuation\">?</span></span> <span class=\"token function\">ToDateTime</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span> <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> str<span class=\"token punctuation\">,</span> <span class=\"token class-name\"><span class=\"token keyword\">string</span></span> formatStr <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"329\"></td><td><pre>    <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"330\"></td><td><pre>        <span class=\"token keyword\">try</span></pre></td></tr><tr><td data-num=\"331\"></td><td><pre>        <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"332\"></td><td><pre>            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">string</span><span class=\"token punctuation\">.</span><span class=\"token function\">IsNullOrEmpty</span><span class=\"token punctuation\">(</span>formatStr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"333\"></td><td><pre>            <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"334\"></td><td><pre>                <span class=\"token keyword\">return</span> Convert<span class=\"token punctuation\">.</span><span class=\"token function\">ToDateTime</span><span class=\"token punctuation\">(</span>str<span class=\"token punctuation\">,</span> SimpleDateTimeFormat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"335\"></td><td><pre>            <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"336\"></td><td><pre>            <span class=\"token class-name\">DateTimeFormatInfo</span> formatInfo <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">DateTimeFormatInfo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"337\"></td><td><pre>            <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"338\"></td><td><pre>                ShortDatePattern <span class=\"token operator\">=</span> formatStr</pre></td></tr><tr><td data-num=\"339\"></td><td><pre>            <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"340\"></td><td><pre>            <span class=\"token keyword\">return</span> Convert<span class=\"token punctuation\">.</span><span class=\"token function\">ToDateTime</span><span class=\"token punctuation\">(</span>str<span class=\"token punctuation\">,</span> formatInfo<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"341\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"342\"></td><td><pre>        <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Exception</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"343\"></td><td><pre>        <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"344\"></td><td><pre>            <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"345\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"346\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"347\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure>",
            "tags": [
                "笔记",
                "C#"
            ]
        },
        {
            "id": "https://gardenhamster.cn/note/mahjong/note01/",
            "url": "https://gardenhamster.cn/note/mahjong/note01/",
            "title": "立直麻将",
            "date_published": "2024-12-27T16:00:00.000Z",
            "content_html": "<h2 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h2>\n<ul>\n<li>记录一些曾经打错的牌谱</li>\n</ul>\n<h2 id=\"猫猫讲谱集\"><a class=\"anchor\" href=\"#猫猫讲谱集\">#</a> 猫猫讲谱集</h2>\n<p><img loading=\"lazy\" data-src=\"20241228212452.jpg\" alt=\"image\" /></p>\n<ul>\n<li><strong>对子太多，可以先打 6P，等 2P 或者看一下七对子</strong></li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20241228212941.jpg\" alt=\"image\" /></p>\n<ul>\n<li><strong>9S 是 Dora，可以先打 1s，后续碰白板后打 6s 听 7s，因为是愚型所以先不看一气</strong></li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20241228213133.jpg\" alt=\"image\" /></p>\n<ul>\n<li><strong>4P 是 Dora，贪 Dora 可以打 2P，后续摸 36P 可以打 5s 听牌</strong></li>\n</ul>\n",
            "tags": [
                "笔记",
                "立直麻将"
            ]
        },
        {
            "id": "https://gardenhamster.cn/note/Javascript/note01/",
            "url": "https://gardenhamster.cn/note/Javascript/note01/",
            "title": "JavaScript笔记",
            "coverPosition": "15% 30%",
            "date_published": "2024-12-04T16:00:00.000Z",
            "content_html": "<h2 id=\"运算符\"><a class=\"anchor\" href=\"#运算符\">#</a> !! 运算符</h2>\n<ul>\n<li>!! 运算符在 JavaScript 中被称为双重否定运算符，可以将任意值转换为布尔值</li>\n</ul>\n<figure class=\"highlight js\"><figcaption data-lang=\"JavaScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span><span class=\"token operator\">-</span><span class=\"token number\">114514</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token comment\">// console.log(!''); // true</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span><span class=\"token string\">'Hello'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span><span class=\"token keyword\">undefined</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span><span class=\"token number\">NaN</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span></pre></td></tr></table></figure>",
            "tags": [
                "笔记",
                "JavaScript"
            ]
        },
        {
            "id": "https://gardenhamster.cn/note/TypeScript/note01/",
            "url": "https://gardenhamster.cn/note/TypeScript/note01/",
            "title": "TypeScript笔记",
            "date_published": "2024-11-27T16:00:00.000Z",
            "content_html": "<h2 id=\"typescript是什么\"><a class=\"anchor\" href=\"#typescript是什么\">#</a> TypeScript 是什么</h2>\n<ul>\n<li>TypeScript 是由 Microsoft 开发的一种开源编程语言，它扩展了 JavaScript，增加了静态类型系统和类、接口等面向对象的特性。TypeScript 代码在编译时会被转换为纯 JavaScript 代码，可以在任何支持 JavaScript 的环境中运行。</li>\n</ul>\n<h2 id=\"环境安装\"><a class=\"anchor\" href=\"#环境安装\">#</a> 环境安装</h2>\n<ul>\n<li>需要先安装 nodejs</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\"># 全局安装 typescript</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">npm</span> <span class=\"token function\">install</span> typescript <span class=\"token parameter variable\">-g</span></pre></td></tr></table></figure><figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\"># 查询 typescript 版本</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>tsc <span class=\"token parameter variable\">-v</span></pre></td></tr></table></figure><figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\"># 初始化 typescript 项目，执行命令后会在根目录下生成 tsconfig.json, 可以通过修改该文件设置编译器的各种规则，比如严格模式 strict 等</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>tsc <span class=\"token parameter variable\">--init</span></pre></td></tr></table></figure><ul>\n<li>创建 <code>ts</code>  文件，比如 <code>index.ts</code> ，然后编写测试代码</li>\n</ul>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">let</span> str<span class=\"token operator\">:</span><span class=\"token builtin\">string</span><span class=\"token operator\">=</span><span class=\"token string\">'Hello World'</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>str<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><ul>\n<li>编译后运行</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\"># 监控目录下所有 ts 文件变化，如果文件内容改变会自动将其编译为 js 文件，ts 文件修改完以后直接执行 js 文件即可</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>tsc <span class=\"token parameter variable\">-w</span> </pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token comment\"># 新建终端执行 js 文件测试效果</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token function\">node</span> index.js</pre></td></tr></table></figure><ul>\n<li>或者使用 <code>ts-node</code>  插件运行</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\"># 安装 ts-node 插件</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">npm</span> <span class=\"token function\">install</span> ts-node <span class=\"token parameter variable\">-g</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token comment\"># 初始化 npm，执行后会生成 package.json</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token function\">npm</span> init <span class=\"token parameter variable\">-y</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token comment\"># 安装 TypeScript 的 nodejs 声明</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token function\">npm</span> <span class=\"token function\">install</span> @types/node <span class=\"token parameter variable\">-D</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token comment\"># 运行 ts 文件</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>ts-node index.ts</pre></td></tr></table></figure><h2 id=\"arguments对象\"><a class=\"anchor\" href=\"#arguments对象\">#</a> arguments 对象</h2>\n<ul>\n<li>arguments 对是一个类数组对象，作用域在方法内部时，包含了当前函数被调用时传入的所有参数，也可以转换为数值，使用 arguments 调试的时候很方便</li>\n</ul>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">foo</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>params<span class=\"token operator\">:</span> <span class=\"token builtin\">any</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arguments<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">//[Arguments] &#123; '0': 123, '1': 'hello', '2': true &#125;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token keyword\">const</span> args <span class=\"token operator\">=</span> <span class=\"token builtin\">Array</span><span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span>arguments<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 将 arguments 对象转换为数组</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [ 123, 'hello', true ]</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token function\">foo</span><span class=\"token punctuation\">(</span><span class=\"token number\">123</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"hello\"</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><h2 id=\"any类型和unknown类型\"><a class=\"anchor\" href=\"#any类型和unknown类型\">#</a> Any 类型和 Unknown 类型</h2>\n<h3 id=\"相同点\"><a class=\"anchor\" href=\"#相同点\">#</a> 相同点</h3>\n<ul>\n<li>any 和 unknown 都是顶级类型，是 Object 类型的父类</li>\n</ul>\n<h3 id=\"不同点\"><a class=\"anchor\" href=\"#不同点\">#</a> 不同点</h3>\n<ul>\n<li>unknown 只能赋值给自身或者 any</li>\n<li>unknown 表示不确定类型的参数，不允许调用对象的任何属性和方法，否则会出现编译错误，可以只用于方法中的输入或输出，是安全型的 any</li>\n</ul>\n<h2 id=\"never类型\"><a class=\"anchor\" href=\"#never类型\">#</a> Never 类型</h2>\n<ul>\n<li>用于从来都不会返回值的函数 (比如死循环)，或者无论如何都会抛出异常的函数</li>\n</ul>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">const</span> loop <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">never</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span> <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">const</span> error <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">never</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><h2 id=\"object和object类型\"><a class=\"anchor\" href=\"#object和object类型\">#</a> Object 和 object 类型</h2>\n<ul>\n<li>Object（大写）和 Java 和 C# 一样都包含了所有类型，可以存放任意值</li>\n<li>object（小写）只能存放引用类型或者函数</li>\n</ul>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">let</span> a1<span class=\"token operator\">:</span>Object <span class=\"token operator\">=</span> <span class=\"token number\">123</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">let</span> a2<span class=\"token operator\">:</span>Object <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">let</span> a3<span class=\"token operator\">:</span>Object <span class=\"token operator\">=</span> <span class=\"token string\">'123'</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">let</span> a4<span class=\"token operator\">:</span>Object <span class=\"token operator\">=</span> <span class=\"token punctuation\">&#123;</span><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">let</span> a5<span class=\"token operator\">:</span>Object <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">let</span> a6<span class=\"token operator\">:</span><span class=\"token function-variable function\">Object</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">=></span><span class=\"token number\">123</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token keyword\">let</span> b1<span class=\"token operator\">:</span>object <span class=\"token operator\">=</span> <span class=\"token number\">123</span>   <span class=\"token comment\">// 报错</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre><span class=\"token keyword\">let</span> b2<span class=\"token operator\">:</span>object <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span>  <span class=\"token comment\">// 报错</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token keyword\">let</span> b3<span class=\"token operator\">:</span>object <span class=\"token operator\">=</span> <span class=\"token string\">'123'</span> <span class=\"token comment\">// 报错</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre><span class=\"token keyword\">let</span> b4<span class=\"token operator\">:</span>object <span class=\"token operator\">=</span> <span class=\"token punctuation\">&#123;</span><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token keyword\">let</span> b5<span class=\"token operator\">:</span>object <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token keyword\">let</span> b6<span class=\"token operator\">:</span><span class=\"token function-variable function\">object</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">=></span><span class=\"token number\">123</span></pre></td></tr></table></figure><h2 id=\"interface\"><a class=\"anchor\" href=\"#interface\">#</a> Interface</h2>\n<h3 id=\"多个同名的interface会进行合并\"><a class=\"anchor\" href=\"#多个同名的interface会进行合并\">#</a> 多个同名的 Interface 会进行合并</h3>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">interface</span> <span class=\"token class-name\">Person</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">interface</span> <span class=\"token class-name\">Person</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    age<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token keyword\">let</span> p1<span class=\"token operator\">:</span> Person <span class=\"token operator\">=</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    name<span class=\"token operator\">:</span> <span class=\"token string\">\"111\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    age<span class=\"token operator\">:</span> <span class=\"token number\">18</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><h3 id=\"可空类型和只读类型readonly\"><a class=\"anchor\" href=\"#可空类型和只读类型readonly\">#</a> 可空类型？和只读类型 readonly</h3>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">interface</span> <span class=\"token class-name\">Person</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    age<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span><span class=\"token comment\">// 可空类型</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token keyword\">readonly</span> id<span class=\"token operator\">:</span><span class=\"token builtin\">number</span><span class=\"token comment\">// 只读</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    <span class=\"token keyword\">readonly</span> <span class=\"token function-variable function\">print</span><span class=\"token operator\">:</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">=></span><span class=\"token punctuation\">&#123;</span><span class=\"token punctuation\">&#125;</span><span class=\"token comment\">// 只读</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token keyword\">let</span> p1<span class=\"token operator\">:</span> Person <span class=\"token operator\">=</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    name<span class=\"token operator\">:</span> <span class=\"token string\">\"111\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    id<span class=\"token operator\">:</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    <span class=\"token function-variable function\">print</span><span class=\"token operator\">:</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">=></span><span class=\"token punctuation\">&#123;</span><span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>p1<span class=\"token punctuation\">.</span>id<span class=\"token operator\">=</span><span class=\"token number\">2</span><span class=\"token punctuation\">;</span><span class=\"token comment\">// 报错</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>p1<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">print</span><span class=\"token operator\">=</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">=></span><span class=\"token punctuation\">&#123;</span><span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 报错</span></pre></td></tr></table></figure><h3 id=\"继承extends\"><a class=\"anchor\" href=\"#继承extends\">#</a> 继承 extends</h3>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">interface</span> <span class=\"token class-name\">ClassA</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">interface</span> <span class=\"token class-name\">ClassB</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    age<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>    sex<span class=\"token operator\">:</span> <span class=\"token builtin\">boolean</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token comment\">// 可以继承多个</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre><span class=\"token keyword\">interface</span> <span class=\"token class-name\">Person</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">ClassA</span><span class=\"token punctuation\">,</span> ClassB <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    <span class=\"token function-variable function\">print</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><h3 id=\"接口定义函数\"><a class=\"anchor\" href=\"#接口定义函数\">#</a> 接口定义函数</h3>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">interface</span> <span class=\"token class-name\">Show</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    <span class=\"token punctuation\">(</span>name<span class=\"token operator\">:</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span>age<span class=\"token operator\">:</span><span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span><span class=\"token builtin\">string</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">const</span> fn<span class=\"token operator\">:</span><span class=\"token function-variable function\">Show</span><span class=\"token operator\">=</span><span class=\"token punctuation\">(</span>name<span class=\"token operator\">:</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span>age<span class=\"token operator\">:</span><span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">=></span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">$&#123;</span>name<span class=\"token interpolation-punctuation punctuation\">&#125;</span></span><span class=\"token string\">:</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">$&#123;</span>age<span class=\"token interpolation-punctuation punctuation\">&#125;</span></span><span class=\"token template-punctuation string\">`</span></span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token string\">'张三'</span><span class=\"token punctuation\">,</span><span class=\"token number\">18</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><h2 id=\"interface索引签名\"><a class=\"anchor\" href=\"#interface索引签名\">#</a> Interface 索引签名</h2>\n<ul>\n<li>实现 Interface 的对象的属性数量必须与接口的属数量保持一致，如果只是用到 Interface 中的一小部分属性可以使用属性签名</li>\n</ul>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">interface</span> <span class=\"token class-name\">Person</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    name<span class=\"token operator\">:</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span>    <span class=\"token comment\">// 只定义需要用到的属性</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    age<span class=\"token operator\">:</span><span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span>     <span class=\"token comment\">// 只定义需要用到的属性</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token comment\">// 这里 propName 是可以任意取的名称，变量的名称是 string 类型，值类型是 any</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    <span class=\"token punctuation\">[</span>propName<span class=\"token operator\">:</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">]</span><span class=\"token operator\">:</span><span class=\"token builtin\">any</span>   <span class=\"token comment\">// 其他属性定义为 any</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token keyword\">let</span> p1<span class=\"token operator\">:</span>Person<span class=\"token operator\">=</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    name<span class=\"token operator\">:</span><span class=\"token string\">'111'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    age<span class=\"token operator\">:</span><span class=\"token number\">18</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    sex<span class=\"token operator\">:</span><span class=\"token number\">0</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>p1<span class=\"token punctuation\">.</span>address<span class=\"token operator\">=</span><span class=\"token string\">'2222'</span><span class=\"token punctuation\">;</span>   <span class=\"token comment\">// 可以动态添加更多的属性值</span></pre></td></tr></table></figure><ul>\n<li>也可以分开定义固定属性和动态属性</li>\n</ul>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">interface</span> <span class=\"token class-name\">Product</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    price<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    stock<span class=\"token operator\">:</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>        <span class=\"token punctuation\">[</span>size<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    colors<span class=\"token operator\">:</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>        <span class=\"token punctuation\">[</span>color<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> <span class=\"token builtin\">boolean</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token keyword\">const</span> hoodie<span class=\"token operator\">:</span> Product <span class=\"token operator\">=</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>    name<span class=\"token operator\">:</span> <span class=\"token string\">'Hoodie'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    price<span class=\"token operator\">:</span> <span class=\"token number\">50</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    stock<span class=\"token operator\">:</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>        <span class=\"token string-property property\">'S'</span><span class=\"token operator\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>        <span class=\"token string-property property\">'M'</span><span class=\"token operator\">:</span> <span class=\"token number\">8</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>        <span class=\"token string-property property\">'L'</span><span class=\"token operator\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    colors<span class=\"token operator\">:</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>        <span class=\"token string-property property\">'Red'</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>        <span class=\"token string-property property\">'Blue'</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre></pre></td></tr><tr><td data-num=\"26\"></td><td><pre><span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>hoodie<span class=\"token punctuation\">.</span>stock<span class=\"token punctuation\">[</span><span class=\"token string\">'S'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre><span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>hoodie<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token string\">'Red'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><h2 id=\"数组定义\"><a class=\"anchor\" href=\"#数组定义\">#</a> 数组定义</h2>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">// 常用定义</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">let</span> arr1<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token comment\">// 泛型定义</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">let</span> arr2<span class=\"token operator\">:</span> <span class=\"token builtin\">Array</span><span class=\"token operator\">&lt;</span><span class=\"token builtin\">number</span><span class=\"token operator\">></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token comment\">// 对象数组</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">interface</span> <span class=\"token class-name\">Person</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre><span class=\"token keyword\">let</span> arr3<span class=\"token operator\">:</span> Person<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">&#123;</span> name<span class=\"token operator\">:</span> <span class=\"token string\">'111'</span> <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token keyword\">let</span> arr4<span class=\"token operator\">:</span> <span class=\"token builtin\">Array</span><span class=\"token operator\">&lt;</span>Person<span class=\"token operator\">></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">&#123;</span> name<span class=\"token operator\">:</span> <span class=\"token string\">'222'</span> <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre><span class=\"token comment\">// 二维数组</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token keyword\">let</span> arr5<span class=\"token operator\">:</span><span class=\"token builtin\">number</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token keyword\">let</span> arr6<span class=\"token operator\">:</span><span class=\"token builtin\">Array</span><span class=\"token operator\">&lt;</span><span class=\"token builtin\">Array</span><span class=\"token operator\">&lt;</span><span class=\"token builtin\">number</span><span class=\"token operator\">>>=</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre><span class=\"token comment\">// 大杂烩数组</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre><span class=\"token keyword\">let</span> arr7<span class=\"token operator\">:</span><span class=\"token builtin\">any</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token number\">123</span><span class=\"token punctuation\">,</span><span class=\"token string\">'abc'</span><span class=\"token punctuation\">,</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre><span class=\"token keyword\">let</span> arr8<span class=\"token operator\">:</span><span class=\"token punctuation\">[</span><span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span><span class=\"token builtin\">boolean</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">&#123;</span><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">]</span><span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token number\">123</span><span class=\"token punctuation\">,</span><span class=\"token string\">'abc'</span><span class=\"token punctuation\">,</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">&#123;</span>name<span class=\"token operator\">:</span><span class=\"token string\">'333'</span><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre><span class=\"token comment\">// 剩余参数...args</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>args<span class=\"token operator\">:</span><span class=\"token builtin\">number</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arguments<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><h2 id=\"函数定义\"><a class=\"anchor\" href=\"#函数定义\">#</a> 函数定义</h2>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">// 常用定义</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">fn1</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token comment\">// 箭头函数</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">const</span> fn2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre><span class=\"token comment\">// 默认参数</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token keyword\">const</span> fn3 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token comment\">// 可选参数 (可空参数)</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre><span class=\"token keyword\">const</span> fn4 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span>b <span class=\"token operator\">??</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre><span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">fn4</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token comment\">// 输出 1</span></pre></td></tr></table></figure><h2 id=\"函数重载\"><a class=\"anchor\" href=\"#函数重载\">#</a> 函数重载</h2>\n<ul>\n<li>函数重载有点复杂，不像 Java 或者 C# 等可以直接写同名的实现方法，还是少用为好</li>\n</ul>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">// 函数声明，不写也可以，写了以后 VSCode 可以显示有这些方法可以重载</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">message</span><span class=\"token punctuation\">(</span>options<span class=\"token operator\">:</span> object<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">message</span><span class=\"token punctuation\">(</span>text<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> onClose<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Function</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">message</span><span class=\"token punctuation\">(</span>text<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> mode<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> duration<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">message</span><span class=\"token punctuation\">(</span>text<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> duration<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> onClose<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Function</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token comment\">// 函数实现</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">message</span><span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>  param1<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">|</span> object<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>  param2<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">Function</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>  param3<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Function</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">number</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> param1<span class=\"token operator\">==</span><span class=\"token string\">'string'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> param1<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> param1<span class=\"token operator\">==</span><span class=\"token string\">'object'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> param1<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    <span class=\"token comment\">// 以此类推做业务处理...</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>    <span class=\"token keyword\">return</span> <span class=\"token string\">''</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre></pre></td></tr><tr><td data-num=\"19\"></td><td><pre><span class=\"token comment\">// 调用方式 1</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre><span class=\"token function\">message</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>  mode<span class=\"token operator\">:</span> <span class=\"token string\">\"mode\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>  text<span class=\"token operator\">:</span> <span class=\"token string\">\"msg\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>  <span class=\"token function-variable function\">onClose</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>  duration<span class=\"token operator\">:</span> <span class=\"token number\">3000</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre></pre></td></tr><tr><td data-num=\"27\"></td><td><pre><span class=\"token comment\">// 调用方式 2</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre><span class=\"token function\">message</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"msg\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre><span class=\"token function\">message</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"msg\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre><span class=\"token function\">message</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"msg\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"mode\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre><span class=\"token function\">message</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"msg\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"mode\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre><span class=\"token function\">message</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"msg\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"mode\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre><span class=\"token function\">message</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"msg\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3000</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span> <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><h2 id=\"联合类型和交叉类型\"><a class=\"anchor\" href=\"#联合类型和交叉类型\">#</a> 联合类型 | 和交叉类型 &amp;</h2>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">// 联合类型，变量可以声明为多个类型</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">const</span> fn1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>type<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token keyword\">return</span> type<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">fn1</span><span class=\"token punctuation\">(</span><span class=\"token string\">'666'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token comment\">// 交叉类型，对象作为参数时可以具有多个类的属性，类似于 extends</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token class-name\"><span class=\"token keyword\">interface</span></span> Person <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    age<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre><span class=\"token keyword\">interface</span> <span class=\"token class-name\">Man</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>    hobby<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre><span class=\"token keyword\">const</span> fn2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>man<span class=\"token operator\">:</span> Person <span class=\"token operator\">&amp;</span> Man<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span><span class=\"token keyword\">void</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>man<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre><span class=\"token function\">fn2</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>    name<span class=\"token operator\">:</span><span class=\"token string\">'张三'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>    age<span class=\"token operator\">:</span><span class=\"token number\">18</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    hobby<span class=\"token operator\">:</span><span class=\"token string\">'唱跳rap'</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h2 id=\"断言\"><a class=\"anchor\" href=\"#断言\">#</a> 断言</h2>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">const</span> fn <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>num<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    <span class=\"token comment\">//const length=num.length;// 报错，类型 “string | number” 上不存在属性 “length”。</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>num <span class=\"token keyword\">as</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token comment\">// 告诉编译器传入的 num 一定是 string 类型，编译器不再进行校验</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token operator\">></span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token comment\">// 第二种方式断言</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token string\">'123456'</span><span class=\"token punctuation\">)</span><span class=\"token comment\">// 输出 6</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token number\">123456</span><span class=\"token punctuation\">)</span><span class=\"token comment\">// 输出 undefined</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token comment\">//</span></pre></td></tr></table></figure><h2 id=\"class类\"><a class=\"anchor\" href=\"#class类\">#</a> Class 类</h2>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">interface</span> <span class=\"token class-name\">Person</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>    name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token comment\">// 属性可以定义为 readonly</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token keyword\">readonly</span> id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    <span class=\"token function\">show</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token keyword\">class</span> <span class=\"token class-name\">Man</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">Person</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    <span class=\"token comment\">// 构造函数</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>    <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span>name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>id <span class=\"token operator\">=</span> id<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>    <span class=\"token comment\">// 同 Java 和 C#，可以将方法定义为 public private protected</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>    <span class=\"token keyword\">public</span> <span class=\"token function\">sing</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>    <span class=\"token keyword\">private</span> <span class=\"token function\">dance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>    <span class=\"token keyword\">protected</span> <span class=\"token function\">rap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>    <span class=\"token comment\">// 不加修饰符默认是 public</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>    <span class=\"token function\">show</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>        <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">练习时间长达</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">$&#123;</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>time<span class=\"token interpolation-punctuation punctuation\">&#125;</span></span><span class=\"token string\">的个人练习生</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">$&#123;</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name<span class=\"token interpolation-punctuation punctuation\">&#125;</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>    <span class=\"token comment\">// 静态方法，方法体内可以调用静态方法，但是不能调用动态方法</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>    <span class=\"token keyword\">static</span> <span class=\"token function\">basketball</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">music</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>        <span class=\"token comment\">//this.sing ()// 报错</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>    <span class=\"token keyword\">static</span> <span class=\"token function\">music</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>        <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"登登登登~~~\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>    <span class=\"token comment\">//get set 方法</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>    <span class=\"token keyword\">private</span> _time<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">=</span> <span class=\"token number\">2.5</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre>    <span class=\"token keyword\">get</span> <span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_time<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"43\"></td><td><pre>    <span class=\"token keyword\">set</span> <span class=\"token function\">time</span><span class=\"token punctuation\">(</span>time<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre>        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_time <span class=\"token operator\">=</span> <span class=\"token number\">2.5</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"46\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"47\"></td><td><pre></pre></td></tr><tr><td data-num=\"48\"></td><td><pre><span class=\"token keyword\">const</span> m1<span class=\"token operator\">:</span> Man <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Man</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"蔡徐坤\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">18</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"49\"></td><td><pre>m1<span class=\"token punctuation\">.</span>time <span class=\"token operator\">=</span> <span class=\"token number\">2.5</span><span class=\"token punctuation\">;</span><span class=\"token comment\">//</span></pre></td></tr><tr><td data-num=\"50\"></td><td><pre>m1<span class=\"token punctuation\">.</span><span class=\"token function\">show</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"51\"></td><td><pre>Man<span class=\"token punctuation\">.</span><span class=\"token function\">basketball</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token comment\">// 调用静态方法</span></pre></td></tr></table></figure><h2 id=\"元组\"><a class=\"anchor\" href=\"#元组\">#</a> 元组</h2>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">// 定义元组类型，下面定义的元组只能存放 number 和 string 类型</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">let</span> arr1<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'2'</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>arr1<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arr1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token comment\">// 定义只读类型的元组</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token keyword\">const</span> arr2<span class=\"token operator\">:</span> <span class=\"token keyword\">readonly</span> <span class=\"token punctuation\">[</span><span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">boolean</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token comment\">//arr2 [0]=2;// 报错</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre><span class=\"token comment\">//arr2.push (true);// 报错</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arr2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token comment\">// 定义命名元组</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token keyword\">type</span> <span class=\"token class-name\">Person</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> age<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> sex<span class=\"token operator\">:</span> <span class=\"token builtin\">boolean</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre><span class=\"token keyword\">const</span> arr3<span class=\"token operator\">:</span> Person <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'张三'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">18</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre><span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arr3<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> arr3<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> arr3<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre><span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>names<span class=\"token punctuation\">,</span> age<span class=\"token punctuation\">,</span> sex<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> arr3<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre><span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>names<span class=\"token punctuation\">,</span> age<span class=\"token punctuation\">,</span> sex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><h2 id=\"ts编写防抖功能\"><a class=\"anchor\" href=\"#ts编写防抖功能\">#</a> ts 编写防抖功能</h2>\n<ul>\n<li>一定时间内连续多次点击只会生效一次</li>\n</ul>\n<figure class=\"highlight ts\"><figcaption data-lang=\"TypeScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">let</span> timer<span class=\"token operator\">:</span> <span class=\"token builtin\">any</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">let</span> <span class=\"token function-variable function\">clickTest</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token function\">clearTimeout</span><span class=\"token punctuation\">(</span>timer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>timer <span class=\"token operator\">=</span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'clicked'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>    timer <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">,</span> <span class=\"token number\">500</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure>",
            "tags": [
                "笔记",
                "TypeScript"
            ]
        },
        {
            "id": "https://gardenhamster.cn/note/Vue3/note01/",
            "url": "https://gardenhamster.cn/note/Vue3/note01/",
            "title": "Vue3笔记",
            "background": "cover.jpg",
            "backgroundPosition": "80% 30%",
            "backgroundOpacity": 0.88,
            "date_published": "2024-11-24T16:00:00.000Z",
            "content_html": "<h2 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h2>\n<ul>\n<li>记录 Vue3 + Vite + Ts + Pinia 相关开发环境配置，方便日后查找</li>\n</ul>\n<h2 id=\"vue3绑定动态事件\"><a class=\"anchor\" href=\"#vue3绑定动态事件\">#</a> Vue3 绑定动态事件</h2>\n<ul>\n<li>一般事件绑定</li>\n</ul>\n<figure class=\"highlight html\"><figcaption data-lang=\"HTML\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>template</span><span class=\"token punctuation\">></span></span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span>count=&#123;&#123; count &#125;&#125;<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">@click</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>increase<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>count++<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>template</span><span class=\"token punctuation\">></span></span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">setup</span> <span class=\"token attr-name\">lang</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>ts<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\"></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>  <span class=\"token keyword\">import</span> <span class=\"token punctuation\">&#123;</span> ref <span class=\"token punctuation\">&#125;</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'vue'</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>  <span class=\"token keyword\">let</span> count <span class=\"token operator\">=</span> ref<span class=\"token operator\">&lt;</span>number<span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">increase</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    count<span class=\"token punctuation\">.</span>value<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>  <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span></pre></td></tr></table></figure><ul>\n<li>动态事件绑定</li>\n</ul>\n<figure class=\"highlight html\"><figcaption data-lang=\"HTML\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>template</span><span class=\"token punctuation\">></span></span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span>count=&#123;&#123; count &#125;&#125;<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">@[event]</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>increase<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>count++<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>template</span><span class=\"token punctuation\">></span></span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">setup</span> <span class=\"token attr-name\">lang</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>ts<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\"></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>  <span class=\"token keyword\">import</span> <span class=\"token punctuation\">&#123;</span> ref <span class=\"token punctuation\">&#125;</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'vue'</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>  <span class=\"token keyword\">const</span> event<span class=\"token operator\">=</span><span class=\"token string\">'dblclick'</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>  <span class=\"token keyword\">let</span> count <span class=\"token operator\">=</span> ref<span class=\"token operator\">&lt;</span>number<span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">increase</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    count<span class=\"token punctuation\">.</span>value<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>  <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span></pre></td></tr></table></figure>",
            "tags": [
                "笔记",
                "Vue3"
            ]
        },
        {
            "id": "https://gardenhamster.cn/note/Vue3/environment/",
            "url": "https://gardenhamster.cn/note/Vue3/environment/",
            "title": "Vue3开发环境配置",
            "date_published": "2024-11-12T16:00:00.000Z",
            "content_html": "<h2 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h2>\n<ul>\n<li>记录 Vue3 + Vite + Ts + Pinia 相关开发环境配置，方便日后查找</li>\n</ul>\n<h2 id=\"安装nvm\"><a class=\"anchor\" href=\"#安装nvm\">#</a> 安装 NVM</h2>\n<ul>\n<li>\n<p>NVM 全称 node.js version management，专门针对 node 版本进行管理的工具，通过它可以安装和切换不同版本的 node.js</p>\n</li>\n<li>\n<p>下载安装 Nvm：<a href=\"https://github.com/coreybutler/nvm-windows/releases\">https://github.com/coreybutler/nvm-windows/releases</a></p>\n</li>\n<li>\n<p>修改 Nvm 安装目录下的 <code>settings.txt</code> ，添加淘宝镜像配置 <code>node_mirror</code>  和 <code>npm_mirror</code></p>\n</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>root: D:<span class=\"token punctuation\">\\</span>DevelopmentTool<span class=\"token punctuation\">\\</span>NVM</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>path: D:<span class=\"token punctuation\">\\</span>DevelopmentTool<span class=\"token punctuation\">\\</span>NVM<span class=\"token punctuation\">\\</span>nodejs</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>node_mirror: https://npmmirror.com/mirrors/node/</pre></td></tr><tr><td data-num=\"4\"></td><td><pre>npm_mirror: https://npmmirror.com/mirrors/npm/</pre></td></tr></table></figure><ul>\n<li>在 NVM 安装目录下创建两个文件夹，npm 全局包安装目录 <code>node_global</code> ，npm 缓存目录 <code>node_cache</code> ，使用 Cmd 配置文件夹路径</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">npm</span> config <span class=\"token builtin class-name\">set</span> prefix <span class=\"token string\">\"D:\\DevelopmentTool\\NVM<span class=\"token entity\" title=\"\\n\">\\n</span>ode_global\"</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">npm</span> config <span class=\"token builtin class-name\">set</span> cache <span class=\"token string\">\"D:\\DevelopmentTool\\NVM<span class=\"token entity\" title=\"\\n\">\\n</span>ode_cache\"</span></pre></td></tr></table></figure><ul>\n<li>配置 Nvm 环境变量， <code>NVM_HOME</code>  是 Nvm 安装目录， <code>NVM_SYMLINK</code>  是 Nvm 安装时选择的 Nodejs 目录， <code>NODE_GLOBAL</code>  是上面创建的目录</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20241108172827.jpg\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20241108173330.jpg\" alt=\"image\" /></p>\n<ul>\n<li>安装并切换 Nodejs 版本</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>nvm <span class=\"token parameter variable\">-v</span>                  //查看NVM版本</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>nvm list available      //查看可安装的Nodejs版本</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>nvm list                //查看已安装的Nodejs版本</pre></td></tr><tr><td data-num=\"4\"></td><td><pre>nvm <span class=\"token function\">install</span> <span class=\"token number\">22.11</span>.0     //指定安装一个Nodejs的LST最新稳定版，NVM安装目录下会生成对应版本的文件夹</pre></td></tr><tr><td data-num=\"5\"></td><td><pre>nvm use <span class=\"token number\">22.11</span>.0         //切换到安装好的Nodejs</pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token function\">node</span> <span class=\"token parameter variable\">-v</span>                 //查询当前的nodejs版本</pre></td></tr></table></figure><ul>\n<li>配置和查看 Npm 淘宝镜像</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">npm</span> config <span class=\"token builtin class-name\">set</span> registry https://registry.npmmirror.com</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">npm</span> config get registry</pre></td></tr></table></figure><h2 id=\"vite构建\"><a class=\"anchor\" href=\"#vite构建\">#</a> Vite 构建</h2>\n<ul>\n<li>使用 cmd 执行以下命令，cmd 所在路径下会生成对应的项目文件夹，然后用 vscode 打开</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">npm</span> init vite@latest</pre></td></tr></table></figure><ul>\n<li>\n<p>Project name 输入项目名</p>\n</li>\n<li>\n<p>Select a framework 选择 <code>Vue</code></p>\n</li>\n<li>\n<p>Select a variant 选择 <code>TypeScript</code></p>\n</li>\n<li>\n<p>vscode 打开上面创建的项目文件夹，然后打开 Terminal，安装一下 package.json 中的项目依赖</p>\n</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">npm</span> <span class=\"token function\">install</span></pre></td></tr></table></figure><figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">npm</span> run dev         //启动开发环境</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">npm</span> run build       //构建打包命令</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token function\">npm</span> run preview     //预览生产环境命令</pre></td></tr></table></figure><h2 id=\"安装vscode插件\"><a class=\"anchor\" href=\"#安装vscode插件\">#</a> 安装 VSCode 插件</h2>\n<h3 id=\"安装vue-official\"><a class=\"anchor\" href=\"#安装vue-official\">#</a> 安装 Vue-Official</h3>\n<ul>\n<li>vscode 扩展中搜索插件 <code>Vue - Official</code>  并安装，原名叫 <code>Volar</code></li>\n</ul>\n<h3 id=\"为vue-official设置代码缩进\"><a class=\"anchor\" href=\"#为vue-official设置代码缩进\">#</a> 为 Vue - Official 设置代码缩进</h3>\n<ul>\n<li>\n<p>打开 <code>Vue - Official</code>  设置，往下拉找到配置项 <code>Script: Initial Indent</code>  勾选上就行</p>\n</li>\n<li>\n<p>按下 <code>Ctrl + K + F</code>  后选择 Formater 为 <code>Vue - Official</code>  可以看到 ts 代码会缩进两个空格了</p>\n</li>\n</ul>\n<h2 id=\"自定义代码模板\"><a class=\"anchor\" href=\"#自定义代码模板\">#</a> 自定义代码模板</h2>\n<ul>\n<li>\n<p>打开 <code>设置</code>  --&gt; <code>代码片段</code>  --&gt; 搜索 <code>vue.json</code>  没有的话就新建一个</p>\n</li>\n<li>\n<p><code>prefix</code>  是插入这套模板的前缀，在 vscode 中输入这个 <code>prefix</code>  后按下回车就能把 <code>body</code>  的内容快速插入到编辑器中</p>\n</li>\n<li>\n<p><code>$0</code>  是插入模板后光标的初始位置</p>\n</li>\n</ul>\n<figure class=\"highlight json\"><figcaption data-lang=\"JSON\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>\t<span class=\"token property\">\"Print to console\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>\t\t<span class=\"token property\">\"prefix\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"vue3\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>\t\t<span class=\"token property\">\"body\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>\t\t\t<span class=\"token string\">\"&lt;style scoped>\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>\t\t\t<span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>\t\t\t<span class=\"token string\">\"&lt;/style>\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>\t\t\t<span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>\t\t\t<span class=\"token string\">\"&lt;template>\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>\t\t\t<span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>\t\t\t<span class=\"token string\">\"&lt;/template>\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>\t\t\t<span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>\t\t\t<span class=\"token string\">\"&lt;script lang=\\\"ts\\\" setup>\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>\t\t\t<span class=\"token string\">\"  import &#123;ref,reactive&#125; from 'vue';\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>\t\t\t<span class=\"token string\">\"  $0\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>\t\t\t<span class=\"token string\">\"&lt;/script>\"</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>\t\t<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>\t\t<span class=\"token property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"vue3+ts+setup模板\"</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>\t<span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr></table></figure><h2 id=\"参考链接\"><a class=\"anchor\" href=\"#参考链接\">#</a> 参考链接</h2>\n<ul>\n<li>\n<p><a href=\"https://blog.csdn.net/sjp991012/article/details/134426007\">https://blog.csdn.net/sjp991012/article/details/134426007</a></p>\n</li>\n<li>\n<p><a href=\"https://blog.csdn.net/qq1195566313/article/details/125027972\">https://blog.csdn.net/qq1195566313/article/details/125027972</a></p>\n</li>\n<li>\n<p><a href=\"https://www.jb51.net/article/278151.htm\">https://www.jb51.net/article/278151.htm</a></p>\n</li>\n</ul>\n",
            "tags": [
                "笔记",
                "Vue3"
            ]
        },
        {
            "id": "https://gardenhamster.cn/note/Window/hotkey/",
            "url": "https://gardenhamster.cn/note/Window/hotkey/",
            "title": "Window快捷键",
            "background": "cover.jpg",
            "backgroundPosition": "25% 10%",
            "backgroundOpacity": 0.88,
            "date_published": "2024-05-01T16:00:00.000Z",
            "content_html": "<h2 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h2>\n<ul>\n<li>记录一些比较实用但是不太常用的快捷键，方便遗忘的时候可以快速查找</li>\n</ul>\n<h2 id=\"shiftwin左右箭头\"><a class=\"anchor\" href=\"#shiftwin左右箭头\">#</a> Shift+Win + 左右箭头</h2>\n<ul>\n<li>将应用程序窗口快速移动到下一个显示屏，特别是在远程的时候非常好用</li>\n</ul>\n<h2 id=\"win上下左右箭头\"><a class=\"anchor\" href=\"#win上下左右箭头\">#</a> Win + 上下左右箭头</h2>\n<ul>\n<li>上：应用窗口最大化</li>\n<li>下：应用窗口最小化</li>\n<li>左：应用窗口左分屏</li>\n<li>右：应用窗口右分屏</li>\n</ul>\n",
            "tags": [
                "笔记",
                "Window",
                "快捷键"
            ]
        },
        {
            "id": "https://gardenhamster.cn/course/waifu/spine/",
            "url": "https://gardenhamster.cn/course/waifu/spine/",
            "title": "解包某款2D手游中的Spine看板娘",
            "date_published": "2024-04-21T16:00:00.000Z",
            "content_html": "<h2 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h2>\n<ul>\n<li>上一篇文章记录了 Live2d 模型的提取方法，接下来记录 Spine 模型的提取方法</li>\n</ul>\n<h2 id=\"对spine的一些个人理解\"><a class=\"anchor\" href=\"#对spine的一些个人理解\">#</a> 对 Spine 的一些个人理解</h2>\n<ul>\n<li>\n<p>Spine 其实是一款 2D 动画软件，通过将贴图绑定到骨骼文件中，然后再控制骨骼就可以实现不同的动作效果，相对于 live2d 有着更小的内存开支，通常 Spine 模型都需要以下几种文件</p>\n</li>\n<li>\n<p><code>*.skel</code> ：骨骼的二进制文件，也有 <code>*.josn</code>  形式的文件，后者体积比较大，但是前者在 web 上的兼容性不好，Spine 官方的运行时也是到 3.8 以后才开始支持读取二进制文件</p>\n</li>\n<li>\n<p><code>*.png</code> : 喜闻乐见的分尸图，为什么是 Png 格式就不用多说了</p>\n</li>\n<li>\n<p><code>*.atlas</code> ：存放贴图文件的信息，通常第一行记录贴图文件的路径，其余的是各个部件以及其对应的坐标信息，通过 Spine 编辑器可以使用该文件对贴图文件再次拆解</p>\n</li>\n<li>\n<p>值得一提的是，加载 skel 文件必须使用其对应编辑器版本的运行时才行，也就是说如果一个 skel 文件是使用 3.6 版本的 Spine 编辑器创建的，那么就必须使用 3.6 版本的运行时才能成功加载这个模型，官方自己的 Spine 编辑器也不例外</p>\n</li>\n</ul>\n<h2 id=\"提取游戏资源\"><a class=\"anchor\" href=\"#提取游戏资源\">#</a> 提取游戏资源</h2>\n<ul>\n<li>和上一篇文章的流程一样，用 AssetStudio 直接读取 Mumu 模拟器中复制出来的游戏资源，加载后搜索一下 <code>atlas</code>  或者 <code>skel</code></li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240430192417.png\" alt=\"image\" /></p>\n<ul>\n<li>还好某游的模型文件都是有命名规律的，这里看到 <code>*.atlas</code> , <code>*.skel</code> , <code>*.png</code>  文件都是以 Figure 开头命名的，和上一篇文章一样，将这些文件全部按照路径分组全部导出</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240430193047.png\" alt=\"image\" /></p>\n<ul>\n<li>将自己喜欢的模型所需要的文件单独复制在一个文件里</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240430193350.png\" alt=\"image\" /></p>\n<h2 id=\"制作spine模型\"><a class=\"anchor\" href=\"#制作spine模型\">#</a> 制作 Spine 模型</h2>\n<ul>\n<li>启动 Live2DViewerEx，选择 <code>Ex工作室</code>  --&gt; <code>Spine编辑器</code>  --&gt; <code>选择模型文件夹</code> ，点击右下角的 <code>创建配置文件</code> ，添加上相应的文件</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240501231314.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240501231600.png\" alt=\"image\" /></p>\n<ul>\n<li>确定以后就能看到效果了，如果没有找到模型的话可以调整一下左上角缩放大小</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240501231802.png\" alt=\"image\" /></p>\n<ul>\n<li>接着和上一篇文章一样添加待机动画</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240501234235.png\" alt=\"image\" /></p>\n<ul>\n<li>接着添加触摸动画</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240501232718.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240501232910.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240501233154.png\" alt=\"image\" /></p>\n<ul>\n<li>接着绑定动作，和 live2d 一样也是可以添加语音和台词的</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240501233425.png\" alt=\"image\" /></p>\n<ul>\n<li>确定以后就可以测试触摸效果了，点一下左边的 <code>显示可触摸区域</code> 可以查看点击范围</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240501235235.png\" alt=\"image\" /></p>\n<ul>\n<li>点一下旁边的预览按钮就可以加载到桌面上了，前提是需要先启动 <code>Live2DViewerEX</code>  然后再启动 <code>EX工作室</code> 才行</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240501235835.png\" alt=\"image\" /></p>\n<h2 id=\"在网页上加载spine\"><a class=\"anchor\" href=\"#在网页上加载spine\">#</a> 在网页上加载 Spine</h2>\n<ul>\n<li>\n<p>上面提到想要加载 Spine 模型，就必须用到对应版本的运行时</p>\n</li>\n<li>\n<p>在 Live2DViewerEX 中刚好可以显示模型的版本，可以看到这个模型的对应的 Spine 版本是 3.6.53</p>\n</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240502001219.png\" alt=\"image\" /></p>\n<ul>\n<li>\n<p>然而遗憾的是上面也提到了 Spine 官方的 web 运行时到 3.8 版本后才开始支持读取二进制文件 <code>.skel</code></p>\n</li>\n<li>\n<p>详细的官方运行时 demo 可以在 github 上找到，左上角的分支 <code>3.8</code>  对应的是运行时</p>\n</li>\n<li>\n<p><a href=\"https://github.com/EsotericSoftware/spine-runtimes/tree/3.8/spine-ts\">https://github.com/EsotericSoftware/spine-runtimes/tree/3.8/spine-ts</a></p>\n</li>\n<li>\n<p>如果我想将这个模型加载到 web 上，就只能想办法修改 skel 文件的版本或者转 json 格式了</p>\n</li>\n<li>\n<p><s>或许可以早 Spine 编辑器中重新加载 Skel 然后再重新导出想要的版本？理论上可行但是网上的 Spine 破解版我也只找到 3.8 版本的。对于 3.6 的模型它完全加载不出来，切换版本还莫名报错了。正式版的 Spine 还死贵后来放弃了</s></p>\n</li>\n<li>\n<p>后来在各种搜索引擎上搜了一通后总算找到了一个可以将低版本 skel 文件转成 3.8 版本 json 文件网站</p>\n</li>\n<li>\n<p><a href=\"https://naganeko.pages.dev/chibi-gif\">https://naganeko.pages.dev/chibi-gif</a></p>\n</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240502145402.png\" alt=\"image\" /></p>\n<ul>\n<li>\n<p><s>用这种方法转换出来的文件会不会丢掉什么东西？emmmmm 不好说，但是在一部分 sdk 中加载后某些部件显示是不正常的，不过这个也有可能是运行时本身的原因</s></p>\n</li>\n<li>\n<p>如果各位大佬有更好的解决办法请在篇文章下留言</p>\n</li>\n</ul>\n<h2 id=\"参考链接\"><a class=\"anchor\" href=\"#参考链接\">#</a> 参考链接</h2>\n<h3 id=\"spine模型提取\"><a class=\"anchor\" href=\"#spine模型提取\">#</a> Spine 模型提取</h3>\n<ul>\n<li><a href=\"https://www.bilibili.com/read/cv18073492\">https://www.bilibili.com/read/cv18073492</a></li>\n</ul>\n<h3 id=\"spine文档\"><a class=\"anchor\" href=\"#spine文档\">#</a> Spine 文档</h3>\n<ul>\n<li><a href=\"http://zh.esotericsoftware.com/spine-runtimes\">http://zh.esotericsoftware.com/spine-runtimes</a></li>\n</ul>\n<h3 id=\"spine-demo\"><a class=\"anchor\" href=\"#spine-demo\">#</a> Spine Demo</h3>\n<ul>\n<li><a href=\"https://github.com/EsotericSoftware/spine-runtimes/tree/3.8/spine-ts\">https://github.com/EsotericSoftware/spine-runtimes/tree/3.8/spine-ts</a></li>\n</ul>\n<h3 id=\"skel版本转换\"><a class=\"anchor\" href=\"#skel版本转换\">#</a> Skel 版本转换</h3>\n<ul>\n<li><a href=\"https://blog.csdn.net/Z478942073/article/details/128981520\">https://blog.csdn.net/Z478942073/article/details/128981520</a></li>\n<li><a href=\"https://naganeko.pages.dev/chibi-gif/\">https://naganeko.pages.dev/chibi-gif/</a></li>\n</ul>\n<h3 id=\"网页上加载skel\"><a class=\"anchor\" href=\"#网页上加载skel\">#</a> 网页上加载 Skel</h3>\n<ul>\n<li><a href=\"https://pelom.cn/archives/106\">https://pelom.cn/archives/106</a></li>\n<li><a href=\"https://www.cnblogs.com/c10udlnk/p/15846185.html\">https://www.cnblogs.com/c10udlnk/p/15846185.html</a></li>\n</ul>\n",
            "tags": [
                "教程",
                "waifu",
                "spine"
            ]
        },
        {
            "id": "https://gardenhamster.cn/course/waifu/live2d/",
            "url": "https://gardenhamster.cn/course/waifu/live2d/",
            "title": "解包某款2D手游中的live2d看板娘",
            "date_published": "2024-04-11T16:00:00.000Z",
            "content_html": "<h2 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h2>\n<ul>\n<li>\n<p>前阵子刚好以前玩过的某款老牌 2d 手游正准备过十周年庆，回坑之后发现新出的看板娘做的都不错，所以决定把她们全部都捞过来博客里给我打工卖萌</p>\n</li>\n<li>\n<p>由于每个游戏的游戏引擎都可能不一样，碰巧这款游戏是用 Unity 制作的，而且有现成的解包工具，所以这篇文章仅供参考，非 Unity 引擎请自行搜索解包工具</p>\n</li>\n<li>\n<p><s>顺便点名批评一下某二游公司的某伟某皓某宇某策划某天使，十周年刚回坑就是让我这个老萌新吃满一百连大保底，真忘记我当年是怎么弃坑的了是吧</s></p>\n</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"face01.png\" alt=\"image\" /></p>\n<h2 id=\"关于live2d\"><a class=\"anchor\" href=\"#关于live2d\">#</a> 关于 Live2d</h2>\n<ul>\n<li>\n<p>据我局限的认知一般游戏里的看板引擎主要分为两种，Live2d 和 Spine</p>\n</li>\n<li>\n<p>Live2d 比 Spine 有更强的互动性，比如触摸反馈等，如果你发现某个模型的目光会跟着玩家的鼠标进行移动，那么这个模型大概率就是 Live2d 制作的</p>\n</li>\n<li>\n<p>关于 Live2d 的配置说明可以参考一下这篇文章</p>\n</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240412172536.png\" alt=\"image\" /></p>\n<ul>\n<li>\n<p><a href=\"https://eikanya.github.io/post/live2d%E9%85%8D%E7%BD%AE\">https://eikanya.github.io/post/live2d 配置</a></p>\n</li>\n<li>\n<p>本文只讨论 Live2d，<a href=\"/course/waifu/spine\">Spine 请查看下一篇文章</a></p>\n</li>\n</ul>\n<h2 id=\"导出游戏资源\"><a class=\"anchor\" href=\"#导出游戏资源\">#</a> 导出游戏资源</h2>\n<ul>\n<li>在 Mumu 模拟器上安装好游戏，等待所有游戏资源下载完毕（包括游戏内要另外下载的资源），在 <code>Android/data</code>  目录下找到游戏文件夹，然后复制到 Mumu 共享目录中提取出来</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240410150617.png\" alt=\"image\" /></p>\n<h2 id=\"下载assetstudio\"><a class=\"anchor\" href=\"#下载assetstudio\">#</a> 下载 AssetStudio</h2>\n<ul>\n<li>\n<p>这个项目原名叫 AssetStudio，Github 上也有不少少类似的项目，比如 UnityStudio，GenshinStudio，CNStudio 等</p>\n</li>\n<li>\n<p>由于这个项目自身比较特殊的原因，<s>或者涉及到 Unity 或者游戏公司的利益问题？</s>，如果某一天链接失效了，就在 github 上重新找一下类似的项目吧</p>\n</li>\n<li>\n<p>下载地址：<a href=\"https://github.com/RazTools/Studio/releases\">https://github.com/RazTools/Studio/releases</a></p>\n</li>\n<li>\n<p>从 Release 中下载最新版本的 AssetStudio 后，解压打开里面的 AssetStudio.GUI.exe，启动这个程序需要安装对应的.net 运行时，初次启动如果没有安装会自动提示下载安装</p>\n</li>\n</ul>\n<h2 id=\"提取模型文件\"><a class=\"anchor\" href=\"#提取模型文件\">#</a> 提取模型文件</h2>\n<ul>\n<li>\n<p>运行 AssetStudio.GUI.exe 后，在 <code>Options</code> --&gt; <code>Specify Game</code>  中选一下对应的游戏，比如某原选择 GI、某铁选择 SR、某零选择 ZZZ，由于我要解包的游戏不选也行，所以我这里选了默认的 Normal</p>\n</li>\n<li>\n<p>选择 <code>file</code> --&gt; <code>Load folder</code> ，选择刚才从 Mumu 中复制出来的游戏文件夹</p>\n</li>\n<li>\n<p>注意 AssetStudio 对内存的需求比较大，解包的内容越多需要的内存就越大，如果内存不够的话就将 *.unity3d， *.blk 等文件单独拎出来分批读取吧</p>\n</li>\n<li>\n<p>加载以后搜索一下 moc，可以发现文件都放在这个路径下  <code>assets\\assetbundles\\menusv2\\partner\\allpartnerlive2dsv4</code></p>\n</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240410184902.png\" alt=\"image\" /></p>\n<ul>\n<li>选择 <code>Options</code> --&gt; <code>Export options</code> ，将 <code>Group exported assets by</code>  设置为 <code>container path</code> ，避免导出时按照素材类型分组导致同名文件被覆盖的问题</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240410185216.png\" alt=\"image\" /></p>\n<ul>\n<li>选择 <code>Export</code> --&gt; <code>All assets</code> ，将所有素材导出，等待导出完毕后，按照刚才的路径找到我们需要的素材</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411005548.png\" alt=\"image\" /></p>\n<ul>\n<li>这里每个 live2d 模型都放在单独的文件夹里，可以按照文件夹里的 <code>texture_00.png</code>  来判断是否自己需要的模型，这里以 1833 这个红叶香水的模型为例</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411005957.png\" alt=\"image\" /></p>\n<ul>\n<li>将下面的文件复制一份到一个单独的文件夹中，以后直接从这个文件夹里加载模型就行</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411011730.png\" alt=\"image\" /></p>\n<h2 id=\"提取moc文件\"><a class=\"anchor\" href=\"#提取moc文件\">#</a> 提取 moc 文件</h2>\n<ul>\n<li>\n<p>现在还缺少一个关键的 <code>.moc3</code>  文件，这个文件需要用另一种方法提取出来</p>\n</li>\n<li>\n<p>回到 AssetStudio 找到目标.moc 文件，或者对应的贴图，这里没有找到 moc 文件所以搜索了 <code>texture_00</code></p>\n</li>\n<li>\n<p>右键目标文件 --&gt; <code>Show original file</code> ，记录弹出路径中选中的文件名，比如这里对应的是 <code>assetbundle__103_8936e6a2275cdac7a85fa5b4d24ab640.unity3d</code></p>\n</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411013832.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240411014619.png\" alt=\"image\" /></p>\n<ul>\n<li>\n<p>将这个文件复制出来单独放在一个文件夹中，比如我放在名字叫 103 的文件夹里</p>\n</li>\n<li>\n<p>从 github 上下载另一个项目 <a href=\"https://github.com/Perfare/UnityLive2DExtractor/releases\">UnityLive2DExtractor</a></p>\n</li>\n<li>\n<p>下载地址：<a href=\"https://github.com/Perfare/UnityLive2DExtractor/releases\">https://github.com/Perfare/UnityLive2DExtractor/releases</a></p>\n</li>\n<li>\n<p>下载压缩包解压后，将刚才的文件夹拖放到解压目录的 <code>UnityLive2DExtractor.exe</code>  上，顺利的话会在拖动文件夹对应的目录中生成一个 <code>Live2DOutput</code>  文件夹</p>\n</li>\n<li>\n<p>如果无法运行可以尝试安装一下对应版本的运行时，.config 文件中显示的运行时是.NETFramework，Version=v4.7.2</p>\n</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411021453.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240417174249.png\" alt=\"image\" /></p>\n<ul>\n<li>在生成的 <code>Live2DOutput</code>  文件夹中找到我们需要的 <code>moc3</code> ， <code>1833.physics3.json</code> ， <code>textures</code> ，将这些文件也复制到前面创建的文件夹中</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411023135.png\" alt=\"image\" /></p>\n<ul>\n<li>最终所有需要的模型文件如下</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411023416.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240411023443.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240411023503.png\" alt=\"image\" /></p>\n<h2 id=\"提取音频文件\"><a class=\"anchor\" href=\"#提取音频文件\">#</a> 提取音频文件</h2>\n<ul>\n<li>音频文件一般打包在 pck 文件里，直接在 Mumu 导出的文件里搜 <code>*.pck</code> ，在里面找到这个带 <code>Partner</code>  命名的大概率就是看板娘的语言包了，这里把它单独复制到一个文件夹里</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411151546.png\" alt=\"image\" /></p>\n<ul>\n<li>\n<p>这里图方便使用一个 UP 制作的音频解包工具<a href=\"https://www.bilibili.com/read/cv5330096\"> WwiseExtractor</a>，下载链接需要到的 UP 的专栏链接里面找</p>\n</li>\n<li>\n<p>链接：<a href=\"https://www.bilibili.com/read/cv5330096\">https://www.bilibili.com/read/cv5330096</a></p>\n</li>\n<li>\n<p>打开压缩包里面的 <code>WwiseExtractorConsole.exe</code> ，第一次选择刚才的 PCK 文件夹，第二次选择输出目录，注意两次不要选同一个目录，第一个目录也不能包含第二个目录</p>\n</li>\n<li>\n<p>等程序跑完后可以得到一堆 ogg 文件，用格式工厂把这些音频文件全部转成 mp3 格式，再从 mp3 里面去找我们具体需要的文件</p>\n</li>\n<li>\n<p><s>或许大概实装越早的看板命名的下标就越靠前？？？</s></p>\n</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411160058.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240411161540.png\" alt=\"image\" /></p>\n<ul>\n<li>将看板娘所需要的音频文件复制到模型文件夹的 sound 目录下，这下需要的文件就齐了</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411174317.png\" alt=\"image\" /></p>\n<h2 id=\"制作live2d模型\"><a class=\"anchor\" href=\"#制作live2d模型\">#</a> 制作 live2d 模型</h2>\n<ul>\n<li>\n<p>制作模型需要用到  <code>Live2DViewerEx</code> ，这个软件可以对 live2d 模型动作进行编辑，平时也可以将模型加载到桌面当作看板娘</p>\n</li>\n<li>\n<p>这个软件是要在 Steam 上购买的，大概二十多块钱左右吧，不想购买的话自己找破解版吧</p>\n</li>\n<li>\n<p>启动 <code>Live2DViewerEx</code> ，启动后选 <code>EX工作室</code>  --&gt; <code>Live2D编辑器</code>  --&gt; <code>选择Moc或Json文件</code></p>\n</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411175527.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240411175911.png\" alt=\"image\" /></p>\n<ul>\n<li>\n<p>如果是已经做好的模型直接选 model.json 之类的 json 文件就行，本文演示一下自定义，所以加载 <code>.moc</code>  文件</p>\n</li>\n<li>\n<p>打开后会提示创建 json 配置文件，把之前整理出来的 Moc、物理 json、贴图都给选上</p>\n</li>\n<li>\n<p>这里先创建一个中文语音版的配置文件 <code>1833_cn.model3.json</code></p>\n</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411181034.png\" alt=\"image\" /></p>\n<ul>\n<li>添加待机动画 <code>Idle</code></li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411182119.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240411184622.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240411184932.png\" alt=\"image\" /></p>\n<ul>\n<li>添加出场动画 <code>Start</code></li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240412012852.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240412013100.png\" alt=\"image\" /></p>\n<ul>\n<li>接着添加触摸动画，首先找到触摸的区域，然后记录下来这个区域的名字</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240411190049.png\" alt=\"image\" /></p>\n<ul>\n<li>接着返回编辑配置文件，添加点击区域</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240412003749.png\" alt=\"image\" /></p>\n<ul>\n<li>点击区域绑定相应的动作和语音</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240412004057.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240412014313.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240412020816.png\" alt=\"image\" /></p>\n<ul>\n<li>\n<p>到目前为止所有的配置都会保存在我们创建的 <code>1833_cn.model3.json</code>  文件中，下次继续编辑的时候只需要加载这个 Json 文件就行</p>\n</li>\n<li>\n<p>同理我们可以将这份配置文件复制一份改名为 <code>1833_jp.model3.json</code> ，然后加载这份文件将所有语音修改成日语</p>\n</li>\n</ul>\n<h2 id=\"将模型加载到桌面中\"><a class=\"anchor\" href=\"#将模型加载到桌面中\">#</a> 将模型加载到桌面中</h2>\n<ul>\n<li>重新启动 <code>Live2DViewerEX</code> ，这次启动选项选择 <code>启动 Live2DViewerEX</code></li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240412021816.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240412022357.png\" alt=\"image\" /></p>\n<ul>\n<li>拔掉耳机，将音量调到最大，测试一下效果</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240412025509.png\" alt=\"image\" /></p>\n<h2 id=\"部分模型的兼容性问题\"><a class=\"anchor\" href=\"#部分模型的兼容性问题\">#</a> 部分模型的兼容性问题</h2>\n<ul>\n<li>有一部分模型在 Live2DViewerEX 加载后，无论怎么绑定 motions 都始终无法触发相应的动作效果，比如待机动画等都是无法执行的，但是默认开启的视线追踪是正常的，像这样</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240422111215.png\" alt=\"image\" /></p>\n<ul>\n<li>因此推测逆向出来的 moc 文件应该是没问题的，问题可能出现在 motions 动作文件上。在一番折腾后发现，两个不同版本之间的模型，它们的参数命名规范是不一样的，也就是说某游很可能使用了不同的 Cubism SDK 来制作不同的模型</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240422113231.png\" alt=\"image\" /></p>\n<p><img loading=\"lazy\" data-src=\"20240422113740.png\" alt=\"image\" /></p>\n<ul>\n<li>\n<p><a href=\"http://live2d.pavostudio.com/doc/zh-cn/exstudio/live2d-editor/#_18\">http://live2d.pavostudio.com/doc/zh-cn/exstudio/live2d-editor/#_18</a></p>\n</li>\n<li>\n<p>抱着试一下的心态将 motions 文件里的这类参数命名方式全给替换掉，但是这类型的参数实在太多了，无奈还是手搓了一个现成的替换工具</p>\n</li>\n<li>\n<p><a href=\"https://github.com/GardenHamster/MotionModifys\">https://github.com/GardenHamster/MotionModifys</a></p>\n</li>\n<li>\n<p>将替换后的 motions3.json 文件重新绑定到模型中，发现待机动作之类的都可以正常触发了，而且幸运的是还没有出现其他奇奇怪怪的问题</p>\n</li>\n</ul>\n<p><img loading=\"lazy\" data-src=\"20240422115108.png\" alt=\"image\" /></p>\n<ul>\n<li>最后对比一下游戏的模型绑定台词和语音，却发现游戏里一些动作是也是加载不出来的，或许官方也卡在类似的版本兼容问题上了吧......</li>\n</ul>\n<h2 id=\"在网页上加载live2d\"><a class=\"anchor\" href=\"#在网页上加载live2d\">#</a> 在网页上加载 live2d</h2>\n<ul>\n<li>\n<p>在 web 上加载 live2d 模型需要用到官方的 SDK <a href=\"https://docs.live2d.com/zh-CHS/cubism-sdk-manual/cubism-sdk-for-web\">Cubism SDK for Web</a></p>\n</li>\n<li>\n<p>由于 live2d 模型版本有区分 Cubism2/3/4/5，各个版本的模型加载方式或许各不相同，你可以使用 Github 上一个大佬的兼容项目<a href=\"https://github.com/guansss/pixi-live2d-display\"> pixi-live2d-display</a></p>\n</li>\n<li>\n<p>Github 上的 Live2dWeb 相关项目对点击事件等加载也各不相同，所以如果想要做出来最符合自己预期的效果，还是建议自己手搓代码吧</p>\n</li>\n<li>\n<p>你也可以尝试使用我的一个魔改项目<a href=\"https://github.com/GardenHamster/live2d-web\"> live2d-web</a>，使用方法清查看 Readme</p>\n</li>\n<li>\n<p><s>理论上 Live2DViewerEX 创意工坊上的 Lpk 文件如果能解包成功也是能加载到 web 上吧</s></p>\n</li>\n</ul>\n<h2 id=\"参考链接\"><a class=\"anchor\" href=\"#参考链接\">#</a> 参考链接</h2>\n<h3 id=\"模型提取\"><a class=\"anchor\" href=\"#模型提取\">#</a> 模型提取</h3>\n<p><a href=\"https://www.bilibili.com/read/cv5773529\">https://www.bilibili.com/read/cv5773529</a><br />\n<a href=\"https://www.maxstars.xyz/2023/09/24/bi-lan-hang-xian-chai-bao-ji-lu\">https://www.maxstars.xyz/2023/09/24/bi-lan-hang-xian-chai-bao-ji-lu</a><br />\n<a href=\"https://www.bilibili.com/read/cv27390576/\">https://www.bilibili.com/read/cv27390576/</a><br />\n<a href=\"https://eikanya.github.io/post/live2d%E9%85%8D%E7%BD%AE\">https://eikanya.github.io/post/live2d 配置</a></p>\n<h3 id=\"音频提取\"><a class=\"anchor\" href=\"#音频提取\">#</a> 音频提取</h3>\n<p><a href=\"https://www.bilibili.com/read/cv5330096\">https://www.bilibili.com/read/cv5330096</a><br />\n<a href=\"https://www.bilibili.com/read/cv3027629\">https://www.bilibili.com/read/cv3027629</a><br />\n<a href=\"https://www.bilibili.com/read/cv5939682\">https://www.bilibili.com/read/cv5939682</a></p>\n<h3 id=\"模型兼容\"><a class=\"anchor\" href=\"#模型兼容\">#</a> 模型兼容</h3>\n<p><a href=\"https://github.com/guansss/pixi-live2d-display/discussions/143\">https://github.com/guansss/pixi-live2d-display/discussions/143</a><br />\n<a href=\"http://live2d.pavostudio.com/doc/zh-cn/live2d/model-config\">http://live2d.pavostudio.com/doc/zh-cn/live2d/model-config</a><br />\n<a href=\"http://live2d.pavostudio.com/doc/zh-cn/exstudio/live2d-editor/#_18\">http://live2d.pavostudio.com/doc/zh-cn/exstudio/live2d-editor/#_18</a><br />\n<a href=\"https://intmain0.com/187\">https://intmain0.com/187</a></p>\n<h3 id=\"web加载\"><a class=\"anchor\" href=\"#web加载\">#</a> web 加载</h3>\n<p><a href=\"https://docs.live2d.com/zh-CHS/cubism-sdk-manual/cubism-sdk-for-web\">https://docs.live2d.com/zh-CHS/cubism-sdk-manual/cubism-sdk-for-web</a><br />\n<a href=\"https://github.com/guansss/pixi-live2d-display\">https://github.com/guansss/pixi-live2d-display</a><br />\n<a href=\"https://github.com/GardenHamster/live2d-web\">https://github.com/GardenHamster/live2d-web</a><br />\n<a href=\"https://github.com/stevenjoezhang/live2d-widget\">https://github.com/stevenjoezhang/live2d-widget</a><br />\n<a href=\"https://github.com/galnetwen/Live2D\">https://github.com/galnetwen/Live2D</a></p>\n",
            "tags": [
                "教程",
                "waifu",
                "live2d"
            ]
        },
        {
            "id": "https://gardenhamster.cn/note/Window/command/",
            "url": "https://gardenhamster.cn/note/Window/command/",
            "title": "Windows命令",
            "date_published": "2023-07-08T16:00:00.000Z",
            "content_html": "<h1 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h1>\n<p>记录一些曾经用过的 Window 命令，方便日后查询</p>\n<h1 id=\"tasklist\"><a class=\"anchor\" href=\"#tasklist\">#</a> tasklist</h1>\n<p>有时候某个 dll 莫名其妙的被占用了，但是任务管理器又找不到相关的进程，可以用这个命令查询一下 PID，然后通过 <code>tskill</code>  结束掉进程</p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"><span>h</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre>tasklist /m Dll或者Exe文件名</pre></td></tr></table></figure><p>栗子:</p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"><span>h</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre>C:<span class=\"token punctuation\">\\</span>Users<span class=\"token punctuation\">\\</span>Administrator<span class=\"token operator\">></span>tasklist /m log4net.dll</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>映像名称                       PID 模块</pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">=</span> <span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span> <span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span><span class=\"token operator\">==</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>dotnet.exe                   <span class=\"token number\">11068</span> log4net.dll</pre></td></tr></table></figure><h1 id=\"tskill\"><a class=\"anchor\" href=\"#tskill\">#</a> tskill</h1>\n<p>结束一个进程</p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"><span>h</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre>tskill PID</pre></td></tr></table></figure><p>栗子:</p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>C:<span class=\"token punctuation\">\\</span>Users<span class=\"token punctuation\">\\</span>Administrator<span class=\"token operator\">></span>tskill <span class=\"token number\">11068</span></pre></td></tr></table></figure>",
            "tags": [
                "笔记",
                "Window"
            ]
        },
        {
            "id": "https://gardenhamster.cn/note/mysql/function/",
            "url": "https://gardenhamster.cn/note/mysql/function/",
            "title": "Mysql笔记",
            "date_published": "2023-05-15T16:00:00.000Z",
            "content_html": "<h1 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h1>\n<p>记录一些曾经用过的 mysql 语句，方便日后查询</p>\n<h1 id=\"substring_index\"><a class=\"anchor\" href=\"#substring_index\">#</a> substring_index</h1>\n<h3 id=\"参数\"><a class=\"anchor\" href=\"#参数\">#</a> 参数</h3>\n<p>substring_index(string,sep,num)</p>\n<p>string：被分割的字符串</p>\n<p>sep：分割符</p>\n<p>num：提取第 N 个分割后的字符串，值不能为 0。正数表示从左到右，负数表示从右到左</p>\n<h3 id=\"sql\"><a class=\"anchor\" href=\"#sql\">#</a> sql</h3>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">select</span> sd<span class=\"token punctuation\">.</span>sodetailid<span class=\"token punctuation\">,</span>so<span class=\"token punctuation\">.</span>orderno<span class=\"token punctuation\">,</span>so<span class=\"token punctuation\">.</span>code<span class=\"token punctuation\">,</span>sd<span class=\"token punctuation\">.</span>printnum<span class=\"token punctuation\">,</span>sd<span class=\"token punctuation\">.</span>printprice<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>SUBSTRING_INDEX<span class=\"token punctuation\">(</span>SUBSTRING_INDEX<span class=\"token punctuation\">(</span>sd<span class=\"token punctuation\">.</span>productcontent<span class=\"token punctuation\">,</span><span class=\"token string\">'public_style:'</span><span class=\"token punctuation\">,</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span><span class=\"token string\">'&#125;&#123;'</span><span class=\"token punctuation\">,</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> public_style<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>SUBSTRING_INDEX<span class=\"token punctuation\">(</span>SUBSTRING_INDEX<span class=\"token punctuation\">(</span>sd<span class=\"token punctuation\">.</span>productcontent<span class=\"token punctuation\">,</span><span class=\"token string\">'productsize:'</span><span class=\"token punctuation\">,</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span><span class=\"token string\">'&#125;&#123;'</span><span class=\"token punctuation\">,</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> productsize<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>SUBSTRING_INDEX<span class=\"token punctuation\">(</span>SUBSTRING_INDEX<span class=\"token punctuation\">(</span>sd<span class=\"token punctuation\">.</span>productcontent<span class=\"token punctuation\">,</span><span class=\"token string\">'public_unit:'</span><span class=\"token punctuation\">,</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span><span class=\"token string\">'&#125;&#123;'</span><span class=\"token punctuation\">,</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> public_unit</pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">from</span> so_detail sd</pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">inner</span> <span class=\"token keyword\">join</span> so <span class=\"token keyword\">on</span> so<span class=\"token punctuation\">.</span>orderid<span class=\"token operator\">=</span>sd<span class=\"token punctuation\">.</span>orderid</pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token keyword\">where</span> so<span class=\"token punctuation\">.</span>createdate<span class=\"token operator\">></span><span class=\"token string\">'2022-01-01 00:00:00'</span> <span class=\"token operator\">and</span> so<span class=\"token punctuation\">.</span>createdate<span class=\"token operator\">&lt;=</span><span class=\"token string\">'2023-01-01 00:00:00'</span></pre></td></tr></table></figure><h3 id=\"说明\"><a class=\"anchor\" href=\"#说明\">#</a> 说明</h3>\n<p>有一天 Boss 让我统计近几年的订单数据给他。但是有一些关键数据放在了一个格式有点特殊的字段里，像这样：</p>\n<p><code>Printnum:5000&#125;&#123;public_type:Leaflet(128g art paper)&#125;&#123;public_style:A4&#125;&#123;public_unit:Double side(4C+4C)&#125;&#123;public_kind:1&#125;&#123;public_price:311.9&#125;&#123;productsize:210mmx297mm&#125;&#123;poundtype:128gGlossy Art paper&#125;&#123;public_typeset:&#125;&#123;public_docpath:filesystem&#125;&#123;</code></p>\n<p>我要提取的是这个字段里面的 <code>public_style</code>  的值 <code>A4</code> ，于是用到了 <code>substring_index</code>  函数</p>\n<p>首先先用 <code>public_style:</code>  做第一次分割，拿到两个字符串</p>\n<p>第一条： <code>Printnum:5000&#125;&#123;public_type:Leaflet(128g art paper)&#125;&#123;</code></p>\n<p>第二条： <code>A4&#125;&#123;public_unit:Double side(4C+4C)&#125;&#123;public_kind:1&#125;&#123;public_price:311.9&#125;&#123;productsize:210mmx297mm&#125;&#123;poundtype:128gGlossy Art paper&#125;&#123;public_typeset:&#125;&#123;public_docpath:filesystem&#125;&#123;</code></p>\n<p><code>num</code>  参数传入 <code>-1</code> ，可以返回分割后从右往左的第一个字符串，也就是上面的第二条</p>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">select</span> SUBSTRING_INDEX<span class=\"token punctuation\">(</span><span class=\"token string\">'Printnum:5000&#125;&#123;public_type:Leaflet(128g art paper)&#125;&#123;public_style:A4&#125;&#123;public_unit:Double side(4C+4C)&#125;&#123;public_kind:1&#125;&#123;public_price:311.9&#125;&#123;productsize:210mmx297mm&#125;&#123;poundtype:128gGlossy Art paper&#125;&#123;public_typeset:&#125;&#123;public_docpath:filesystem&#125;&#123;'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'public_style:'</span><span class=\"token punctuation\">,</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> public_style</pre></td></tr></table></figure><p><img loading=\"lazy\" data-src=\"20230516163402.jpg\" alt=\"image\" /></p>\n<p>接着再用 <code>&#125;&#123;</code> 做第二次分割，获得 <code>public_style</code>  的值 <code>A4</code> 。 <code>num</code>  参数传入 <code>1</code> ，返回从左到右第一条</p>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">select</span> SUBSTRING_INDEX<span class=\"token punctuation\">(</span>SUBSTRING_INDEX<span class=\"token punctuation\">(</span><span class=\"token string\">'Printnum:5000&#125;&#123;public_type:Leaflet(128g art paper)&#125;&#123;public_style:A4&#125;&#123;public_unit:Double side(4C+4C)&#125;&#123;public_kind:1&#125;&#123;public_price:311.9&#125;&#123;productsize:210mmx297mm&#125;&#123;poundtype:128gGlossy Art paper&#125;&#123;public_typeset:&#125;&#123;public_docpath:filesystem&#125;&#123;'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'public_style:'</span><span class=\"token punctuation\">,</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span><span class=\"token string\">'&#125;&#123;'</span><span class=\"token punctuation\">,</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> public_style</pre></td></tr></table></figure><p><img loading=\"lazy\" data-src=\"20230516164214.jpg\" alt=\"image\" /></p>\n",
            "tags": [
                "笔记",
                "Mysql"
            ]
        },
        {
            "id": "https://gardenhamster.cn/note/Linux/command/",
            "url": "https://gardenhamster.cn/note/Linux/command/",
            "title": "Linux命令",
            "date_published": "2022-12-02T16:00:00.000Z",
            "content_html": "<h1 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h1>\n<p>记录一些曾经用过的 Linux 命令，方便日后查询</p>\n",
            "tags": [
                "笔记",
                "Linux"
            ]
        }
    ]
}