就在上周,我们公司的大佬让我们熟悉一下NFine框架,参考NFine开发平台学习,于是按照步骤一步步的在电脑上部署平台环境,发布测试。
首先是映入眼中的是登录界面
输入账号密码,登录
界面还是挺友善的,舒适好看,随便点了一点发现功能几乎都没有实现。。
接下来当然是打开项目代码,查看项目目录结构了,如下图:
先给大家讲一下主要的目录结构,还有对应的功能作用,如果大家以前学过java的一些框架像SSH,SSM或者了解MVC设计模式都很容易理解并且上手操作的:
包含NFine.Code(底层核心类)和NFine.Data(数据层),这些都是固定的,我们不需要修改,比如NFine,Data下面的这些接口IRepositoryBase.cs等,我们可以声明仓库接口去继承这些接口,然后用对应类去实现,通过生成类对象进行方法调用,接下来会提。
展示一下IRepositoryBase接口里面的内容:
public interface IRepositoryBase : IDisposable
{
IRepositoryBase BeginTrans();
int Commit();
int Insert(TEntity entity) where TEntity : class, new();
int Insert(List entitys) where TEntity : class, new();
int Update(TEntity entity) where TEntity : class, new();
int Delete(TEntity entity) where TEntity : class, new();
int Delete(Expression> predicate) where TEntity : class, new();
TEntity FindEntity(object keyValue) where TEntity : class, new();
TEntity FindEntity(Expression> predicate) where TEntity : class, new();
IQueryable IQueryable() where TEntity : class, new();
IQueryable IQueryable(Expression> predicate) where TEntity : class, new();
List FindList(string strSql) where TEntity : class, new();
List FindList(string strSql, DbParameter[] dbParameter) where TEntity : class, new();
List FindList(Pagination pagination) where TEntity : class, new();
List FindList(Expression> predicate, Pagination pagination) where TEntity : class, new();
}
1、NFine.Domain中的03 Entity 里面都是一些bean,类似于javabean,包含表单bean,数据bean,结果bean等
比如我们待会会涉及到的UserEntity
public class UserEntity : IEntity, 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
{
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
{
void DeleteForm(string keyValue);
void SubmitForm(UserEntity userEntity, UserLogOnEntity userLogOnEntity, string keyValue);
}
有了仓库接口声明,肯定要有对应的实现类,这样我们就可以直接使用接口里定义的方法了
4、NFine.Repository就是定义对应的实现类
我们也来看看UserRepository里面长啥样
public class UserRepository : MySqlRepositoryBase, IUserRepository
{
public void DeleteForm(string keyValue)
{
...
}
public void SubmitForm(UserEntity userEntity, UserLogOnEntity userLogOnEntity, string keyValue)
{
...
}
}
5、NFine.Application这个就是业务逻辑层了,所有业务逻辑都是在这里编写
比如我们接下来要讲的登录功能的业务逻辑就是在这里编码实现的,我们来看看:
由于代码有点多,我就截图好了,CheckLogin这个方法就是写的登录逻辑
毫无疑问这里就是视图层和控制层两者结合了
先来看看控制层,和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的你们有所帮助,有问题可以留言,我最迟会在一天内帮你们解答。