最近和朋友完成了一个大单子架构是mvc5+ef6+Bootstrap,用的是vs2015,数据库是sql server2014。朋友做的架构,项目完成后觉得很多值得我学习,在这里总结下一些心得。
创建项目一开始删掉App_Start目录下的IdentityConfig.cs和Startup.Auth.cs文件;清空Modle文件夹,Controller文件夹和相应的View; 删除目录下的ApplicationInsights.config文件和Startup.cs文件。(不使用自带的Identity,太多内容不需要)
修改web.config文件(添加<add key="owin:AutomaticAppStartup" value="false"/>不使用Startup.cs文件来启动项目)
<appSettings> <add key=value=/> <add key=value=/> <add key=value=/> <add key=value=/> <add key=value=/> <!--去掉创建项目初的Startup.cs文件的设置--> </appSettings>
(不用他们是因为自带的这些内容太冗余)
去掉冗余内容正式开始,首先介绍数据库这一块,数据库我们是配置的可以手动生成和修改的
1.在项目目录想创建Migrations文件夹,里面添加Configuration.cs文件
Configuration : DbMigrationsConfiguration<AccountContext> { public Configuration() { AutomaticMigrationsEnabled = true; ContextKey = ; } Seed(AccountContext context) { //base.Seed(context); } }
在Model文件夹下添加AccountContext.cs文件
public class AccountContext:DbContext { ) { } public DbSet<User> Users { get; set; } OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } }
<connectionStrings> <add name=connectionString=providerName=/> </connectionStrings>
然后 使用vs2015里面的工具-NuGet包管理器-程序包管理控制平台
输入add-migration Initial 按回车,在输入update-database按回车。在App_Data文件夹下就会看到AccountContext数据库了。
2.在Model文件夹下添加User.css文件
public class User { public int ID { get; set; } public string UserName { get; set; } public string Password { get; set; } public Role Role { get; set; } }
//角色枚举 = = 5 }
在ViewModel文件夹中添加Account.cs文件
public class Account { [Required] public string Name { get; set; } [Required] public string Password { get; set; } public string RePassword { get; set; } }
这里推荐创建BaseController之后的Controller就继承它来使用
public class BaseController : Controller
{
public string UserName => User.Identity.Name;
public AccountContext db = new AccountContext();
private User _userInfo = null;
public User CurrentUserInfo
{
get
{
if (_userInfo == null)
{
var user = db.Users.SingleOrDefault(u => u.UserName == UserName);//此处为了不每次访问用户表可以做一个静态类,里面存放用户表信息.
_userInfo = user == null ? null : new User()
{
ID = user.ID,
UserName = user.UserName,
Role = user.Role
};
}
return _userInfo;
}
}
//验证角色:获取Action的CustomAttributes,过滤角色
OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var authRoleAtt = filterContext.ActionDescriptor.GetCustomAttributes(false).SingleOrDefault(att => att is AuthorizeRoleAttribute) as AuthorizeRoleAttribute;
if (authRoleAtt == null && CurrentUserInfo != null)
return;
if (!authRoleAtt.Roles.Contains(CurrentUserInfo.Role))
{
filterContext.Result = View(, , );
}
}
//这里是记log用
OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
;
)
msg += $;
//Log.Debug(msg);
}
}
AdminController继承BaseController
[Authorize] public ActionResult Index() { return View(db.Users.ToList()); } [Authorize, AuthorizeRole(Role.管理员)] public ActionResult Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } User user = db.Users.Find(id); if (user == null) { return HttpNotFound(); } return View(user); }
登录页面: