asp.net core identity学习1

2023-10-31

ASP.NET Identity 学习

  1. 创建一个Asp.net core mvc项目
    添加Nuget包:

    • Microsoft.EntityFrameworkCore.SqlServer 3.1.3
    • Microsoft.EntityFrameworkCore.Tools 3.1.3
    • Microsoft.AspNetCore.Identity.EntityFrameworkCore 3.1.3
  2. 更改HomeController类的内容

public IActionResult Index()
      {
         return View(new Dictionary<string, object> { ["Placeholder"]="Placeholder"});
      }

更改HomeController的Index视图内容:

@{
    ViewData["Title"] = "首页";
}
@model Dictionary<string, object>
<div class="bg-primary m-1 p-1 text-white"><h4>用户详情</h4></div>
<table class="table table-sm table-bordered m-1 p-1">
    @foreach (var kvp in Model)
    {
        <tr><th>@kvp.Key</th><td>@kvp.Value</td></tr>
    }
</table>
  1. 在Models文件夹下创建AppUser类,继承自IdentityUser
using Microsoft.AspNetCore.Identity;

namespace IdentityDemo.Models
{
    public class AppUser:IdentityUser
    {
    }
}

  1. 在Model文件夹下创建DbContext:AppIdentityDbContext
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace IdentityDemo.Models
{
    public class AppIdentityDbContext:IdentityDbContext<AppUser>
    {
        public AppIdentityDbContext(DbContextOptions<AppIdentityDbContext> options):base(options)
        {

        }
    }
}

  1. 配置数据库连接
    在appsettings.json中配置数据库连接
{
  "Data": {
    "IdentityDemo": {
      "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=IdentityDemo;Trusted_Connection=True;MultipleActiveResultSets=true"
    },
    "Logging": {
      "LogLevel": {
        "Default": "Information",
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    },
    "AllowedHosts": "*"
  }

  1. 在Startup.cs中读取配置文件中的数据库链接地址
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using IdentityDemo.Models;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace IdentityDemo
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            //配置数据库连接
            services.AddDbContext<AppIdentityDbContext>(
                options => options.UseSqlServer(Configuration["Data:IdentityDemo:ConnectionString"])
                );

            //配置Identity
            services.AddIdentity<AppUser, IdentityRole>()
                .AddEntityFrameworkStores<AppIdentityDbContext>()
                .AddDefaultTokenProviders();

            services.AddControllersWithViews();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseStatusCodePages();
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

  1. 添加数据库迁移
add-migrations InitialCreate  
update database
  1. 列举用户账户
using IdentityDemo.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;

namespace IdentityDemo.Controllers
{
    public class AdminController : Controller
    {
        private UserManager<AppUser> userManager;
        //构造函数注入,获取UserManager
        public AdminController(UserManager<AppUser> usrMgr)
        {
            userManager = usrMgr;
        }
        public IActionResult Index()
        {
            return View(userManager.Users);
        }
    }
}

视图修改 Index.cshtml:

@model IEnumerable<AppUser>

@{
    ViewData["Title"] = "Index";
}
<div class="bg-primary m-1 p-1 text-white"><h4>用户账号</h4></div>
<table class="table table-sm table-bordered">
    <tr><th>ID</th><th>用户名</th><th>邮箱</th></tr>
    @if (Model.Count() == 0)
    {
        <tr><td colspan="3" class="text-center">没有</td></tr>
    }
    else
    {
        foreach (AppUser user in Model)
        {
            <tr>
                <td>@user.Id</td>
                <td>@user.UserName</td>
                <td>@user.Email</td>
            </tr>
        }
    }
</table>
<a class="btn btn-primary" asp-action="Create">创建</a>

  1. 创建用户
    1). 创建用户视图模型 UserViewModels
public class CreateModel
    {
        [Required]
        [Display(Name = "用户名")]
        public string Name { get; set; }

        [Required]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "电子邮箱")]
        public string Email { get; set; }
        
        [Required]
        [DataType(DataType.Password)]
        [Display(Name="密码")]
        public string Password { get; set; }
    }
  1. 添加Action方法
    在AdminController中添加Create方法:
/// <summary>
/// 创建用户
/// </summary>
/// <returns></returns>
public ViewResult Create() => View();

[HttpPost]
public async Task<IActionResult> Create(CreateModel model)
{
   if (ModelState.IsValid)
   {
         AppUser user = new AppUser
         {
            UserName = model.Name,
            Email = model.Email
         };
         ///创建用户
         IdentityResult result = await userManager.CreateAsync(user, model.Password);
         if (result.Succeeded) //成功则返回列表页
         {
            return RedirectToAction("Index");
         }
         else
         {
            foreach (IdentityError error in result.Errors)
            {
               ModelState.AddModelError("", error.Description);
            }
         }
   }
   return View(model);
}
  1. 创建用户测试
  1. ctrl+F5运行程序,访问 “https://localhost:44382/Admin/Create” ,填写用户名Joe,邮箱:joe@example.com,密码:Secret123$。点击"创建",创建用户成功。
  2. 再次输入相同的用户名,提示“User name ‘Joe’ is already taken.”
  3. 更改第一步中的用户名为Alice,密码为secret,创建用户时会提示密码强度不够的信息。因为Asp.net内置密码验证规则。
  1. 更改密码验证规则
    在Startup类的ConfigureServices方法中,配置密码验证规则:
public void ConfigureServices(IServiceCollection services)
{
   //配置数据库连接
   services.AddDbContext<AppIdentityDbContext>(
         options => options.UseSqlServer(Configuration["Data:IdentityDemo:ConnectionString"])
         );

   //配置Identity的密码验证规则
   //规则为至少六位
   services.AddIdentity<AppUser, IdentityRole>(opts =>
   {
         opts.Password.RequiredLength = 6;
         opts.Password.RequireNonAlphanumeric = false;
         opts.Password.RequireLowercase = false;
         opts.Password.RequireUppercase = false;
         opts.Password.RequireDigit = false;
   }).AddEntityFrameworkStores<AppIdentityDbContext>()
         .AddDefaultTokenProviders();

   services.AddControllersWithViews();
}
  1. 自定义密码验证器类
    自定义密码验证规则除了上面一种方法,还可以自定义类,实现IPasswordValidator接口或者继承自UserValidator,接口定义:
using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Identity {
public interface IPasswordValidator<TUser> where TUser : class {
   Task<IdentityResult> ValidateAsync(UserManager<TUser> manager,
      TUser user, string password);
   }
}

CustomPasswordValidator类:

using Microsoft.AspNetCore.Identity;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using IdentityDemo.Models;

namespace IdentityDemo.Infrastructure
{
    /// <summary>
    /// 自定义用户密码验证规则
    /// </summary>
    public class CustomPasswordValidator : UserValidator<AppUser>
    {
        public override async Task<IdentityResult> ValidateAsync(UserManager<AppUser> manager, AppUser user)
        {
            IdentityResult result = await base.ValidateAsync(manager, user);
            List<IdentityError> errors = result.Succeeded ? new List<IdentityError>() : result.Errors.ToList();
            if (!user.Email.ToLower().EndsWith("@example.com"))
            {
                errors.Add(new IdentityError
                {
                    Code = "EmailIdentityError",
                    Description = "只允许example.com的邮箱地址注册账号"
                });
            }
            return errors.Count == 0 ? IdentityResult.Success : IdentityResult.Failed(errors.ToArray());
        }
    }
}

在Startup类的ConfigureServices中注入服务:

public void ConfigureServices(IServiceCollection services)
{
   //自定义密码验证服务
   services.AddTransient<IPasswordValidator<AppUser>, CustomPasswordValidator>();
   
   //配置数据库连接
   services.AddDbContext<AppIdentityDbContext>(
         options => options.UseSqlServer(Configuration["Data:IdentityDemo:ConnectionString"])
         );

   //配置Identity
   services.AddIdentity<AppUser, IdentityRole>(opts =>
   {
         opts.Password.RequiredLength = 6;
         opts.Password.RequireNonAlphanumeric = false;
         opts.Password.RequireLowercase = false;
         opts.Password.RequireUppercase = false;
         opts.Password.RequireDigit = false;
   }).AddEntityFrameworkStores<AppIdentityDbContext>()
         .AddDefaultTokenProviders();

   services.AddControllersWithViews();
}
  1. 用户名验证码规则
    用户名验证规则有两种:通过配置和自定义验证类。

1). 通过配置,在Startup类的ConfigureServices方法中配置

//配置Identity
services.AddIdentity<AppUser, IdentityRole>(opts =>
{
      opts.User.RequireUniqueEmail = true;
      opts.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz";
      opts.Password.RequiredLength = 6;
      opts.Password.RequireNonAlphanumeric = false;
      opts.Password.RequireLowercase = false;
      opts.Password.RequireUppercase = false;
      opts.Password.RequireDigit = false;
}).AddEntityFrameworkStores<AppIdentityDbContext>()
      .AddDefaultTokenProviders();

2). 自定义验证规则类,实现IUserValidator接口

using Microsoft.AspNetCore.Identity;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using IdentityDemo.Models;

namespace IdentityDemo.Infrastructure
{
    /// <summary>
    /// 自定义用户名或者邮箱验证规则
    /// </summary>
    public class CustomUserValidator : UserValidator<AppUser>
    {
        public override async Task<IdentityResult> ValidateAsync(UserManager<AppUser> manager, AppUser user)
        {
            IdentityResult result = await base.ValidateAsync(manager, user);
            List<IdentityError> errors = result.Succeeded ? new List<IdentityError>() : result.Errors.ToList();
            if (!user.Email.ToLower().EndsWith("@example.com"))
            {
                errors.Add(new IdentityError
                {
                    Code = "EmailIdentityError",
                    Description = "只允许example.com的邮箱地址注册账号"
                });
            }
            return errors.Count == 0 ? IdentityResult.Success : IdentityResult.Failed(errors.ToArray());
        }
    }
}

在Startup类中,配置依赖注入:

services.AddTransient<IUserValidator<AppUser>,CustomUserValidator>();
  1. 编辑、删除用户功能
    1). 在用户列表页,添加编辑、删除按钮:Index.cshtml:
@model IEnumerable<AppUser>

@{
    ViewData["Title"] = "Index";
}
<div class="bg-primary m-1 p-1 text-white"><h4>用户账号</h4></div>
<table class="table table-sm table-bordered">
    <tr><th>ID</th><th>用户名</th><th>邮箱</th><th>操作</th></tr>
    @if (Model.Count() == 0)
    {
        <tr><td colspan="3" class="text-center">没有</td></tr>
    }
    else
    {
        foreach (AppUser user in Model)
        {
            <tr>
                <td>@user.Id</td>
                <td>@user.UserName</td>
                <td>@user.Email</td>
                <td>
                    <form asp-action="Delete" asp-route-id="@user.Id" method="post">
                        <a class="btn btn-sm btn-primary" asp-action="Edit"
                           asp-route-id="@user.Id">编辑</a>
                        <button type="submit"
                                class="btn btn-sm btn-danger">
                            删除
                        </button>
                    </form>
                </td>
            </tr>
        }
    }
</table>
<a class="btn btn-primary" asp-action="Create">创建</a>

2). 删除用户

//删除用户
[HttpPost]
public async Task<IActionResult> Delete(string id)
{
   AppUser user = await userManager.FindByIdAsync(id);
   if (user != null)
   {
         IdentityResult result = await userManager.DeleteAsync(user);
         if (result.Succeeded)
         {
            return RedirectToAction("Index");
         }
         else
         {
            AddErrorsFromResult(result);
         }
   }
   else
   {
         ModelState.AddModelError("", "User Not Found");
   }
   return View("Index", userManager.Users);
}

private void AddErrorsFromResult(IdentityResult result)
{
   foreach (IdentityError error in result.Errors)
   {
         ModelState.AddModelError("", error.Description);
   }
}

3). 编辑用户

/// <summary>
/// 编辑用户
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<IActionResult> Edit(string id)
{
   AppUser user = await userManager.FindByIdAsync(id);
   if (user != null)
   {
         return View(user);
   }
   else
   {
         return RedirectToAction("Index");
   }
}

/// <summary>
/// 编辑用户
/// </summary>
/// <param name="id"></param>
/// <param name="email"></param>
/// <param name="password"></param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> Edit(string id, string email,
string password)
{
   AppUser user = await userManager.FindByIdAsync(id);
   if (user != null)
   {
         user.Email = email;
         //用户邮箱校验
         IdentityResult validEmail = await userValidator.ValidateAsync(userManager, user);
         if (!validEmail.Succeeded)
         {
            AddErrorsFromResult(validEmail);
         }
         IdentityResult validPass = null;
         if (!string.IsNullOrEmpty(password))
         {
            //用户密码校验
            validPass = await passwordValidator.ValidateAsync(userManager, user, password);
            if (validPass.Succeeded)
            {
               //用户密码加密
               user.PasswordHash = passwordHasher.HashPassword(user, password);
            }
            else
            {
               AddErrorsFromResult(validPass);
            }
         }
         //1. 只修改了邮箱,2. 修改了邮箱和密码
         if ((validEmail.Succeeded && validPass == null) || (validEmail.Succeeded && password != string.Empty && validPass.Succeeded))
         {
            IdentityResult result = await userManager.UpdateAsync(user); //更新用户信息s
            if (result.Succeeded)
            {
               return RedirectToAction("Index");
            }
            else
            {
               AddErrorsFromResult(result);
            }
         }
   }
   else
   {
         ModelState.AddModelError("", "User Not Found");
   }
   return View(user);
}

编辑用户的视图:
Edit.cshtml:

@model AppUser

@{
    ViewData["Title"] = "修改用户信息";
}

<div class="bg-primary m-1 p-1"><h4>修改用户信息</h4></div>
<div asp-validation-summary="All" class="text-danger"></div>
<form asp-action="Edit" method="post">
    <div class="form-group">
        <label asp-for="Id"></label>
        <input asp-for="Id" class="form-control" disabled />
    </div>
    <div class="form-group">
        <label asp-for="Email"></label>
        <input asp-for="Email" class="form-control" />
    </div>
    <div class="form-group">
        <label for="password">Password</label>
        <input name="password" class="form-control" />
    </div>
    <button type="submit" class="btn btn-primary">保存</button>
    <a asp-action="Index" class="btn btn-secondary">取消</a>
</form>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

asp.net core identity学习1 的相关文章

  • asp.net web.config 模拟与应用程序池身份

    如果我在 web config 中模拟用户 但应用程序在使用另一个身份的应用程序池下运行 那么当您访问服务器上的资源 例如文件 时将使用哪个身份 另一个问题 您可以在与应用程序其余部分不同的身份下运行页面吗 当您访问服务器上的资源时 用户将
  • 标识列与主键[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我们如何决定使用身份列还是主键 这两个概念并不相互排斥 所有组合都是可能的 身份列也是主
  • 如何使用 ASP.NET 身份模型进行 WCF 服务授权和身份验证

    我正在开发一个 ASP NET 4 5 Web 应用程序 它使用 ASP NET 身份模型进行身份验证和授权 该 Web 应用程序还托管 WCF 服务并同时使用它 还有另一个基于 WPF 的应用程序将使用托管的 WCF 服务 以及作为客户端
  • LINQ to Entities - 如何在调用 SaveChanges() 后最好地获取 IDENTITY 值

    该网站上提出了许多与执行插入后检索 IDENTITY 相关的问题 我们获取身份的方法是在调用 SaveChanges 之后立即进行以下调用 context MyClass OrderByDescending c gt c Id FirstO
  • 导入 Microsoft Access 数据库时保留自动编号列的值

    我尝试以编程方式将多个表从 Microsoft SQL Server 导入到 Microsoft Access 每个 SQL Server 表都有一个标识列 相应的 Access 表也有一个自动编号列 现在我想生成 SQL 脚本以将数据从
  • Java 是否保证 Object.getClass() == Object.getClass()?

    我在这里确实指的是身份平等 例如 以下内容是否总是打印true System out println foo getClass fum getClass 是的 类标记是唯一的 对于任何给定的类加载器来说 IE 您将始终获得对同一物理对象的引
  • Informix:如何获取最后插入的记录的ID

    在 INSERT 语句之后获取 SERIAL 列的值的最有效方法是什么 IE 我正在寻找一种复制方法 IDENTITY or SCOPE IDENTITYMS SQL 的功能 最后一个 SERIAL 插入的值存储在 SQLCA 记录中 作为
  • 创建项目时无需身份验证的 ASP.NET 身份集成

    我对身份有疑问 而且我对此不太熟悉 不久前 我开始了一个新项目 最初并不打算附加任何身份验证 然而 随着项目的发展 我们发现我们应该实施它 由于最初并不是这样设置的 所以我创建了一个登录表单 我找到了这个问题的答案并实现了它 如何在 ASP
  • 如何在 SQL Server 中增加(或保留)IDENTITY 值而不插入表

    有没有办法保留或跳过或增加标识列的值 我有两个表以一对一的关系连接 第一个具有 IDENTITY PK 列 第二个具有 int PK 不是 IDENTITY 我以前先插入 获取ID 然后插入第二个 而且工作正常 现在我需要在第二个表中插入值
  • cookie“.AspNetCore.Identity.Application”已设置“SameSite=None”,并且还必须设置“Secure”

    我点击了这些链接 准备您的身份服务器 https www thinktecture com en identity samesite prepare your identityserver 如何删除 Samesies cookie http
  • IdentityServer4中的签名凭证是什么?

    我们正在使用 NET Core Web 应用程序实现 Identity Server 4 我浏览了身份服务器文档 配置身份服务器 使用 DI 时有以下行 AddTemporarySigningCredential 我试图理解这个签名凭证是什
  • 合并 IdentityDbContext 和 DbContext ASP.NET MVC

    我希望我的 ASP NET MVC 项目中只有一个 DbContext 我应该如何将默认的 IdentityDbContext 与我自己的代码首先 DbContext 合并 他们使用相同的数据库 public class Applicati
  • ASP.NET Core 2.2 创建身份用户

    ASP Net Core 全新 必须使用 Identity 创建一个 asp net core 2 2 项目 并让用户播种 我找不到任何有关如何准确执行此操作的文档 我能够找到创建身份角色的代码 无论如何编译 还没有达到可以运行它的位置 p
  • 即使 IP 更改或浏览器数据已清除,我如何识别网站上的唯一用户?

    我正在开发一个视频流网站 我想计算每个视频的独特观看次数 我参考了互联网上的一些网站 甚至询问了其他一些程序员 他们说要么使用 cookie 要么使用会话 要么使用 IP 地址 但这些事情会随着时间的推移而改变 另外 如果可能的话 我们可以
  • WSO2 身份服务器外部 LDAP 因 OID 身份人员不存在而抛出 OBJECT_CLASS

    我正在使用 Identity Server 4 1 0 并且还在 Apache Directory Studio 中运行 ApacheDS 所以我现在想要的是将我的 IS 连接到外部 LDAP IS 与 ldap 的连接良好 只是由于缺少属
  • 将 sybase 中现有的 int 列更改为标识

    赛贝斯12 5 我有一个正在生产中的现有表 需要更改它的 PK int 列 以便自动填充 创建表时 理想情况下将 ID 列创建为标识 此 ID 列是多个其他表中的外键 因此不能删除该表并重新开始 问题是 我无法将 PK 设置为 IDENTI
  • 相当于 Core 3.0 中的验证实体

    它似乎 受保护覆盖 DbEntityValidationResult ValidateEntity 在最新版本 2 2 0 和 3 0 中 从包 Microsoft AspNetCore Identity EntityFrameworkCo
  • SQL Server 2012 列标识增量在第 7 个条目上从 6 跳到 1000+ [重复]

    这个问题在这里已经有答案了 我有一个奇怪的场景 其中 SQL Server 2012 数据库中的 auto Identity int 列没有正确递增 假设我有一个使用 int auto 标识作为主键的表 它偶尔会跳过增量 例如 1 2 3
  • 如何将 MVC 5 IdentityModels.cs 移动到单独的程序集中

    我想知道是否有人遇到了我在尝试搬家时遇到的问题ApplicationUser进入模型项目 所有其他模型都驻留在其中 包括与用户表相关的模型 我的测试 MVC 5 解决方案由一个 Web 项目和两个类库组成 一个用于数据访问层 DAL 另一个
  • 对 Python 的 id() 感到困惑[重复]

    这个问题在这里已经有答案了 我可以理解以下定义 每个对象都有一个身份 类型和值 对象的身份 一旦创建就永远不会改变 你可能会认为它是 对象在内存中的地址 这is操作员比较身份 两个物体 这id 函数返回一个代表其值的整数 身份 我假设上面的

随机推荐

  • MySQL入門_テーブル作成

    create database case a show databases drop database case a create database case db use case db drop table if exists user
  • JS之返回字符串最后出现的位置lastIndexOf

    作用 lastIndexOf 方法可返回一个指定的字符串值最后出现的位置 在一个字符串中的指定位置从后向前搜索 语法 stringObject lastIndexOf searchvalue fromindex 参数1 必需 规定需检索的字
  • [ 人力资源面试篇 ] HR 面试题分析详解大集合,看完直怼面试官(一)

    博主介绍 博主介绍 大家好 我是 PowerShell 很高兴认识大家 主攻领域 渗透领域 数据通信 通讯安全 web安全 面试分析 点赞 评论 收藏 养成习惯 一键三连 欢迎关注 一起学习 一起讨论 一起进步 文末有彩蛋 作者水平有限 欢
  • Python面试题

    1 一行代码实现1 100之和 利用sum 函数求和 2 如何在一个函数内部修改全局变量 函数内部global声明 修改全局变量 3 列出5个python标准库 os 提供了不少与操作系统相关联的函数 sys 通常用于命令行参数 re 正则
  • 社区发现:论文中模块度Q的计算

    2 Extending the definition of modularity to directed graphs with overlapping communities 参考文献 1 刘传建 复杂网络中的社团结构划分及分析应用 D
  • glfwPollEvents()程序崩溃

    系列文章目录 文章目录 系列文章目录 前言 一 程序崩溃的地方找不到 二 解决步骤 1 vs2019中打开 诊断工具 窗口 2 在vs2019中打开 并行堆栈 窗口 总结 例子 源码下载 前言 如果使用GLFW 没有这句glfwPollEv
  • dz 2级域名

    例如 http www cheungfei com 开启了二级域名 http bbs cheungfei com 开启之后发现不能同步登陆 刚开始以为要在Ucenter中添加应用 后来发现问题还没有解决 到DISCUZ官网看看别人的帖子 才
  • 多线程、定时器----基础认识篇1

    1 多线程一般通过使用thread的子类或者往thread构造方法中传入runnable对象实现 也就是常说的 继承 thread类 和 实现runnable接口 注 实现runnable接口可以实现线程 原理是 在thread的run方法
  • Instagram Shop如何开通?如何销售?最全面攻略

    借助 Instagram 商店 品牌可以策划一系列可购物的商品 这些商品可通过其 Instagram 个人资料直接访问 这使得在应用程序上销售更容易 也被潜在客户发现 一 什么是Instagram Shop Instagram 商店为商家提
  • 2021 年山东省职业院校技能大赛中职组“网络安全” 赛项

    2021 年山东省职业院校技能大赛 中职组 网络安全 赛项 竞赛题库 网络安全赛项专家组 2021 年 11 月 赛题说明 一 竞赛时间安排与分值权重 二 竞赛拓扑图 模块编号 模块名称 竞赛时间 小时 权值 A 基础设施设置与安全加固 3
  • php 操作 MySQL 中的Blob类型

    我们需要保存一个文件或者一张图片或者其他二进制或多媒体文件时 经常选择使用 类型 一 基本使用 Blob就是一种Mysql的数据类型 它是一个二进制大型对象 可以作为大量数据的容器 其实更准确地说Blob是一系列数据类型 MySQL的四种B
  • 深入源码分析Spring为什么不支持构造方法的循环依赖

    我们知道当通过构造方法的方式注入属性时 是不支持循环依赖这种场景的 本文主要通过分析源码看看为什么构造方法不能支持循环依赖 当然 如果读者还不了解循环依赖的问题 建议先结合源码搞清楚 可以先看看这篇文章 深入源码分析Spring如何解决循环
  • 高通LK代码devinfo分区 read_device_info

    有一个devinfo分区专门用来保存一些信息 在devinfo分区没烧录过的情况下 默认Charger screen enabled false 没有关机充电动画 fastboot oem device info lk调用读这些信息 当然不
  • 宝塔搭建网站教程php,怎么利用宝塔面板搭建网站详细教程

    利用宝塔面板搭建网站是当前主流形式 宝塔面板操作简单 可视化操作 是新手和老司机搭建网站的首选 今天我的主题网就给小白们分享下怎么利用宝塔搭建自己的网站 如果你还没有安装宝塔可以参考 宝塔面板安装小白教程 来进行安装 1 宝塔面板添加站点步
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】经典屏保

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 经典屏保 知识点循环迭代编程基础 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 DVD机在视频输出时 为了保护电视显像管 在待机状态会显示 屏保动画 如下图所示 DV
  • JS的一些数据类型的转换

    bytes 转 16进制字符串 function bytesToHex bytes for var hex i 0 i lt bytes length i hex push bytes i gt gt gt 4 toString 16 he
  • 入行网络工程师一年的心得体会

    本人与2019年毕业与天津某高校的网络工程专业 大学期间就考了一个网络工程师的软考中级职称 过了一个没啥用的英语四级 也有想过考一个华为或者思科的IE证书 但是价格对于一个学生党来说 确实代价太大了 报一个培训班1w5 考试费用零零散散加起
  • RabbitMQ入门教程(安装,管理插件,Publisher/Consumer/交换机/路由/队列/绑定关系,及如何保证100%投递等)

    RabbitMQ入门教程 安装 管理插件 Publisher Consumer 交换机 路由 队列 绑定关系 及如何保证100 投递等 1 RabbitMQ简介及AMQP协议 开源的消息代理和队列服务器 基于AMQP Advanced Me
  • IDEA 无法找到jdk,只能找到jre解决方式(亲测有效)

    在第一次使用IDEA的时候 发现需要自己去配置SDK的路径 但发现死活找不到jdk 只能找到jre 搜索资料发现可能是只装了jre 没有装jdk 在配置SDK前先要配置Java的核心 JDK 其实JDK就是SDK 只不过SDK的配置依赖着J
  • asp.net core identity学习1

    ASP NET Identity 学习 创建一个Asp net core mvc项目 添加Nuget包 Microsoft EntityFrameworkCore SqlServer 3 1 3 Microsoft EntityFramew