diff --git "a/\351\273\204\347\216\211\346\235\255/20240708_DDD\351\242\206\345\237\237\351\251\261\345\212\250\350\256\276\350\256\241\346\200\235\346\203\263\347\232\204\346\216\242\350\256\250\344\270\216\346\200\235\350\200\203.md" "b/\351\273\204\347\216\211\346\235\255/20240708_DDD\351\242\206\345\237\237\351\251\261\345\212\250\350\256\276\350\256\241\346\200\235\346\203\263\347\232\204\346\216\242\350\256\250\344\270\216\346\200\235\350\200\203.md" new file mode 100644 index 0000000000000000000000000000000000000000..dc401d505276ae726a361251377c18999afbe223 --- /dev/null +++ "b/\351\273\204\347\216\211\346\235\255/20240708_DDD\351\242\206\345\237\237\351\251\261\345\212\250\350\256\276\350\256\241\346\200\235\346\203\263\347\232\204\346\216\242\350\256\250\344\270\216\346\200\235\350\200\203.md" @@ -0,0 +1,15 @@ +领域驱动设计(Domain-Driven Design,DDD)是一种软件开发方法,旨在通过将业务领域的知识融入软件设计中,以解决复杂业务问题。DDD强调将业务逻辑和领域模型置于核心位置,通过通用语言、领域模型和限界上下文等概念来帮助开发团队更好地理解和解决业务问题。 + +以下是一些关键概念和实践,有助于进行领域驱动设计: + +1. **通用语言(Ubiquitous Language)**:开发团队和业务专家之间共享的语言和概念,用于沟通和理解业务需求。通用语言应该贯穿于整个软件开发过程中,确保所有人对业务领域的理解保持一致。 + +2. **领域模型(Domain Model)**:领域模型是对业务领域的抽象表示,包括实体、值对象、聚合根、领域服务等元素。领域模型应该反映业务领域的核心概念和规则,帮助开发团队更好地理解和实现业务需求。 + +3. **限界上下文(Bounded Context)**:限界上下文是领域驱动设计中用于划分业务领域边界的概念。每个限界上下文都有自己的通用语言和领域模型,可以独立开发和演化。通过定义清晰的限界上下文,可以避免混淆和冲突,提高团队协作效率。 + +4. **聚合(Aggregate)**:聚合是领域模型中的一个重要概念,用于将相关对象组合成一个单元,具有边界和一致性约束。聚合通过聚合根来管理内部对象,确保数据的一致性和完整性。 + +5. **领域事件(Domain Events)**:领域事件是领域驱动设计中用于描述领域中发生的重要事件的概念。领域事件可以帮助不同限界上下文之间进行解耦,实现事件驱动的架构。 + +以上是领域驱动设计中的一些关键概念和实践,有助于开发团队更好地理解和解决复杂业务问题。如果您有特定的问题或需要更多深入的讨论,请随时告诉我,我将很乐意为您提供帮助。 \ No newline at end of file diff --git "a/\351\273\204\347\216\211\346\235\255/20240709_\345\210\206\351\205\215\350\247\222\350\211\262\347\273\231\347\224\250\346\210\267.md" "b/\351\273\204\347\216\211\346\235\255/20240709_\345\210\206\351\205\215\350\247\222\350\211\262\347\273\231\347\224\250\346\210\267.md" new file mode 100644 index 0000000000000000000000000000000000000000..f654a4b31fbe261396d0c6496ba127995c9dc7f7 --- /dev/null +++ "b/\351\273\204\347\216\211\346\235\255/20240709_\345\210\206\351\205\215\350\247\222\350\211\262\347\273\231\347\224\250\346\210\267.md" @@ -0,0 +1,67 @@ +```csharp +// User 模型 +public class User +{ + public int Id { get; set; } + public string Username { get; set; } + public List Roles { get; set; } +} + +// Role 模型 +public class Role +{ + public int Id { get; set; } + public string Name { get; set; } + public List Users { get; set; } +} + +// 数据库上下文 +public class ApplicationDbContext : DbContext +{ + public DbSet Users { get; set; } + public DbSet Roles { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseSqlServer("YourConnectionString"); + } +} + +// 分配角色给用户的控制器 +[ApiController] +[Route("[controller]")] +public class UserRoleController : ControllerBase +{ + private readonly ApplicationDbContext _context; + + public UserRoleController(ApplicationDbContext context) + { + _context = context; + } + + [HttpPost] + public IActionResult AssignRole([FromBody] UserRoleAssignment assignment) + { + var user = _context.Users.Include(u => u.Roles).FirstOrDefault(u => u.Username == assignment.Username); + var role = _context.Roles.FirstOrDefault(r => r.Name == assignment.Role); + + if (user != null && role != null) + { + user.Roles.Add(role); + _context.SaveChanges(); + return Ok("Role assigned successfully"); + } + else + { + return NotFound("User or role not found"); + } + } +} + +// 用户角色分配模型 +public class UserRoleAssignment +{ + public string Username { get; set; } + public string Role { get; set; } +} +``` diff --git "a/\351\273\204\347\216\211\346\235\255/20240710_\344\277\256\346\224\271\345\220\204\346\216\245\345\217\243\345\217\212\345\256\236\347\216\260\357\274\214\347\273\237\344\270\200\351\242\206\345\237\237\346\234\215\345\212\241\350\277\224\345\233\236\345\200\274\347\273\223\346\236\204.md" "b/\351\273\204\347\216\211\346\235\255/20240710_\344\277\256\346\224\271\345\220\204\346\216\245\345\217\243\345\217\212\345\256\236\347\216\260\357\274\214\347\273\237\344\270\200\351\242\206\345\237\237\346\234\215\345\212\241\350\277\224\345\233\236\345\200\274\347\273\223\346\236\204.md" new file mode 100644 index 0000000000000000000000000000000000000000..912a49b92f99a3c9aa2aa323a2b2defde813f97b --- /dev/null +++ "b/\351\273\204\347\216\211\346\235\255/20240710_\344\277\256\346\224\271\345\220\204\346\216\245\345\217\243\345\217\212\345\256\236\347\216\260\357\274\214\347\273\237\344\270\200\351\242\206\345\237\237\346\234\215\345\212\241\350\277\224\345\233\236\345\200\274\347\273\223\346\236\204.md" @@ -0,0 +1,67 @@ +```csharp +// User 模型 +public class User +{ + public int Id { get; set; } + public string Username { get; set; } + public List Roles { get; set; } +} + +// Role 模型 +public class Role +{ + public int Id { get; set; } + public string Name { get; set; } + public List Users { get; set; } +} + +// 数据库上下文 +public class ApplicationDbContext : DbContext +{ + public DbSet Users { get; set; } + public DbSet Roles { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseSqlServer("YourConnectionString"); + } +} + +// 分配角色给用户的控制器 +[ApiController] +[Route("[controller]")] +public class UserRoleController : ControllerBase +{ + private readonly ApplicationDbContext _context; + + public UserRoleController(ApplicationDbContext context) + { + _context = context; + } + + [HttpPost] + public IActionResult AssignRole([FromBody] UserRoleAssignment assignment) + { + var user = _context.Users.Include(u => u.Roles).FirstOrDefault(u => u.Username == assignment.Username); + var role = _context.Roles.FirstOrDefault(r => r.Name == assignment.Role); + + if (user != null && role != null) + { + user.Roles.Add(role); + _context.SaveChanges(); + return Ok("Role assigned successfully"); + } + else + { + return NotFound("User or role not found"); + } + } +} + +// 用户角色分配模型 +public class UserRoleAssignment +{ + public string Username { get; set; } + public string Role { get; set; } +} +``` \ No newline at end of file diff --git "a/\351\273\204\347\216\211\346\235\255/20240711_\351\242\206\345\237\237\346\234\215\345\212\241\346\216\245\345\217\243\346\216\242\347\264\242\345\222\214\345\260\235\350\257\225.md" "b/\351\273\204\347\216\211\346\235\255/20240711_\351\242\206\345\237\237\346\234\215\345\212\241\346\216\245\345\217\243\346\216\242\347\264\242\345\222\214\345\260\235\350\257\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..b95430a1229d2f70ba8e85bcb46e6a6ddf1c5e3c --- /dev/null +++ "b/\351\273\204\347\216\211\346\235\255/20240711_\351\242\206\345\237\237\346\234\215\345\212\241\346\216\245\345\217\243\346\216\242\347\264\242\345\222\214\345\260\235\350\257\225.md" @@ -0,0 +1,21 @@ +#### 什么是测试 +2 ``` +3 测试是软件生命周期中一个非常重要的阶段,在应用程序的开发过程中,为了确保它的功能与预期一致,必须对其进行测试 +4 帮助开发员改正系统中所存在的缺陷,提高软件的可靠性 +5 测试应该覆盖到软件的所有功能,全面、细致的测试会在很大程度上节省软件开发的成本 +6 ``` +7 #### 二、测试的类型 +8 +9 根据不同的维度,可以把测试方法分为不同的类型 +10 +11 从结构的透明性方式,分为白盒测试、黑盒测试和灰盒测试 +12 白盒测试(结构测试):在已知程序的内部逻辑前提下,对程序内部结构进行验证 +13 黑盒测试(功能测试):将软件视为“黑盒”,在对程序内部实现未知的前提下,按照需求和预期结果对程序的功能进行测试 +14 灰盒测试:介于二者之间,在已知程序内部逻辑的前提下,对软件进行功能测试 +15 从测试执行方式,分为手工测试和自动化测试 +16 手工测试:要求测试人员与最终使用软件的用户一样,对软件功能进行实际操作并验证 +17 自动化测试:通过专业的测试软件、测试脚本騞自动化测试用例对软件进行测试 +18 从测试所涉及的层次,分为单元测试、集成测试和系统测试 +19 单元测试:验证代码段(如方法或函数)功能的测试,通常由开发人员编写相应的测试方法,以验证代码执行后与预期结果是否一致 +20 集成测试:用于验证具有依赖关系的多个模块或组件是否能够正常工作 +21 系统测试:对整个系统进行全面测试 diff --git "a/\351\273\204\347\216\211\346\235\255/20240712-antdv\344\275\277\347\224\250.md" "b/\351\273\204\347\216\211\346\235\255/20240712-antdv\344\275\277\347\224\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..0008d5ad1919bf0f48de2a46b4fc2545a135adf5 --- /dev/null +++ "b/\351\273\204\347\216\211\346\235\255/20240712-antdv\344\275\277\347\224\250.md" @@ -0,0 +1,42 @@ +1. 安装脚手架工具 +vue-cli + +$ npm install -g @vue/cli +# OR +$ yarn global add @vue/cli +2. 创建一个项目 +使用命令行进行初始化。 + +$ vue create antd-demo +并配置项目。 + +若安装缓慢报错,可尝试用 cnpm 或别的镜像源自行安装:rm -rf node_modules && cnpm install。 + +3. 使用组件 +$ npm i --save ant-design-vue@next +完整引入 + +import { createApp } from 'vue'; +import Antd from 'ant-design-vue'; +import App from './App'; +import 'ant-design-vue/dist/antd.css'; + +const app = createApp(); +app.config.productionTip = false; + +app.use(Antd); +以上代码便完成了 Antd 的引入。需要注意的是,样式文件需要单独引入。 + +局部导入组件 + +import { createApp } from 'vue'; +import { Button, message } from 'ant-design-vue'; +import App from './App'; + +const app = createApp(App); +app.config.productionTip = false; + +/* 会自动注册 Button 下的子组件, 例如 Button.Group */ +app.use(Button).mount('#app'); + +app.config.globalProperties.$message = message; \ No newline at end of file