先上个架构图,接下来在一一分析.
一 实体层
引用SqlSugar
我们的ORM框架是sqlsugar,sqlsugar提供了自动生成实体类的方法,可以自动生成,因为我的表比较少,所以选择了手写
以user表为例
using System; using SqlSugar; namespace FuturesContest.Model { /// <summary> /// 管理员 /// </summary> [SugarTable("user")] public class User { [SugarColumn(IsPrimaryKey =true,IsIdentity =true)] public int Id { get; set; } /// <summary> /// 登录名 /// </summary> public string Account { get; set; } /// <summary> /// 密码 /// </summary> public string Password { get; set; } /// <summary> /// 昵称 /// </summary> [SugarColumn(ColumnName = "nick_name")] public string NickName { get; set; } [SugarColumn(ColumnName = "is_enabled")] public int IsEnabled { get; set; } [SugarColumn(ColumnName = "add_time")] public DateTime AddTime { get; set; } [SugarColumn(ColumnName = "last_time")] public DateTime LastTime { get; set; } [SugarColumn(ColumnName = "head_thumb")] public string HeadThumb { get; set; } [SugarColumn(ColumnName = "order_id")] public int OrderId { get; set; } } }
说明:
[SugarTable("user")]---------数据库表名与类名不一致,用SugarTable标明实际的数据库表名
[SugarColumn(IsPrimaryKey =true,IsIdentity =true)]-----------表示该列是主键,并且自增
[SugarColumn(ColumnName = "nick_name")]----------数据库字段名 与 类中的属性名 不一致,用SugarColumn标明实际的列名
二 IDAL层
引用实体层
为了代码重用,IDAL层中最主要的事情就是定义一个父接口,里面包含了公用的增删改查
IBaseDal
using System; using System.Collections.Generic; using System.Linq.Expressions; namespace FuturesContest.IDAL { public interface IBaseDal<T> where T:class,new() { #region 插入方法 /// <summary> /// 添加一条数据 /// </summary> /// <param name="entity">实体数据</param> /// <returns>返回响应条数</returns> int Add(T entity); /// <summary> /// 添加一条数据 /// </summary> /// <param name="entity">实体数据</param> /// <returns>返回主键</returns> int AddReutrnIdentity(T entity); /// <summary> /// 添加一条数据 /// 只是将identity添加到实体的参数里面并返回 /// 没有查询2次库 /// 所以有些默认值什么的变动是取不到的你们需要手动进行2次查询获取 /// </summary> /// <param name="entity">实体数据</param> /// <returns>将identity添加到实体的参数里面并返回</returns> T AddReturnEntity(T entity); /// <summary> /// 添加一条数据 /// </summary> /// <param name="entity">实体数据</param> /// <returns>返回布尔值</returns> bool AddReturnBool(T entity); /// <summary> /// 批量添加 /// </summary> /// <param name="list">要添加的集合</param> /// <returns>返回响应行数</returns> int AddBatch(IEnumerable<T> list); #endregion #region 删除方法 /// <summary> /// 根据实体中的主键删除 /// </summary> /// <param name="entity">实体并必须有主键</param> /// <returns>返回影响行数</returns> int Delete(T entity); /// <summary> /// 根据集合中的主键删除 /// </summary> /// <param name="list">集合并必须有主键</param> /// <returns>返回影响行数</returns> int Delete(IEnumerable<T> list); /// <summary> /// 根据主键删除 /// </summary> /// <param name="id">主键</param> /// <returns>返回影响行数</returns> int Delete(int id); /// <summary> /// 根据主键集合删除 /// </summary> /// <param name="ids">主键数组</param> /// <returns>返回影响行数</returns> int Delete(int[] ids); int Delete(IEnumerable<int> ids); #endregion #region 更新方法 /// <summary> /// 根据实体主键更新 /// </summary> /// <param name="entity">实体并必须有主键</param> /// <returns>返回影响行数</returns> int Modify(T entity); /// <summary> /// 批量更新 /// </summary> /// <param name="list">要更新的集合并必须有主键</param> /// <returns>返回影响行数</returns> int ModifyBatch(List<T> list); #endregion #region 查询方法 /// <summary> /// 查询全部 /// </summary> /// <returns>返回实体集合</returns> IEnumerable<T> QueryAll(); /// <summary> /// 查询top条数据 /// </summary> /// <param name="top">要top几</param> /// <returns>返回实体集合</returns> IEnumerable<T> QueryTop(int top); /// <summary> /// 根据主键查询 /// </summary> /// <param name="id">主键</param> /// <returns>返回对应实体</returns> T QueryById(int id); /// <summary> /// 分页查询 /// </summary> /// <param name="orderBy">排序字段</param> /// <param name="OrderType"></param> /// <param name="pageIndex">起始页</param> /// <param name="pageSize">页长</param> /// <param name="totalCount">总数据</param> /// <returns>返回实体集合</returns> IEnumerable<T> QueryPage(Expression<Func<T, object>> orderBy, int OrderType, int pageIndex, int pageSize, ref int totalCount); /// <summary> /// 条件查询 /// </summary> /// <param name="where">lamada查询条件</param> /// <returns>返回实体集合</returns> IEnumerable<T> QueryByIf(Expression<Func<T, bool>> where); /// <summary> /// 分页条件查询 /// </summary> /// <param name="orderBy">排序字段</param> /// <param name="where">lamada查询条件</param> /// <param name="pageIndex">起始页</param> /// <param name="pageSize">页长</param> /// <param name="totalCount">总数据</param> /// <returns>返回实体集合</returns> IEnumerable<T> QueryByIfPage(Expression<Func<T, object>> orderBy, int orderType, Expression<Func<T, bool>> where, int pageIndex, int pageSize, ref int totalCount); #endregion } }
我会在后面的随笔中详细讲DAL和BLL的封装
除了公用的方法,我们可能还需要一些user自己的方法,也定义个接口
IUserDal
using FuturesContest.Model; namespace FuturesContest.IDAL { public interface IUserDal :IBaseDal<User> { } }
三 DAL层
引用 实体层|IDAL层|sqlsugar|Mysql.Data|Newtonsoft.Json
这个层主要的类有 SqlSugarFatory和BaseDal
SqlSugarFatory类的作用是----创建一个mysql连接的db上下文
BaseDal是对IBaseDal的实现
SqlSugarFatory
using System; using System.Configuration; using System.Linq; using SqlSugar; namespace FuturesContest.DAL { public class SqlSugarFatory { private static readonly string Conn = ConfigurationManager.AppSettings["ConStringMySQL"]; public static SqlSugarClient GetInstance() { var db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = Conn, DbType = DbType.MySql, IsAutoCloseConnection = true }); db.Ado.IsEnableLogEvent = true; db.Ado.LogEventStarting = (sql, pars) => { Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))); Console.WriteLine(); }; return db; } } }
baseDal
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using FuturesContest.IDAL; using SqlSugar; namespace FuturesContest.DAL { public class BaseDal<T>: IBaseDal<T> where T:class,new() { public int Add(T entity) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Insertable(entity).ExecuteCommand(); return result; } } public int AddReutrnIdentity(T entity) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Insertable(entity).ExecuteReturnIdentity(); return result; } } public T AddReturnEntity(T entity) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Insertable(entity).ExecuteReturnEntity(); return result; } } public bool AddReturnBool(T entity) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Insertable(entity).ExecuteCommandIdentityIntoEntity(); return result; } } public int AddBatch(IEnumerable<T> list) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Insertable(list.ToArray()).ExecuteCommand(); return result; } } public int Delete(T entity) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Deleteable(entity).ExecuteCommand(); return result; } } public int Delete(IEnumerable<T> list) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Deleteable<T>(list).ExecuteCommand(); return result; } } public int Delete(int id) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Deleteable<T>(id).ExecuteCommand(); return result; } } public int Delete(int[] ids) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Deleteable<T>(ids).ExecuteCommand(); return result; } } public int Delete(IEnumerable<int> ids) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Deleteable<T>(ids).ExecuteCommand(); return result; } } public int Modify(T entity) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Updateable(entity).ExecuteCommand(); return result; } } public int ModifyBatch(List<T> list) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Updateable(list).ExecuteCommand(); return result; } } public IEnumerable<T> QueryAll() { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Queryable<T>().ToList(); return result; } } public IEnumerable<T> QueryTop(int top) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Queryable<T>().Take(top).ToList(); return result; } } public T QueryById(int id) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Queryable<T>().InSingle(id); return result; } } public IEnumerable<T> QueryPage(Expression<Func<T, object>> orderBy, int orderType, int pageIndex, int pageSize, ref int totalCount) { using (var db = SqlSugarFatory.GetInstance()) { var result = db.Queryable<T>().OrderBy(orderBy, (OrderByType)orderType).ToPageList(pageIndex, pageSize, ref totalCount); return result; } } public IEnumerable<T> QueryByIf(Expression<Func<T, bool>> where) { using (var db = SqlSugarFatory.GetInstance()) { if (where != null) { var list = db.Queryable<T>().WhereIF(true, where).ToList(); return list; } else { var list = db.Queryable<T>().ToList(); return list; } } } public IEnumerable<T> QueryByIfPage(Expression<Func<T, object>> orderBy, int orderType, Expression<Func<T, bool>> where, int pageIndex, int pageSize, ref int totalCount) { using (var db = SqlSugarFatory.GetInstance()) { var list = db.Queryable<T>().WhereIF(true, where).OrderBy(orderBy, (OrderByType)orderType).ToPageList(pageIndex, pageSize, ref totalCount); return list; } } } }
UserDal既要实现IuserDal,又要继承BaseDal
userdal
using FuturesContest.IDAL; using FuturesContest.Model; namespace FuturesContest.DAL { public class UserDal:BaseDal<User>,IUserDal { } }
四 IBLL层
引用 实体层
主要IbaseBll类
IBaseBll
using System; using System.Collections.Generic; using System.Linq.Expressions; namespace FuturesContestIBLL { public interface IBaseBll<T> where T:class,new() { #region 插入方法 /// <summary> /// 添加一条数据 /// </summary> /// <param name="entity">实体数据</param> /// <returns>返回响应条数</returns> int Add(T entity); /// <summary> /// 添加一条数据 /// </summary> /// <param name="entity">实体数据</param> /// <returns>返回主键</returns> int AddReutrnIdentity(T entity); /// <summary> /// 添加一条数据 /// 只是将identity添加到实体的参数里面并返回 /// 没有查询2次库 /// 所以有些默认值什么的变动是取不到的你们需要手动进行2次查询获取 /// </summary> /// <param name="entity">实体数据</param> /// <returns>将identity添加到实体的参数里面并返回</returns> T AddReturnEntity(T entity); /// <summary> /// 添加一条数据 /// </summary> /// <param name="entity">实体数据</param> /// <returns>返回布尔值</returns> bool AddReturnBool(T entity); /// <summary> /// 批量添加 /// </summary> /// <param name="list">要添加的集合</param> /// <returns>返回响应行数</returns> int AddBatch(IEnumerable<T> list); #endregion #region 删除方法 /// <summary> /// 根据实体中的主键删除 /// </summary> /// <param name="entity">实体并必须有主键</param> /// <returns>返回影响行数</returns> int Delete(T entity); /// <summary> /// 根据集合中的主键删除 /// </summary> /// <param name="list">集合并必须有主键</param> /// <returns>返回影响行数</returns> int Delete(IEnumerable<T> list); /// <summary> /// 根据主键删除 /// </summary> /// <param name="id">主键</param> /// <returns>返回影响行数</returns> int Delete(int id); /// <summary> /// 根据主键集合删除 /// </summary> /// <param name="ids">主键数组</param> /// <returns>返回影响行数</returns> int Delete(int[] ids); int Delete(IEnumerable<int> ids); #endregion #region 更新方法 /// <summary> /// 根据实体主键更新 /// </summary> /// <param name="entity">实体并必须有主键</param> /// <returns>返回影响行数</returns> int Modify(T entity); /// <summary> /// 批量更新 /// </summary> /// <param name="list">要更新的集合并必须有主键</param> /// <returns>返回影响行数</returns> int ModifyBatch(List<T> list); #endregion #region 查询方法 /// <summary> /// 查询全部 /// </summary> /// <returns>返回实体集合</returns> IEnumerable<T> QueryAll(); /// <summary> /// 查询top条数据 /// </summary> /// <param name="top">要top几</param> /// <returns>返回实体集合</returns> IEnumerable<T> QueryTop(int top); /// <summary> /// 根据主键查询 /// </summary> /// <param name="id">主键</param> /// <returns>返回对应实体</returns> T QueryById(int id); /// <summary> /// 分页查询 /// </summary> /// <param name="orderBy">排序字段</param> /// <param name="pageIndex">起始页</param> /// <param name="pageSize">页长</param> /// <param name="totalCount">总数据</param> /// <returns>返回实体集合</returns> IEnumerable<T> QueryPage(Expression<Func<T, object>> orderBy, int OrderType, int pageIndex, int pageSize, ref int totalCount); /// <summary> /// 条件查询 /// </summary> /// <param name="where">lamada查询条件</param> /// <returns>返回实体集合</returns> IEnumerable<T> QueryByIf(Expression<Func<T, bool>> where); /// <summary> /// 分页条件查询 /// </summary> /// <param name="orderBy">排序字段</param> /// <param name="where">lamada查询条件</param> /// <param name="pageIndex">起始页</param> /// <param name="pageSize">页长</param> /// <param name="totalCount">总数据</param> /// <returns>返回实体集合</returns> IEnumerable<T> QueryByIfPage(Expression<Func<T, object>> orderBy,int orderType, Expression<Func<T, bool>> where, int pageIndex, int pageSize, ref int totalCount); #endregion } }
IUserBll需要继承IBaseBll
using System.Collections.Generic; using FuturesContest.Model; namespace FuturesContestIBLL { public interface IUserBll:IBaseBll<User> { bool ExistAccount(string account); bool ExistNickName(string nickname); bool IsRightPassword(User user); User GetUserByAccount(string account); User GetUserByCookie(string account, string password); void SaveCookie(User model); void ClearCookie(); } }
五 BLL层
引用 IDAL,DAL,Model,IBLL
主要BaseBll类
BaseBll
using System; using System.Collections.Generic; using System.Linq.Expressions; using FuturesContest.DAL; using FuturesContest.IDAL; using FuturesContestIBLL; namespace FuturesContest.BLL { public class BaseBll<T>:IBaseBll<T> where T:class,new () { private readonly IBaseDal<T> _dao = new BaseDal<T>(); public int Add(T entity) { return _dao.Add(entity); } public int AddReutrnIdentity(T entity) { return _dao.AddReutrnIdentity(entity); } public T AddReturnEntity(T entity) { return _dao.AddReturnEntity(entity); } public bool AddReturnBool(T entity) { return _dao.AddReturnBool(entity); } public int AddBatch(IEnumerable<T> list) { return _dao.AddBatch(list); } public int Delete(T entity) { return _dao.Delete(entity); } public int Delete(IEnumerable<T> list) { return _dao.Delete(list); } public int Delete(int id) { return _dao.Delete(id); } public int Delete(int[] ids) { return _dao.Delete(ids); } public int Delete(IEnumerable<int> ids) { return _dao.Delete(ids); } public int Modify(T entity) { return _dao.Modify(entity); } public int ModifyBatch(List<T> list) { return _dao.ModifyBatch(list); } public IEnumerable<T> QueryAll() { return _dao.QueryAll(); } public IEnumerable<T> QueryTop(int top) { return _dao.QueryTop(top); } public T QueryById(int id) { return _dao.QueryById(id); } public IEnumerable<T> QueryPage(Expression<Func<T, object>> orderBy, int OrderType, int pageIndex, int pageSize, ref int totalCount) { return _dao.QueryPage(orderBy, OrderType,pageIndex, pageSize,ref totalCount); } public IEnumerable<T> QueryByIf(Expression<Func<T, bool>> where) { return _dao.QueryByIf(where); } public IEnumerable<T> QueryByIfPage(Expression<Func<T, object>> orderBy, int orderType, Expression<Func<T, bool>> where, int pageIndex, int pageSize, ref int totalCount) { return _dao.QueryByIfPage(orderBy, orderType,where, pageIndex,pageSize,ref totalCount); } } }
userBll既要继承basebll,又要实现IuserBll
using System.Collections.Generic; using FuturesContest.IDAL; using FuturesContest.Model; using FuturesContestIBLL; using FuturesContest.DAL.Container; using FuturesContest.Tools; namespace FuturesContest.BLL { public class UserBll : BaseBll<User>, IUserBll { private readonly IUserDal _dao = Container.Resolve<IUserDal>(); public bool ExistAccount(string account) { var list = _dao.QueryByIf(m => m.Account == account) as List<User>; if (list == null) return false; return list.Count > 0; } public bool ExistNickName(string nickname) { var list = _dao.QueryByIf(m => m.NickName == nickname) as List<User>; if (list == null) return false; return list.Count > 0; } public bool IsRightPassword(User user) { var list = _dao.QueryByIf(m => m.Account == user.Account && m.Password == user.Password && m.IsEnabled == 1) as List<User>; if (list == null) return false; return list.Count > 0; } public User GetUserByAccount(string account) { var list = _dao.QueryByIf(m => m.Account == account && m.IsEnabled == 1) as List<User>; return list?.Count >= 1 ? list[0] : null; } public User GetUserByCookie(string account, string password) { var decPwd = DesEncrypt.Decrypt(password); var list = _dao.QueryByIf(m => m.Account == account && m.Password == decPwd && m.IsEnabled == 1) as List<User>; return list?.Count >= 1 ? list[0] : null; } public void SaveCookie(User model) { CookieHelper.WriteCookie("FuturesUserName", model.Account, 1440); var cookiePwd = DesEncrypt.Encrypt(model.Password); CookieHelper.WriteCookie("FuturesPassword", cookiePwd, 1440); } public void ClearCookie() { CookieHelper.WriteCookie("FuturesUserName", "", 0); CookieHelper.WriteCookie("FuturesPassword", "", 0); } } }
六 UI层
用MVC建立网站即可
七 viewModel层
UI层用到的强类型
八 Util层
公用的一些工具