框架PEANUT-WF接口与扩展
1.接口
1.1IDAL
(1). 数据字典
获取接口对象
var idic=PeanutProvider.Get<ISysDictionaryDal>();
接口说明
/// <summary>
/// 查询
/// </summary>
/// <param name="assembleName">程序集</param>
/// <param name="dicName">字典名称</param>
/// <returns></returns>
List<SysDictionaryEntity> QueryEntities(string assembleName, string dicName);
/// <summary>
/// 查询指定程序集、字典名称,并转换指定自定义实体
/// </summary>
/// <typeparam name="T">数据字典实体(属性包含多种类型entity、dic、list)</typeparam>
/// <param name="assembleName">程序集名称</param>
/// <param name="dicName">字典名称</param>
/// <returns></returns>
T ConvertToCusEntity<T>(string assembleName="", string dicName = "")
where T : class, new();
通过单例直接获取框架程序集的字典信息
var dicEntity=Ggo<PeanutDicEntity>.GetObj
DEMO
var idic=PeanutProvider.Get<ISysDictionaryDal>();
var entities = idic.QueryEntities("Peanut.BasePC.Wf", "class_info");
var entities2 = idic.ConvertToCusEntity<PeanutDicEntity>();
//获取框架已配置的信息,直接单例就可以
var entities3 = Ggo<PeanutDicEntity>.GetObj;
(2).系统编码
获取接口对象
var isysEndoce = PeanutProvider.Get<ISysEncodeDal>();
接口说明
/// <summary>
/// 获取最新的编码信息
/// </summary>
/// <typeparam name="T1"></typeparam>
/// <param name="columnName">列名</param>
/// <param name="exprEncodeName">编码字段名</param>
/// <param name="exprSort">排序字段名</param>
/// <param name="isDbSame">是否是同一个数据库</param>
/// <param name="lastRowData">如果不是同一个数据那么最新的编码信息是多少</param>
/// <returns></returns>
Tuple<bool, string> GetNewEncodeNo<T1>(string columnName, Expression<Func<T1, object>> exprEncodeName,Expression<Func<T1, object>> exprSort,
bool isDbSame = true, string lastRowData = "")
where T1 : class, new();
DEMO
var lastUserNo = "U-001";
var isysEndoce = PeanutProvider.Get<ISysEncodeDal>();
var newNo= isysEndoce.GetNewEncodeNo<SysUserEntity>("用户编号", x => x.UserNo, x => x.Id, false, lastUserNo);
//数据库与编码表所在库相同时候
var newNo2= isysEndoce.GetNewEncodeNo<SysUserEntity>("用户编号", x => x.UserNo, x => x.Id);
(3). 用户管理
获取对象
var iUserDal = PeanutProvider.Get<IBaseUserDal>();
接口说明
/// <summary>
/// 绑定方式查询
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="userNo">用户编号</param>
/// <param name="classLine">班组</param>
/// <param name="depart">部门</param>
/// <returns></returns>
DataTable QueryUserBind(string userName, string userNo, string classLine, string depart);
/// <summary>
/// 保存用户信息(表绑定)
/// </summary>
/// <returns></returns>
bool SaveUserBind();
/// <summary>
/// 登陆
/// </summary>
/// <param name="name">用户名</param>
/// <param name="pwd">密码</param>
/// <returns></returns>
SysUserEntity CheckLogin(string name, string pwd);
/// <summary>
/// 获取登陆信息集合
/// </summary>
/// <returns></returns>
List<SysUserEntity> GetUserList(string userNo = "");
/// <summary>
/// 更新编号
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
bool GetUserNo(ref string result);
/// <summary>
/// 根据用户名、用户编号查询实体
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="userNo">用户编号</param>
/// <returns></returns>
SysUserEntity QueryUserSingle(string userName, string userNo);
/// <summary>
/// 当前用户密码是否存在
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="userNo">用户编号</param>
/// <returns></returns>
bool CheckPwd(string userName, string userNo, string pwd);
/// <summary>
/// 批量新增用户
/// </summary>
/// <param name="list">实体集合</param>
/// <returns></returns>
int AddEntities(List<SysUserEntity> list);
1.2窗体
//单例
//系统 菜单栏
PeanutProvider.Get<SysMenuFrm>().ShowDialog();
//系统文件配置
PeanutProvider.Get<FileConfigFrm>().ShowDialog();
//用户管理
PeanutProvider.Get<SysUserForm>().ShowDialog();
//数据字典
PeanutProvider.Get<SysDictionaryFrm>().ShowDialog();
//框架主页接口
var imainFrm = PeanutProvider.Get<IFrameMain>();
(1)框架主页接口详情
/// <summary>
/// 添加窗体到TabPage
/// </summary>
/// <param name="control">Form、UserControl</param>
/// <param name="text">标题</param>
/// <param name="isSelect">是否选中</param>
void AddTabPage(ContainerControl control,string text, bool isSelect = false);
/// <summary>
/// 添加窗体到TabPage
/// </summary>
/// <param name="entity">菜单栏实体</param>
/// <param name="isSelect">是否选中</param>
void LoadTabPage(SysMenuEntity entity, bool isSelect = false);
/// <summary>
/// 通过sourceName获取实体
/// </summary>
/// <param name="resourceName">资源名称(注入名称或类全名)</param>
/// <returns></returns>
SysMenuEntity GetMenuEntity(string resourceName);
2.扩展
2.1文件配置初始化
将自定义用户控件(文件配置)扩展到框架配置模块中;
(1)创建用户控件并实现接口IFrameFileConfig两个方法
/// <summary>
/// 切换到当前TabPage以后点击刷新
/// </summary>
/// <param name="tab"></param>
public void RefreshConfig(object tab)
{
}
/// <summary>
/// 切换到当前TabPage的时候点击保存
/// </summary>
/// <param name="tab"></param>
public void SaveConfig(object tab)
{
}
(2)在系统初始化完成IOC注册;
container.RegisterType<UcFileConfig>().As<IFrameFileConfig>();
2.2框架主页底部扩展
将自定义用户控件扩展到框架底部(默认为消息通知栏)的右侧DockStyle.Right;
(1)创建用户控件并实现IFrameBottom接口
例如:我们创建用户控件UcBottom,并添加Led控件;
/// <summary>
/// 加载到框架底部以后加载
/// </summary>
/// <param name="bottomPl">底部通知栏Panel</param>
public void LoadBottom(Panel bottomPl)
{
}
(2)注册控件
container.RegisterType<UcBottom>().As<IFrameBottom>();
(3)在Form_Load中获取
var ucBottom = PeanutProvider<IFrameBottom>.Get<UcBottom>();
效果如下:
2.3插件扩展
将其他类库以插件的形式扩展到当前框架;
1.使用框架初始化解决方案
(1)引入Peanut.Initialize包(NET6.0/NET462同平台)与项目版本相同;
(2)添加初始化相关,并在IOCIni中完成相关注册;
(3)在PeanutConfig.config文件中的ModuleIniNameSpace节点配置模块信息,这里分两种情况,如果引用模块则,此处配置模块的实际程序集信息,如果只是将模块放到程序运行目录下,那么需要填写模块路径信息,如下:
(4)配置菜单栏
这里配置的程序集为实际的程序集信息;
(5)重启加载效果如下
(6)总结:
优点:与框架集成度高,且可以使用框架的初始化解决方案,且Peanut.Initialize包非常轻量级;
缺点:要求与框架是同平台,SDK版本要一致、包的版本一致;
使用场景:通常公司内部模块开发和扩展使用;
2.完全与框架不产生依赖,完全通过反射
(1)直接在PeanutConfig.Config配置ModuleIniNameSpace,具体同上
(2)配置菜单栏
(3)加载效果如下:
(4)总结:
优点:不要求加载模块与框架是同平台例如NET6.0可以加载NET462,没有框架引用没有其他约束,
缺点:由于只是加载模块的某个功能,可能很多初始化的未完成加载造成异常,由于跟框架依赖减少,可能相关功能通用性降低;
使用场景:由于项目需要单纯加载一个组件,且没法要求同平台的情况;
3.进程启动加载
以上两种情况或多或少的对平台、开发语言等有要求,当然扩展效果都是比较好的,且一定要了解模块的内部信息,如程序集、类名等资源,使用进程启动不需要这些限制,当然同时也是加载效果最不好,同时失败情况比较多,需要进行测试后才能确定,这里我们加载一个小工具测试一下;
4.WebBrowser
使用内嵌的Chrome浏览器组件,只需要将“加载模式”选择WebBrowser,设定“资源地址”为网站地址即可;
WebView2运行环境下载
总结:只面向Web集成
2.4用户自定义权限扩展
1.创建自定义权限模板
[UserAuthorityTemplate]
public class ProjectAuthorityEntity: IUserAuthorityTemplate
{
/// <summary>
/// 新增权限
/// </summary>
[TreeNode(1000, -1, "权限根节点")]
public AuthorityConfig RightsManagerParent { get; set; } = new AuthorityConfig();
[TreeNode(1001, 1000, "权限子节点1")]
public AuthorityConfig RightsManagerChild1 { get; set; } = new AuthorityConfig();
[TreeNode(1002, 1000, "权限子节点2")]
public AuthorityConfig RightsManagerChild2 { get; set; } = new AuthorityConfig();
/// <summary>
/// 新增权限
/// </summary>
[TreeNode(1010, -1, "权限根节点")]
public AuthorityConfig RightsManagerParent2 { get; set; } = new AuthorityConfig();
[TreeNode(1011, 1010, "权限子节点1")]
public AuthorityConfig RightsManagerChild12 { get; set; } = new AuthorityConfig();
[TreeNode(1012, 1010, "权限子节点2")]
public AuthorityConfig RightsManagerChild22 { get; set; } = new AuthorityConfig();
}
2.IOC注册模板
container.RegisterType<ProjectAuthorityEntity>().As<IUserAuthorityTemplate>();
3.加载权限模板
在菜单管理-用户管理-权限模板中,点击“加载模板”(如果框架权限也需要初始化可以勾选“包含框架”)则会将现有实体定义模板加载;
4.获取当前权限
var valid= Ggo.GetObj<ProjectAuthorityEntity>().RightsManagerChild12.Valid;
2.5权限验证IdentifyConfirmFrm
var identifyConfirmFrm = new IdentifyConfirmFrm(this, () =>
{
//验证通过以后
this.BeginInvoke(new Action(() => { c1DockingTab1.Enabled = true; }));
toolStrip1.Enabled = true;
}, () =>
{
//初始化未验证
this.BeginInvoke(new Action(() => { c1DockingTab1.Enabled = false; }));
toolStrip1.Enabled = false;
}, "8421");
3.服务
3.1WebApi
1.IOCIni中注册
container.RegisterSystemIni<PeanutServer, IServiceIni>();
2.初始化启动
public void ServiceLoad()
{
//登录成功以后启动WebApi服务器
ServiceStart.WebApiStart<StartupEx>();
}
3.创建Controller,通常在项目Api下