From 0bafed132d9cc91b17ebdeba2eea7583fa62a4c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E4=BD=B3=E6=AC=A3?= <14091193+fanjxin@user.noreply.gitee.com> Date: Sun, 1 Dec 2024 22:53:07 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=83=E4=B9=A0=E5=A4=A7=E6=95=B4=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\351\242\230\346\225\264\345\220\210.md" | 652 ++++++++++++++++++ 1 file changed, 652 insertions(+) create mode 100644 "\350\214\203\344\275\263\346\254\243/11\346\234\210Mvc\347\273\203\344\271\240\351\242\230\346\225\264\345\220\210.md" diff --git "a/\350\214\203\344\275\263\346\254\243/11\346\234\210Mvc\347\273\203\344\271\240\351\242\230\346\225\264\345\220\210.md" "b/\350\214\203\344\275\263\346\254\243/11\346\234\210Mvc\347\273\203\344\271\240\351\242\230\346\225\264\345\220\210.md" new file mode 100644 index 0000000..562bcdd --- /dev/null +++ "b/\350\214\203\344\275\263\346\254\243/11\346\234\210Mvc\347\273\203\344\271\240\351\242\230\346\225\264\345\220\210.md" @@ -0,0 +1,652 @@ +## Linux练习题 +## 1. + ***1.尝试使用以下几种方式分别登录服务器,说明它们分别的注意事项,并说明它们之间的区别:ssh客户端,tabby应用,xShell,putty*** + ### 注意事项 + (拓展和总结) +#### 1.SSH命令行: +:**适合熟悉命令行的用户,注意密钥管理和安全性** +使用注意事项: +a.命令熟悉度:需要熟悉SSH命令。 +b.自动化脚本:在编写自动化脚本的时候,确保脚本的安全性,避免在脚本中明文储存密码。 +c.环境变量:注意环境变量对SSH客户端和服务器软件。 +#### 2.Tabby: +**:提供现代化的界面和丰富的功能,注意多台同步和插件的的安全性** +安全性注意事项: + +密码管理: +建议使用Tabby的密码管理器功能来存储和管理SSH密钥和密码,避免在配置文件中明文存储敏感信息。 +加密存储: +确保Tabby的配置文件和数据存储是加密的,以防止敏感信息泄露。 +插件安全性: +仅安装来自可信来源的插件,避免安装未知或不可信的插件,以防止安全漏洞。 +使用注意事项: + +a:多平台同步: +如果使用多台设备,注意Tabby的配置同步功能,确保同步的安全性,避免敏感信息在传输过程中泄露。 +b:会话管理: +定期清理不再使用的会话配置,避免不必要的连接信息残留。 +c:文件传输: +使用Tabby内置的SFTP功能时,注意文件权限和传输的安全性,避免传输敏感文件到不安全的位置。 +#### 3. Xshell +**提供企业级功能,注意许可证合规和高级安全功能的使用** +安全性注意事项: + +许可证合规: +确保使用合法的许可证,避免使用盗版软件,以防止安全风险和法律问题。 +高级安全功能: +充分利用Xshell提供的多种加密和验证方式,如双因素认证(2FA)、公钥认证等。 +会话加密: +确保所有会话数据在传输过程中都是加密的,避免使用不安全的协议(如Telnet)。 +使用注意事项: + +a.多标签管理: +合理管理多个标签会话,避免打开过多的标签导致资源占用过高。 +b.脚本编写: +如果使用Xshell的脚本编写功能,确保脚本的安全性,避免脚本注入攻击。 +c.会话文件: +注意会话文件的存储位置和权限,避免敏感信息泄露。 +#### PuTTY +**适合轻重级需求,注意密钥管理和会话配置** +安全性注意事项: + +密钥管理: +妥善管理PuTTY的私钥文件(.ppk),避免私钥泄露。 +建议使用强密码短语保护私钥。 +会话保存: +避免在PuTTY的会话保存中存储敏感信息,如密码和密钥。 +更新补丁: +定期更新PuTTY到最新版本,以修补已知的安全漏洞。 +使用注意事项: + +a.多窗口管理: +PuTTY不支持多标签会话管理,注意管理多个PuTTY窗口,避免混乱。 +b.会话配置: +合理配置PuTTY的会话参数,如字体、颜色、窗口大小等,以提高使用体验。 +c.文件传输: +使用PuTTY的PSCP工具进行文件传输时,注意文件权限和传输的安全性。 + + ### 区别: +| 功能/特性 | SSH命令行 | Tabby | Xshell | PuTTY | +|------------------|--------------------|--------------------------------|--------------------------------|-----------------------------| +| **平台支持** | Windows(需额外安装)、Linux、macOS | Windows、macOS、Linux | Windows | Windows、macOS、Linux | +| **多标签会话** | 不支持,需手动管理 | 支持多标签会话 | 支持多标签会话 | 不支持,需手动管理 | +| **SFTP支持** | 需要额外工具 | 内置SFTP功能 | 支持SFTP | 需要额外工具 | +| **脚本自动化** | 支持 | 支持(通过插件) | 支持(高级脚本编写) | 有限支持 | +| **串口连接** | 不支持 | 支持 | 支持 | 不支持 | +| **高级功能** | 有限(需命令行操作)| 插件扩展功能丰富 | 动态端口转发、脚本编写 | 基础功能 | +| **用户界面** | 命令行界面(CLI) | 图形用户界面(GUI),现代化界面 | 图形用户界面(GUI),专业级界面 | 图形用户界面(GUI),简单界面 | +| **多平台同步** | 手动管理 | 支持 | 有限支持 | 手动管理 | +| **安全性** | 依赖于用户配置 | 提供基本安全功能 | 提供高级安全功能,适合企业级 | 提供基本安全功能 | +| **许可证** | 免费开源 | 免费开源 | 免费版(功能有限),商业版需付费 | 免费开源 | +| **适用场景** | 命令行操作、脚本自动化 | 现代化界面、多平台用户 | 企业级用户、高级安全需求 | 轻量级、简单需求 | + +## 2. +***2.更新软件源,命令:apt update,并了解这一步的实际用处和意义*** +### 实际用处: +**apt update 主要的功能是刷新本地软件包索引,使其与远程软件仓库保持同步** +### 意义: +1.通过定期更新软件包,可以修补已知的安全漏洞和错误,提高系统的安全性和稳定性。 +2.通过使用 apt update 和 apt upgrade,开发者可以确保开发环境中的所有工具和库都是最新的,从而提高开发效率。 +3.apt update 和 apt upgrade 命令简化了依赖管理过程,使得开发者可以轻松地管理和更新项目依赖项。 +4.支持远程开发,确保开发环境的一致性和最新性。 + +## 3. +***更新软件和补丁,命令:apt upgrade -y,并了解这一步的实际用处意义*** +a.自动更新: 通过自动更新所有已安装的软件包,确保系统中的软件包都是最新版本,包含最新的功能、安全补丁和错误修复。 +b.简化操作: -y 参数自动确认所有提示,简化了升级过程,适用于自动化脚本和批处理操作。 +c.安全性: 定期运行 apt upgrade -y 可以修补已知的安全漏洞,提高系统的安全性。 +d.稳定性: 更新软件包可以避免由于版本不兼容导致的问题,提高系统的稳定性。 +e.开发效率: 最新的开发工具和库可以提供新的功能和改进,帮助开发者更高效地完成开发任务。 + +## 4. +***熟悉并完成*** +1.查看当前目录下的文件和文件夹 +![](./ls展示.png) +2.查看当前路径 +![](./切换路径.png) +3.创建一个新的文件夹 +![](./创建.png) + +## 5. +**在服务器上面安装sdk环境** +![](./安装sdk环境.PNG) + + +## 6. + +a.安装:![](./nginx安装.png) + 完成nginx部署的10个静态网站 +``` + 主要步骤: + 安装nginx + 上传网页 + 配置nginx配置文件 + 测试nginx配置文件,命令:nginx -t + 强制让nginx加载配置文件,命令:nginx -s reload +``` +### 静态网站(h5作业里的哈哈哈) +![第一个](./静态网站1.png) + + +## 7.部署简单的mvc项目 +一、在服务器上安装了运行环境或者是调试环境(必要条件) +1、如何安装SDK包管理器 + - 先下载个文件 wget curl + - 注册文件 + - 删除已经注册过的文件 rm + - 更新软件源 apt update + - 安装sdk apt install dontnet-sdk-8.0 +2、在Linux上安装软件或者应用的常用方式如下: +- 1、包管理器(对用户来说最简单) +- 2、使用二进制文件安装(对用户来说次简单) +- 3、编译安装(对用户来说最难) + +二、讲打包好的程序上传到指定目录(必要条件) + - 1、scp工具scp -r ./* root@xxxx.xxx:/var/www/xxxx.xxx `scp工具(Tabby Terminal软件` + - 2、xftp + +三、一般建议使用Nginx做反向代理(PS:如果不做反向代理,则这条可以不用) + + +# MVC练习 +```cs +//1.***创建一个控制台项目,没有任何选项,体会项目名称和什么有关系*** +dotnet new console -n Blog +//2、创建一个控制项目,项目名称Blog +dotnet new console -o Blog +//3、创建一个控制台项目,输出到Blog目录 +dotnet new mvc -n BlogMVC +//4、创建一个MVC项目,指定项目名称 +dotnet new mvc -o BlogMVC +//5、创建一个MVC项目,指定输出目录 +//使用命令行工具,运行以下命令创建解决方案: +dotnet new sln -n ComprehensiveSolution +//6.创建MVC项目:a: +dotnet new mvc -n BlogMVC +//b:创建三个类库项目: +dotnet new classlib -n ClassLibrary1 +dotnet new classlib -n ClassLibrary2 +dotnet new classlib -n ClassLibrary3 +//c:将所有项目添加到解决方案中: +dotnet sln add BlogMVC/BlogMVC.csproj +dotnet sln add ClassLibrary1/ClassLibrary1.csproj +dotnet sln add ClassLibrary2/ClassLibrary2.csproj +dotnet sln add ClassLibrary3/ClassLibrary3.csproj +//7、创建一个项目,在默认控制器(Home)下,新增一个Action方法,名为Ok,同时为其创建对应视图以显示这个视图 +//在Controllers文件夹下的HomeController.cs中添加以下方法: +public IActionResult Ok() +{ + return View(); +} +//创建视图文件,在Views/Home文件夹下创建Ok.cshtml文件,并添加以下内容: +

Ok

+

This is the Ok view.

+ +//7. 创建一个项目,创建一个新的控制器,名为Blogs,新的控制器拥有一个名为Index的Action,该方法返回一个视图,视图显示“神级预判” +//在Controllers文件夹下创建一个新的控制器BlogsController.cs,并添加以下内容: +public class BlogsController : Controller +{ + public IActionResult Index() + { + return View(); + } +} +//8.创建视图文件,在Views/Blogs文件夹下创建Index.cshtml文件,并添加以下内容: +

Index

+

神级预判

+ +//9. 给第8题的新控制器,添加一个新的Action,名为Music,不接受任何参数,并返回对应的视图,视图显示“顶级打野” +//在BlogsController.cs中添加以下方法: +public IActionResult Music() +{ + return View(); +} +//创建视图文件,在Views/Blogs文件夹下创建Music.cshtml文件,并添加以下内容: +

Music

+

顶级打野

+//10. 给第8题的新控制器,新增一个Action,名为List,不接受任何参数,并返回对应视图,视图显示一个经典CRUD界面 +//在BlogsController.cs中添加以下方法: +public IActionResult List() +{ + return View(); +} +//创建视图文件,在Views/Blogs文件夹下创建List.cshtml文件,并添加以下HTML代码来模拟CRUD界面: +

List

+

这里是CRUD界面

+//11. 新增一个控制器,名为Products,该控制器具有一个名为Edit的Action,这个Action接受一个int类型的参数id,显示这个id +//在Controllers文件夹下创建一个新的控制器ProductsController.cs,并添加以下内容: +public class ProductsController : Controller +{ + public IActionResult Edit(int id) + { + return View(id); + } +} +//12.创建视图文件,在Views/Products文件夹下创建Edit.cshtml文件,并添加以下内容: +

Edit

+

ID: @Model

+//在11题的新控制器中,新增一个名为Create的Action,该Action接受一个类型为Students的参数,并展示该参数的姓名属性 +//首先,需要定义Student模型。在项目中创建一个新的文件夹Models,并在其中创建Student.cs文件,内容如下: +namespace YourProjectName.Models +{ + public class Student + { + public string Name { get; set; } + public int Age { get; set; } + public double Height { get; set; } + } +} +//在ProductsController.cs中添加以下方法: +public IActionResult Create(Student student) +{ + return View(student); +} +//创建视图文件,在Views/Products文件夹下创建Create.cshtml文件,并添加以下内容: +

Create

+

Name: @Model.Name

+``` + +# 专项练习1-控制器传参 + +```cs + public IActionResult Index(int Id) + { + return Content(Id.ToString) + } +``` + +```cs + public IActionResult Index_2(string Id){ + return Content(Id) + } +``` + +```cs + public IActionResult Index_2(string name){ + return Content(name) + } +``` + +```cs + public class BlogContriller : Controller{ + [HttpPost] + public IActionResult Create([FromBody] BlogCreateDto blogCreateDto){ + return Content(blogCreateDto.Title) + } + } + public class BlogCreateDto{ + // Title等为自动属性 + public string Title{get;set;}=null!; + public string Author{get;set;}=null!; + public string Content{get;set;}=null!; + } +``` + + + + + +```cs + public class BlogContriller : Controller{ + [HttpPost] + public IActionResult Create([FromBody] Products productCreateDto){ + return Content(blogCreateDto.Title) + } + } + public class Products{ + public string Name{get;set;}=null!; + public string Price{get;set;}=null!; + public string Stock{get;set;}=null!; + } + ``` + + + + + +```cs + public class BlogContriller : Controller{ + [HttpPost] + public IActionResult Create_2([FromBody] Students studentCreateDto){ + return Content(blogCreateDto.Title) + } + } + public class Students{ + public string Name{get;set;}=null!; + public string Price{get;set;}=null!; + public string Stock{get;set;}=null!; + } + ``` + + + +# 专项练习3-基础能力 + + ```cs + public IActionResult WW(){ + // 生成随机数 + Random random=new Random(); + // 范围[0,100] + int num=random.Next(0,101); + return View(num); + } +``` + +```cs + public IActionResult HH(){ + // 1.生成随机数 + Random random=new Random(); + // 2.范围(0,100] + int num=random.Next(1,101); + return View(num); + } +``` + +```CS +public IActionResult Bb(){ + // 生成随机数 + Random random=new Random(); + // 2.定一个列表 类型为int + var num=new List(); + for (int i = 0; i <10; i++) + { // 2.范围[5,80] 生成的随机数添加到列表 + num.Add(random.Next(5,81)); + } + return View(num); + } +``` + +```cs + public IActionResult LL(){ + // 1.100个中文字符 + string str="晨曦初露暮色渐浓霞光满天霜露凝寒雾霾笼罩虹霓交辉霖雨绵绵霁月清风飓风呼啸飚速疾驰飔风轻拂飕然有声飗然飘动飖风轻扬飙风狂舞山川壮丽河流蜿蜒湖泊静谧海洋浩瀚岛屿星罗沙漠无垠草原辽阔森林茂密花草繁盛树木参天枝叶扶疏果实累累稻谷飘香菜蔬鲜美饭香四溢人生百态喜怒哀乐悲欢离合爱恨情仇亲情温暖友情真挚爱情甜蜜思念绵长回忆悠远希望满怀梦想成真奋斗不息拼搏不止勇往直前文化艺术书香四溢笔墨纸砚诗书画印琴棋书画歌舞升平乐声悠扬舞姿曼妙戏剧人生电影世界文学经典艺术瑰宝科学技术创新发展信息时代网络世界计算机技术人工智能机器人虚拟现实航天科技生物工程医学进步健康生活日常生活衣食住行柴米油盐锅碗瓢盆桌椅板凳床铺被褥灯火通明炊烟袅袅市井百态人间烟火"; + // 2.生成随机数 + Random random=new Random(); + // 3.随机选一个字符 + char n1=str[random. Next(str.Length)]; + ViewBag.n1 =n1; + return View(); + } + ``` + +```cs +public IActionResult JJJ(){ + string str="晨曦初露暮色渐浓霞光满天霜露凝寒雾霾笼罩虹霓交辉霖雨绵绵霁月清风飓风呼啸飚速疾驰飔风轻拂飕然有声飗然飘动飖风轻扬飙风狂舞山川壮丽河流蜿蜒湖泊静谧海洋浩瀚岛屿星罗沙漠无垠草原辽阔森林茂密花草繁盛树木参天枝叶扶疏果实累累稻谷飘香菜蔬鲜美饭香四溢人生百态喜怒哀乐悲欢离合爱恨情仇亲情温暖友情真挚爱情甜蜜思念绵长回忆悠远希望满怀梦想成真奋斗不息拼搏不止勇往直前文化艺术书香四溢笔墨纸砚诗书画印琴棋书画歌舞升平乐声悠扬舞姿曼妙戏剧人生电影世界文学经典艺术瑰宝科学技术创新发展信息时代网络世界计算机技术人工智能机器人虚拟现实航天科技后得从多起可说年你于她他时以们对地那着要下我可经到后国于生一是了子上"; + Random random=new Random(); + // 随机数范围 + int Length=random.Next(5,51); + //空字符串 + string arr=""; + for (int i = 0; i + +```cs + public IActionResult Sa(){ + string na = "赵,钱,孙,李,周,吴,郑,王,冯,陈,褚,卫,蒋,沈,韩,杨,朱,秦,尤,许,何,吕,施,张,孔,曹,严,华,金,魏,陶,姜,戚,谢,邹,喻,柏,水,窦,章,云,苏,潘,葛,奚,范,彭,郎,鲁,韦,昌,马,苗,凤,花,方,俞,任,袁,柳,酆,鲍,史,唐,费,廉,岑,薛,雷,贺,倪,汤,滕,殷,罗,毕,郝,邬,安,常,乐,于,时,傅,皮,卞,齐,康,伍,余,元,卜,顾,孟,平,黄,和,穆,萧,尹,姚,邵,湛,汪,祁"; } + string str="晨曦初露暮色渐浓霞光满天霜露凝寒雾霾笼罩虹霓交辉霖雨绵绵霁月清风飓风呼啸飚速疾驰飔风轻拂飕然有声飗然飘动飖风轻扬飙风狂舞山川壮丽河流蜿蜒湖泊静谧海洋浩瀚岛屿星罗沙漠无垠草原辽阔森林茂密花草繁盛树木参天枝叶扶疏果实累累稻谷飘香菜蔬鲜美饭香四溢说生国年着就那和要下以后得你她它们从多可了对于也她们经于很他时以要对你而起我可以们来到年和下说到你那她以时他着我为就地大可于中国生一是了上们到你他我在可以为子于国地大就那和要时来下经对后得从多起可说年你于她他时以们对地那着要下我可经到后国于生一是了子上"; + // 2.生成随机数 + Random random=new Random(); + //随机取得一个姓 + string[] names = na.Split(',');//将字符串分割成子字符串数组 + char n=na[random.Next(names.Length)]; + //随机获得1到2个字符 + int cou=random.Next(1,3); + string arr=""; + for (int i = 0; i < cou; i++) + { + arr+=str[random.Next(str.Length)]; + } + string name=n+arr; + ViewBag.name=name; + return View(); + ``` +# 专项练习4-控制器返回值 + + +```cs + // 1.渲染简单数据类型到视图 + public string Create(){ + return "ahhhhh"; + } +``` + +```cs + public IActionResult Index2(){ + var student=new HH.Models.Student{ + Name="李xl", + Age=19, + Sex="女" + }; + return View(student); + } +``` + +```cs + public IActionResult Index4(){ + var list=new List{ + "wjr", + "18", + "女" + }; + return View(list); + } +``` +# 专项练习5-视图及其模板引擎 + +>代码展示: +```cs +public string Index() +{ + return "我是简单数据类型"; +} +``` + + + + +```cs +public IActionResult Index2() +{ + var list = new BlogCreateDto + { + Title="好想上厕所", + Author="王富贵", + Content="有些人错过之后就哭了" + }; +// 有传参就一定有返回值 + return View(list); +} + +```cs +public IActionResult Index3() +{ + var list = new List + { + new Blogbbt + { + Title="秋思", + Author="哈哈", + Content="哈哈哈哈哈", + }, + new Blogbbt + { + Title="春困", + Author="嘿嘿", + Content="嘿嘿嘿嘿", + }, + new Blogbbt + { + Title="霸王茶姬", + Author="兼职", + Content="我是一点都不想干了!!!!气鼠!!!!", + }, + }; + return View(list); +} +``` +```cs + + + + + + + + @foreach(var item in @Model) + { + + + + + + + } +
标题作者内容操作
@item.Title@item.Author@item.Content + + +
+``` + +```cs +public IActionResult Index4() +{ + var blog = new Blog + { + Title = "今天周四", + Author = "张三", + Content = "今天怎么这么快就过完了,啊啊啊啊啊,不想上早八", + BlogCreateDto = new List + { + new BlogCreateDto + { + Title="明天天星期五", + Author = "张三", + Content = "上午上完课就可以放假,开心" + }, + new BlogCreateDto + { + Title="明天星期五", + Author = "张三", + Content = "上午上完课就可以放假,开心" + }, + } + }; + return View(blog); +} +public IActionResult Index3() +{ + var list = new Blog + { + Title="秋思", + Author="哈哈", + Content="哈哈哈哈哈", + Blogbbt = new List + { + new Blogbbt + { + Title="春困", + Author="嘿嘿", + Content="嘿嘿嘿嘿", + }, + new Blogbbt + { + Title="霸王茶姬", + Author="兼职", + Content="我是一点都不想干了!!!!气鼠!!!!", + } + }, + }; + return View(list); +} +``` +```cs +

@Model.Title

+

@Model.Author

+

@Model.Content

+ +

BlogCreateDto:

+ + + + + + + + @foreach(var item in @Model.BlogCreateDto) + { + + + + + + + } +
标题作者内容操作
@item.Title@item.Author@item.Content + + +
+ +# 11.29 列表添加作业 +>代码步骤 +``` + +```CS +//创建一个静态类 +public static class HH{ + // public static List Friend {get;set;}=new List (); + + //声明一个静态属性List为类型 + public static List Friend {get;set;} + // 构建静态函数(只执行一次) + static HH(){ + //初始化静态属性 + Friendt=new List(); + for (int i = 0; i < 6; i++) + { + var s=new Friend{ + Id=i+1, + Name="李兴露", + Age=11, + Sex="未知", + }; + Friend.Add(s); + } + } +} +``` + +``` +@* 添加 *@ +@model Baby2.Models.Friend; +
+
+
+
+ +
+``` + + + **a.使用post请求** + [HttpPost] + public IActionResult Index2(Friend input){ + var maxId=Two.Student.Select(t=>t.Id).Max(); + input.Id=maxId+1; + HH.Friend.Add(input); + return RedirectToAction("index_1"); + } + ``` + 获取最大的Id + 在该基础上加1 + 将内容添加到表单中 + 内容添加好后重新定向到主页面 + ``` \ No newline at end of file -- Gitee