通用权限
1、引入命名空间。
using Microsoft.EntityFrameworkCore;
项目结构
新建BBC解决方案。在解决方案下新建BBC_Api,BBC_data,BBC_Service,BBC_Web文件夹。
本次项目采用DB First模式,新建数据库后在包管理控制台下使用
Add:Scaffold-DbContext -Connection “连接字符串” Microsoft.EntityFrameworkCore.SqlServer -OutputDir "创建后放的文件夹"创建对应实体。
1、BBC_data文件夹下新建标准类库,命名Data。
一方面用来映射数据库实体,另一方面用来装在其他的实体,如View实体,逻辑映射实体等。
2、BBC_Service文件夹下新建标准类库,命名Service。
引用Data层,用来实现提供web的逻辑操作。
3、BBC_Web文件夹下新建Web项目,命名web。
引用Data层和Service层,用来实现对用户可视化展示。
4、BBC_Api文件夹下Api项目,命名Api。
引用Data层和Service层,对不同端提供数据接口。
BBC_data
1、新建一个Entity文件。
新建一个Entity文件夹用于存放表对应的实体属性
。
如图
2、新建DbContext文件。
新建BBCDbContext类,配置映射关系
。
namespace Data
{
public class BBCDbContext: DbContext
{
public BBCDbContext(DbContextOptions<BBCDbContext> options) : base(options) { }
public virtual DbSet<LogLogin> LogLogin { get; set; }
public virtual DbSet<LogOperate> LogOperate { get; set; }
public virtual DbSet<LogPage> LogPage { get; set; }
public virtual DbSet<SysDictionary> SysDictionary { get; set; }
public virtual DbSet<SysMenu> SysMenu { get; set; }
public virtual DbSet<SysMenuRole> SysMenuRole { get; set; }
public virtual DbSet<SysRole> SysRole { get; set; }
public virtual DbSet<SysUser> SysUser { get; set; }
public virtual DbSet<SysUserRole> SysUserRole { get; set; }
}
}
用于实现数据库与项目实体映射桥梁。
BBC_Service
BBC_Web
1、配置数据库连接字符串。
appsettings.json
。
"ConnectionStrings": {
"BBC": "Server=.;uid=sunyong;pwd=1qaz!QAZ;Database=BBC;"
}
2、将连接字符串注入到Starup.cs。
Startup.cs->ConfigureServices
。在Starup.cs文件夹下面的ConfigureServices方法下面添加如下代码
//数据库连接映射
services.AddDbContext<BBCDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("BBC")));
BBC_Api
1、配置数据库连接字符串。
appsettings.json
。
"ConnectionStrings": {
"BBC": "Server=.;uid=sunyong;pwd=1qaz!QAZ;Database=BBC;"
}
2、将连接字符串注入到Starup.cs。
Startup.cs->ConfigureServices
在Starup.cs文件夹下面的ConfigureServices方法下面添加如下代码
//数据库连接映射
services.AddDbContext<BBCDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("BBC")));
封装通用方法
BBC_Service
1、新建BaseService文件夹。
ServiceCore.cs
用于封装通用的增删查改的方法,用于整表操作。
namespace Service
{
public class ServiceCore<T> where T : class, new()
{
private BBCDbContext db { get; set; }
public ServiceCore(BBCDbContext _db) {
db = _db;
}
public bool Add(T entity) {
db.Set<T>().Add(entity);
return db.SaveChanges() > 0;
}
public bool Remove(T entity) {
db.Entry(entity).State = EntityState.Deleted;
return db.SaveChanges() > 0;
}
public bool Update(T entity) {
db.Entry(entity).State = EntityState.Modified;
return db.SaveChanges() > 0;
}
public T Entity(int id) {
return db.Set<T>().Find(id);
}
}
}
2、新建Service.Dal文件夹。
ServiceDal.cs
用于封装常用的逻辑操作。注:ServiceCore方法和ServiceDal方法可以合并成一个,这边为了后面用到方便所以这边暂时分开。
namespace Service
{
public class ServiceDal<T> where T : class, new()
{
private BBCDbContext db;
public ServiceDal(BBCDbContext _db) {
db = _db;
}
public bool Adds(List<T> entities) {
db.AddRange(entities);
return db.SaveChanges() == entities.Count();
}
public bool Removes(List<T> entities) {
db.RemoveRange(entities);
return db.SaveChanges() == entities.Count();
}
public bool Updates(List<T> entities) {
db.UpdateRange(entities);
return db.SaveChanges() == entities.Count();
}
public List<T> GetList() {
return db.Set<T>().ToList();
}
public IQueryable<T> Entites(Expression<Func<T, bool>> lambda) {
return db.Set<T>().Where(lambda).AsQueryable();
}
}
}
3、新建Service.Bll文件夹。
用于封装每一个单体实体操作,包括单个实体添加,多个实体一次性添加,单个实体删除,多个实体删除,单实体数据更改,多个实体更新,以及通过主键查询单个实体,查询实体数据列表,通过条件查询列表数据。 以下以SysUserService实体方法为例
namespace Service
{
public class SysUserService
{
private readonly ServiceDal<SysUser> dal;
private readonly ServiceCore<SysUser> core;
public SysUserService(ServiceDal<SysUser> _dal, ServiceCore<SysUser> _core) {
dal = _dal;
core = _core;
}
public bool Add(SysUser entity) {
return core.Add(entity);
}
public bool Adds(List<SysUser> entities) {
return dal.Adds(entities);
}
public bool Remove(SysUser entity) {
return core.Remove(entity);
}
public bool Removes(List<SysUser> entities) {
return dal.Removes(entities);
}
public bool Update(SysUser entity) {
return core.Update(entity);
}
public bool Updates(List<SysUser> entities) {
return dal.Updates(entities);
}
public SysUser GetEntity(int id) {
return core.Entity(id);
}
public List<SysUser> SysUsers() {
return dal.GetList();
}
public IQueryable GetEntites(Expression<Func<SysUser, bool>> lambda) {
return dal.Entites(lambda);
}
}
}
总结
依次类推,将其他业务逻辑也进行封装,或者在使用到的时候在进行封装。如下图
页面显示层操作即Web UI
BBC_Web
首先下载Bootstrap.js插件
数据库逻辑
设计sql
。
CREATE TABLE [dbo].[Sys_User](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[UserName] [VARCHAR](50) NOT NULL,
[Password] [VARCHAR](50) NOT NULL,
[NickName] [NVARCHAR](50) NULL,
[Phone] [VARCHAR](50) NULL,
[WChart] [VARCHAR](100) NULL,
[EMail] [VARCHAR](200) NULL,
[Sex] [INT] NOT NULL,
[Address] [NVARCHAR](200) NULL,
[Count] [INT] NULL,
[IdCard] [VARCHAR](50) NULL,
[Summary] [NVARCHAR](100) NULL,
[CreateUser] [INT] NOT NULL,
[CreateTime] [DATETIME] NOT NULL,
[UpdateUser] [INT] NULL,
[UpdateTime] [DATETIME] NULL,
[State] [VARCHAR](50) NOT NULL,
CONSTRAINT [PK_Sys_User] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Sys_Role](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[RoleName] [NVARCHAR](50) NOT NULL,
[RoleSort] [INT] NULL,
[Summary] [NVARCHAR](100) NULL,
[CreateUser] [INT] NOT NULL,
[CreateTime] [DATETIME] NOT NULL,
[UpdateUser] [INT] NULL,
[UpdateTime] [DATETIME] NULL,
[State] [VARCHAR](50) NOT NULL,
CONSTRAINT [PK_Sys_Role] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Sys_UserRole](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[UserId] [INT] NOT NULL,
[RoleId] [INT] NOT NULL,
[Summary] [NVARCHAR](100) NULL,
[CreateUser] [INT] NOT NULL,
[CreateTime] [DATETIME] NOT NULL,
[UpdateUser] [INT] NULL,
[UpdateTime] [DATETIME] NULL,
[State] [VARCHAR](50) NOT NULL,
CONSTRAINT [PK_Sys_UserRole] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Sys_Menu](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[ParentId] [INT] NULL,
[MenuName] [NVARCHAR](50) NULL,
[MenuUrl] [VARCHAR](50) NULL,
[MenuSort] [INT] NULL,
[MenuIcon] [VARCHAR](50) NULL,
[MenuType] [VARCHAR](50) NULL,
[Summary] [NVARCHAR](100) NULL,
[CreateUser] [INT] NOT NULL,
[CreateTime] [DATETIME] NOT NULL,
[UpdateUser] [INT] NULL,
[UpdateTime] [DATETIME] NULL,
[State] [VARCHAR](50) NOT NULL,
CONSTRAINT [PK_Sys_Menu] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Sys_MenuRole](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[RoleId] [INT] NOT NULL,
[MenuId] [INT] NOT NULL,
[Summary] [NVARCHAR](100) NULL,
[CreateUser] [INT] NOT NULL,
[CreateTime] [DATETIME] NOT NULL,
[UpdateUser] [INT] NULL,
[UpdateTime] [DATETIME] NULL,
[State] [VARCHAR](50) NOT NULL,
CONSTRAINT [PK_Sys_MenuRole] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Sys_Dictionary](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[Key] [VARCHAR](50) NOT NULL,
[Value] [NVARCHAR](50) NOT NULL,
[Summary] [NVARCHAR](100) NULL,
[CreateUser] [INT] NOT NULL,
[CreateTime] [DATETIME] NOT NULL,
[UpdateUser] [INT] NULL,
[UpdateTime] [DATETIME] NULL,
[State] [VARCHAR](50) NOT NULL,
CONSTRAINT [PK_Sys_Dictionary] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Log_Page](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[Excetpion] [NVARCHAR](MAX) NOT NULL,
[Page] [VARCHAR](50) NOT NULL,
[Type] [VARCHAR](50) NULL,
[Summary] [NVARCHAR](100) NULL,
[CreateUser] [INT] NOT NULL,
[CreateTime] [DATETIME] NOT NULL,
[UpdateUser] [INT] NULL,
[UpdateTime] [DATETIME] NULL,
[State] [VARCHAR](50) NOT NULL,
CONSTRAINT [PK_Log_Page] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE TABLE [dbo].[Log_Login](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[IpAddress] [VARCHAR](200) NOT NULL,
[Browse] [VARCHAR](300) NOT NULL,
[Os] [VARCHAR](150) NULL,
[Summary] [NVARCHAR](100) NULL,
[CreateUser] [INT] NOT NULL,
[CreateTime] [DATETIME] NOT NULL,
[UpdateUser] [INT] NULL,
[UpdateTime] [DATETIME] NULL,
[State] [VARCHAR](50) NOT NULL,
CONSTRAINT [PK_Log_Login] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Log_Operate](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[Title] [NVARCHAR](50) NULL,
[Content] [NVARCHAR](50) NULL,
[IpAddress] [VARCHAR](50) NULL,
[Summary] [NVARCHAR](100) NULL,
[CreateUser] [INT] NOT NULL,
[CreateTime] [DATETIME] NOT NULL,
[UpdateUser] [INT] NULL,
[UpdateTime] [DATETIME] NULL,
[State] [VARCHAR](50) NOT NULL,
CONSTRAINT [PK_Log_Operate] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO