期货大赛项目|一,框架搭建

先上个架构图,接下来在一一分析.


一 实体层

引用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; }
    }
}
View Code

说明:

[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
    }
}
View Code

我会在后面的随笔中详细讲DAL和BLL的封装

除了公用的方法,我们可能还需要一些user自己的方法,也定义个接口

IUserDal

using FuturesContest.Model;
namespace FuturesContest.IDAL
{
    public interface IUserDal :IBaseDal<User>
    {
    }
}
View Code

三 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;
        }
    }
}
View Code

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;
            }
        }
    }
}
View Code

UserDal既要实现IuserDal,又要继承BaseDal

userdal

using FuturesContest.IDAL;
using FuturesContest.Model;

namespace FuturesContest.DAL
{
    public class UserDal:BaseDal<User>,IUserDal
    {
    }
}
View Code

四 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
    }
}
View Code

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();
    }
}
View Code

五 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);
        }
    }
}
View Code

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);

        }
    }
}
View Code

六 UI层

用MVC建立网站即可

七 viewModel层

UI层用到的强类型

八 Util层

公用的一些工具

猜你喜欢

转载自www.cnblogs.com/tanfuchao/p/9207659.html