定制GUI登录界面插件 (仅支持到桌面GUI客户端)

定制GUI登录界面插件 (仅支持到桌面GUI客户端)
本篇基础:BOS平台的二开编程(论坛),C#编程(ms),WPF编程(ms),Python语法, XML语法,VistualStudio2012(up)工具(ms),C/S基础知识,x86与x64基础知识
一、应用背景
在特殊行业应用中,对登录需求有特定业务场景,需要定制一些登录特定逻辑,例如医疗系统,POS系统,B2C后台系统等等。这时候通用界面可能信息太多,需要做 适当简化,就需要用到定制登录界面UI来满足需求。
二、部署二次开发组件
1、在K/3 Cloud服务器安装目录 的【WebSite\ClientBin\K3CloudClient\controlplugins】目录下部署二次开发.deploy组件。具体部署方法参考《答疑3:通过BOSIDE新建解决方案或应用方案》
2、(可选-部署方案,如果使用1的方案,这个步骤可忽略)增量.KDZ文件部署方式:
2.1、在云星空应用服务器安装目录的【WebSite/ClientBin/CustomControl/WPF】目录下部署二次开发组件,这个目录安装包会创建。
2.2、自定义组件可以用Zip压缩文件压缩为Zip格式,后修改后缀名为.kdz。
2.3、配置组件下载列表MainDownloadList.xml(篇幅调整,参考答疑的【疑问2】)
3、启动金蝶云星空客户端桌面版程序的桌面链接,这时程序会自动按照服务器地址设定检查组件版本,并按需要下载相关客制化组件到客户端电脑本地的 【%Program Files%\Kingdee\K3Cloud\DeskClient\K3CloudClient\controlplugins】目录下。
4、启动定制登录UI组件,在【%Program Files %\Kingdee\K3Cloud\WebSite\App_Data\】目录下,打开编辑Common.config,找到Appsettings节点,在该节点子节点中加入如下新节点,保存即启动插件成功:
<!--定制化登录界面-->
<add key ="CustomLoginUI" value="Kingdee.XPF.CustomControlPlugins.CustomLoginUI,Kingdee.XPF.CustomControlPlugins" />
<!--当定制化登录界面构建失败时,允许使用默认的登录界面代替-->
<add key ="AllowCustomUseDefLoginUI" value="true" />
特别注意:(千万不要修改上面的key属性,固定必须是“CustomLoginUI",value可以替换为你自己开发的控件组件,例如“LoginTest.LoginUI,LoginTest”,通用的DotNet类描述格式)
三、制作定制登录UI界面组件
1、在Visual Studio 2012中新增类库工程;需要新增有WPF界面元素的,必须新建WPF类库类型的工程。(.Net Framework 4 参考图片)

2、可下载运行客户端后,引用客户端目录下的基础组件如下(安装K/3 Cloud安装包+最新补丁,可得下面组件):
Kingdee.BOS.dll [必选],
Kingdee.BOS.Client.Core.dll [必选],
Kingdee.BOS.ServiceFacade.KDServiceClient.dll [可选],
Kingdee.BOS.ServiceFacade.KDServiceClientFx.dll [可选],
Kingdee.BOS.XPF.ControlPlugins.Contracts.dll [可选]
* 以上组件安装云星空桌面客户端后,在磁盘目录可以找到 【C:\Program Files (x86)\Kingdee\K3Cloud\DeskClient\K3CloudClient】

3、新建继承自DotNetWPF框架的UserControl(WPF)的类,编写定制化登录UI控件桌面客户端代码如下。重点实现IKDLoginControl接口。
重点关注LoginInfo GetLoginInfo()接口实现和调用 this.Owner.DoLogin()以及成功登录后调用this.Owner.LoadMainWindow()接口进入主控界面。
4、2015-11-09,6.0发布后,6.0的This.Owner接口改为IKDLoginControlOwner类型了。二开代码访问必须符合该接口类型。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Kingdee.BOS.Client.Core;
using Kingdee.BOS.Authentication;
using Kingdee.BOS.ServiceFacade.KDServiceClient.Account;
using Kingdee.BOS.ServiceFacade.KDServiceClient;
using Kingdee.BOS.DataCenterInfo;
namespace ZQWCustomLoginUI
{
/// <summary>
/// Interaction logic for ZQWLoginV1.xaml
/// </summary>
public partial class ZQWLoginV1: UserControl ,IKDLoginControl
{
IKDLoginControlOwner Owner { get; set; }
ItemModel currentDataCenter { get; set; }
public CustomLoginUI()
{
InitializeComponent();
this.Dispatcher.BeginInvoke(new Action(() => InitDataCenterList()));
}
private void InitDataCenterList()
{
CboDCName.DisplayMemberPath = "Name";
CboDCName.SelectedValuePath = "Id";
var proxy = new AccountClientProxy();
var dclist = proxy.GetDataCenterList();
CboDCName.ItemsSource = dclist;
CboDCName.SelectedIndex = 0;
}
public void ClearData()
{
}
public void DoLogin()
{
}
public bool Focus(string key)
{
return true;
}
public LoginInfo GetLoginInfo()
{
var acctID = CboDCName.SelectedValue as string;
string userName = this.TxtUserName.Text.Trim();
string userPwd = this.TxtPassword.Password.Trim();
int lcid = 2052;
var loginInfo = new LoginInfo() {
Username = userName,
Password = userPwd,
AcctID = acctID,
Lcid = lcid,
AuthenticateType = AuthenticationType.PwdAuthentication,
ClientInfo = this.GetOwner().GetClientInfo()
};
return loginInfo;
}
public IKDLoginControlOwner GetOwner()
{
return this.Owner;
}
/// <summary>
/// 获取窗口标题信息
/// </summary>
/// <returns></returns>
public string GetFormTitle()
{
return "ZQWLoginV1";
}
public bool IsDataLoaded()
{
return true;
}
public void LoadLocalSettings()
{
;
}
public IKDLoginControl NewInstance()
{
return new CustomLoginUI();
}
public void SaveLoginSettings()
{
;
}
public void SetOwner(IKDLoginControlOwner owner)
{
this.Owner = owner;
// owner.EnableShapeWindow(true); //只显示登录窗体定制部分.
}
public void SetProgressTips(string tips)
{
;
}
public void UpdateGobalLocalId(string localId)
{
;
}
public void Release()
{
this.Owner = null;
}
public KDSize GetUISize()
{
return new KDSize() { Height = 500, Width = 700 };
}
private void btnDoLogin_Click(object sender, RoutedEventArgs e)
{
var sDCName = DCName.Text;
var ret = this.Owner.DoLogin();
ret.Context.DataCenterName = sDCName;
if (ret.LoginResultType == LoginResultType.Success)
{
this.Owner.LoadMainWindow();
}
else
{
this.Owner.ShowErrorMessage(new Exception(ret.Message));
}
}
}
}
四、例子
1、按照【二、部署二次开发插件】中的第4小点打开默认插件;
2、运行客户端GUI程序应用,将会看到登录界面变成如下Demo定制登录UI插件的界面(演示界面,未做任何修饰和密码处理),如下图:

五、登录后逻辑 。(2016-03-18补丁功能)
1、登陆后获取LoginResult对象,判断是否需要窗口提示,并参考2中的工具类进行使用;
2、登录窗口弹出工具类:
2.1 使用系统默认密码修改框提示密码修改
Kingdee.BOS.XPF.Component.Utils.KDLoginUtils.ShowModifyPwdWindow(this.Owner as Window, new Action(() =>{
this.TxtPassword.Password = "";
this.TxtPassword.Focus();
}));
2.2 制定自定义单据FormId密码修改框提示密码修改
var arg = new Kingdee.BOS.Client.Core.KDLoginInfoChangeArgs()
{
OldPwd = oldPwd,
UserId = userid,
FormId = pwdFormid,//自定义单据
LayoutId = layoutid//自定义单据布局ID,为空默认布局
};
Kingdee.BOS.XPF.Component.Utils.KDLoginUtils.KDLoginUtils.ShowModifyPwdWindow(arg, AfterOpenPublishForm);
2.3 制定自定义单据FormId提示相关操作
var arg = new KDLoginInfoChangeArgs()
{
FormId = formId,//自定义单据
InputData = inputData//自定义单据传入数据,格式自定义
};
Kingdee.BOS.XPF.Component.Utils.KDLoginUtils.KDLoginUtils.ShowSpecialForm(arg, AfterOpenSpecialForm);
2.4 在K/3 Cloud的默认登录界面中,针对LoginResult.LoginResultType的处理如下,可以作为你的插件参考:
switch (loginRet.LoginResultType)
{
case LoginResultType.Failure:
KDMessageBox.Show(loginRet.Message,
定制GUI登录界面插件 (仅支持到桌面GUI客户端)
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



