介绍 在开始这篇文章之前,请阅读我的前一篇文章: 开始使用ASP。NET Core 2.0身份和角色管理 在上一篇文章中,我们详细讨论了如何使用ASP。NET Core Identity在MVC应用程序中用于创建用户角色和根据用户角色显示菜单。 在本文中,我们将详细了解如何在用户登录后显示基于角色的动态菜单。为此,我们将创建一个菜单主表,并插入一些记录来显示菜单,并根据登录用户的角色将URL链接到菜单。 下面,我们来看看如何: 创建默认的admin和manager用户创建MenuMaster表,并为admin和manager角色插入一些示例记录,以显示菜单,根据登录用户动态将未经身份验证的用户重定向到登录页面显示菜单 背景 先决条件 确保已在计算机上安装了所有先决条件。如果没有,那么下载并安装它们,一个一个。 首先,从这个链接sql Server 2014或以上下载并安装Visual Studio 2017 使用的代码 步骤1 -创建一个数据库 这是我们上一篇文章的延续;正如我们已经告诉你的,我们将为两个ASP使用一个公共数据库。NET标识表和我们自己的新表。 在上一篇文章中,我们已经解释了如何创建用户角色,在这里,对于基于角色的菜单管理,我们需要在ASP之间创建一个关系表。NET Roles表和我们的菜单表。 让我们详细看看如何创建与ASP有关系的新菜单表。NET身份AspNetRoles表。 在这里,我们可以看到MenuMaster使用的字段: 首先,我们将创建一个数据库,并在appsettings中设置连接字符串。json文件DefaultConnection与我们的新数据库连接。我们将使用这个数据库的ASP。NET Core标识表创建。 创建数据库 运行以下脚本创建数据库MenuMaster表和示例菜单插入行脚本。 隐藏,收缩,复制Code

  1. USE MASTER
  2. GO
  3.  
  4. -- 1) Check for the Database Exists. If the database exists, then drop and create new DB
  5. IF EXISTS (SELECT [name] FROM sys.databases WHERE [name] = 'AttendanceDB' )
  6. DROP DATABASE AttendanceDB
  7. GO
  8.  
  9. CREATE DATABASE AttendanceDB
  10. GO
  11.  
  12. USE AttendanceDB
  13. GO
  14.  
  15. IF EXISTS ( SELECT [name] FROM sys.tables WHERE [name] = 'MenuMaster' )
  16. DROP TABLE MenuMaster
  17. GO
  18.  
  19. CREATE TABLE MenuMaster
  20. (
  21. MenuIdentity int identity(1,1),
  22. MenuID VARCHAR(30) NOT NULL,
  23. MenuName VARCHAR(30) NOT NULL,
  24. Parent_MenuID VARCHAR(30) NOT NULL,
  25. User_Roll [varchar](256) NOT NULL,
  26. MenuFileName VARCHAR(100) NOT NULL,
  27. MenuURL VARCHAR(500) NOT NULL,
  28. USE_YN Char(1) DEFAULT 'Y',
  29. CreatedDate datetime
  30. CONSTRAINT [PK_MenuMaster] PRIMARY KEY CLUSTERED
  31. (
  32. [MenuIdentity] ASC ,
  33. [MenuID] ASC,
  34. [MenuName] ASC
  35. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, _
  36. ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  37. ) ON [PRIMARY]
  38.  
  39. select * from MenuMaster
  40. -- Insert Admin User Details
  41. Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)
  42. Values('AUSER','ADMIN Dashboard','*','ADMIN','INDEX','ADMINC','Y',getDate())
  43. Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)
  44. Values('AAbout','About Admin','*','ADMIN','INDEX','ADMINAC','Y',getDate())
  45. Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)
  46. Values('LStock','Live Stock','AUSER','ADMIN','INDEX','StockC','Y',getDate())
  47. Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)
  48. Values('Profile','User Details','AUSER','ADMIN','INDEX','MemberC','Y',getDate())
  49. Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)
  50. Values('MUSER','Manager Dashboard','*','ADMIN','INDEX','ManagerC','Y',getDate())
  51. Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)
  52. Values('MAbout','About Manager','*','ADMIN','INDEX','ManagerAC','Y',getDate())
  53. Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)
  54. Values('Accounts','Account Details','MUSER','ADMIN','INDEX','AccountC','Y',getDate())
  55. Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,_
  56. MenuURL,USE_YN,CreatedDate)
  57. Values('Inventory','Inventory Details','MUSER','ADMIN','INDEX','InventoryC','Y',getDate())
  58.  
  59. -- Insert Manager User Details
  60. Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)
  61. Values('MUSER','Manager Dashboard','*','Manager','INDEX','ManagerC','Y',getDate())
  62. Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)
  63. Values('MAbout','About Manager','*','Manager','INDEX','ManagerAC','Y',getDate())
  64. Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)
  65. Values('Accounts','Account Details','MUSER','Manager','INDEX','AccountC','Y',getDate())
  66. Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)
  67. Values('Inventory','Inventory Details','MUSER','Manager','INDEX','InventoryC','Y',getDate())
  68.  
  69. select * from MenuMaster
  70.  
  71. select * from AspnetUserRoles

在这里,我们可以看到我们在菜单主表中使用的格式,该格式用于根据用户角色插入显示菜单的记录。 MenuID = 'AUSER'(我们将提供唯一的菜单ID)。MenuName = 'ADMIN Dashboard'(我们将给出菜单显示文本),parent_menuid = '* '(如果这是主菜单,那么我们将在这里给出“*”,否则我们将给出以前记录的MenuID,以显示这条记录作为子菜单显示)。User_Roll = 'ADMIN'(在这里,我们将给出用户角色,如果需要为基于ADMIN、Manager、accounting等多个角色的用户使用相同的菜单,那么我们将为不同的用户角色插入相同的菜单细节。在我们的示例中,我们为管理员和管理员用户都添加了与“管理仪表板”相同的菜单细节,因为他们都可以查看菜单和页面。MenuFileName = 'INDEX'(这里,我们给出了当单击菜单时显示的视图名称)。MenuURL = 'ADMINC'(在这里,我们给出了当单击菜单时显示的控制器名称)。USE_YN = 'Y'(这是一个可选字段,我们可以使用它来显示菜单或不显示)。CreatedDate = getDate()(对于输入创建日期,这也是可选的)。 在这个演示应用程序中,当用户点击菜单时,我们已经有了所有需要的控制器和视图。 步骤2 -创建您的ASP。网络核心 安装Visual Studio 2017之后,单击“开始”,然后单击“程序”并选择Visual Studio 2017——单击Visual Studio 2017。单击New,然后选择Project,选择Web,然后选择ASP。NET Core Web应用程序。输入项目名称并单击。 选择Web应用程序(模型-视图-控制器)并单击更改身份验证。 选择单个用户帐户并单击ok创建项目。 更新appsettings.json 在appsettings。json文件,我们可以找到DefaultConnection连接字符串。这里,在连接字符串中,更改SQL服务器名称、UID和PWD,以便在一个数据库中创建和存储所有用户详细信息。 隐藏,复制Code

  1. "ConnectionStrings": {
  2. "DefaultConnection": "Server= YOURSERVERNAME;Database=InventoryDB;
  3. user id= YOURSQLUSERID;password=YOURSQLPASSWORD;Trusted_Connection=True;
  4. MultipleActiveResultSets=true"
  5. },

步骤3 -在Startup.cs文件中添加身份服务 默认情况下,在您的ASP中。在asp.net Core应用程序中,身份识别服务将被添加到start .cs file /ConfigureServices方法中。您也可以另外添加密码强度,而用户注册,也可以设置默认的登录页/登出页,也AccessDeniedPath使用以下代码: 隐藏,收缩,复制Code

  1. services.AddIdentity<ApplicationUser, IdentityRole>()
  2. .AddEntityFrameworkStores<ApplicationDbContext>()
  3. .AddDefaultTokenProviders();
  4.  
  5. //Password Strength Setting
  6. services.Configure<IdentityOptions>(options =>
  7. {
  8. // Password settings
  9. options.Password.RequireDigit = true;
  10. options.Password.RequiredLength = 8;
  11. options.Password.RequireNonAlphanumeric = false;
  12. options.Password.RequireUppercase = true;
  13. options.Password.RequireLowercase = false;
  14. options.Password.RequiredUniqueChars = 6;
  15.  
  16. // Lockout settings
  17. options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
  18. options.Lockout.MaxFailedAccessAttempts = 10;
  19. options.Lockout.AllowedForNewUsers = true;
  20.  
  21. // User settings
  22. options.User.RequireUniqueEmail = true;
  23. });
  24.  
  25. //Setting the Account Login page
  26. services.ConfigureApplicationCookie(options =>
  27. {
  28. // Cookie settings
  29. options.Cookie.HttpOnly = true;
  30. options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
  31. options.LoginPath = "/Account/Login"; // If the LoginPath is not set here,
  32. // ASP.NET Core will default to /Account/Login
  33. options.LogoutPath = "/Account/Logout"; // If the LogoutPath is not set here,
  34. // ASP.NET Core will default to /Account/Logout
  35. options.AccessDeniedPath = "/Account/AccessDenied"; // If the AccessDeniedPath
  36. // is not set here, ASP.NET Core will default to /Account/AccessDenied
  37. options.SlidingExpiration = true;
  38. });

步骤4:注册和创建用户 现在我们的ASP。NET Core web应用程序已经为用户在我们的网站注册做好了准备,用户注册后也可以登录到我们的系统。在接下来的步骤中,我们将通过将role添加到user来进行授权。构建并运行应用程序以注册第一个默认管理用户。 在这里,我们将注册两个用户,一个为Admin,另一个为Manager。我们将使用这些用户来添加角色。我们将创建两个用户,syedshanumcain@gmail.com和afraz@gmail.com。注意:您可以创建并在启动代码中更改用户详细信息,以便向用户添加角色。 刷新数据库 当刷新数据库时,可以看到所有标识表都已创建。 步骤5:创建角色并为角色分配用户 我们使用下面的方法创建一个新角色,即“Admin”和“Manager”。我们将分配最近注册的用户作为“管理”和“经理”到我们的网站。打开Startup.cs文件并将此方法添加到你的Startup.cs文件中。 隐藏,收缩,复制Code

  1. private async Task CreateUserRoles(IServiceProvider serviceProvider)
  2. {
  3. var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
  4. var UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
  5.  
  6. IdentityResult roleResult;
  7. //Adding Addmin Role
  8. var roleCheck = await RoleManager.RoleExistsAsync("Admin");
  9. if (!roleCheck)
  10. {
  11. //create the roles and seed them to the database
  12. roleResult = await RoleManager.CreateAsync(new IdentityRole("Admin"));
  13. }
  14.  
  15. roleCheck = await RoleManager.RoleExistsAsync("Manager");
  16. if (!roleCheck)
  17. {
  18. //create the roles and seed them to the database
  19. roleResult = await RoleManager.CreateAsync(new IdentityRole("Manager"));
  20. }
  21.  
  22. //Assign Admin role to the main User here we have given our
  23. //newly loregistered login id for Admin management
  24. ApplicationUser user = await UserManager.FindByEmailAsync("syedshanumcain@gmail.com");
  25. var User = new ApplicationUser();
  26. await UserManager.AddToRoleAsync(user, "Admin");
  27.  
  28. user = await UserManager.FindByEmailAsync("Afraz@gmail.com");
  29. await UserManager.AddToRoleAsync(user, "Manager");
  30. }

在start .cs文件中,我们可以找到Configure方法。从这个配置方法调用我们的CreateUserRoles方法。当我们构建和运行我们的应用程序时,我们可以看到新的角色,如“Admin”和“Manager”将在ASPNetRole表中创建。 步骤6:创建Admin/Manager页面并设置授权 现在我们有了一个管理/管理用户的ASP。下一步,让我们创建控制器和视图来显示基于用户登录。在前面的示例中,我们已经看到了如何为每个页面中的角色设置授权,使用它,我们将创建所有需要的控制器和视图。在附呈的样例演示应用程序中,你可以找到我们已经创建的所有控制器和视图,并根据你的需要创建自己的。 第7步:使用依赖注入来显示菜单 创建模型类 首先,我们将在模型文件夹中创建一个类。我们将类名命名为MenuMaster,与数据库中的表名相同。在MenuMaster类中,我们需要创建和我们的表格字段一样的属性,如下图所示: 隐藏,复制Code

  1. public class MenuMaster
  2. {
  3. [Key]
  4. public int MenuIdentity { get; set; }
  5. public string MenuID { get; set; }
  6. public string MenuName { get; set; }
  7. public string Parent_MenuID { get; set; }
  8. public string User_Roll { get; set; }
  9. public string MenuFileName { get; set; }
  10. public string MenuURL { get; set; }
  11. public string USE_YN { get; set; }
  12. public DateTime CreatedDate { get; set; }
  13. }

创建接口类 现在,是时候使用名为GetMenuMaster()和GetMenuMaster(字符串UserRole)的方法创建一个接口了,我们将在服务中实现这个接口,以便从表中获取所有菜单细节,还可以使用另一个方法根据用户角色获取菜单。为了创建接口,在模型文件夹中添加一个新类,并将其命名为“IMenuMasterService”。 我们将把类更改为接口,因为我们要创建一个接口来在服务中实现它。 隐藏,复制Code

  1. public interface IMenuMasterService
  2. {
  3. IEnumerable<MenuMaster> GetMenuMaster();
  4. IEnumerable<MenuMaster> GetMenuMaster(String UserRole);
  5. }

创建服务 现在,让我们添加一个新的类服务文件夹,并将这个类命名为“MenuMasterService”。在这个类中,我们将实现接口IMenuMasterService。我们知道,如果实现了接口,那么应该在类中声明接口方法。在此服务中,我们使用接口方法,并返回带有菜单详细信息的列表,还按用户角色返回菜单详细信息。我们将直接将其注入到视图页面中。 隐藏,复制Code

  1. public class MenuMasterService:IMenuMasterService
  2. {
  3. private readonly ApplicationDbContext _dbContext;
  4.  
  5. public MenuMasterService(ApplicationDbContext dbContext)
  6. {
  7. _dbContext = dbContext;
  8. }
  9.  
  10. public IEnumerable<MenuMaster> GetMenuMaster()
  11. {
  12. return _dbContext.MenuMaster.AsEnumerable();
  13.  
  14. }
  15.  
  16. public IEnumerable<MenuMaster> GetMenuMaster(string UserRole)
  17. {
  18. var result = _dbContext.MenuMaster.Where(m => m.User_Roll == UserRole).ToList();
  19. return result;
  20. }
  21. }

注册服务 我们需要将创建的服务注册到容器。从项目中打开Startup.cs,将服务添加到容器中。 在Startup.cs类中,找到名为ConfigureServices的方法,并添加您的服务“MenuMasterService”,如下所示: 隐藏,复制Code

  1. services.AddTransient<MenuMasterService, MenuMasterService>();

将服务注入到_Layout中。cshtml页面 现在,它更简单更容易,因为我们可以直接在视图页面中注入服务,并将所有结果绑定到我们的视图页面。为了在视图中注入服务,这里我们将使用现有的_Layout。cshtml页面。因为我们将在网站的顶部显示菜单并在所有页面中使用,所以这里我们使用了_Layout。cshtml页面将菜单结果绑定为基于用户登录的菜单。 在这里,我们首先检查用户是否通过我们的网站身份验证,然后如果用户已经登录,那么我们将获得登录用户的角色详细信息,并根据用户角色绑定菜单。在这里,我们绑定了2个层次的菜单作为主菜单和子菜单。在我们的表结果中,我们检查所有的Parent_MenuID= " * ",因为我们将以Parent_MenuID为" * "来显示主菜单,在接下来的内部循环中,我们将显示适合于主菜单的子菜单。 隐藏,收缩,复制Code

  1. <divclass="navbar-collapse collapse">
  2. <ulclass="nav navbar-nav">
  3. <li><aasp-area=""asp-controller="Home"asp-action="Index">Home</a></li>
  4. @if (User.Identity.IsAuthenticated)
  5. {
  6. var UserRoles = "";
  7. if (@User.IsInRole("Admin"))
  8. {
  9. UserRoles = "Admin";
  10. }
  11. else
  12. {
  13. UserRoles = "Manager";
  14. }
  15.  
  16. @if (menus.GetMenuMaster(@UserRoles).Any())
  17. {
  18. @if (menus.GetMenuMaster(@UserRoles).Any())
  19. {
  20. @foreach (var menuNames in menus.GetMenuMaster(@UserRoles).Where
  21. (n => n.Parent_MenuID == "*"))
  22. {
  23. <li>
  24. <aasp-area=""asp-controller=@menuNames.MenuURL asp-action=@menuNames.MenuFileName>@menuNames.MenuName</a>
  25. <ulclass="sub-menu">
  26. @foreach (var subMenu in menus.GetMenuMaster(@UserRoles).Where
  27. (n => n.Parent_MenuID == @menuNames.MenuID))
  28. {
  29. <li>
  30. <aasp-area=""asp-controller=@subMenu.MenuURL asp-action=@subMenu.MenuFileName>@subMenu.MenuName</a>
  31. </li>
  32. }
  33. </ul>
  34. </li>
  35. }
  36. }
  37. }
  38. }
  39. </ul>

的兴趣点 首先,在SQL服务器中创建一个示例AttendanceDB数据库,并运行脚本创建MenuMaster表并插入示例记录。appsettings。json文件,更改DefaultConnection连接字符串与您的SQL服务器连接。在Startup.cs文件中,添加我们在本文中讨论的所有代码。这是一个简单的演示应用程序,我们有固定的管理员和经理的角色,你也可以改变根据你的要求和CSS设计菜单和子菜单移动兼容性不好,您可以添加您自己的引导程序设计来实现你的菜单风格。希望你们都喜欢这篇文章,很快我们将看到另一篇文章中有更多的活生生的例子。 历史 ASPNETCORERoleManagement - 2018-04-03 本文转载于:http://www.diyabc.com/frontweb/news19730.html

ASP。使用依赖注入的asp.net Core 2.0用户角色库动态菜单管理的更多相关文章

  1. ASP.NET 依赖注入。

    ASP.NET 依赖注入. http://www.it165.net/pro/html/201407/17685.html 我在网上看到了这篇文章,这边文章主要说的方法就是通过读取配置文件来解决依赖注 ...

  2. ASP .NET依赖注入理解

    ASP .NET依赖注入理解[转]:  https://www.cnblogs.com/wzk153/p/10892444.html

  3. Asp.NetCore依赖注入和管道方式的异常处理及日志记录

    前言     在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平:本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog ...

  4. C#反射与特性(六):设计一个仿ASP.NETCore依赖注入Web

    目录 1,编写依赖注入框架 1.1 路由索引 1.2 依赖实例化 1.3 实例化类型.依赖注入.调用方法 2,编写控制器和参数类型 2.1 编写类型 2.2 实现控制器 3,实现低配山寨 ASP.NE ...

  5. 几个步骤轻松搞定ASP.NET 依赖注入。

    http://www.it165.net/pro/html/201407/17685.html 我在网上看到了这篇文章,这边文章主要说的方法就是通过读取配置文件来解决依赖注入的问题.但是每次新建一个依 ...

  6. VS2019 .Net Core 3.0 Web 项目启用动态编译

    VS2019 中 .Net Core 3.0 项目默认没有启用动态编译, 这导致按F5调试的时候,修改了 HTML 代码,在浏览器上刷新没有效果. 启用动态编译方法如下: 1. 安装 Microsof ...

  7. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  8. 学习ASP.NET Core,你必须了解无处不在的“依赖注入”

    ASP.NET Core的核心是通过一个Server和若干注册的Middleware构成的管道,不论是管道自身的构建,还是Server和Middleware自身的实现,以及构建在这个管道的应用,都需要 ...

  9. ASP.NET Core 中文文档 第三章 原理(10)依赖注入

    原文:Dependency Injection 作者:Steve Smith 翻译:刘浩杨 校对:许登洋(Seay).高嵩 ASP.NET Core 的底层设计支持和使用依赖注入.ASP.NET Co ...

随机推荐

  1. 高可用服务之Keepalived邮件通知配置

    上一篇博客我们了解了keepalived的架构以及安装.VIP的配置和高可用相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13634755.html: ...

  2. 【Flutter 实战】1.20版本更新及新增组件

    老孟导读:Flutter 1.20 更新了 Slider.RangeSlider.日期选择器组件.时间选择器组件的样式,新增了交换组件:InteractiveViewer,下面详细介绍其用法. 滑块 ...

  3. TKE基于弹性网卡直连Pod的网络负载均衡

    前言 Kubernetes在集群接入层设计并提供了两种原生资源Service和Ingress,分别负责四层和七层的网络接入层配置. 传统的做法是创建Ingress或LoadBalancer类型的Ser ...

  4. 调整JavaScript抽象的迭代方案

    原文链接:Adapting JavaScript Abstractions Over Time 译者:小溪里 校对者:郭华翔.苗冬青 即使还没有读过我的文章<在处理网络数据的 JavaScrip ...

  5. centos7新增用户并授权root权限、非root用户启动tomcat程序

    一.centos7新增用户并授权root权限 cat /etc/redhat-release查看centos版本号 1.禁用root账户登录 vim /etc/ssh/sshd_config 找到这一 ...

  6. 2017年PHP程序员未来路在何方(转)

    PHP 从诞生到现在已经有20多年历史,从Web时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷, Node.js . GO . Python 不断地在挑战 PHP 的地位.这些技术的推 ...

  7. Git进阶之路:配置git同时推送github和gitee仓库

    1. 进入工程根目录打开.git文件夹(需要显示隐藏文件夹) 2. 打开.git文件夹下的config文件进行编辑添加github和gitee仓库地址 3. 推送验证 github提交记录 gitee ...

  8. 基于Ant Design Vue封装一个表单控件

    开源代码 https://github.com/naturefwvue/nf-vue3-ant 有缺点本来是写在最后的,但是博文写的似乎有点太长了,估计大家没时间往下看,于是就把有缺点写在前面了,不喜 ...

  9. Shell编程(4)

    shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式 func() { #指定函数名 co ...

  10. threading之线程的开始,暂停和退出

    目录 背景 实现代码 背景 利用多线程实现一个开关功能,需要对产生的线程进行管理(例如:开启,暂停,关闭等操作). 实现代码 任务脚本: #!/usr/bin/python3 # _*_ coding ...