当前位置: 首页 > 工具软件 > CoreWeb > 使用案例 >

.NET Core web项目框架

燕雨石
2023-12-01

一、创建项目
1. 表示层  解决方案名:Market  、Market.Web

2. 业务层  Market.Service

3. 数据访问层  Market.Repository

4. 实体层   Market.Model

5. 公共层  Market.Infrastructure

6. 页面实体层---用于放Success/date   Market.ViewModel

7. 组件层----服务   Market.Components

8. 第三方--短信

9. WebApi

注意:

1. 除表示层创建为Web项目、其他层皆为.NETCore类库

2. 框架搭好之后每个层添加所用到的引用

 

二、实体层操作
2.1 在实体层添加AdminInfo管理员类(vs版本2.1直接添加、3.0版本用命令执行)

 

/// <summary>
    /// 管理员信息表
    /// </summary>
    public class AdminInfo
    {
        /// <summary>
        /// 管理员Id
        /// </summary>
        [Key]
        public int AdminId { get; set; }
        /// <summary>
        /// 真实姓名
        /// </summary>
        [MaxLength(50)]
        public string RealName { get; set; }
        /// <summary>
        /// 登录名
        /// </summary>
        public string LoginName { get; set; }
        /// <summary>
        /// 登录密码
        /// </summary>
        public string LoginPwd { get; set; }
        /// <summary>
        /// 性别
        /// </summary>
        public short Sex { get; set; }
        /// <summary>
        /// 手机号
        /// </summary>
        public Int64 Telphone { get; set; }
        /// <summary>
        /// 邮箱
        /// </summary>
        public string Email { get; set; }
        /// <summary>
        /// 角色Id
        /// </summary>
        public int RoleId { get; set; }
        /// <summary>
        /// 备注
        /// </summary>
        public string Remark { get; set; }
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { get; set; }
        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { get; set; }
        /// <summary>
        /// 最后一次登录时间
        /// </summary>
        public DateTime LastLoginTime { get; set; }
        /// <summary>
        /// 登录时间
        /// </summary>
        public DateTime LoginTime { get; set; }
        /// <summary>
        /// 修改时间
        /// </summary>
        public DateTime UpdateTime { get; set; }
        /// <summary>
        /// QQ
        /// </summary>
        public string QQ { get; set; }
        /// <summary>
        /// 状态1:启用 0:禁用
        /// </summary>
        public short Status { get; set; }
    }


2.2 打开Nuget管理窗口

2.3 在实体层安装Nuget包

Install-Package Microsoft.EntityFrameworkCore.SqlServer -version 2.1.1
 
Install-Package Microsoft.EntityFrameworkCore.Tools -version 2.1.1
 
Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design


2.4 创建一个MarketContext类

public  class MarketContext: DbContext  //管理上下文类---设置连接字符串
    {
        public DbSet<AdminInfo> AdminInfo { get; set; }
 
        protected override void OnConfiguring(DbContextOptionsBuilder dbContextOptionsBuilder)
        {
            dbContextOptionsBuilder.UseSqlServer("server=localhost;database=Market;uid=sa;pwd=sa");
        }
    }


2.5 数据迁移与生成数据库

Add-Migration build125    Update-Database
 
三、数据访问层操作
注意:(添加Nuget包System.Linq.Dynamic.Core)

3.1 创建IRepository接口

/// <summary>
    /// 定义泛型仓储接口
    /// </summary>
    /// <typeparam name="TEntity">实体类型</typeparam>
    public interface IRepository<T> where T : class
    {
        #region 同步
 
        /// <summary>
        /// 判断记录是否存在
        /// </summary>
        /// <param name="predicate">lambda表达式条件</param>
        /// <returns></returns>
        bool IsExist(Expression<Func<T, bool>> predicate);
 
        /// <summary>
        /// 新增实体
        /// </summary>
        /// <param name="entity">实体</param>
        /// <param name="autoSave">是否立即执行保存</param>
        /// <returns></returns>
        bool Add(T entity, bool autoSave = true);
 
        /// <summary>
        /// 批量添加
        /// </summary>
        /// <param name="entities">实体列表</param>
        /// <param name="autoSave">是否立即执行保存</param>
        /// <returns></returns>
        bool AddRange(IEnumerable<T> entities, bool autoSave = true);
 
        /// <summary>
        /// 更新实体
        /// </summary>
        /// <param name="entity">实体</param>
        /// <param name="autoSave">是否立即执行保存</param>
        bool Update(T entity, bool autoSave = true);
 
        /// <summary>
        /// 更新部分属性
        /// </summary>
        /// <param name="entity">实体</param>
        /// <param name="autoSave">是否立即执行保存</param>
        /// <param name="updatedProperties">要更新的字段</param>
        /// <returns></returns>
        bool Update(T entity, bool autoSave = true, params Expression<Func<T, object>>[] updatedProperties);
 
        /// <summary>
        /// 更新实体部分属性,泛型方法
        /// </summary>
        /// <param name="entity">实体</param>
        /// <param name="autoSave">是否立即执行保存</param>
        /// <param name="updatedProperties">要更新的字段</param>
        /// <returns></returns>
        bool Update<Entity>(Entity entity, bool autoSave = true, params Expression<Func<Entity, object>>[] updatedProperties) where Entity : class;
 
        /// <summary>
        /// 批量更新实体
        /// </summary>
        /// <param name="entities">实体列表</param>
        /// <param name="autoSave">是否立即执行保存</param>
        bool UpdateRange(IEnumerable<T> entities, bool autoSave = true);
 
        /// <summary>
        /// 删除实体
        /// </summary>
        /// <param name="entity">要删除的实体</param>
        /// <param name="autoSave">是否立即执行保存</param>
        bool Delete(T entity, bool autoSave = true);
 
        /// <summary>
        /// 批量删除
        /// </summary>
        /// <param name="T">对象集合</param>
        /// <returns></returns>
        bool Delete(IEnumerable<T> entities);
 
        /// <summary>
        /// 批量删除
        /// </summary>
        /// <param name="T">对象集合</param>
        /// <param name="autoSave">是否立即执行保存</param>
        /// <returns></returns>
        bool Delete(IEnumerable<T> entities, bool autoSave = true);
 
        /// <summary>
        /// 获取实体集合
        /// </summary>
        /// <returns></returns>
        IQueryable<T> GetList();
 
        /// <summary>
        /// 根据lambda表达式条件获取实体集合
        /// </summary>
        /// <param name="top">前几条</param>
        /// <param name="predicate">查询条件</param>
        /// <param name="ordering">排序</param>
        /// <param name="args">条件参数</param>
        /// <returns></returns>
        IQueryable<T> GetList(int top, string predicate, string ordering, params object[] args);
 
        /// <summary>
        /// 根据lambda表达式条件获取实体集合
        /// </summary>
        /// <param name="predicate">lambda表达式条件</param>
        /// <returns></returns>
        IQueryable<T> GetList(Expression<Func<T, bool>> predicat);
 
        /// <summary>
        /// 根据lambda表达式条件获取单个实体
        /// </summary>
        /// <param name="predicate">lambda表达式条件</param>
        /// <returns></returns>
        T GetModel(Expression<Func<T, bool>> predicate);
 
        /// <summary>
        /// 分页查询
        /// </summary>
        /// <param name="pageIndex">当前页</param>
        /// <param name="pageSize">页大小</param>
        /// <param name="predicate">条件</param>
        /// <param name="ordering">排序</param>
        /// <param name="args">条件参数</param>
        /// <returns></returns>
        IQueryable<T> GetPagedList(int pageIndex, int pageSize, string predicate, string ordering, params object[] args);
 
        /// <summary>
        /// 获取记录总数
        /// </summary>
        /// <param name="predicate">查询条件</param>
        /// <param name="args">条件参数</param>
        /// <returns></returns>
        int GetRecordCount(string predicate, params object[] args);
 
        /// <summary>
        /// 保存
        /// </summary>
        int Save();
 
        #endregion
    }


3.2 创建RepositoryBase类

/// <summary>
    /// 仓储基类
    /// </summary>
    /// <typeparam name="T">实体类型</typeparam>
    public abstract class RepositoryBase<T> : IRepository<T> where T : class
    {
        //定义数据访问上下文对象
        protected readonly SyDbContext _dbContext;
 
        /// <summary>
        /// 通过构造函数注入得到数据上下文对象实例
        /// </summary>
        /// <param name="dbContext"></param>
        public RepositoryBase(SyDbContext dbContext)
        {
            _dbContext = dbContext;
        }
 
        #region 同步
 
        /// <summary>
        /// 判断记录是否存在
        /// </summary>
        /// <param name="predicate">lambda表达式条件</param>
        /// <returns></returns>
        public bool IsExist(Expression<Func<T, bool>> predicate)
        {
            return _dbContext.Set<T>().Any(predicate);
        }
 
        /// <summary>
        /// 新增实体
        /// </summary>
        /// <param name="entity">实体</param>
        /// <param name="autoSave">是否立即执行保存</param>
        /// <returns></returns>
        public bool Add(T entity, bool autoSave = true)
        {
            int row = 0;
            _dbContext.Set<T>().Add(entity);
            if (autoSave)
                row = Save();
            return (row > 0);
        }
 
        /// <summary>
        /// 批量添加
        /// </summary>
        /// <param name="entities">实体列表</param>
        /// <param name="autoSave">是否立即执行保存</param>
        /// <returns></returns>
        public bool AddRange(IEnumerable<T> entities, bool autoSave = true)
        {
            int row = 0;
            _dbContext.Set<T>().AddRange(entities);
            if (autoSave)
                row = Save();
            return (row > 0);
        }
 
        /// <summary>
        /// 更新实体
        /// </summary>
        /// <param name="entity">实体</param>
        /// <param name="autoSave">是否立即执行保存</param>
        public bool Update(T entity, bool autoSave = true)
        {
            int row = 0;
            _dbContext.Update(entity);
            if (autoSave)
                row = Save();
            return (row > 0);
        }
 
        /// <summary>
        /// 更新实体部分属性
        /// </summary>
        /// <param name="entity">实体</param>
        /// <param name="autoSave">是否立即执行保存</param>
        /// <param name="updatedProperties">要更新的字段</param>
        /// <returns></returns>
        public bool Update(T entity, bool autoSave = true, params Expression<Func<T, object>>[] updatedProperties)
        {
            int row = 0;
            //告诉EF Core开始跟踪实体的更改,
            //因为调用DbContext.Attach方法后,EF Core会将实体的State值
            //更改回EntityState.Unchanged,
            _dbContext.Attach(entity);
            if (updatedProperties.Any())
            {
                foreach (var property in updatedProperties)
                {
                    //告诉EF Core实体的属性已经更改。将属性的IsModified设置为true后,
                    //也会将实体的State值更改为EntityState.Modified,
                    //这样就保证了下面SaveChanges的时候会将实体的属性值Update到数据库中。
                    _dbContext.Entry(entity).Property(property).IsModified = true;
                }
            }
 
            if (autoSave)
                row = Save();
            return (row > 0);
        }
 
        /// <summary>
        /// 更新实体部分属性,泛型方法
        /// </summary>
        /// <param name="entity">实体</param>
        /// <param name="autoSave">是否立即执行保存</param>
        /// <param name="updatedProperties">要更新的字段</param>
        /// <returns></returns>
        public bool Update<Entity>(Entity entity, bool autoSave = true, params Expression<Func<Entity, object>>[] updatedProperties) where Entity : class
        {
            int row = 0;
            //告诉EF Core开始跟踪实体的更改,
            //因为调用DbContext.Attach方法后,EF Core会将实体的State值
            //更改回EntityState.Unchanged,
            _dbContext.Attach(entity);
            if (updatedProperties.Any())
            {
                foreach (var property in updatedProperties)
                {
                    //告诉EF Core实体的属性已经更改。将属性的IsModified设置为true后,
                    //也会将实体的State值更改为EntityState.Modified,
                    //这样就保证了下面SaveChanges的时候会将实体的属性值Update到数据库中。
                    _dbContext.Entry(entity).Property(property).IsModified = true;
                }
            }
 
            if (autoSave)
                row = Save();
            return (row > 0);
        }
 
        /// <summary>
        /// 批量更新实体
        /// </summary>
        /// <param name="entities">实体列表</param>
        /// <param name="autoSave">是否立即执行保存</param>
        public bool UpdateRange(IEnumerable<T> entities, bool autoSave = true)
        {
            int row = 0;
            _dbContext.UpdateRange(entities);
            if (autoSave)
                row = Save();
            return (row > 0);
        }
 
        /// <summary>
        /// 根据lambda表达式条件获取单个实体
        /// </summary>
        /// <param name="predicate">lambda表达式条件</param>
        /// <returns></returns>
        public T GetModel(Expression<Func<T, bool>> predicate)
        {
            return _dbContext.Set<T>().FirstOrDefault(predicate);
        }
 
        /// <summary>
        /// 删除实体
        /// </summary>
        /// <param name="entity">要删除的实体</param>
        /// <param name="autoSave">是否立即执行保存</param>
        public bool Delete(T entity, bool autoSave = true)
        {
            int row = 0;
            _dbContext.Set<T>().Remove(entity);
            if (autoSave)
                row = Save();
            return (row > 0);
        }
 
        /// <summary>
        /// 批量删除
        /// </summary>
        /// <param name="T">对象集合</param>
        /// <returns></returns>
        public bool Delete(IEnumerable<T> entities)
        {
            _dbContext.Set<T>().RemoveRange(entities);
            int row = _dbContext.SaveChanges();
            return (row > 0);
        }
 
        /// <summary>
        /// 批量删除
        /// </summary>
        /// <param name="T">对象集合</param>
        /// <param name="autoSave">是否立即执行保存</param>
        /// <returns></returns>
        public bool Delete(IEnumerable<T> entities, bool autoSave = true)
        {
            int row = 0;
            _dbContext.Set<T>().RemoveRange(entities);
            if (autoSave)
                row = Save();
            return (row > 0);
        }
 
        /// <summary>
        /// 获取实体集合
        /// </summary>
        /// <returns></returns>
        public virtual IQueryable<T> GetList()
        {
            return _dbContext.Set<T>().AsQueryable();
        }
 
        /// <summary>
        /// 根据lambda表达式条件获取单个实体
        /// </summary>
        /// <param name="predicate">lambda表达式条件</param>
        /// <returns></returns>
        public virtual IQueryable<T> GetList(Expression<Func<T, bool>> predicate)
        {
            return _dbContext.Set<T>().Where(predicate);
        }
 
        /// <summary>
        /// 根据lambda表达式条件获取实体集合
        /// </summary>
        /// <param name="top">前几条</param>
        /// <param name="predicate">查询条件</param>
        /// <param name="ordering">排序</param>
        /// <param name="args">条件参数</param>
        /// <returns></returns>
        public virtual IQueryable<T> GetList(int top, string predicate, string ordering, params object[] args)
        {
            var result = _dbContext.Set<T>().AsQueryable();
 
            if (!string.IsNullOrWhiteSpace(predicate))
                result = result.Where(predicate, args);
 
            if (!string.IsNullOrWhiteSpace(ordering))
                result = result.OrderBy(ordering);
 
            if (top > 0)
            {
                result = result.Take(top);
            }
            return result;
        }
 
        /// <summary>
        /// 分页查询,返回实体对象
        /// </summary>
        /// <param name="pageIndex">当前页</param>
        /// <param name="pageSize">页大小</param>
        /// <param name="predicate">条件</param>
        /// <param name="ordering">排序</param>
        /// <param name="args">条件参数</param>
        /// <returns></returns>
        public virtual IQueryable<T> GetPagedList(int pageIndex, int pageSize, string predicate, string ordering, params object[] args)
        {
            var result = (from p in _dbContext.Set<T>()
                          select p).AsQueryable();
 
            if (!string.IsNullOrWhiteSpace(predicate))
                result = result.Where(predicate, args);
 
            if (!string.IsNullOrWhiteSpace(ordering))
                result = result.OrderBy(ordering);
 
            return result.Skip((pageIndex - 1) * pageSize).Take(pageSize);
        }
 
        /// <summary>
        /// 获取记录总数
        /// </summary>
        /// <param name="predicate">查询条件</param>
        /// <param name="args">条件参数</param>
        /// <returns></returns>
        public virtual int GetRecordCount(string predicate, params object[] args)
        {
            if (string.IsNullOrWhiteSpace(predicate))
            {
                return _dbContext.Set<T>().Count();
            }
            else
            {
                return _dbContext.Set<T>().Where(predicate, args).Count();
            }
        }
 
        /// <summary>
        /// 事务性保存
        /// </summary>
        public int Save()
        {
            int result = _dbContext.SaveChanges();
            return result;
        }
 
        #endregion
    }


3.3 创建SyDbContext管理上下文类

 public class SyDbContext:DbContext  //管理上下文类
    {
        public DbSet<AdminInfo> AdminInfos { get; set; }
 
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="options"></param>
        public SyDbContext(DbContextOptions<SyDbContext> options) : base(options)
        {
 
        }
 
        public virtual DbSet<AdminInfo> AdminInfo { get; set; }
    }


注意:此时删掉实体层中MarketContext类与Migrations文件夹、同时在表示层中appsettings.json文件添加配置连接字符串

 "ConnectionStrings": {
    "ConnectionString": "server=localhost;database=Market;uid=sa;pwd=sa"
  }


3.4 在表示层Program类中添加读取配置文件的代码

 public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }
 
        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            //读取配置文件
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Environment.CurrentDirectory)
                .AddJsonFile("appsettings.json")//读取配置文件,获取启动的端口号
                .Build();
            return WebHost.CreateDefaultBuilder(args)
                .UseConfiguration(configuration)
                .UseStartup<Startup>();
        }
        //=>
        //WebHost.CreateDefaultBuilder(args)
        //    .UseStartup<Startup>();
    }


3.5 在表示层Startup类ConfigureServices方法中添加代码

 //数据库上下文注入 使用DbContext池,提高性能 
            services.AddDbContextPool<SyDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ConnectionString")));
 
四、组件层操作
注意:(添加Nuget包Microsoft.Extensions.DependencyInjection)

4.1 在组件层中新建Extensions文件夹其中添加DataServiceExtension类

 public static class DataServiceExtension
    {
        /// <summary>
        /// 注入数据
        /// </summary>
        /// <param name="services"></param>
        public static IServiceCollection AddDataService(this IServiceCollection services)
        {
            #region 范围依赖注入
            services.AddScoped<IAdminInfoService, AdminInfoService>();
            #endregion
            return services;
        }
    }


4.2 在表示层Startup类ConfigureServices方法中添加数据服务注入代码

//数据服务注入
services.AddDataService();


 

五、公共层操作
5.1 在公共层新建Encrytp文件夹其中添加MD5Encrypt类

public class MD5Encrypt
    {
        /// <summary>
        /// MD5加密
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public static string Encrypt(string source)
        {
            if (string.IsNullOrEmpty(source)) return string.Empty;
            HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
            byte[] bytes = Encoding.UTF8.GetBytes(source);//这里需要区别编码的
            byte[] hashValue = provider.ComputeHash(bytes);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 16; i++)
            {
                sb.Append(hashValue[i].ToString("x2"));
            }
            return sb.ToString();
        }
    }


5.2 添加一个EnumExtension类

 

   /// <summary>
    /// 枚举扩展属性
    /// </summary>
    public static class EnumExtension
    {
        private static Dictionary<string, Dictionary<string, string>> enumCache;
 
        private static Dictionary<string, Dictionary<string, string>> EnumCache
        {
            get
            {
                if (enumCache == null)
                {
                    enumCache = new Dictionary<string, Dictionary<string, string>>();
                }
                return enumCache;
            }
            set { enumCache = value; }
        }
 
        /// <summary>
        /// 获得枚举提示文本
        /// </summary>
        /// <param name="en"></param>
        /// <returns></returns>
        public static string GetEnumText(this Enum en)
        {
            string enString = string.Empty;
            if (null == en) return enString;
            var type = en.GetType();
            enString = en.ToString();
            if (!EnumCache.ContainsKey(type.FullName))
            {
                var fields = type.GetFields();
                Dictionary<string, string> temp = new Dictionary<string, string>();
                foreach (var item in fields)
                {
                    var attrs = item.GetCustomAttributes(typeof(TextAttribute), false);
                    if (attrs.Length == 1)
                    {
                        var v = ((TextAttribute)attrs[0]).Value;
                        temp.Add(item.Name, v);
                    }
                }
                EnumCache.Add(type.FullName, temp);
            }
            if (EnumCache[type.FullName].ContainsKey(enString))
            {
                return EnumCache[type.FullName][enString];
            }
            return enString;
        }
    }
 
    public class TextAttribute : Attribute
    {
        public TextAttribute(string value)
        {
            Value = value;
        }
 
        public string Value { get; set; }
    }
 


六、业务层操作
6.1 在业务层新建IService文件夹其中添加IAdminInfoService接口

public interface IAdminInfoService
    {
        //验证登录
        ResponseResult ValidateLogin(string userName, string userPwd);
    }


6.2 在业务层新建Service文件夹其中添加AdminInfoService类

 

public class AdminInfoService : RepositoryBase<AdminInfo>, IAdminInfoService
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="syDbContext"></param>
        public AdminInfoService(SyDbContext syDbContext) : base(syDbContext)
        {
 
        }
 
        /// <summary>
        /// 验证登录
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="userPwd"></param>
        /// <returns></returns>
        public ResponseResult ValidateLogin(string userName, string userPwd)
        {
            ResponseResult responseResult = new ResponseResult();
            //MD5加密
            var md5 = MD5Encrypt.Encrypt(userPwd);
            //查询
            var model = GetModel(a => a.LoginName == userName && a.LoginPwd == md5);
            if (model != null)
            {
                responseResult.success = true;
                responseResult.data = model;
            }
            else
            {
                responseResult.success = false;
                responseResult.msg = "账号或密码错误!";
            }
            return responseResult;
        }        
    }


 
七、页面实体层操作
7.1 在页面实体层添加一个ResponseEnum类

public enum ResponseEnum
    {
        /// <summary>
        /// 请求(或处理)成功
        /// </summary>
        [Text("请求(或处理)成功")]
        Status = 200, //请求(或处理)成功
 
        /// <summary>
        /// 内部请求出错
        /// </summary>
        [Text("内部请求出错")]
        Error = 500, //内部请求出错
 
        /// <summary>
        /// 未授权标识
        /// </summary>
        [Text("未授权标识")]
        Unauthorized = 401,//未授权标识
 
        /// <summary>
        /// 请求参数不完整或不正确
        /// </summary>
        [Text("请求参数不完整或不正确")]
        ParameterError = 400,//请求参数不完整或不正确
 
        /// <summary>
        /// 请求TOKEN失效
        /// </summary>
        [Text("请求TOKEN失效")]
        TokenInvalid = 403,//请求TOKEN失效
 
        /// <summary>
        /// HTTP请求类型不合法
        /// </summary>
        [Text("HTTP请求类型不合法")]
        HttpMehtodError = 405,//HTTP请求类型不合法
 
        /// <summary>
        /// HTTP请求不合法,请求参数可能被篡改
        /// </summary>
        [Text("HTTP请求不合法,请求参数可能被篡改")]
        HttpRequestError = 406,//HTTP请求不合法
 
        /// <summary>
        /// 该URL已经失效
        /// </summary>
        [Text("该URL已经失效")]
        URLExpireError = 407,//HTTP请求不合法
    }


7.2 在页面实体层添加一个ResponseResult类

 /// <summary>
    /// 请求返回统一格式
    /// </summary>
    public class ResponseResult
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        public ResponseResult()
        {
 
        }
 
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="success">是否成功</param>
        /// <param name="code">状态码</param>
        /// <param name="list">数据</param>
        /// <param name="recordCount">总记录数</param>
        public ResponseResult(bool success, string msg, int code, dynamic list, int recordCount)
        {
            this.success = success;
            this.msg = msg;
            this.code = code;
            this.data = list;
            this.count = recordCount;
        }
 
        /// <summary>
        /// 构造函数,成功返回列表
        /// </summary>
        /// <param name="list">数据</param>
        /// <param name="recordCount">总记录数</param>
        public ResponseResult(dynamic list, int recordCount)
        {
            this.success = true;
            this.data = list;
            this.count = recordCount;
        }
 
        /// <summary>
        /// 构造函数,操作是否成功
        /// </summary>
        /// <param name="list">数据</param>
        /// <param name="code">状态码</param>
        /// <param name="recordCount">总记录数</param>
        public ResponseResult(bool success, int code, string msg)
        {
            this.success = success;
            this.code = code;
            this.msg = msg;
        }
 
        /// <summary>
        /// 构造函数,操作是否成功
        /// </summary>
        /// <param name="list">数据</param>
        /// <param name="recordCount">总记录数</param>
        public ResponseResult(bool success, string msg)
        {
            this.success = success;
            if (success)
            {
                this.code = 200;
            }
            else
            {
                this.code = 500;
            }
            this.msg = msg;
        }
 
        /// <summary>
        /// 是否成功
        /// </summary>
        public bool success { get; set; } = true;
        /// <summary>
        /// 状态码
        /// </summary>
        public int code { set; get; } = 0;
        /// <summary>
        /// 总记录数
        /// </summary>
        public int count { set; get; } = 0;
 
        /// <summary>
        /// 数据
        /// </summary>
        public dynamic data { set; get; }
 
        /// <summary>
        /// 返回信息
        /// </summary>
        public string msg { set; get; }
 
        /// <summary>
        /// 序列化为字符串
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return Newtonsoft.Json.JsonConvert.SerializeObject(this);
        }
    }


7.3  在表示层Startup类ConfigureServices方法中添加全局配置Json序列化处理代码

         

   // 注册MVC到Container
            services.AddMvc()
            //全局配置Json序列化处理
            .AddJsonOptions(options =>
            {
               options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
               options.SerializerSettings.ContractResolver = new DefaultContractResolver();
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
 


八、表示层操作
8.1 在wwwroot中的文件夹加入所用到的js、css、images、layui文件夹

8.2 在Controllers文件夹中添加一个AccountController控制器

 

public class AccountController : Controller
    {
        //接口注入
        public IAdminInfoService _adminInfoService;
        public AccountController(IAdminInfoService adminInfoService)
        {
            _adminInfoService = adminInfoService;
        }
 
 
        /// <summary>
        /// 登录页
        /// </summary>
        /// <returns></returns>
        public IActionResult Login()
        {
            return View();
        }
 
        /// <summary>
        /// 验证登录
        /// </summary>
        /// <returns></returns>
        public IActionResult ValidateLogin(string userName, string userPwd)
        {
            //调用验证登录方法
            var result = _adminInfoService.ValidateLogin(userName, userPwd);
            return Json(result);
        }
 
 
        /// <summary>
        /// 退出登录
        /// </summary>
        /// <returns></returns>
        public IActionResult LoginOut()
        {
            ViewData["Message"] = "Your contact page.";
            return View();
        }
    }


8.3 在View文件夹中新建Account文件夹其次再添加一个Login.cshtml页面

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>系统登录 - 超市账单管理系统</title>
    <link rel="stylesheet" href="~/css/style.css" />
    <link rel="stylesheet" href="~/lib/layui-v2.5.4/layui/css/modules/layer/default/layer.css" />
    <script type="text/javascript" src="~/lib/jquery/dist/jquery.min.js"></script>
    <script type="text/javascript" src="~/lib/layui-v2.5.4/layui/lay/modules/layer.js"></script>
 
</head>
<body class="login_bg">
    <section class="loginBox">
        <header class="loginHeader">
            <h1>超市账单管理系统</h1>
        </header>
        <section class="loginCont">
            <form class="loginForm" action="welcome.html">
                <div class="inputbox">
                    <label for="user">用户名:</label>
                    <input id="user" type="text" name="username" placeholder="请输入用户名" required />
                </div>
                <div class="inputbox">
                    <label for="mima">密码:</label>
                    <input id="mima" type="password" name="password" placeholder="请输入密码" required />
                </div>
                <div class="subBtn">
                    <input type="submit"  value="登录" />
                    <input type="reset" value="重置" />
                </div>
            </form>
        </section>
    </section>
 
</body>
</html>
 类似资料: