随着技术的进步,跨平台开发已经成为了标配,在此大背景下,ASP.NET Core也应运而生。本文主要基于ASP.NET Core+Element+Sql Server开发一个校园图书管理系统为例,简述基于MVC三层架构开发的常见知识点,仅供学习分享使用,如有不足之处,还请指正。
在本示例中,涉及到B/S全栈开发的常见知识点,包括后端与前端,主要如下:
Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。具体组件使用方法,可参考官网:https://element.eleme.io/#/zh-CN,

工欲善其事必先利其器,所以开发具体功能之前,首先要搭建开发环境,步骤如下所示:
本示例中的校园图书管理系统,基于ASP.NET Core MVC三层架构,在创建时选择对应模板即可,如下所示:

根据创建向导进行创建即可,在项目名称处输入CLMS,目标框架选择.Net6.0即可。为了项目可移植性,将DAL层和Entity层独立出来成单独的工程。项目结构如下所示:

在本示例中,采用Data First方式,先创建数据库和对应的表结构,根据业务需求分析,
主要包括三部分:
如下所示:

连接数据库,需要在配置文件appsettings.json中,添加数据库连接字符串,如下所示:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"Default": "Server=localhost;Database=CLMS;Trusted_Connection=True;User Id=sa;Password=abc123;Encrypt=True;TrustServerCertificate=True;"
},
"AllowedHosts": "*"
}
EntityFrameWork框架需要进行安装,目前版本为7.0.1,可通过NuGet包管理器进行安装,如下所示:

数据库操作采用EntityFrameCore框架,继承自DbContext,如下所示:
1 using CLMS.Entity;
2 using Microsoft.EntityFrameworkCore;
3
4 namespace CLMS.DAL
5 {
6 /// <summary>
7 /// 创建数据库上下文类
8 /// </summary>
9 public class DataContext : DbContext
10 {
11 public DbSet<UserEntity> Users { get; set; }
12
13 public DbSet<MenuEntity> Menus { get; set; }
14
15 public DbSet<RoleEntity> Roles { get; set; }
16
17 public DbSet<UserRoleEntity> UserRoles { get; set; }
18
19 public DbSet<RoleMenuEntity> RoleMenus { get; set; }
20
21 /// <summary>
22 /// 图书室
23 /// </summary>
24 public DbSet<LibraryEntity> Librarys { get; set; }
25
26 /// <summary>
27 /// 阅览架
28 /// </summary>
29 public DbSet<BookRackEntity> BookRacks { get; set; }
30
31 /// <summary>
32 /// 借还记录
33 /// </summary>
34 public DbSet<CirculateEntity> Circulates { get; set; }
35
36 /// <summary>
37 /// 图书
38 /// </summary>
39 public DbSet<BookEntity> Books { get; set; }
40
41 public DataContext(DbContextOptions options) : base(options)
42 {
43
44 }
45
46 protected override void OnModelCreating(ModelBuilder modelBuilder)
47 {
48 base.OnModelCreating(modelBuilder);
49 modelBuilder.Entity<UserEntity>().ToTable("Users");
50 modelBuilder.Entity<MenuEntity>().ToTable("Menus");
51 modelBuilder.Entity<RoleEntity>().ToTable("Roles");
52 modelBuilder.Entity<UserRoleEntity>().ToTable("UserRoles");
53 modelBuilder.Entity<RoleMenuEntity>().ToTable("RoleMenus");
54 //
55 modelBuilder.Entity<LibraryEntity>().ToTable("Librarys");
56 modelBuilder.Entity<BookRackEntity>().ToTable("BookRacks");
57 modelBuilder.Entity<CirculateEntity>().ToTable("Circulates");
58 modelBuilder.Entity<BookEntity>().ToTable("Books");
59 }
60 }
61 }
在Startup.cs中,添加EntittyFramework的注入,如下所示:
1 using Autofac.Extensions.DependencyInjection;
2 using CLMS.DAL;
3 using Microsoft.EntityFrameworkCore;
4
5 var builder = WebApplication.CreateBuilder(args);
6
7 // Add services to the container.
8 builder.Services.AddControllersWithViews();
9 builder.Services.AddDbContext<DataContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
10 builder.Services.AddHttpContextAccessor();
11 builder.Services.AddSession();//配置session访问服务
12 // 以下是autofac依赖注入
13 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
14 var app = builder.Build();
15
16 // Configure the HTTP request pipeline.
17 if (!app.Environment.IsDevelopment())
18 {
19 app.UseExceptionHandler("/Home/Error");
20 // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
21 app.UseHsts();
22 }
23
24 app.UseHttpsRedirection();
25
26 app.UseStaticFiles();
27
28 app.UseRouting();
29 app.UseSession();
30 app.UseAuthorization();
31
32 app.MapControllerRoute(
33 name: "default",
34 pattern: "{controller=Home}/{action=Index}/{id?}");
35
36 app.Run();
在本示例中,主要用到Element UI框架,以及axios框,Vue2.0,可通过Visual Studio进行安装,如下所示:
选择Web项目,右键-->添加-->客户端库。打开添加窗口,然后选择对应库进行安装即可,如下所示:

安装成功后,如下所示:

当基础开发环境搭建好后,就可以进行具体功能开发,以登录功能为例,步骤如下:
控制器主要负责页面导航和逻辑处理,如下所示:
1 namespace CLMS.Host.Controllers
2 {
3 public class LoginController : Controller
4 {
5 private DataContext dataContext;
6
7 public LoginController(DataContext context)
8 {
9 dataContext = context;
10 }
11
12 [HttpGet]
13 public IActionResult Index()
14 {
15 return View();
16 }
17
18 [Consumes("application/json")]
19 [HttpPost]
20 public Msg Login([FromBody]User user)
21 {
22 Msg msg = new Msg();
23 if (string.IsNullOrEmpty(user.UserName) || string.IsNullOrEmpty(user.Password))
24 {
25 msg.message = "用户名或密码为空";
26 msg.code = 1;
27 return msg;
28 }
29 else
30 {
31 var item = dataContext.Users.FirstOrDefault(i => i.UserName == user.UserName && i.Password == user.Password);
32 if (item != null)
33 {
34 HttpContext.Session.SetInt32("UserId", item.Id);
35 msg.message = "success";
36 msg.code = 0;
37 return msg;
38 }
39 else
40 {
41 msg.message = "用户名或密码验证错误";
42 msg.code = 1;
43 return msg;
44 }
45
46 }
47 }
48 }
49 }
视图主要用于数据的呈现和交互,登录视图对应Login/Index.cshtml页面。主要功能如下:
登录视图代码如下:
1 @{
2 Layout = null;
3 }
4 <!DOCTYPE html>
5 <html>
6 <head>
7 <title>校园图书管理系统</title>
8 <!-- For-Mobile-Apps-and-Meta-Tags -->
9 <meta name="viewport" content="width=device-width, initial-scale=1" />
10 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
11
12 <!-- 引入样式 -->
13 <link rel="stylesheet" href="/lib/element-ui/theme-chalk/index.min.css">
14 <!-- 引入组件库 -->
15 <script src="/lib/vue/dist/vue.min.js"></script>
16 <script src="/lib/element-ui/index.min.js"></script>
17 <script src="/lib/axios/axios.min.js"></script>
18 </head>
19
20 <body style="background:url('/imgs/loginbg.jpg');background-size: 100% 100%;background-repeat:no-repeat;width: 100%;height: 100vh;margin:0;">
21
22 <div id="app">
23 <h1>校园图书管理系统</h1>
24 <div class="loginbody">
25 <el-form label-width="70px" style="margin-top:40px;" :model="form">
26 <el-form-item label="用户名">
27 <el-input placeholder="Please input username" v-model="form.UserName"/>
28 </el-form-item>
29 <el-form-item label="密码">
30 <el-input type="password" placeholder="Please input password" show-password v-model="form.Password"/>
31 </el-form-item>
32 <el-form-item style="text-align:left;">
33 <el-checkbox label="记住密码" size="large" v-model="form.Remember" />
34 </el-form-item>
35 <el-button>取消</el-button>
36 <el-button type="primary" plain v-on:click="onSubmit">登录</el-button>
37 <br />
38 <div class="reg">
39 <el-link type="warning" style="text-align:right;">注册</el-link>
40 </div>
41
42 </el-form>
43 </div>
44 <br />
45 <br />
46 </div>
47 <div class="footer">
48 <p> © 2022-2023 校园图书管理系统. All Rights Reserved | Design by 小六公子</p>
49 </div>
50
51 <script>
52 var app= new Vue({
53 el: '#app',
54 data:function() {
55 return {
56 form: {
57 UserName: '',
58 Password: '',
59 Remember: false,
60 }
61 }
62 },
63 methods: {
64 onSubmit() {
65 console.log('submit!');
66 axios.post('/Login/Login', {
67 UserName: this.form.UserName,
68 Password: this.form.Password
69 }).then(function (response) {
70 if(response.status==200){
71 var msg = response.data;
72 if(msg.code=="0"){
73 window.location="/Home";
74 }else{
75 window.alert(msg.message);
76 }
77 }
78 console.log(response);
79 }).catch(function (error) {
80 console.log(error);
81 });
82 }
83 }
84 });
85 </script>
86 <style>
87 #app{
88 width:100%;
89 height:60%;
90 text-align:center;
91 position:absolute;
92 top:100px;
93 }
94 .el-input{
95 height:35px;
96 width:90%;
97 }
98 .el-button{
99 width:120px;
100 height:35px;
101 }
102 .loginbody{
103 display: block;
104 background: white;
105 width: 25%;
106 height: 300px;
107 position: absolute;
108 left: 38%;
109 border-radius:5px;
110 }
111 .footer{
112 position: absolute;
113 bottom: 10px;
114 display: flex;
115 margin-bottom: 10px;
116 left: 36%;
117 }
118 h1{
119 color: white;
120 font-size: 40px;
121 }
122 .reg{
123 text-align: right;
124 margin-right: 20%;
125 margin-top: 10px;
126 }
127 </style>
128 </body>
129 </html>
运行测试
经过以上步骤,登录功能已经做好,运行程序。然后数据账号密码,点击登录进行跳转,如下所示:

登录成功后,如下所示:

以上就是校园图书管理系统的基础环境搭建以及登录功能实现,后续功能再继续介绍。旨在抛砖引玉,一起学习,共同进步。
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注