From 2fffa587c2bcaa1a4088f6ddf44685ea5d90eb0b Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 24 Nov 2024 22:27:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...344\270\252MVC\351\241\271\347\233\256.md" | 20 ++ .../20241122_MVC\347\273\203\344\271\240.md" | 279 ++++++++++++++++++ ...06\345\233\276\346\230\276\347\244\272.md" | 81 +++++ 3 files changed, 380 insertions(+) create mode 100644 "\347\250\213\346\242\246/20241120_\351\203\250\347\275\262\344\270\200\344\270\252MVC\351\241\271\347\233\256.md" create mode 100644 "\347\250\213\346\242\246/20241122_MVC\347\273\203\344\271\240.md" create mode 100644 "\347\250\213\346\242\246/20241122_\346\216\247\345\210\266\345\231\250\344\274\240\345\217\202&\350\247\206\345\233\276\346\230\276\347\244\272.md" diff --git "a/\347\250\213\346\242\246/20241120_\351\203\250\347\275\262\344\270\200\344\270\252MVC\351\241\271\347\233\256.md" "b/\347\250\213\346\242\246/20241120_\351\203\250\347\275\262\344\270\200\344\270\252MVC\351\241\271\347\233\256.md" new file mode 100644 index 0000000..d0c8a27 --- /dev/null +++ "b/\347\250\213\346\242\246/20241120_\351\203\250\347\275\262\344\270\200\344\270\252MVC\351\241\271\347\233\256.md" @@ -0,0 +1,20 @@ +@startmindmap +Debian部署MVC(Asp.Net Core)的先决条件 + 1. 在服务器上安装运行环境或者调试环境 + * 如何安装SDK包管理器 + * 先下载文件(wget或curl) + * 注册文件 + * 删除已经注册过的文件(rm) + * 更新软件源(apt update) + * 安装SDK(apt install dotnet-sdk-8.0) + * 在Linux上安装软件或者应用常用方式如下: + * 包管理器 + * 使用二进制文件安装 + * 编译安装 + 2. 将打包好的程序上传到指定目录 + * SCP工具 + * 打包 dotnet publish + * 测试 + * 上传 scp -r ./*root@xxxx.xxx:/var/www/xxxx:xxx + 3. 一般建议使用Nginx做反向代理 +@endmindmap \ No newline at end of file diff --git "a/\347\250\213\346\242\246/20241122_MVC\347\273\203\344\271\240.md" "b/\347\250\213\346\242\246/20241122_MVC\347\273\203\344\271\240.md" new file mode 100644 index 0000000..cc57a1e --- /dev/null +++ "b/\347\250\213\346\242\246/20241122_MVC\347\273\203\344\271\240.md" @@ -0,0 +1,279 @@ +# Linux练习 +> 任务1:尝试使用以下几种方式分别登录服务器,说明它们分别的注意事项,并说明它们之间的区别 +`ssh客户端`:(操作简单,cmd终端就可以) +* 确保服务器的ssh服务已开启;ssh端口号(默认22);配置以使用密钥认证 +* 基础的ssh连接工具;自带工具;足够用于日常远程登录和管理 +* 适用于所有操作系统 +`tabby应用`:(有点复杂,需要用ssh配置连接) +* 是一个开源的终端平台;支持ssh,telnet,串口连接等;安装tabby应用;配置连接时,需输入正确的服务器信息(主机名、端口、用户名等);可以创建多个配置文件以保存不同的服务器连接信息 +* 提供图形界面;适合管理多个连接的用户;集成了多个终端和连接工具,方便管理多个服务器 +`xShell`:(复杂,根据IP公网登录了,连接网页需用xftp连接显示网页) +* 是一个Windows平台的ssh客户端;支持ssh密钥认证和会话保存 +* 专为Windows设计,提供图形界面 +`putty`:(也很简单,需安装putty包操作) +* 是一个轻量级工具;启动速度快;不提供像tabby和xshell那样的多标签或多会话管理功能 +* 适合快速的ssh连接 + +> 任务2:更新软件源,命令:apt update,并了解这一步的实际用处和意义 +`apt update`: +* 实际用处:apt update 命令会同步本地软件包列表与软件源服务器上的列表,确保系统是最新的软件包版本 +* 意义:最新的软件包可以确保系统的安全性和稳定性;过时的版本会导致安全问题或兼容性问题 +* 既不移除已安装的软件包也不安装新软件包,只升级已存在的软件包 +* `apt update`只是更新了本地的软件包索引;`apt upgrade或apt install`执行实际的软件包下载和安装 +> 任务3:更新软件和补丁,命令:apt upgrade -y,并了解这一步的实际用处意义 +`apt upgrade -y`: +* 实际用处:安全补丁,确保系统免受已知漏洞的影响,维护系统的稳定性和性能 +* 意义:对bug修复,自动更新,系统上所有可升级的软件包都将被更新到最新版本 +* 需安装新软件包,可使用该命令 +> 任务4.Linux命令略微熟练 +> 任务5.在服务器上安装SDK环境 +`安装SDK环境步骤`: +* 先登录服务器-->进入dotnet官网-->点击下载.net8.0-->选择Linux的包管理器安装程序-->选择Debian系统(Debian12)-->打开cmd终端输入命令`wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb`(先下载文件)-->`dpkg -i packages-microsoft-prod.deb`(注册文件)-->`rm packages-microsoft-prod.deb`(删除已注册的文件)-->`apt update`(更新软件源)-->`apt install dotnet-sdk-8.0`(安装命令)-->`dotnet`(检测已安装情况) +> 任务6.使用nginx部署10个静态网站,要求不同域名,不同内容 +主要步骤: +安装nginx +上传网页 +配置nginx配置文件 +测试nginx配置文件,命令:nginx -t +强制让nginx加载配置文件,命令:nginx -s reload +* 部署静态网站的步骤: + 1. 先登录服务器-->安装SDK运行环境(步骤看任务5) + 2. 部署MVC终端命令`dotnet new mvc -0 ./Blog/` +# MVC练习 +> 1. 创建一个控制台项目,没有任何选项,体会项目名称和什么有关系 +* 项目文件夹:在文件系统中,项目名称成为存放项目文件的文件夹名称 +* 命名空间:在C#中,项目名称默认成为代码文件中的根命名空间 +* Assembly名称:编译后的DLL或EXE文件的名称,默认与项目名称相同 +* 解决方案资源管理器:在Visual Studio中,项目名称显示在解决方案资源管理器中,代表你的项目 +* 例如,如果你将项目命名为“MyConsoleApp”,那么 + ```js + 1. 文件夹名称可能是“MyConsoleApp” + 2. 命名空间可能是“MyConsoleApp” + 3. 输出的DLL或EXE文件名可能是“MyConsoleApp.dll”或“MyConsoleApp.exe” + ``` +> 2. 创建一个控制项目,项目名称Blog +`dotnet new console -n Blog` +> 3. 创建一个控制台项目,输出到Blog目录 +`cd Blog` +> 4. 创建一个MVC项目,指定项目名称 +`dotnet new mvc -n Blog` +> 5. 创建一个MVC项目,指定输出目录 +`dotnet new mvc -0 ./Blog/` +> 6. 创建一个带解决方案,其下有一个MVC项目,3个类库项目的“综合项目” +`dotnet new sln`(创建解决方案)-->`mkdir src`(创建文件夹)--> `dotnet new classlib -0 ./src/Blog.Core`(创建类库)-->`dotnet sln add .\src\Blog.Core\`(将类库添加到解决方案中)-->`dotnet build`(编译项目) +> 7. 创建一个项目,在默认控制器(Home)下,新增一个Action方法,名为Ok,同时为其创建对应视图以显示这个视图 +`dotnet new mvc`-->在Home下建一个文件ok.cshtml +-->在ok.cshtml里 +```js +昨天今天每天 +陪你左右 +``` +-->在控制器中HomeController.cs里 +```js + public IActionResult ok() + { + return View(); + } +``` +-->`dotnet watch`热重载-->html网页地址`http://localhost:5000/Home/ok` +> 8. 创建一个项目,创建一个新的控制器,名为Blogs,新的控制器拥有一个名为Index的Action,该方法返回一个视图,视图显示“神级预判” +`dotnet new mvc` +-->在Controllers里键一个文件Blogs.cs +```js +using Microsoft.AspNetCore.Mvc; +namespace Blog.Controllers; +public class Blogs:Controller{ + public IActionResult Index() + { + return View(); + } +} +``` +--->在Views里建一个文件夹Blogs-->在建一个文件index.cshtml +```js +神级预判 +//html网页地址http://localhost:5000/Blogs/index +``` +> 9. 给第8题的新控制,添加一个新的Action,名为Music,不接受任何参数,并返回对应的视图,视图显示“顶级打野” +-->在Controllers里的一个文件Blogs.cs里 +```js +using Microsoft.AspNetCore.Mvc; +namespace Blog.Controllers; +public class Blogs:Controller{ + public IActionResult Index() + { + return View(); + } + public IActionResult Music() + { + return View(); + } +} +``` +--->在Views里建一个文件夹Blogs-->在建一个文件Music.cshtml +```js +顶级打野 +//html网页地址http://localhost:5000/Blogs/Music +``` +> 10. 给第8题的新控制器,新增一个Action,名为List,不接受任何参数,并返回对应视图,视图显示一个经典CRUD界面 + +> 11. 新增一个控制器,名为Products,该控制器具有一个名为Edit的Action,这个Action接受一个int类型的参数id,显示这个id +```js + public IActionResult Edit( int id){ + return Content(id.ToString()); + } +``` +> 12. 在11题的新控制器中,新增一个名为Create的Action,该Action接受一个类型为Students(有姓名、年龄、体长属性)的参数,并展示该参数的姓名属性 +# 控制器传参练习 +> 1. 简单参数传递 在一个叫Blog控制器中,定义一个叫Index的Action,并且传递一个int类型的值,id为变量名 +```js + public IActionResult Index( int id){ + return Content(id.ToString()); + } +//html页面中在网址上输入数字(http://localhost:5000/baby/index/12345)会在页面上显示12345 +``` +> 2. 简单参数传递 在一个叫Blog控制器中,定义一个叫Index_2的Action,并且传递一个string类型的值,id为变量名 +```js + public IActionResult Index_2( string id){ + return Content(id.ToString()); + } +//html页面中在网址上输入字符串类型的(http://localhost:5000/baby/index_2/fgdgd123)会在页面上显示fgdgd123 +``` +> 3. 简单参数传递 在一个叫Blog控制器中,定义一个叫Index_3的Action,并且传递一个string类型的值,name为变量名 +**注意:**变量名改了得在Program.cs里的` pattern: "{controller=Home}/{action=Index}/{name?}");`修改 +```js + public IActionResult Index_2( string name){ + return Content(id.ToString()); + } +//html页面中在网址上输入字符串类型的(http://localhost:5000/baby/index_2/fgdgd123)会在页面上显示fgdgd123 +``` +> 4. 复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create的Action,并且传递一个BlogCreateDto类型的值,blogCreateDto为变量名; +PS: BlogCreateDto类型具有Title、Author、Content自动属性 +**在控制器中输入** +```js +using Microsoft.AspNetCore.Mvc; +namespace Blog.Controllers; +public class BabyController:Controller{ +//视图显示 + [HttpPost] + public IActionResult Create([FromBody] BlogCreateDto blogCreateDto){ + return View(blogCreateDto); + } + public IActionResult Index( int id){ + var blogCreateDto=new BlogCreateDto{ + Author="小红", + Title="果敢", + Content="人生不就是白干加白干" + }; + return View(blogCreateDto); + } +} +// 定义类型 + public class BlogCreateDto{ + public string Title{get;set;}=null!; + public string Author{get;set;}=null!; + public string Content{get;set;}=null!; + } +``` +**在views里的Baby的Index.cshtml中** +```js +@model Blog.Controllers.BlogCreateDto; + +

@Model.Title

+@Model.Author +@Model.Content +``` +> 5. 复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create_1的Action,并且传递一个Products类型的值,productCreateDto为变量名 +PS: Products类型具有Name、Price、Stock自动属性 +**在控制器中输入** +```js +using Microsoft.AspNetCore.Mvc; +namespace Blog.Controllers; +public class BabyController:Controller{ +//视图显示 + [HttpPost] + public IActionResult Create_1([FromBody] Products productCreateDto){ + return View(productCreateDto); + } + public IActionResult Index( int id){ + var productCreateDto=new Products{ + Name="小黑", + Price="456", + Stock="没有防备,也许就是故事的结尾" + }; + return View(productCreateDto); + } +} +// 定义类型 + public class Products{ + public string Name{get;set;}=null!; + public string Price{get;set;}=null!; + public string Stock{get;set;}=null!; + } +``` +**在views里的Baby的Index.cshtml中** +```js +@model Blog.Controllers.Products; + +

@Model.Name

+@Model.Price +@Model.Stock +``` +> 6. 复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create_2的Action,并且传递一个Students类型的值,studentCreateDto为变量名 +PS: Students类型具有StudentName、Sex、Age自动属性 +**在控制器中输入** +```js +using Microsoft.AspNetCore.Mvc; +namespace Blog.Controllers; +public class BabyController:Controller{ +//视图显示 + [HttpPost] + public IActionResult Create_2([FromBody] Students studentCreateDto){ + return View(studentCreateDto); + } + public IActionResult Index( int id){ + var studentCreateDto=new Students{ + StudentName="蓝蓝", + Sex="女", + Age="18" + }; + return View(studentCreateDto); + } +} +// 定义类型 + public class Students{ + public string StudentName{get;set;}=null!; + public string Sex{get;set;}=null!; + public string Age{get;set;}=null!; + } +``` +**在views里的Baby的Index.cshtml中** +```js +@model Blog.Controllers.Students; + +

@Model.StudentName

+@Model.Sex +@Model.Age +``` \ No newline at end of file diff --git "a/\347\250\213\346\242\246/20241122_\346\216\247\345\210\266\345\231\250\344\274\240\345\217\202&\350\247\206\345\233\276\346\230\276\347\244\272.md" "b/\347\250\213\346\242\246/20241122_\346\216\247\345\210\266\345\231\250\344\274\240\345\217\202&\350\247\206\345\233\276\346\230\276\347\244\272.md" new file mode 100644 index 0000000..06a8ec2 --- /dev/null +++ "b/\347\250\213\346\242\246/20241122_\346\216\247\345\210\266\345\231\250\344\274\240\345\217\202&\350\247\206\345\233\276\346\230\276\347\244\272.md" @@ -0,0 +1,81 @@ +# 在控制器里具有相同参数类型包含3个方面: +1. 参数的个数 +2. 参数的类型 +3. 顺序也是关键 +# 简单传参 +在控制器中输入 +```js +public IactionResult Index(int id) +{ + return Content(id.ToString()); +} +//以上代码,可在网页地址中直接输入可显示: + localhost:5000/baby/index/1234 + 页面显示1234 +``` +> `id`:上面的id与Program.cs里的:`pattern:"{controller=Home}/{action=Index}/{id?}";`--> 相互联系 +# 复杂传参 + +## 定义类型 +```js +//在控制器里的外部输入 + public class BlogCreateDto{ + public string Title{get;set;}=null!; + public string Author{get;set;}=null!; + public string Content{get;set;}=null!; + } +``` +1. 浏览器-->get请求 +2. postman-->post请求 +> 若想使用postman来显示转义代码则还需要以下代码输入 +```js +[HttpPost] +public IActionResult Create ([FromBody] BlogCreateDto blogCreateDto) +{ + return Content(blogCreateDto.Title); //针对于title + return Content(JsonSerializer.Serialize(blogCreateDto)); //针对于全部类型 +} +``` +> `BlogCreateDto`:类型;`blogCreateDto`:变量 +* 利用postman使用在post里body写js代码 + ```js + { + "title":"果敢", + "author":"小红", + "content":"xxxxxx" + } + ``` +* 所输出的转义代码可在json在线解析里显示 +## 视图显示 +```js +//在控制器中Post + [HttpPost] + public IActionResult Create([FromBody] BlogCreateDto blogCreateDto) + { + return View(blogCreateDto); + } +//在控制器中传值 + public IActionResult Index( int id){ + var blogCreateDto=new BlogCreateDto{ + Author="小红", + Title="果敢", + Content="人生不就是白干加白干" + }; + return View(blogCreateDto); + } +//在Views里的Index.cshtml + @model Blog.Controllers.BlogCreateDto; + +

@Model.Title

+@Model.Author +@Model.Content +``` + + -- Gitee