就在上周,我们公司的大佬让我们熟悉一下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的你们有所帮助,有问题可以留言,我最迟会在一天内帮你们解答。

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

  1. 用ionic快速开发hybird App(已附源码,在下面+总结见解)

    用ionic快速开发hybird App(已附源码,在下面+总结见解) 1.ionic简介 ionic 是用于敏捷开发APP的解决方案.核心思路是:利用成熟的前端开发技术,来写UI和业务逻辑.也就是说 ...

  2. leaflet-webpack 入门开发系列二加载不同在线地图切换显示(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载 webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 ...

  3. Hexo+Butterfly 快速搭建个人博客【附源码】

    先上效果 在线查看:https://hongxh.cn/ Github 源码 https://github.com/hxh2010/hexo-butterfly Hexo hexo在线文档 安装: $ ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理(附源码)

    前言目录 前言:时间很快,已经快到春节的时间了,这段时间由于生病,博客基本没更新,所以今天写一下我们做的一个项目吧,是对权限的基本操作的操作,代码也就不怎么说了,直接上传源码和图片展示,下面我们直接进 ...

  5. PHPCMS V9 实现下拉加载的方法,兼容手机端(附源码下载)

    PHPCMS V9 实现下拉加载的方法,兼容手机端 HTML部分 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2 ...

  6. 「兔了个兔」看我如何抓取兔兔图片到本地(附源码)

  7. Springboot快速开发-书本信息管理系统(项目源码)

    [我后续会发一个资源包,里面是所有代码,数据库表设计也有,大学生可以直接用,导入数据库运行,再导入后端项目和前端项目,再去网页运行就好了,效果图下面有] 1.考核要求: 数据库:MYSQL5.7+ 后 ...

  8. OpenCvSharp (C# OpenCV) DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别、骰子识别、菜品识别)(附源码)

    本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别.骰子识别.菜品识别)! 前言: 下 ...

  9. JNPF快速开发平台——业务流程系统(BPM)开发方案

    项目简介 随着计算机技术的发展和互联网时代的到来,我们已经进入了信息时代,也称为数字化时代,在这数字化的时代里,企业的经营管理都受到了极大的挑战.从上世纪90年代起至今,企业的信息化工作开展的如火如荼 ...

  10. 【人工智能“六步走”学习路线】(初学必看)

    [人工智能"六步走"学习路线](初学必看) 学习笔记第三篇 1.学习并掌握一些数学知识 高等数学是基础中的基础,一切理工科都需要这个打底,数据挖掘.人工智能.模式识别此类跟数据打交 ...

最新文章

  1. android中volley通信框架简介
  2. python入门指南百度云-Python入门指南
  3. time.h 详细介绍
  4. Oracle 11g新特性:Automatic Diagnostic Repository
  5. 输入控件tagsinput
  6. 一首歌,一种情感,一种心情
  7. css 图片自适应_img图片自适应object-fit
  8. android检测手机网络连接不上,Android WIFI及手机网络连接情况检查
  9. setjmp 与 longjmp
  10. 字符串压缩——C语言
  11. 微信外卖点餐系统开发教程
  12. 你了解实时3D渲染吗?实时渲染软件和应用场景科普来了
  13. 使用Photoshop出现提示“脚本错误-50出现一般Photoshop错误“
  14. windows保护无法启动修复服务器,win10使用命令修复系统时提示Windows 资源保护无法启动修复服务怎么办...
  15. spring boot 2.1.7启动过程源码解析
  16. 转一篇关于安装vue脚手架 执行到安装demo:setup e2e tests with nightwacth 要不要选择NO的问题的解释
  17. 麻省理工学院|软件构造|课程翻译
  18. 计算球体积和球表面积
  19. java日志管理-学习(一)
  20. 数据库设计:需求分析

热门文章

  1. python程序应用经典实例-精心整理!9个 Python 实用案例分享
  2. 将txt格式的地图导入到ArcMap
  3. java 铁路管理信息系统_java多线程之铁路售票系统
  4. Testbench编写方法
  5. linux 锐捷客户端 脚本,基于802.1x的锐捷linux客户端
  6. c语言二级考试报名费,c语言二级考试(计算机二级c语言报名)
  7. 写一个小程序实现win系统定时锁屏
  8. 我是一只IT小小鸟(转载)
  9. DXperience重编译汉化的方法
  10. 计算机科学导论第12版答案,计算机科学导论第12章参考答案.pdf