IApp接口

框架封装了整个应该程序的启动过程,也实现了启动画面、系统更新、同步日期、全局异常等常规功能,简化了系统的开发,因此需要提供功能扩展接口,系统中把相关的扩展点都封装在此接口中。

接口定义如下:

  1. /// <summary>
  2. /// 应用程序扩展接口
  3. /// <para>
  4. /// 框架封装了整个应该程序的启动过程,也实现了启动画面\系统更新\同步日期\全局异常等常规功能
  5. /// 简化了系统的开发,因此需要提供功能扩展接口,系统中把相关的扩展点都封装在此接口中。
  6. /// </para>
  7. /// </summary>
  8. public interface IApp
  9. {
  10. /// <summary>
  11. /// 读取应用程序配置
  12. /// <para>
  13. /// 定义应用程序在启动之初,如何读取系统配置信息,此函数是启动的第一步执行。
  14. /// </para>
  15. /// </summary>
  16. WinFormSetting GetSetting();
  17. /// <summary>
  18. /// 保存应用程序配置
  19. /// <para>
  20. /// 当系统配置信息发生变化时,如何保存系统配置信息。
  21. /// </para>
  22. /// </summary>
  23. /// <param name="setting">配置对象</param>
  24. void SaveSetting(WinFormSetting setting);
  25. /// <summary>
  26. /// 获取表格配置对象
  27. /// <para>
  28. /// 系统中对表格控件可以进行属性自定义,此函数返回表格配置信息操作类。
  29. /// </para>
  30. /// </summary>
  31. IGridSetting GetGridSetting();
  32. /// <summary>
  33. /// 获取登陆窗口
  34. /// <para>
  35. /// 定义系统登录窗口,如不需要登录,请返回null。
  36. /// </para>
  37. /// </summary>
  38. Form GetLoginForm();
  39. /// <summary>
  40. /// 获取主窗口
  41. /// <para>
  42. /// 定义系统主界面。不允许为null。
  43. /// </para>
  44. /// </summary>
  45. Form GetMainForm();
  46. /// <summary>
  47. /// 获取启动屏幕
  48. /// <para>
  49. /// 定义系统启动屏幕,必须遵守DevExpress组件启动屏幕规范。
  50. /// </para>
  51. /// </summary>
  52. Type GetSplashScreen();
  53. /// <summary>
  54. /// 获取等待窗体
  55. /// <para>
  56. /// 定义系统等待窗体,必须遵守DevExpress组件等待窗体规范。
  57. /// </para>
  58. /// </summary>
  59. Type GetWaitForm();
  60. /// <summary>
  61. /// 获取接口对象
  62. /// <para>
  63. /// 定义系统后台通讯接口操作对象。
  64. /// </para>
  65. /// </summary>
  66. /// <param name="setting">应用设置</param>
  67. WebApi GetApi(WinFormSetting setting);
  68. /// <summary>
  69. /// 用户登录
  70. /// <para>
  71. /// 定义用户登录过程。
  72. /// </para>
  73. /// </summary>
  74. /// <param name="account">账号</param>
  75. /// <param name="password">密码</param>
  76. /// <param name="captcha">验证码</param>
  77. /// <returns>成功返回True</returns>
  78. BoolMessage<SysUser> UserLogin(string account, string password, string captcha);
  79. /// <summary>
  80. /// 验证用户
  81. /// <para>
  82. /// 验证用户账号密码是否正确,与登录函数不同的是,此函数只验证账号密码,而用户登录还会有其他安全相关的操作和日志记录。
  83. /// </para>
  84. /// </summary>
  85. /// <param name="account">账号</param>
  86. /// <param name="password">密码</param>
  87. /// <param name="captcha">验证码</param>
  88. /// <returns>成功返回True</returns>
  89. BoolMessage UserValid(string account, string password, string captcha);
  90. /// <summary>
  91. /// 获取用户拥有的模块集合
  92. /// <para>
  93. /// 获取当前用户拥有的系统模块集合。
  94. /// </para>
  95. /// </summary>
  96. /// <param name="user">用户对象</param>
  97. IList<SysModule> GetModules(SysUser user);
  98. /// <summary>
  99. /// 客户端与服务端网络测试
  100. /// <para>
  101. /// 客户端和服务端进行网络测试。
  102. /// </para>
  103. /// </summary>
  104. bool Ping();
  105. /// <summary>
  106. /// 客户端心跳
  107. /// <para>
  108. /// 激活当前用户,保持当前客户端在线。
  109. /// </para>
  110. /// </summary>
  111. /// <param name="id">当前应用或者用户标识</param>
  112. bool Active(string id);
  113. /// <summary>
  114. /// 全局处理异常
  115. /// <para>
  116. /// 定义系统全局异常处理,只有用户未处理的异常才会再此统一处理,如果用户在函数中编写try catch,则不会触发此函数。
  117. /// </para>
  118. /// </summary>
  119. /// <param name="e">异常对象</param>
  120. void GlobalExceptionProcess(Exception e);
  121. }

默认实现

以下为系统默认实现,默认实现中所有的函数都是虚函数,每个函数都可以重写,根据自身的业务情况,重新相关函数。

  1. namespace XCI.Sys
  2. {
  3. /// <summary>
  4. /// 系统默认应用程序接口
  5. /// <para>
  6. /// 默认实现了系统应用程序接口,所有函数都是虚函数,可根据业务情况,重新父类函数。
  7. /// </para>
  8. /// </summary>
  9. public class BaseApplication : IApp
  10. {
  11. /// <summary>
  12. /// 读取应用程序配置
  13. /// <para>
  14. /// 定义应用程序在启动之初,此函数是启动的第一步执行。
  15. /// 默认实现是从输出目录下的app.json文件中读取配置信息
  16. /// </para>
  17. /// </summary>
  18. public virtual WinFormSetting GetSetting()
  19. {
  20. return ConfigFactory.Default.Get("WinForm", () => new WinFormSetting());
  21. }
  22. /// <summary>
  23. /// 保存应用程序配置
  24. /// <para>
  25. /// 当系统配置信息发生变化时,把配置信息保存到输出目录下的app.json文件
  26. /// </para>
  27. /// </summary>
  28. /// <param name="setting">配置对象</param>
  29. public virtual void SaveSetting(WinFormSetting setting)
  30. {
  31. ConfigFactory.Default.Save();
  32. }
  33. /// <summary>
  34. /// 获取表格配置对象
  35. /// <para>
  36. /// 系统中对表格控件可以进行属性自定义,此函数返回对象可以对用户保存的配置文件上传到服务器,也可以指定本地模式,不上传到服务器。
  37. /// </para>
  38. /// </summary>
  39. public virtual IGridSetting GetGridSetting()
  40. {
  41. //如果没有指定服务器地址,则使用本地模式
  42. return new DefaultGridSetting(SysRuntime.Setting.GridSettingLocalMode);
  43. }
  44. /// <summary>
  45. /// 获取登陆窗口
  46. /// <para>
  47. /// 定义系统登录窗口,如不需要登录,请返回null。
  48. /// </para>
  49. /// </summary>
  50. public virtual Form GetLoginForm()
  51. {
  52. return new FrmStandardLogin();
  53. }
  54. /// <summary>
  55. /// 获取主窗口
  56. /// <para>
  57. /// 定义系统主界面。不允许为null。
  58. /// </para>
  59. /// </summary>
  60. public virtual Form GetMainForm()
  61. {
  62. return new FrmStandardMain();
  63. }
  64. /// <summary>
  65. /// 获取启动屏幕
  66. /// <para>
  67. /// 定义系统启动屏幕,必须遵守DevExpress组件启动屏幕规范。
  68. /// </para>
  69. /// </summary>
  70. public virtual Type GetSplashScreen()
  71. {
  72. return typeof(FrmSplashScreen);
  73. }
  74. /// <summary>
  75. /// 获取等待窗体
  76. /// <para>
  77. /// 定义系统等待窗体,必须遵守DevExpress组件等待窗体规范。
  78. /// </para>
  79. /// </summary>
  80. public virtual Type GetWaitForm()
  81. {
  82. return typeof(FrmWait);
  83. }
  84. /// <summary>
  85. /// 获取接口对象
  86. /// <para>
  87. /// 定义系统后台通讯接口操作对象,函数返回值实现了在请求服务器时自动添加应用标识、时间戳、token等请求头。
  88. /// </para>
  89. /// </summary>
  90. /// <param name="setting">应用设置</param>
  91. public virtual WebApi GetApi(WinFormSetting setting)
  92. {
  93. return new SysWebApi(setting.Id,
  94. setting.ApiUrl,
  95. TimeSpan.FromMilliseconds(setting.ApiTimeout),
  96. setting.IsDebugMode);
  97. }
  98. /// <summary>
  99. /// 用户登录
  100. /// <para>
  101. /// 定义用户登录过程。
  102. /// </para>
  103. /// </summary>
  104. /// <param name="account">账号</param>
  105. /// <param name="password">密码</param>
  106. /// <param name="captcha">验证码</param>
  107. /// <returns>成功返回True</returns>
  108. public virtual BoolMessage<SysUser> UserLogin(string account, string password, string captcha)
  109. {
  110. return UserService.Instance.Login(account, password, captcha);
  111. }
  112. /// <summary>
  113. /// 验证用户
  114. /// <para>
  115. /// 验证用户账号密码是否正确,与登录函数不同的是,此函数只验证账号密码,而用户登录还会有其他安全相关的操作和日志记录。
  116. /// </para>
  117. /// </summary>
  118. /// <param name="account">账号</param>
  119. /// <param name="password">密码</param>
  120. /// <param name="captcha">验证码</param>
  121. /// <returns>成功返回True</returns>
  122. public virtual BoolMessage UserValid(string account, string password, string captcha)
  123. {
  124. return UserService.Instance.ValidUser(account, password, captcha);
  125. }
  126. /// <summary>
  127. /// 获取用户拥有的模块集合
  128. /// <para>
  129. /// 获取当前用户拥有的系统模块集合。
  130. /// </para>
  131. /// </summary>
  132. /// <param name="user">用户对象</param>
  133. public virtual IList<SysModule> GetModules(SysUser user)
  134. {
  135. return ModuleService.Instance.SelectListByUserId(user.Id);
  136. }
  137. /// <summary>
  138. /// 客户端与服务端网络测试
  139. /// <para>
  140. /// 客户端和服务端进行网络测试。
  141. /// </para>
  142. /// </summary>
  143. public virtual bool Ping()
  144. {
  145. return SysService.Instance.Ping();
  146. }
  147. /// <summary>
  148. /// 客户端心跳
  149. /// <para>
  150. /// 激活当前用户,保持当前客户端在线。
  151. /// </para>
  152. /// </summary>
  153. /// <param name="id">当前应用或者用户标识</param>
  154. public virtual bool Active(string id)
  155. {
  156. return OnlineUserService.Instance.Active(id);
  157. }
  158. /// <summary>
  159. /// 全局处理异常
  160. /// <para>
  161. /// 定义系统全局异常处理,只有用户未处理的异常才会再此统一处理,如果用户在函数中编写try catch,则不会触发此函数。
  162. /// </para>
  163. /// </summary>
  164. /// <param name="e">异常对象</param>
  165. public virtual void GlobalExceptionProcess(Exception e)
  166. {
  167. if (e is ControlValueException)
  168. {
  169. return;
  170. }
  171. if (e is SocketException se)
  172. {
  173. MessageBoxHelper.ShowError(DebugHelper.BuildAllMessage(se));
  174. }
  175. else if (e is AggregateException ae)
  176. {
  177. ae.Handle(p => true);
  178. MessageBoxHelper.ShowError(DebugHelper.BuildAllMessage(ae.InnerExceptions.ToArray()));
  179. }
  180. else if (e is WebApiException || e is BoolMessageFailException || e is BoolMessageValidException)
  181. {
  182. MessageBoxHelper.ShowError(e.Message);
  183. }
  184. else
  185. {
  186. var ef = new FrmException(e);
  187. ef.ShowDialog();
  188. ef.Dispose();
  189. }
  190. DebugHelper.Catch(e.Message);
  191. }
  192. }
  193. }

常见使用场景

  1. 快速原形测试

重新下面的函数,可以实现快速原形测试

  1. public override Form GetLoginForm()
  2. {
  3. return null;
  4. }
  5. public override Form GetMainForm()
  6. {
  7. return new Form1();
  8. }
  1. 临时修改系统配置
  1. public override WinFormSetting GetSetting()
  2. {
  3. var setting = base.GetSetting();
  4. setting.ApiUrl = "";//临时修改服务器根Url
  5. setting.ApiTimeout = 3000;//临时修改超时时间
  6. //修改其他属性值
  7. return setting;
  8. }
  1. 固定账号登录
  1. public override BoolMessage<SysUser> UserLogin(string account, string password, string captcha)
  2. {
  3. var user = new SysUser
  4. {
  5. Id = "123456780", //用户主键
  6. Account = "admin", //用户账号
  7. Name = "管理员" //用户姓名
  8. };
  9. //使用固定账号登录,实现快速登录
  10. return new BoolMessage<SysUser>(true,user);
  11. }

运行时对象

系统启动成功后,会把启动过程中产生的各种对象都保存在SysRuntime对象下面,这是一个静态类。

在后续的业务处理中有需要的时候直接调用SysRuntime的静态属性或者静态方法。

  1. namespace XCI.Sys
  2. {
  3. /// <summary>
  4. /// 应用程序运行时数据
  5. /// </summary>
  6. public static class SysRuntime
  7. {
  8. /// <summary>
  9. /// 启动参数
  10. /// </summary>
  11. public static string[] StartupArgs { get; set; }
  12. /// <summary>
  13. /// 当前应用程序对象
  14. /// </summary>
  15. public static IApp App { get; set; }
  16. /// <summary>
  17. /// 服务器名称
  18. /// </summary>
  19. public static string ServerName { get; set; }
  20. /// <summary>
  21. /// 应用程序设置
  22. /// </summary>
  23. public static WinFormSetting Setting { get; set; }
  24. /// <summary>
  25. /// 登陆窗口
  26. /// </summary>
  27. public static Form LoginForm { get; set; }
  28. /// <summary>
  29. /// 主窗口
  30. /// </summary>
  31. public static Form MainForm { get; set; }
  32. /// <summary>
  33. /// 启动屏幕类型
  34. /// </summary>
  35. public static Type SplashScreenType { get; set; }
  36. /// <summary>
  37. /// 加载等待窗体类型
  38. /// </summary>
  39. public static Type WaitFormType { get; set; }
  40. /// <summary>
  41. /// 业务接口操作对象
  42. /// </summary>
  43. public static WebApi Api { get; set; }
  44. /// <summary>
  45. /// 当前应用程序登陆用户
  46. /// </summary>
  47. public static SysUser CurrentUser { get; set; }
  48. /// <summary>
  49. /// 添加主页面文档
  50. /// </summary>
  51. /// <param name="code">编码</param>
  52. /// <param name="form">窗体</param>
  53. public static void AddTabDocument(string code, Form form);
  54. /// <summary>
  55. /// 是否有指定模块编码的权限
  56. /// </summary>
  57. /// <param name="codes">模块编码集合</param>
  58. /// <returns>存在返回true,否则返回false</returns>
  59. public static bool IsAuthorize(params string[] codes);
  60. }
  61. }