设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间01 现在时间01 缓存数据 当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

查看: 3081|回复: 4

ASP.NET MVC使用Identity增删改查用户

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:225
  • 打卡月天数:1
  • 打卡总奖励:3302
  • 最近打卡:2025-12-11 03:17:56
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
424
主题
391
精华
0
金钱
4551
积分
872
注册时间
2023-1-5
最后登录
2025-12-11

发表于 2023-2-12 10:13:33 | 显示全部楼层 |阅读模式

源码在这里:https://github.com/darrenji/UseIdentityCRUDUserInMVC,本地下载

在VS2013中创建一个MVC项目,用默认的"无身份验证"作为身份验证机制。

通过控制台下载Bootstrap。

  1. Install-Package -version 3.0.3 bootstrap
复制代码

下载成功后,在解决方案下的Content和Scripts多了该版本的css和js文件。

把创建项目默认HomeController中的所有Action以及/Views/Home下的所有视图删除。

热热身

先来做一个简单练习。

在HomeController中的Index方法中,把一个字典传递给视图。

  1. public class HomeController : Controller
  2. {
  3. public ActionResult Index()
  4. {
  5. Dictionary<string, object> data = new Dictionary<string, object>();
  6. data.Add("placeholder", "placeholder");
  7. return View(data);
  8. }
  9. }
复制代码

_Layout.cshtml设置如下:

  1. <head>
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  3. <meta charset="utf-8" />
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>ASP.NET Identity实战</title>
  6. <link href="~/Content/bootstrap.min.css" rel="external nofollow" rel="stylesheet" />
  7. <link href="~/Content/bootstrap-theme.min.css" rel="external nofollow" rel="stylesheet" />
  8. <style>
  9. .container {padding-top:10px;}
  10. .validation-summary-errors{color:red;}
  11. </style>
  12. </head>
  13. <body>
  14. <div class="container">
  15. @RenderBody()
  16. </div>
  17. @Scripts.Render("~/bundles/jquery")
  18. @Scripts.Render("~/bundles/bootstrap")
  19. @RenderSection("scripts", required: false)
  20. </body>
复制代码

Home/Index.cshtml视图中:

  1. @{
  2. ViewBag.Title = "Index";
  3. Layout = "~/Views/Shared/_Layout.cshtml";
  4. }
  5. <div class="panel panel-primary">
  6. <div class="panel-heading">用户明细</div>
  7. <table class="table table-striped">
  8. @foreach (string key in Model.Keys)
  9. {
  10. <tr>
  11. <th>@key</th>
  12. <td>@Model[key]</td>
  13. </tr>
  14. }
  15. </table>
  16. </div>
复制代码

111411k4lwzfw8zlf5fwfi.png

前期准备

分别安装如下组件。

  1. Install-Package Microsoft.AspNet.Identity.EntityFramework –Version 2.0.0Install-Package Microsoft.AspNet.Identity.OWIN -Version 2.0.0Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0
复制代码

配置Web.config如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!--
  3. 有关如何配置 ASP.NET 应用程序的详细信息,请访问
  4. http://go.microsoft.com/fwlink/?LinkId=301880
  5. -->
  6. <configuration>
  7. <configSections>
  8. <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  9. <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  10. </configSections>
  11. <connectionStrings>
  12. <add name="IdentityDb" providerName="System.Data.SqlClient" connectionString="Data Source=(localdb)\v11.0;Initial Catalog=IdentityDb;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;MultipleActiveResultSets=True"/>
  13. </connectionStrings>
  14. <appSettings>
  15. <add key="webpages:Version" value="3.0.0.0" />
  16. <add key="webpages:Enabled" value="false" />
  17. <add key="ClientValidationEnabled" value="true" />
  18. <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  19. <add key="owin:AppStartup" value="WebApplication4.IdentityConfig" />
  20. </appSettings>
  21. <system.web>
  22. <compilation debug="true" targetFramework="4.5" />
  23. <httpRuntime targetFramework="4.5" />
  24. </system.web>
  25. <runtime>
  26. <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  27. <dependentAssembly>
  28. <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
  29. <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  30. </dependentAssembly>
  31. <dependentAssembly>
  32. <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
  33. <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
  34. </dependentAssembly>
  35. <dependentAssembly>
  36. <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
  37. <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
  38. </dependentAssembly>
  39. <dependentAssembly>
  40. <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
  41. <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  42. </dependentAssembly>
  43. <dependentAssembly>
  44. <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
  45. <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
  46. </dependentAssembly>
  47. </assemblyBinding>
  48. </runtime>
  49. <entityFramework>
  50. <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  51. <providers>
  52. <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  53. </providers>
  54. </entityFramework>
  55. </configuration>
复制代码

以上,

  • 增加了connectionStrings节点,将自动创建localdb数据库
  • 在appSettings节点中增加了一个key为owin:AppStartup项,这是确保OWIN运行正常的全局配置

在Models文件夹下创建如下类。

  1. public class AppUser : IdentityUser
  2. {
  3. }
复制代码

在解决方案下创建Infrastructure文件夹。

在Infrastructure文件夹下创建一个上下文类,需要实现IdentityDbContext<>接口。

  1. public class AppIdentityDbContext : IdentityDbContext<AppUser>
  2. {
  3. public AppIdentityDbContext()
  4. : base("IdentityDb")
  5. {
  6. }
  7. static AppIdentityDbContext()
  8. {
  9. //使用EF Code First第一次创建的时候调用
  10. Database.SetInitializer<AppIdentityDbContext>(new IdentityDbInit());
  11. }
  12. public static AppIdentityDbContext Create()
  13. {
  14. return new AppIdentityDbContext();
  15. }
  16. }
  17. //初始化
  18. public class IdentityDbInit : DropCreateDatabaseIfModelChanges<AppIdentityDbContext>
  19. {
  20. protected override void Seed(AppIdentityDbContext context)
  21. {
  22. PerformInitialSetup(context);
  23. base.Seed(context);
  24. }
  25. //初始化工作
  26. public void PerformInitialSetup(AppIdentityDbContext context)
  27. { }
  28. }
复制代码

在Infrastructure文件夹下创建一个管理用户的类,需要继承UserManager类。

还记得,先前在appSettings节点中配置了一个如下方式:

  1. <add key="owin:AppStartup" value="WebApplication4.IdentityConfig" />
复制代码

OWIN需要一个全局启动文件,默认会到项目的顶级命名空间下找IdentityConfig这个类。

那就在App_Start中创建IdentityConfig这个类,这个类在WebApplication4这个命名空间下。

  1. namespace WebApplication4
  2. {
  3. public class IdentityConfig
  4. {
  5. public void Configuration(IAppBuilder app)
  6. {
  7. app.CreatePerOwinContext<AppIdentityDbContext>(AppIdentityDbContext.Create);
  8. app.CreatePerOwinContext<AppUserManager>(AppUserManager.Create);
  9. app.UseCookieAuthentication(new CookieAuthenticationOptions {
  10. AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
  11. LoginPath = new Microsoft.Owin.PathString("/Account/Login")
  12. });
  13. }
  14. }
  15. }
复制代码

显示用户

创建AdminController,现在可以向视图传递所有的用户了,编写如下:

  1. public class AdminController : Controller
  2. {
  3. public ActionResult Index()
  4. {
  5. return View(UserManager.Users);
  6. }
  7. private AppUserManager UserManager
  8. {
  9. get
  10. {
  11. return HttpContext.GetOwinContext().GetUserManager<AppUserManager>();
  12. }
  13. }
  14. }
复制代码

再创建Admin/Index.cshtml类型为IEnumerable的强类型视图。

  1. @model IEnumerable<WebApplication4.Models.AppUser>
  2. @{
  3. ViewBag.Title = "Index";
  4. Layout = "~/Views/Shared/_Layout.cshtml";
  5. }
  6. <div class="panel panel-primary">
  7. <div class="panel-heading">
  8. 所有用户账户
  9. </div>
  10. <table class="table table-striped">
  11. <tr><th>ID</th><th>Name</th><th>Email</th><th></th></tr>
  12. @if (Model.Count() == 0)
  13. {
  14. <tr><td colspan="4" class="text-center">还没有创建用户</td></tr>
  15. }
  16. else
  17. {
  18. foreach (WebApplication4.Models.AppUser user in Model)
  19. {
  20. <tr>
  21. <td>@user.Id</td>
  22. <td>@user.UserName</td>
  23. <td>@user.Email</td>
  24. <td>
  25. @using (Html.BeginForm("Delete", "Admin",
  26. new { id = user.Id }))
  27. {
  28. @Html.ActionLink("编辑", "Edit", new { id = user.Id },
  29. new { @class = "btn btn-primary btn-xs" })
  30. <button class="btn btn-danger btn-xs"
  31. type="submit">
  32. 删除
  33. </button>
  34. }
  35. </td>
  36. </tr>
  37. }
  38. }
  39. </table>
  40. </div>
  41. @Html.ActionLink("创建用户", "Create", null, new { @class = "btn btn-primary" })
复制代码

111411aahn6zny54tv7rc6.png

创建用户

在Models文件夹下创建一个视图模型。

  1. namespace WebApplication4.Models
  2. {
  3. public class CreateModel
  4. {
  5. public string Id { get; set; }
  6. [Required]
  7. public string Name { get; set; }
  8. [Required]
  9. public string Email { get; set; }
  10. [Required]
  11. public string Password { get; set; }
  12. }
  13. }
复制代码

在AdminController中添加创建用户相关的方法。

  1. public class AdminController : Controller
  2. {
  3. public ActionResult Index()
  4. {
  5. return View(UserManager.Users);
  6. }
  7. //创建显示
  8. public ActionResult Create()
  9. {
  10. return View();
  11. }
  12. [HttpPost]
  13. public async Task<ActionResult> Create(CreateModel model)
  14. {
  15. if(ModelState.IsValid)
  16. {
  17. var user = new AppUser{UserName = model.Name, Email = model.Email};
  18. IdentityResult result = await UserManager.CreateAsync(user, model.Password);
  19. if(result.Succeeded)
  20. {
  21. return RedirectToAction("Index");
  22. }else{
  23. AddErrorsFromResult(result);
  24. }
  25. }
  26. return View(model);
  27. }
  28. //创建接收
  29. private void AddErrorsFromResult(IdentityResult result)
  30. {
  31. foreach(var error in result.Errors)
  32. {
  33. ModelState.AddModelError("", error);
  34. }
  35. }
  36. private AppUserManager UserManager
  37. {
  38. get
  39. {
  40. return HttpContext.GetOwinContext().GetUserManager<AppUserManager>();
  41. }
  42. }
  43. }
复制代码

在Admin/Create.cshtml视图页中:

  1. @model WebApplication4.Models.CreateModel
  2. @{
  3. ViewBag.Title = "Create";
  4. Layout = "~/Views/Shared/_Layout.cshtml";
  5. }
  6. <h2>Create</h2>
  7. @using (Html.BeginForm())
  8. {
  9. @Html.AntiForgeryToken()
  10. <div class="form-horizontal">
  11. <h4>创建用户</h4>
  12. <hr />
  13. @Html.ValidationSummary(true)
  14. <div class="form-group">
  15. @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
  16. <div class="col-md-10">
  17. @Html.EditorFor(model => model.Name)
  18. @Html.ValidationMessageFor(model => model.Name)
  19. </div>
  20. </div>
  21. <div class="form-group">
  22. @Html.LabelFor(model => model.Email, new { @class = "control-label col-md-2" })
  23. <div class="col-md-10">
  24. @Html.EditorFor(model => model.Email)
  25. @Html.ValidationMessageFor(model => model.Email)
  26. </div>
  27. </div>
  28. <div class="form-group">
  29. @Html.LabelFor(model => model.Password, new { @class = "control-label col-md-2" })
  30. <div class="col-md-10">
  31. @Html.EditorFor(model => model.Password)
  32. @Html.ValidationMessageFor(model => model.Password)
  33. </div>
  34. </div>
  35. <div class="form-group">
  36. <div class="col-md-offset-2 col-md-10">
  37. <input type="submit" value="创建用户" class="btn btn-default" />
  38. </div>
  39. </div>
  40. </div>
  41. }
  42. <div>
  43. @Html.ActionLink("返回", "Index")
  44. </div>
复制代码

111411nql99jffljm1zjmw.png

点击"创建"按钮,创建成功返回显示用户页面。

111412p22oxuc1aldtdkzu.png

oh, my god,只是配置了一下就有数据了? 数据在哪呢?

点击左上角的"服务器资源管理器",右键"IdentityDb",点击"刷新"。

111412pp4mbn1nmttgslb1.png

再打开AspNetUsers表,刚创建的用户赫然在列。

111412ccn66t94dtkptx84.png

好像还有点欠缺,用户输入密码的时候,总应该有些限制吧。

能想到的,ASP.NET Identity都为我们准备好了。有一个PasswordValidator类就是干这个的。

在Infrastructure文件夹中创建一个PasswordValidator类的继承子类。

  1. namespace WebApplication4.Infrastructure
  2. {
  3. public class CustomPasswordValidator : PasswordValidator
  4. {
  5. public override async Task<IdentityResult> ValidateAsync(string pass)
  6. {
  7. IdentityResult result = await base.ValidateAsync(pass);
  8. if (pass.Contains("12345"))
  9. {
  10. var errors = result.Errors.ToList();
  11. errors.Add("密码中包含太多连续数字");
  12. result = new IdentityResult(errors);
  13. }
  14. return result;
  15. }
  16. }
  17. }
复制代码

然后需要把这个规则告诉UserManager。

  1. namespace WebApplication4.Infrastructure
  2. {
  3. public class AppUserManager : UserManager<AppUser>
  4. {
  5. public AppUserManager(IUserStore<AppUser> store) : base(store) { }
  6. public static AppUserManager Create(IdentityFactoryOptions<AppUserManager> options, IOwinContext context)
  7. {
  8. //identity ef上下文
  9. AppIdentityDbContext db = context.Get<AppIdentityDbContext>();
  10. //与identity ef相关的UserStore
  11. IUserStore<AppUser> us = new UserStore<AppUser>(db);
  12. AppUserManager manager = new AppUserManager(us);
  13. //密码相关
  14. manager.PasswordValidator = new CustomPasswordValidator {
  15. RequiredLength = 6,
  16. RequireNonLetterOrDigit = false,
  17. RequireDigit = false,
  18. RequireLowercase = true,
  19. RequireUppercase = true
  20. };
  21. return manager;
  22. }
  23. }
  24. }
复制代码

再次运行程序,创建用户页面,尝试输入不通过的密码。

111412hohj3fjwvtvwfr8f.png

不过,关于密码的规则,似乎可以在View Model的验证层面就可以解决掉。

编辑和删除用户

在AdminController中增加编辑和删除的部分。

  1. public class AdminController : Controller
  2. {
  3. public ActionResult Index()
  4. {
  5. return View(UserManager.Users);
  6. }
  7. //创建显示
  8. public ActionResult Create()
  9. {
  10. return View();
  11. }
  12. //创建接收
  13. [HttpPost]
  14. public async Task<ActionResult> Create(CreateModel model)
  15. {
  16. if(ModelState.IsValid)
  17. {
  18. var user = new AppUser{UserName = model.Name, Email = model.Email};
  19. IdentityResult result = await UserManager.CreateAsync(user, model.Password);
  20. if(result.Succeeded)
  21. {
  22. return RedirectToAction("Index");
  23. }else{
  24. AddErrorsFromResult(result);
  25. }
  26. }
  27. return View(model);
  28. }
  29. //编辑显示
  30. public async Task<ActionResult> Edit(string id)
  31. {
  32. AppUser user = await UserManager.FindByIdAsync(id);
  33. if(User != null)
  34. {
  35. CreateModel createModel = new CreateModel();
  36. createModel.Id = user.Id;
  37. createModel.Email = user.Email;
  38. createModel.Name = user.UserName;
  39. createModel.Password = user.PasswordHash;
  40. return View(createModel);
  41. }
  42. else
  43. {
  44. return RedirectToAction("Index");
  45. }
  46. }
  47. //接收编辑
  48. [HttpPost]
  49. public async Task<ActionResult> Edit(CreateModel createModel)
  50. {
  51. if(ModelState.IsValid)
  52. {
  53. AppUser user = await UserManager.FindByIdAsync(createModel.Id);
  54. if (user != null)
  55. {
  56. //关于邮箱
  57. user.Email = createModel.Email;
  58. IdentityResult validEmail = await UserManager.UserValidator.ValidateAsync(user);
  59. if (!validEmail.Succeeded)
  60. {
  61. AddErrorsFromResult(validEmail);
  62. }
  63. user.UserName = createModel.Name;
  64. //关于密码
  65. IdentityResult validPass = null;
  66. if (createModel.Password != string.Empty)
  67. {
  68. validPass = await UserManager.PasswordValidator.ValidateAsync(createModel.Password);
  69. if (validPass.Succeeded)
  70. {
  71. user.PasswordHash = UserManager.PasswordHasher.HashPassword(createModel.Password);
  72. }
  73. else
  74. {
  75. AddErrorsFromResult(validPass);
  76. }
  77. }
  78. user.Email = createModel.Email;
  79. //验证结果
  80. if ((validEmail.Succeeded && validPass == null) || (validEmail.Succeeded
  81. && createModel.Password != string.Empty && validPass.Succeeded))
  82. {
  83. IdentityResult result = await UserManager.UpdateAsync(user);
  84. if (result.Succeeded)
  85. {
  86. return RedirectToAction("Index");
  87. }
  88. else
  89. {
  90. AddErrorsFromResult(result);
  91. }
  92. }
  93. else
  94. {
  95. ModelState.AddModelError("", "无此用户");
  96. }
  97. }
  98. return View(createModel);
  99. }
  100. else
  101. {
  102. return View(createModel);
  103. }
  104. }
  105. //删除
  106. [HttpPost]
  107. public async Task<ActionResult> Delete(string id)
  108. {
  109. AppUser user = await UserManager.FindByIdAsync(id);
  110. if(user != null)
  111. {
  112. IdentityResult result = await UserManager.DeleteAsync(user);
  113. if(result.Succeeded)
  114. {
  115. return RedirectToAction("Index");
  116. }
  117. else
  118. {
  119. return View("Error", result.Errors);
  120. }
  121. }
  122. else
  123. {
  124. return View("Error", new string[] { "没有此用户" });
  125. }
  126. }
  127. private void AddErrorsFromResult(IdentityResult result)
  128. {
  129. foreach(var error in result.Errors)
  130. {
  131. ModelState.AddModelError("", error);
  132. }
  133. }
  134. private AppUserManager UserManager
  135. {
  136. get
  137. {
  138. return HttpContext.GetOwinContext().GetUserManager<AppUserManager>();
  139. }
  140. }
  141. }
复制代码

Admin/Edit.cshtml视图。

  1. @model WebApplication4.Models.CreateModel
  2. @{
  3. ViewBag.Title = "Edit";
  4. Layout = "~/Views/Shared/_Layout.cshtml";
  5. }
  6. <h2>Edit</h2>
  7. @using (Html.BeginForm())
  8. {
  9. @Html.AntiForgeryToken()
  10. <div class="form-horizontal">
  11. <hr />
  12. @Html.ValidationSummary(true)
  13. @Html.HiddenFor(model => model.Id)
  14. <div class="form-group">
  15. @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
  16. <div class="col-md-10">
  17. @Html.EditorFor(model => model.Name)
  18. @Html.ValidationMessageFor(model => model.Name)
  19. </div>
  20. </div>
  21. <div class="form-group">
  22. @Html.LabelFor(model => model.Email, new { @class = "control-label col-md-2" })
  23. <div class="col-md-10">
  24. @Html.EditorFor(model => model.Email)
  25. @Html.ValidationMessageFor(model => model.Email)
  26. </div>
  27. </div>
  28. <div class="form-group">
  29. @Html.LabelFor(model => model.Password, new { @class = "control-label col-md-2" })
  30. <div class="col-md-10">
  31. @Html.EditorFor(model => model.Password)
  32. @Html.ValidationMessageFor(model => model.Password)
  33. </div>
  34. </div>
  35. <div class="form-group">
  36. <div class="col-md-offset-2 col-md-10">
  37. <input type="submit" value="保存" class="btn btn-default" />
  38. </div>
  39. </div>
  40. </div>
  41. }
  42. <div>
  43. @Html.ActionLink("返回", "Index")
  44. </div>
复制代码

另外,如果删除失败,跳转到Shared/Error.cshtml视图页。

  1. @model IEnumerable<string>
  2. @{ ViewBag.Title = "Error";}
  3. <div class="alert alert-danger">
  4. @switch (Model.Count())
  5. {
  6. case 0:
  7. @: Something went wrong. Please try again
  8. break;
  9. case 1:
  10. @Model.First();
  11. break;
  12. default:
  13. @: 发现如下错误:
  14. <ul>
  15. @foreach (string error in Model)
  16. {
  17. <li>@error</li>
  18. }
  19. </ul>
  20. break;
  21. }
  22. </div>
  23. @Html.ActionLink("确定", "Index", null, new { @class = "btn btn-default" })
复制代码

至此,使用ASP.NET Identy实现对用户的增删改查完毕,ASP.NET Identity真的很好很强大!

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对晓枫资讯的支持。如果你想了解更多相关内容请查看下面相关链接


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-21
最后登录
2022-12-24

发表于 2024-12-8 14:39:10 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
16
积分
12
注册时间
2022-12-24
最后登录
2022-12-24

发表于 2025-1-18 20:45:22 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
21
积分
22
注册时间
2022-12-28
最后登录
2022-12-28

发表于 2025-3-13 13:13:17 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:20
  • 最近打卡:2024-09-17 10:32:13
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
32
积分
4
注册时间
2023-12-6
最后登录
2024-9-17

发表于 2025-7-20 23:00:09 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表