初学必看,NFine框架结构加MVC快速开发平台登录流程梳理(附源码)

就在上周,我们公司的大佬让我们熟悉一下NFine框架,参考NFine开发平台学习,于是按照步骤一步步的在电脑上部署平台环境,发布测试。

首先是映入眼中的是登录界面

输入账号密码,登录

界面还是挺友善的,舒适好看,随便点了一点发现功能几乎都没有实现。。

接下来当然是打开项目代码,查看项目目录结构了,如下图:

先给大家讲一下主要的目录结构,还有对应的功能作用,如果大家以前学过java的一些框架像SSH,SSM或者了解MVC设计模式都很容易理解并且上手操作的:

01Common 基础结构层

包含NFine.Code(底层核心类)和NFine.Data(数据层),这些都是固定的,我们不需要修改,比如NFine,Data下面的这些接口IRepositoryBase.cs等,我们可以声明仓库接口去继承这些接口,然后用对应类去实现,通过生成类对象进行方法调用,接下来会提。

展示一下IRepositoryBase接口里面的内容:

public interface IRepositoryBase : IDisposable
{
        IRepositoryBase BeginTrans();
        int Commit();
        int Insert<TEntity>(TEntity entity) where TEntity : class, new();
        int Insert<TEntity>(List<TEntity> entitys) where TEntity : class, new();
        int Update<TEntity>(TEntity entity) where TEntity : class, new();
        int Delete<TEntity>(TEntity entity) where TEntity : class, new();
        int Delete<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class, new();
        TEntity FindEntity<TEntity>(object keyValue) where TEntity : class, new();
        TEntity FindEntity<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class, new();
        IQueryable<TEntity> IQueryable<TEntity>() where TEntity : class, new();
        IQueryable<TEntity> IQueryable<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class, new();
        List<TEntity> FindList<TEntity>(string strSql) where TEntity : class, new();
        List<TEntity> FindList<TEntity>(string strSql, DbParameter[] dbParameter) where TEntity : class, new();
        List<TEntity> FindList<TEntity>(Pagination pagination) where TEntity : class, new();
        List<TEntity> FindList<TEntity>(Expression<Func<TEntity, bool>> predicate, Pagination pagination) where TEntity : class, new();
}

03 Domain应用服务

1、NFine.Domain中的03 Entity 里面都是一些bean,类似于javabean,包含表单bean,数据bean,结果bean等

比如我们待会会涉及到的UserEntity

 public class UserEntity : IEntity<UserEntity>, ICreationAudited, IDeleteAudited, IModificationAudited
{
        [DatabaseAttribute("varchar(50)", true, true, false, "", "主键")]
        public string F_Id { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "账户")]
        public string F_Account { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "姓名")]
        public string F_RealName { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "呢称")]
        public string F_NickName { get; set; }
        [DatabaseAttribute("text", false, false, false, null, "头像")]
        public string F_HeadIcon { get; set; }
        [DatabaseAttribute("tinyint", false, false, false, null, "性别")]
        public bool? F_Gender { get; set; }
        [DatabaseAttribute("datetime", false, false, false, null, "生日")]
        public DateTime? F_Birthday { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "手机")]
        public string F_MobilePhone { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "邮箱")]
        public string F_Email { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "微信")]
        public string F_WeChat { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "主管主键")]
        public string F_ManagerId { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "安全级别")]
        public int? F_SecurityLevel { get; set; }
        [DatabaseAttribute("text", false, false, false, null, "个性签名")]
        public string F_Signature { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "组织主键")]
        public string F_OrganizeId { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "部门主键")]
        public string F_DepartmentId { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "角色主键")]
        public string F_RoleId { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "岗位主键")]
        public string F_DutyId { get; set; }
        [DatabaseAttribute("tinyint", false, false, false, null, "是否管理员")]
        public bool? F_IsAdministrator { get; set; }
        [DatabaseAttribute("int(4)", false, false, false, null, "排序码")]
        public int? F_SortCode { get; set; }
        [DatabaseAttribute("tinyint", false, false, false, null, "删除标志")]
        public bool? F_DeleteMark { get; set; }
        [DatabaseAttribute("tinyint", false, false, false, null, "有效标志")]
        public bool? F_EnabledMark { get; set; }
        [DatabaseAttribute("varchar(500)", false, false, false, null, "描述")]
        public string F_Description { get; set; }
        [DatabaseAttribute("datetime", false, false, false, null, "创建日期")]
        public DateTime? F_CreatorTime { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "创建用户主键")]
        public string F_CreatorUserId { get; set; }
        [DatabaseAttribute("datetime", false, false, false, null, "最后修改时间")]
        public DateTime? F_LastModifyTime { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "最后修改用户")]
        public string F_LastModifyUserId { get; set; }
        [DatabaseAttribute("datetime", false, false, false, null, "删除时间")]
        public DateTime? F_DeleteTime { get; set; }
        [DatabaseAttribute("varchar(50)", false, false, false, null, "删除用户")]
        public string F_DeleteUserId { get; set; }
}

2、NFine.Mapping则是添加映射,将我们的每个Entity与它对应的表关联并指明主键

如UserEntity对应的UserMap

public class UserMap : EntityTypeConfiguration<UserEntity>
{
   public UserMap()
   {
       this.ToTable("Sys_User");
       this.HasKey(t => t.F_Id);
   }
}

Sys_User就是对应的表,而F_Id就是主键

3、NFine.Domain里的04 IRepository则是仓库接口的声明(上面讲NFine.Data时提到过),这些接口都会继承对应NFine.Data的IRepositoryBase接口

依旧看一下对应的IUserRepository

public interface IUserRepository : IRepositoryBase<UserEntity>
{
        void DeleteForm(string keyValue);
        void SubmitForm(UserEntity userEntity, UserLogOnEntity userLogOnEntity, string keyValue);
}

有了仓库接口声明,肯定要有对应的实现类,这样我们就可以直接使用接口里定义的方法了

4、NFine.Repository就是定义对应的实现类

我们也来看看UserRepository里面长啥样

public class UserRepository : MySqlRepositoryBase<UserEntity>, IUserRepository
{
        public void DeleteForm(string keyValue)
        {
            ...
        }
        public void SubmitForm(UserEntity userEntity, UserLogOnEntity userLogOnEntity, string keyValue)
        {
            ...
        }
}

5、NFine.Application这个就是业务逻辑层了,所有业务逻辑都是在这里编写

比如我们接下来要讲的登录功能的业务逻辑就是在这里编码实现的,我们来看看:

由于代码有点多,我就截图好了,CheckLogin这个方法就是写的登录逻辑

04 Web应用程序

毫无疑问这里就是视图层和控制层两者结合了

先来看看控制层,和Spring MVC的名命方式一样,叫做Controller

比如登录的控制器就是LoginController

视图层就是放在views下面了,也就是我们的一些html

好了,大概的结构就是这样,我们现在来讲一下它的登录功能,把整个流程跑一下,你或许可以进一步理解它的工作流程

第一步当然是看首页了

1、采用点击登录按钮,ajax()方法触发调用控制器

2、执行LoginController的CheckLogin()方法

3、调用业务逻辑层里的UserApp类的CheckLogin()方法,我们可以看到它声明了仓库接口的对象,并将对应实现的对象赋值。

这时就可以调用我们Data数据层的方法了

4、调用数据层的方法,通过用户名查询到对应的UserEntity,然后用账户获取了用户的日志信息Entity,验证密钥,相等的话就更新这个Entity,将用户最新登录信息日志更新,然后返回UserEntity(相当于结果bean)给我们的业务层。

5、业务层看返回的UserEntity是否为null,是的话就说明登录失败,不为null,则登录成功,然后做一些初始化操作,发一个转向信息给视图层,转到对应的页面。

讲了这么多,希望对刚学习NFine的你们有所帮助,有问题可以留言,我最迟会在一天内帮你们解答。

发布了54 篇原创文章 · 获赞 74 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_38992372/article/details/105266431