From 943c80fe0865eda2289f563d308d1b5c0e097d10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=A5=E5=AE=89=E7=90=AA?= <2689553517@qq.com> Date: Sun, 24 Nov 2024 21:10:28 +0800 Subject: [PATCH 1/2] sileyihuile --- ...345\222\214Mvc\347\273\203\344\271\240.md" | 155 ++++++++++++++++ ...50\345\222\214\350\247\206\345\233\276.md" | 70 +++++++ ...14\350\277\224\345\233\236\345\200\274.md" | 171 ++++++++++++++++++ 3 files changed, 396 insertions(+) create mode 100644 "\347\253\245\345\256\211\347\220\252/20241119-Linux\347\273\203\344\271\240\345\222\214Mvc\347\273\203\344\271\240.md" create mode 100644 "\347\253\245\345\256\211\347\220\252/20241121-\346\216\247\345\210\266\345\231\250\345\222\214\350\247\206\345\233\276.md" create mode 100644 "\347\253\245\345\256\211\347\220\252/20241122-\346\216\247\345\210\266\345\231\250\345\217\202\346\225\260\345\222\214\350\277\224\345\233\236\345\200\274.md" diff --git "a/\347\253\245\345\256\211\347\220\252/20241119-Linux\347\273\203\344\271\240\345\222\214Mvc\347\273\203\344\271\240.md" "b/\347\253\245\345\256\211\347\220\252/20241119-Linux\347\273\203\344\271\240\345\222\214Mvc\347\273\203\344\271\240.md" new file mode 100644 index 0000000..b8c2571 --- /dev/null +++ "b/\347\253\245\345\256\211\347\220\252/20241119-Linux\347\273\203\344\271\240\345\222\214Mvc\347\273\203\344\271\240.md" @@ -0,0 +1,155 @@ +# 控制器 + +## MVC架构概述 + +**MVC定义**:MVC(Model-View-Controller)是一种软件架构模式,用于分离应用程序的业务逻辑、用户界面和输入逻辑。这个模式提高了代码的可维护性和可扩展性。 + +1. **Model(模型)**: + - 负责管理应用程序的数据和业务逻辑。 + - 与数据存储(如数据库)进行交互,进行数据处理和验证。 + +2. **View(视图)**: + - 负责展示数据给用户。 + - 处理用户界面相关的元素,通常是HTML、CSS及JavaScript等。 + +3. **Controller(控制器)**: + - 作为模型和视图之间的中介。 + - 处理用户输入,更新模型和视图之间的状态。 + +## 控制器的作用 + +1. **接收请求**:控制器接收来自用户的请求(通常是HTTP请求),解析请求参数。 + +2. **调用模型**:根据请求内容,调用相应的模型层进行数据处理,如数据库查询、数据更新等。 + +3. **选择视图**:处理完请求后,控制器选择相应的视图来展示处理结果或反馈给用户。 + +4. **控制流程**:控制器决定应用程序的执行流程,比如跳转到不同的视图或执行不同的逻辑。 + +## 控制器的实现 + +1. **路由配置**: + - 在MVC框架中,通常配置路由,将特定URL映射到对应的控制器和动作(方法)。 + +2. **控制器的基本结构**: + - 控制器通常是一个类,其中的方法对应于用户请求的不同操作。 + - 常见的操作包括: + - `Create`:处理创建新的资源。 + - `Read`:读取和显示资源。 + - `Update`:更新现有资源。 + - `Delete`:删除资源。 + +## 在备案中Linux写不了 + +## MVC练习 + +1.创建一个控制台项目,没有任何选项,体会项目名称和什么有关系 + +dotnet new console + + +2.创建一个控制项目,项目名称Blog + +dotnet new console -n Blog + +3.创建一个控制台项目,输出到Blog目录 + +dotnet new console -o Blog + +4.创建一个MVC项目,指定项目名称 + +dotnet new mvc -n Blog + +5.创建一个MVC项目,指定输出目录 + +dotnet new mvc -o BlogDir + +6.创建一个带解决方案,其下有一个MVC项目,3个类库项目的“综合项目” + +dotnet new sln -n Solution + +MVC项目: dotnet new mvc -n Blog + +类库: dotnet new classlib -n ClassLib1 dotnet new classlib -n ClassLib2 dotnet new classlib -n ClassLib3 + +7.创建一个项目,在默认控制器(Home)下,新增一个Action方法,名为Ok,同时为其创建对应视图以显示这个视图 + +创建项目 dotnet new mvc -n Blog + + public IActionResult Ok() + { + return View(); + } + + +8.创建一个项目,创建一个新的控制器,名为Blogs,新的控制器拥有一个名为Index的Action,该方法返回一个视图,视图显示“神级预判” +``` +public class BlogsController : Controller + { + public IActionResult Index() + { + return View(); + } + } +``` +创建对应视图Views/Blogs/Index.cshtml + +``` +

神级预判

+``` +9.给第8题的新控制,添加一个新的Action,名为Music,不接受任何参数,并返回对应的视图,视图显示“顶级打野” +``` + public IActionResult Music() + { + return View(); + } +``` +创建对应视图Views/Blogs/Music.cshtml +``` +顶级打野 +``` +10.给第8题的新控制器,新增一个Action,名为List,不接受任何参数,并返回对应视图,视图显示一个经典CRUD界面 +``` +public IActionResult List() + { + return View(); + } +``` +创建对应视图Views/Blogs/List.cshtml + +11.新增一个控制器,名为Products,该控制器具有一个名为Edit的Action,这个Action接受一个int类型的参数id,显示这个id +``` +public class ProductsController : Controller +{ + public IActionResult Edit(int id) + { + ViewBag.Id = id; + return View(); + } +} +``` +创建对应视图Views/Products/Edit.cshtml +``` +

Edit Product

+

编辑的产品ID:@ViewBag.Id

+``` +12.在11题的新控制器中,新增一个名为Create的Action,该Action接受一个类型为Students(有姓名、年龄、体长属性)的参数,并展示该参数的姓名属性 +``` +public class ProductsController : Controller{ + public IActionResult Create(){ + var pro=new ProductStudent{ + Name="想死", + Age="3", + Tall="176" + }; + return View(pro); +} + } + public class ProductStudent{ + public string Name{get;set;}=null!; + public string Age{get;set;}=null!; + public string Tall{get;set;}=null!; + + } +``` +创建对应视图Views/Products/Create.cshtml \ No newline at end of file diff --git "a/\347\253\245\345\256\211\347\220\252/20241121-\346\216\247\345\210\266\345\231\250\345\222\214\350\247\206\345\233\276.md" "b/\347\253\245\345\256\211\347\220\252/20241121-\346\216\247\345\210\266\345\231\250\345\222\214\350\247\206\345\233\276.md" new file mode 100644 index 0000000..cb0b381 --- /dev/null +++ "b/\347\253\245\345\256\211\347\220\252/20241121-\346\216\247\345\210\266\345\231\250\345\222\214\350\247\206\345\233\276.md" @@ -0,0 +1,70 @@ +# MVC 中控制器参数和视图笔记 + +## 1. 控制器参数 + +### 1.1 参数传递 +- 控制器方法通常接收来自请求的参数,这些参数可以是在 URL、表单中提交的数据或请求头中的信息。 +- 参数可以通过方法签名直接接收,也可以使用模型绑定将请求数据绑定到特定的模型类上。 + +### 1.2 模型绑定 +- ASP.NET MVC 支持模型绑定机制,可以自动将请求数据转换为特定的类型(如基本数据类型、复杂对象等)。 +- 例如: + ```csharp + public ActionResult Edit(int id, UserModel model) + { + // id 为 URL 参数,model 为表单提交的用户模型 + } + +### 1.3 路由参数 +- 路由可以设定参数,使得 URL 更具可读性并且支持 RESTful 风格。 +- 例如: +```csharp +routes.MapRoute( + name: "Product", + url: "Product/{id}", + defaults: new { controller = "Product", action = "Details" } +); +``` + +### 1.4 查询字符串 +- 控制器可以通过 Request.QueryString 访问查询字符串参数。 +- 这在处理 GET 请求时尤其有用。 + +## 2. 视图 + +### 2.1 视图的作用 +- 视图负责将模型数据转化为用户界面,通常以 HTML 形式展示。 +- 视图通常通过 Razor 视图引擎(.cshtml 文件)进行编写。 + +### 2.2 传递数据到视图 +- 使用 ViewBag 和 ViewData 传递动态数据。 +- 通过强类型视图模型传递数据,确保编译时检查。 +例如: +```csharp +public ActionResult Index() +{ + ViewBag.Message = "Welcome to my site!"; + return View(); +} +``` +``` +public ActionResult Details() +{ + var model = new ProductModel { Id = 1, Name = "Sample Product" }; + return View(model); // 视图是强类型的 +} +``` + +### 2.3 部分视图 +- 可以在视图中渲染部分视图(Partial Views),以提高代码复用性。 +- 使用 Html.Partial() 或 Html.RenderPartial() 方法。 + +### 2.4 布局 +- 使用布局文件定义页面的共同结构(如头部、底部)。 +- 使用 @RenderBody() 来指定内容区域。 + +### 2.5 HTML 帮助程序 +- ASP.NET MVC 提供了一系列 HTML 帮助程序,方便生成表单元素和链接, + +- 例如 Html.TextBoxFor() 和 Html.ActionLink()。 + diff --git "a/\347\253\245\345\256\211\347\220\252/20241122-\346\216\247\345\210\266\345\231\250\345\217\202\346\225\260\345\222\214\350\277\224\345\233\236\345\200\274.md" "b/\347\253\245\345\256\211\347\220\252/20241122-\346\216\247\345\210\266\345\231\250\345\217\202\346\225\260\345\222\214\350\277\224\345\233\236\345\200\274.md" new file mode 100644 index 0000000..25d8bab --- /dev/null +++ "b/\347\253\245\345\256\211\347\220\252/20241122-\346\216\247\345\210\266\345\231\250\345\217\202\346\225\260\345\222\214\350\277\224\345\233\236\345\200\274.md" @@ -0,0 +1,171 @@ +# MVC 控制器返回值和视图笔记 + +## 1. MVC 概述 + +MVC(模型-视图-控制器)是一种软件架构模式,用于分离应用程序的主要关注点。它将应用程序分为三个核心部分: +- **模型(Model)**:处理数据和业务逻辑。 +- **视图(View)**:负责显示数据(用户界面)。 +- **控制器(Controller)**:处理用户输入并与模型和视图进行交互。 + +## 2. 控制器的角色 + +控制器是 MVC 模式中的核心部分,负责接收请求、处理输入、调用模型并返回相应视图。控制器中的方法通常会有特定的返回类型,决定了如何与视图进行交互。 + +## 3. 控制器的返回值 + +### 3.1 返回视图 + +控制器可以返回一个视图,通常是一个 HTML 页面或模板。返回视图的方法通常使用 `View()` 方法。例如: + +```csharp +public IActionResult Index() +{ + return View(); +} +``` +### 3.2 返回数据 + +在某些情况下,控制器可能需要返回 JSON 数据,特别是在构建单页应用或 AJAX 请求时。这可以通过 Json() 方法实现。例如: + +```csharp +public IActionResult GetData() +{ + var data = new { Name = "John", Age = 30 }; + return Json(data); +} +``` + +### 3.3 重定向 +有时候,我们希望在处理请求后重定向到另一个动作或控制器。这可以通过 RedirectToAction() 方法实现。例如: + +```csharp +public IActionResult Create() +{ + // 创建数据逻辑 + return RedirectToAction("Index"); +} +``` + +### 3.4 返回状态码 +在某些情况下,您可能只想返回 HTTP 状态码。例如,当一个资源没有找到时,您可以返回 NotFound(): + +```csharp +public IActionResult GetItem(int id) +{ + var item = _repository.Find(id); + if (item == null) + { + return NotFound(); + } + return Ok(item); +} +``` + +## 4. 视图的创建 +视图是使用 HTML、CSS 和 JavaScript 创建的用户界面。视图文件通常放置在 Views 文件夹中,按照控制器的名称组织子文件夹。例如,对于 HomeController,视图文件应位于 Views/Home/ 中。 + +### 4.1 使用 Razor 语法 +ASP.NET MVC 使用 Razor 语法来生成动态 HTML。基本语法示例: + +```html +@model YourNamespace.Models.YourModel + +

@Model.Title

+

@Model.Description

+``` + +# 作业 + +专项练习-控制器传参 + +1.简单参数传递 在一个叫Blog控制器中,定义一个叫Index的Action,并且传递一个int类型的值,id为变量名 + +效果:![](https://s10.aconvert.com/convert/p3r68-cdx67/anipo-y8y6w.jpg) + +2.简单参数传递 在一个叫Blog控制器中,定义一个叫Index_2的Action,并且传递一个string类型的值,id为变量名 + +效果:![](https://s10.aconvert.com/convert/p3r68-cdx67/avbe3-54vsw.jpg) + +3.简单参数传递 在一个叫Blog控制器中,定义一个叫Index_3的Action,并且传递一个string类型的值,name为变量名 + +效果:![](https://s10.aconvert.com/convert/p3r68-cdx67/a42b8-0el3x.jpg) + +4。复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create的Action,并且传递一个BlogCreateDto类型的值,blogCreateDto为变量名 +``` +PS BlogCreateDto类型具有Title、Author、Content自动属性 +``` + +效果:![](https://s10.aconvert.com/convert/p3r68-cdx67/apd19-uq440.jpg) + +5.复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create_1的Action,并且传递一个Products类型的值,productCreateDto为变量名 +``` +PS Products类型具有Name、Price、Stock自动属性 +``` + +效果:![](https://s10.aconvert.com/convert/p3r68-cdx67/afkes-9hr9x.jpg) + +6.复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create_2的Action,并且传递一个Students类型的值,studentCreateDto为变量名 +``` +PS Students类型具有StudentName、Sex、Age自动属性 +``` + +效果:![](https://s10.aconvert.com/convert/p3r68-cdx67/ad42p-r8bvs.jpg) + + +专项练习-基础能力 + +1.生成一个随机整数,范围[0,100],注意是否包含 +![](https://s10.aconvert.com/convert/p3r68-cdx67/adof9-p70rx.jpg) +2.生成一个随机整数,范围(0,100],注意是否包含 +![](https://s10.aconvert.com/convert/p3r68-cdx67/a6rxs-ztvvu.jpg) +3.生成10个随机整数,范围[5,80],注意是否包含 +![](https://s10.aconvert.com/convert/p3r68-cdx67/ajtae-ixwpu.jpg) +4.定义一个字符串,字符串中有100个中文字符,需要从中随机取1个字符串 +![](https://s10.aconvert.com/convert/p3r68-cdx67/a7mxz-4zqj5.jpg) +5.定义一个字符串,字符串中有100个中文字符,需要从中随机取5-50个字符,组成新的字符 +![](https://s10.aconvert.com/convert/p3r68-cdx67/al8am-klqw9.jpg) +6.定义2个字符串,第一个字符串中放百家姓,第二个字符串中放中文字符,要求从第一个字符串随机取得一个姓,再从第二个字符串中随机获得1到2个字符组成新字符串,和第一个字符串取得的姓组成一个姓名 +![](https://s10.aconvert.com/convert/p3r68-cdx67/ajy0n-zdhrl.jpg) +7.利用以上方法,随机生成100个BlogCreateDto类型(有Title、Author、Content属性)的对象,其中的内容都是随机生成且长度不定,并将其渲染到视图 +``` +public class BlogCreateDto +{ + public string Title { get; set; } + public string Author { get; set; } + public string Content { get; set; } +} + +List blogs = new List(); +for (int i = 0; i < 100; i++) +{ + BlogCreateDto blog = new BlogCreateDto + { + Title = GenerateRandomString(10, 50), // 随机标题长度10-50 + Author = name, // 使用上面生成的姓名 + Content = GenerateRandomString(100, 1000) // 随机内容长度100-1000 + }; + blogs.Add(blog); +} + +string GenerateRandomString(int minLength, int maxLength) +{ + StringBuilder contentSb = new StringBuilder(); + int contentLength = random.Next(minLength, maxLength + 1); + for (int i = 0; i < contentLength; i++) + { + contentSb.Append(chineseCharacters[random.Next(chineseCharacters.Length)]); + } + return contentSb.ToString(); +} +``` +专项练习-控制器返回值 + +1.渲染简单数据到页面 + +效果:![](https://s10.aconvert.com/convert/p3r68-cdx67/asukd-aixvf.jpg) + +2.渲染复杂数据到页面 +![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAAAAACIM/FCAAACh0lEQVR4Ae3ch5W0OgyG4dt/mQJ2xgQPzJoM1m3AbALrxzrf28FzsoP0HykJEEAAAUQTBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEkKK0789+GK/I2ezfQB522PnS1qc8pGgXvr4tE4aY0XOUWlGImThWgyCk6DleixzE7qwBkg/MGiDPlVVAyp1VQGrPKiACDhFI6VkF5LmzCki+sg7IwDoglnVAil0IMkeG9CyUiwsxLFUVFzJJOQaKCjFCDN9RXMjIX7W6ztZXZDKKCyn8sWJvH+nca7WHDN9lROlAliPH9iRKCPI4cswFJQWxB46toLQgQ9jhn5QYZA9DOkoMUoQde5YapAxDWkoNYsOQR3KQd9CxUnIQF4S49CB9ENKlBxmDEKsFUgMCCCCAAHIrSF61f6153Ajy8nyiPr8L5MXnmm4CyT2fzN4DUvHZ+ntA2tOQBRBAAAEEEEAAAQQQ7ZBaC6TwSiDUaYHQ2yuB0MN+ft+43whyrs4rgVCjBUKTFshLC6TUAjGA3AxSaYFYLZBOC2RUAsk8h5qTg9QcbEoOsoQhQ2qQhsO5xCD5dgB5JQaZ+KBKGtKecvR81Ic0ZDjByKdDx0rSEDZ/djQbH+bkIdvfJFm98BfV8hD2zprfVdlu9PxVeyYAkciREohRAplJCaRSAplJCcQogTjSAdlyHRBvSAekJR0QRzogA+mADJkOiCPSAPEtqYBshlRAXC43hxix2QiOuEZkVERykGyNo9idIZKE0HO7XrG6OiMShlDWjstVzdPgXtUH9v0CEidAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQP4HgjZxTpdEii0AAAAASUVORK5CYII=) + +3.渲染集合数据到页面 +![](https://s10.aconvert.com/convert/p3r68-cdx67/ai720-5b7gn.jpg) \ No newline at end of file -- Gitee From 9b2fa74a19b53a61bdc8b52f15b13d1dff5e4c77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=A5=E5=AE=89=E7=90=AA?= <2689553517@qq.com> Date: Sun, 24 Nov 2024 21:40:57 +0800 Subject: [PATCH 2/2] 13b --- ...345\222\214Mvc\347\273\203\344\271\240.md" | 103 +++++++++++++++++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git "a/\347\253\245\345\256\211\347\220\252/20241119-Linux\347\273\203\344\271\240\345\222\214Mvc\347\273\203\344\271\240.md" "b/\347\253\245\345\256\211\347\220\252/20241119-Linux\347\273\203\344\271\240\345\222\214Mvc\347\273\203\344\271\240.md" index b8c2571..428d1a7 100644 --- "a/\347\253\245\345\256\211\347\220\252/20241119-Linux\347\273\203\344\271\240\345\222\214Mvc\347\273\203\344\271\240.md" +++ "b/\347\253\245\345\256\211\347\220\252/20241119-Linux\347\273\203\344\271\240\345\222\214Mvc\347\273\203\344\271\240.md" @@ -39,7 +39,108 @@ - `Update`:更新现有资源。 - `Delete`:删除资源。 -## 在备案中Linux写不了 +## Linux练习 + +1.任务:尝试使用以下几种方式分别登录服务器,说明它们分别的注意事项,并说明它们之间的区别 + +ssh客户端 + +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121195445.png) +tabby应用 + +配置和连接 新建SSH连接 + +xShell + + 点击“新建”,新建会话 + +1.填写一个便于标识的名称 + +2.填写服务器的公网IP + +3.点击用户身份验证 填写服务器的用户名和密码,之后点击“确定” 填写服务器的用户名和密码,之后点击“确定” + +putty + +配置连接:用户需要输入需要连接的主机或IP地址、端口号等信息,并点击“save”按钮 选中之前保持好的配置,点击“open”打开。 + +2.任务:更新软件源,命令:apt update,并了解这一步的实际用处和意义 + +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121195721.png) + +3.任务:更新软件和补丁,命令:apt upgrade -y,并了解这一步的实际用处意义 +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121200014.png) +4.任务:熟悉并完成以下练习 +1.查看当前目录下的文件和文件夹----命令:ls +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121200146.png) + +2.查看当前路径----命令:pwd +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121200224.png) + +3.创建一个新的文件夹----命令:mkdir [文件夹名] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121200316.png) + +4.删除一个文件夹----命令:rmdir [文件夹名](注意:只能删除空文件夹) +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121201225.png) + +5.移动或重命名文件/文件夹----命令:mv [原路径] [新路径] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121200442.png) + +6.复制文件----命令:cp [源文件] [目标路径] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121201103.png) + +7.删除文件----命令:rm [文件名] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121200358.png) + +8.查看文件内容----命令:cat [文件名] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121201312.png) + +9.分页查看文件内容----命令:less [文件名] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121201353.png) + +10.查找文件----命令:find / -name [文件名] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121201504.png) + +11.查看文件权限----命令:ls -l [文件或目录名] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121201536.png) + +12.改变文件权限----命令:chmod [权限] [文件或目录名] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121201742.png) + +13.改变文件所有者----命令:chown [新所有者] [文件或目录名] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121201906.png) + +14.查看当前登录用户----命令:whoami +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121201933.png) + +15.查看系统运行时间和平均负载----命令:uptime +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121201954.png) + +16.查看磁盘使用情况----命令:df -h +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121202026.png) + +17.查看当前路径下的隐藏文件----命令:ls -a +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121202055.png) + +18.创建一个空文件----命令:touch [文件名] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121202125.png) + +19.查看当前系统的内核版本----命令:uname -r +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121202222.png) + +20.查看网络连接状态----命令:ifconfig 或 ip addr +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121202250.png) + +21.安装一个软件包----命令:sudo apt-get install [软件包名] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121202558.png) + +22.卸载一个软件包----命令:sudo apt-get remove [软件包名] +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121202623.png) + +23.更新软件包列表----命令:sudo apt-get update +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121202459.png) +5.在服务器上安装SDK环境 +![](https://gitee.com/shen-yulin20051127/imgs/raw/master/imgs/20241121202730.png) ## MVC练习 -- Gitee