定制GUI客户端登录demo原创
金蝶云社区-勤劳的小蜜蜂
勤劳的小蜜蜂
18人赞赏了该文章 1,406次浏览 未经作者许可,禁止转载编辑于2021年03月17日 07:40:08

第一步:在Visual Studio 2012中新增类库工程;需要新增有WPF界面元素的,必须新建WPF类库类型的工程。(.Net Framework 4 参考图片),温馨提示:最好用Visual Studio 2012工具进行编写

image.png

第二步:引入金蝶组件

Kingdee.BOS.dll [必选], 
Kingdee.BOS.Client.Core.dll [必选], 
Kingdee.BOS.ServiceFacade.KDServiceClient.dll [可选],
Kingdee.BOS.ServiceFacade.KDServiceClientFx.dll [可选],

Kingdee.BOS.XPF.ControlPlugins.Contracts.dll [可选]

log4net2 [必选]

* 以上组件安装云星空桌面客户端后,在磁盘目录可以找到 【C:\Program Files (x86)\Kingdee\K3Cloud\DeskClient\K3CloudClient

image.png

第三步:编辑界面即编辑**.xaml页面

image.png

image.png

第四步:编辑登录逻辑(在**.xaml.cs编辑)

using Kingdee.BOS.Authentication;

using Kingdee.BOS.Client.Core;

using Kingdee.BOS.DataCenterInfo;

using Kingdee.BOS.ServiceFacade.KDServiceClient.Account;

using Kingdee.BOS.Util;

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;


namespace ZQWCustomLoginUI

{

    /// <summary>

    /// UserControl1.xaml 的交互逻辑

    /// </summary>

    public partial class ZQWLoginV1 : UserControl, IKDLoginControl

    {

        IKDLoginControlOwner Owner { get; set; }

        //IKDLoginControlOwner _Owner = null;

        ItemModel currentDataCenter { get; set; }

        public ZQWLoginV1()

        {

            InitializeComponent();

        }


        private void Button_Click_1(object sender, RoutedEventArgs e)

        {

            //MessageBox.Show(string.Format("userName:{0}\r\npassword:{1}", TxtUserName.Text, TxtPassword.Text));

            var sDCName = TxtDataCenter.Text;

            var ret = this.Owner.DoLogin();

            ret.Context.DataCenterName = sDCName;

            // ret.C.DataCenterName = sDCName;

            if (ret.LoginResultType == LoginResultType.Success)

            {

                this.Owner.LoadMainWindow();

            }

            else

            {

                this.Owner.ShowErrorMessage(new Exception(ret.Message));

            }

        }


        public void ClearData()

        {

            //

        }


        public void DoLogin()

        {

            //

        }


        public bool Focus(string key)

        {

            return true;

        }


        public string GetFormTitle()

        {

            return "***登录窗口";

        }


        public LoginInfo GetLoginInfo()

        {

            //演示案例

            //var loginInfo=DemoLoginIfo();

            //需要密码登录

            //var loginInfo = NeedPwdLoginIfo();

            //不需要密码登录

            var loginInfo = NoNeedPwdLoginIfo();

            return loginInfo;

        }

        /// <summary>

        /// 免密登录

        /// </summary>

        /// <returns></returns>

        private LoginInfo NoNeedPwdLoginIfo()

        {

            var ret = new Kingdee.BOS.Authentication.LoginInfo()

            {

                ClientInfo = this.GetOwner().GetClientInfo(),

                PasswordIsEncrypted = false,

                Password = "xxxx",//任意字符串,但不能为空    

                // 此处是强制使用【简单证书】登陆    

                AuthenticateType = AuthenticationType.SimplePassportAuthentication,

                AcctID = "604f2bb47fd138", //数据中心ID     

                Username = TxtUserName.Text,

                Lcid = 2052,

                AppId = "212233_QY3M4ZuFUnp/4+/FT+6O5ZVs0I5ZXKKP", //第三方系统appid    

                // Timestamp = DateTime.Now.GetTimestamp().ToString(), //时间戳,  

                Timestamp = DateTimeFormatUtils.CurrentTimeMillis() / 1000,//时间戳,

                AppSecret = "cce93638737e4d09b15d9c027cbd2a37",//第三方系统密钥

                // 第三方系统登陆授权生成签名数据    

                SignedData = Kingdee.BOS.Util.SHA1Util.GetSignature(

                new string[] { "604f2bb47fd138", TxtUserName.Text, "212233_QY3M4ZuFUnp/4+/FT+6O5ZVs0I5ZXKKP",

                    "cce93638737e4d09b15d9c027cbd2a37", (DateTimeFormatUtils.CurrentTimeMillis() / 1000).ToString() })

            };

            Kingdee.BOS.Client.Core.ClientAppProxy.Current.StartAppVerifyCustomArgs =

                "{dbid:'" + ret.AcctID + "',username:'" + ret.Username + "',appid:'" + ret.AppId + "',signeddata:'" + ret.SignedData + "',timestamp:'" + ret.Timestamp + "',lcid:'2052',usertoken:'',formid:'',pkid:'',formtype:'',otherargs:'',origintype:'SimPas',entryrole:''}";

            return ret;

        }

        /// <summary>

        /// 需要密码登录

        /// </summary>

        /// <returns></returns>

        private LoginInfo NeedPwdLoginIfo()

        {

            var sDCName = TxtDataCenter.Text;

            var proxy = new AccountClientProxy();

            var dt = DateTime.Now;

            var dclist = proxy.GetDataCenterList();

            var dcItem = dclist.Find(new Predicate<DataCenter>((dc) =>

            {

                return dc.Name.Equals(sDCName);

            }));

            this.currentDataCenter = new ItemModel()

            {

                ID = dcItem.Id,

                Header = dcItem.Name

            };

            string userName = this.TxtUserName.Text.Trim();

            string userPwd = this.TxtPassword.Text.Trim();

            int lcid = 2052;

            string acctID = this.currentDataCenter.ID;

            var loginInfo = new LoginInfo()

            {

                Username = userName,

                Password = userPwd,

                AcctID = acctID,

                Lcid = lcid,

                AuthenticateType = AuthenticationType.PwdAuthentication,

                ClientInfo = this.GetOwner().GetClientInfo()

            };

            return loginInfo;

        }

        /// <summary>

        /// 演示案例

        /// </summary>

        private LoginInfo DemoLoginIfo()

        {


            var ret = new LoginInfo();

            ret.LoginType = LoginType.NormalERPLogin;

            ret.AuthenticateType = AuthenticationType.PwdAuthentication;

            ret.Username = TxtUserName.Text;

            ret.Password = TxtPassword.Text;

            ret.Lcid = 2052;

            ret.AcctID = "xxxxx";

            return ret;

        }


        public IKDLoginControlOwner GetOwner()

        {

            return this.Owner;

        }


        public KDSize GetUISize()

        {

            return new KDSize();

        }


        public bool IsDataLoaded()

        {

            return true;

        }


        public void LoadLocalSettings()

        {

            //

        }


        public IKDLoginControl NewInstance()

        {

            return new ZQWLoginV1();

        }


        public void Release()

        {

            //

        }


        public void SaveLoginSettings()

        {

            //throw new NotImplementedException();

        }

        public void SetOwner(IKDLoginControlOwner owner)

        {

            this.Owner = owner;

        }


        public void SetProgressTips(string tips)

        {

            //throw new NotImplementedException();

        }


        public void UpdateGobalLocalId(string localId)

        {

            //throw new NotImplementedException();

        }

    }

}

第五步:制作二开组件(

1:编译生成.dll文件)

image.png

2:将生成的dll文件压缩ZIP文件,后修改文件后缀

例如:ZQWCustomLoginUI.ZIP->ZQWCustomLoginUI.dll.kdz

3:将修改后文件放入D:\Program Files (x86)\Kingdee\K3Cloud\WebSite\ClientBin\CustomControl\WPF目录下

image.png

第六步:修改配置文件

1:修改MainDownloadList.xml文件,手工拷贝一个节点(一个文件需要一个节点进行注册如下图)。然后修改文件名为你的组件名就好了。

image.png

image.png

2:修改MainDownload.xml,修改版本信息为当前时间(与上一步修改MainDownloadList.xml文件中VersionInfo保持一致),不然加载不到二开组件

image.png

image.png

3:修改Common.config文件,找到Appsettings节点,在该节点子节点中加入如下新节点,保存即启动插件成功:

image.png



<!--定制化登录界面-->

<!--<add key="CustomLoginUI" value="ZQWpfControlLibraryLogin.UserControl1,ZQWpfControlLibraryLogin"/>-->

<add key="CustomLoginUI" value="ZQWCustomLoginUI.ZQWLoginV1,ZQWCustomLoginUI"/>

<!--当定制化登录界面构建失败时,允许使用默认的登录界面代替-->

<add key="AllowCustomUseDefLoginUI" value="true"/>

特别注意:(千万不要修改上面的key属性,固定必须是“CustomLoginUI",value可以替换为你自己开发的控件组件,例如“LoginTest.LoginUI,LoginTest”,通用的DotNet类描述格式)

第七步:点击客户端,启动客户端即可观看如下效果

image.png




赞 18