diff --git "a/\346\236\227\346\230\245\347\277\224/20240708_Cookie&Session&Token$JWT.md" "b/\346\236\227\346\230\245\347\277\224/20240708_Cookie&Session&Token$JWT.md" new file mode 100644 index 0000000000000000000000000000000000000000..567ddb684c3c74ad70544e13bb8507b0c1931de6 --- /dev/null +++ "b/\346\236\227\346\230\245\347\277\224/20240708_Cookie&Session&Token$JWT.md" @@ -0,0 +1,66 @@ +# Cookie, Session, Token & JWT 简介 + +## 1. Cookie + +### 定义与功能 +Cookie是存储在客户端的小型文本文件,用于存储用户相关信息,如登录状态、用户偏好等。通过Cookie,服务器可以识别用户并提供个性化的服务。 + +### 工作原理 +- 用户首次访问网站时,服务器通过响应头中的`Set-Cookie`发送Cookie给客户端。 +- 客户端(如浏览器)将Cookie存储在本地。 +- 在随后的请求中,浏览器自动将Cookie添加到请求头中发送给服务器。 +- 服务器解析请求头中的Cookie来识别用户。 + +### 优缺点 +- **优点**:简单易用,适合存储少量用户数据。 +- **缺点**:存储容量有限,易受跨站脚本攻击(XSS)。 + +## 2. Session + +### 定义与功能 +Session是服务器端用于存储用户会话信息的机制。每个用户访问网站时,服务器都会为其创建一个唯一的Session ID,并通过Cookie或其他方式发送给客户端。 + +### 工作原理 +- 用户首次访问时,服务器创建Session并生成Session ID。 +- Session ID通过Cookie或其他方式发送给客户端。 +- 客户端在随后的请求中携带Session ID。 +- 服务器通过Session ID检索存储在服务器端的用户会话信息。 + +### 优缺点 +- **优点**:能存储更多用户信息,适合处理复杂会话。 +- **缺点**:需要服务器存储大量会话信息,对资源要求高;分布式系统中存在Session共享和同步问题。 + +## 3. Token + +### 定义与功能 +Token是一种安全凭证,用于身份验证和授权。与Session和Cookie不同,Token是无状态的,服务器不存储与用户会话相关的信息。 + +### 工作原理 +- 用户通过用户名和密码登录。 +- 服务器验证用户信息后生成Token,并返回给客户端。 +- 客户端在随后的请求中携带Token。 +- 服务器验证Token的有效性来辨别用户身份和权限。 + +### 优缺点 +- **优点**:无状态,适合分布式系统;支持跨域请求;安全性较高。 +- **缺点**:Token可能较长,增加网络负担;存储在客户端,存在被窃取风险。 + +## 4. JWT(JSON Web Token) + +### 定义与功能 +JWT是一种用于身份验证和授权的开放标准(RFC 7519),它以JSON格式封装数据,并通过数字签名保证数据的完整性和安全性。 + +### 组成结构 +- **Header**:包含令牌类型和签名算法。 +- **Payload**:包含用户信息、权限、过期时间等声明。 +- **Signature**:由头部、载荷和密钥组成,用于验证JWT的完整性和真实性。 + +### 工作原理 +- 用户通过用户名和密码登录。 +- 服务器验证用户信息后生成JWT,并返回给客户端。 +- 客户端在请求中携带JWT。 +- 服务器验证JWT的签名和有效期,解析用户信息进行后续处理。 + +### 优缺点 +- **优点**:无状态,适合分布式系统;自包含用户信息,减少服务器查询;支持跨域请求;安全性高。 +- **缺点**:Token较长,增加网络负担;载荷信息不宜过多;无法直接撤销已颁发的Token(可通过设置短期过期时间或修改密钥间接处理)。 \ No newline at end of file diff --git "a/\346\236\227\346\230\245\347\277\224/20240709_\351\233\252\350\212\261\347\256\227\346\263\225.md" "b/\346\236\227\346\230\245\347\277\224/20240709_\351\233\252\350\212\261\347\256\227\346\263\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..09a2f7d424d8a7abb84e2cae8a8f69ab078803a6 --- /dev/null +++ "b/\346\236\227\346\230\245\347\277\224/20240709_\351\233\252\350\212\261\347\256\227\346\263\225.md" @@ -0,0 +1,33 @@ +# 雪花算法(Snowflake Algorithm) + +## 概述 + +雪花算法是Twitter开源的一种用于生成唯一ID的算法,它能够在分布式系统中生成一个64位的唯一ID。这个ID是一个长整型(Long),通常用于数据库的主键或者分布式系统中的唯一标识符。雪花算法生成的ID是趋势递增的,并且具有时间戳部分,这使得它天然就是有序的。 + +## 组成部分 + +雪花算法生成的64位ID可以分为以下几部分: + +1. **第一位**:未使用,因为二进制中最高位为符号位,正数是0,负数是1,一般生成ID为正数,所以默认为0。 + +2. **时间戳部分**:占41位,精确到毫秒级,41位时间戳可以使用69年(2^41-1 / (1000 * 60 * 60 * 24 * 365) = 69年)。 + +3. **工作机器ID**:占10位,可以部署在1024个节点,包括5位datacenterId和5位workerId。 + +4. **序列号**:占12位,毫秒内的计数,同一机器同一时间戳下最多可以生成4096个ID。 + +## 优点 + +1. **全局唯一**:由于时间戳、工作机器ID和序列号的组合,雪花算法能够确保在分布式系统中生成的ID是全局唯一的。 + +2. **趋势递增**:由于ID中包含时间戳部分,所以生成的ID是趋势递增的,这对于需要排序的场景非常有用。 + +3. **时间有序**:时间戳在前,保证了ID的时间有序性,这有利于数据库的插入性能优化。 + +## 缺点 + +1. **依赖系统时钟**:如果系统时钟回拨,可能会导致ID冲突或重复。 + +2. **限制工作机器数量**:虽然可以部署在1024个节点上,但对于超大规模的分布式系统来说可能仍然不够。 + +雪花算法是一种非常实用的分布式系统中生成唯一ID的方法,广泛应用于各种需要全局唯一标识符的场景。 diff --git "a/\346\236\227\346\230\245\347\277\224/20240710_ABP.md" "b/\346\236\227\346\230\245\347\277\224/20240710_ABP.md" new file mode 100644 index 0000000000000000000000000000000000000000..7de5195d804e4b8f40573b59548da0313c2211e6 --- /dev/null +++ "b/\346\236\227\346\230\245\347\277\224/20240710_ABP.md" @@ -0,0 +1,39 @@ +# ABP框架简介 + +## 概述 + +ABP(ASP.NET Boilerplate)是一个开源的、高性能的、模块化的、多层的、基于DDD(领域驱动设计)的应用程序框架。它旨在帮助开发者快速开发新的应用程序或重构现有系统,同时遵循最佳实践和架构原则。ABP框架支持使用ASP.NET Core、.NET Framework等多种技术栈,广泛应用于企业应用开发、微服务架构等领域。 + +## 核心特性 + +### 模块化 + +ABP框架支持通过模块(Modules)来组织应用程序的不同部分。每个模块可以包含自己的实体(Entities)、仓储(Repositories)、服务(Services)等,并且模块之间可以相互依赖或独立存在,从而提高了代码的可维护性和可扩展性。 + +### 多层架构 + +ABP遵循多层架构的设计原则,包括表示层(Presentation Layer)、应用层(Application Layer)、领域层(Domain Layer)和基础设施层(Infrastructure Layer)。这种架构模式有助于将应用程序的不同部分进行清晰的分离,使得每一层都专注于自己的职责,从而提高了代码的可读性和可测试性。 + +### 领域驱动设计 + +ABP框架支持领域驱动设计(DDD),鼓励开发者通过定义清晰的领域模型来指导应用程序的开发。DDD强调领域专家的参与和领域知识的共享,有助于构建出更加符合业务需求的软件系统。 + +### 依赖注入与IoC + +ABP框架内置了对依赖注入(DI)和控制反转(IoC)的支持,允许开发者以松耦合的方式构建应用程序。通过依赖注入,开发者可以在不修改代码的情况下轻松地替换或添加新的组件,从而提高了应用程序的灵活性和可维护性。 + +### 动态Web API + +ABP框架提供了动态Web API的功能,允许开发者通过简单的配置即可自动生成符合RESTful标准的Web API接口。这不仅减少了开发者编写API接口的工作量,还提高了API接口的一致性和可维护性。 + +### 多租户支持 + +ABP框架支持多租户模式,允许单个应用程序实例为多个租户提供服务。每个租户可以有自己的数据库、配置和隔离的资源,从而实现了数据的隔离和安全性。 + +## 社区与文档 + +ABP框架拥有一个活跃的社区和丰富的文档资源。社区中汇聚了大量的开发者,他们分享经验、解决问题,并持续推动着ABP框架的发展。同时,ABP框架的官方文档也非常详尽,覆盖了从入门到进阶的各个方面的内容,为开发者提供了有力的支持。 + +## 总结 + +ABP框架是一个功能强大、易于使用的应用程序框架,它结合了模块化、多层架构、领域驱动设计、依赖注入与IoC、动态Web API以及多租户支持等特性,为开发者提供了快速开发高质量应用程序的能力。如果你正在寻找一个能够帮助你构建可维护、可扩展和高性能的应用程序框架,那么ABP框架将是一个不错的选择。 diff --git "a/\346\236\227\346\230\245\347\277\224/20240711_\346\265\213\350\257\225.md" "b/\346\236\227\346\230\245\347\277\224/20240711_\346\265\213\350\257\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..ce91f233658306968a93837c3ac2476099c5b9b6 --- /dev/null +++ "b/\346\236\227\346\230\245\347\277\224/20240711_\346\265\213\350\257\225.md" @@ -0,0 +1,42 @@ +# 测试(Testing) + +## 引言 + +在软件开发过程中,测试是一个至关重要的环节。它不仅有助于发现软件中的错误(Bugs)和缺陷(Defects),还能确保软件的质量、稳定性和可靠性。通过测试,开发者可以验证软件是否满足需求,并在发布前进行充分的验证和修正。 + +## 测试的重要性 + +1. **提高软件质量**:通过测试可以发现并修复软件中的错误和缺陷,从而提高软件的整体质量。 +2. **减少维护成本**:早期发现并修复错误可以减少后期维护的工作量和成本。 +3. **增强用户满意度**:高质量的软件能够提供更好的用户体验,从而增强用户的满意度和忠诚度。 +4. **支持快速迭代**:在敏捷开发等快速迭代的开发模式中,测试能够确保每次迭代都交付高质量的软件。 + +## 测试类型 + +### 1. 单元测试(Unit Testing) + +单元测试是针对软件中的最小可测试单元(通常是函数或方法)进行的测试。它旨在验证单个单元的行为是否符合预期。 + +### 2. 集成测试(Integration Testing) + +集成测试是将多个单元组合在一起进行测试,以验证它们之间的交互是否符合预期。它关注于单元之间的接口和协作。 + +### 3. 系统测试(System Testing) + +系统测试是将整个软件系统作为一个整体进行测试,以验证其是否满足需求规格说明书中定义的所有功能、性能和可靠性要求。 + +### 4. 验收测试(Acceptance Testing) + +验收测试是用户或客户参与的一种测试,旨在验证软件是否满足用户或客户的需求和期望。它通常包括功能测试、性能测试和用户界面测试等。 + +## 测试实践 + +1. **编写可测试的代码**:编写易于测试的代码是测试成功的前提。开发者应该遵循良好的编程实践和设计模式,使代码更加模块化和可测试。 +2. **自动化测试**:自动化测试可以显著提高测试效率和准确性。开发者应该尽可能地将测试用例自动化,以便在每次构建或部署时自动运行测试。 +3. **持续集成(CI)**:持续集成是一种软件开发实践,它将自动化测试和代码集成相结合,确保每次代码提交都能通过所有测试。这有助于及早发现并修复问题。 +4. **代码覆盖率**:代码覆盖率是衡量测试完整性的一个重要指标。它表示测试用例执行了多少代码。虽然高代码覆盖率不一定意味着高质量的测试,但它确实是一个有用的参考指标。 +5. **回归测试**:回归测试是在软件修改后重新运行之前的测试用例,以确保修改没有引入新的错误或破坏现有的功能。 + +## 结论 + +测试是软件开发过程中不可或缺的一部分。通过有效的测试实践,我们可以提高软件的质量、减少维护成本、增强用户满意度并支持快速迭代。因此,在软件开发项目中,我们应该给予测试足够的重视和资源投入。 diff --git "a/\346\236\227\346\230\245\347\277\224/20240712_Antdv\347\232\204\344\275\277\347\224\250.md" "b/\346\236\227\346\230\245\347\277\224/20240712_Antdv\347\232\204\344\275\277\347\224\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..1e6f0784813fd07c9635662eb71a52a20a2df8bb --- /dev/null +++ "b/\346\236\227\346\230\245\347\277\224/20240712_Antdv\347\232\204\344\275\277\347\224\250.md" @@ -0,0 +1,81 @@ +# Ant Design Vue(Antdv)使用指南 + +Ant Design Vue(简称Antdv)是Ant Design的Vue实现,它提供了丰富的Vue组件,帮助开发者快速构建高质量的Web界面。Antdv继承了Ant Design的设计语言和React版本的核心库,使Vue开发者也能享受到这一优秀的设计体系。 + +## 安装 + +首先,你需要在你的Vue项目中安装Antdv。如果你还没有创建Vue项目,可以使用Vue CLI来创建一个。 + +```bash +npm install ant-design-vue --save +# 或者 +yarn add ant-design-vue +引入Antdv +全局引入 +在你的Vue项目入口文件(通常是main.js或main.ts)中全局引入Antdv及其样式文件。 + +javascript +import Vue from 'vue'; +import App from './App.vue'; +import Antd from 'ant-design-vue'; +import 'ant-design-vue/dist/antd.css'; // 引入官方提供的样式文件 + +Vue.use(Antd); + +new Vue({ + render: h => h(App), +}).$mount('#app'); +按需引入 +为了减小打包体积,你可以使用babel-plugin-import插件来按需引入Antdv的组件和样式。 + +安装babel-plugin-import +bash +npm install babel-plugin-import --save-dev +# 或者 +yarn add babel-plugin-import --dev +在你的.babelrc或babel.config.js文件中配置插件。 +json +{ + "plugins": [ + [ + "import", + { + "libraryName": "ant-design-vue", + "libraryDirectory": "es", + "style": "css" + } + ] + ] +} +然后,你就可以在你的组件中按需引入Antdv的组件了。 + +javascript +// 引入Button组件 +import { Button } from 'ant-design-vue'; + +export default { + components: { + 'a-button': Button, + }, +}; +注意:按需引入时,组件的命名需要以a-为前缀,或者使用as关键字来重命名。 + +使用组件 +安装并引入Antdv后,你就可以在你的Vue组件中使用Antdv提供的组件了。以下是一个简单的例子,展示了如何使用Button组件。 + +vue + + + +``` +## 注意事项 +1. 确保你的Vue版本与Antdv的版本兼容。 +2. 当你使用按需引入时,注意组件的命名规则。 +3. Antdv的样式文件较大,如果你只需要使用部分组件,请考虑使用按需引入的方式来减小打包体积。 \ No newline at end of file