一、前言

本人从事多年医疗管理软件的开发,在医院大多数的软件都还是CS程序,BS程序很少,对于使用者来说CS的操作体验确实比BS的要好。

1、CS的缺点就是升级麻烦,每次有新版本都需要所有客户端操作升级。有没有办法像BS程序那样刷新一下页面就是最新程序?

2、还有就是企业软件项目个性化需求都特别多,特别是界面上的每一个项目可能要求都不太一样,比如表单录入一个项目一个版本是很正常的现象,那有没有办法把界面层的开发单独出来,采用配置的方式了?

3、另外就是现在的开发模式,如果在现场修改问题太麻烦了,改完代码后得编译、发布、升级客户才能看到最新效果,特别怀念以前存储过程的方式,只要往数据库提交最新的SQL,客户立马看到效果。所有界面开发能不能做到像存储过程这样,在运行的程序中直接打开程序代码修改完保存,界面修改过来?

最后,琢磨出使用脚本语言来开发Winform程序,这样上面三个问题就完美解决了,这就是efwplusScript。

 

二、efwplusScript介绍

 

上图就是采用efwplusScript开发的一个简单增删改查的实例,虽然看上去像网页,其实还是Winform程序,点击地址栏的刷新按钮,页面实时显示最新内容,无需升级操作。页面上的所有功能没有一句C#代码,都是采用脚本语言开发。下图显示编写脚本的主界面。

 

可视化设计界面

 

如上图,直接使用efwplusStudio.exe这个工具就可以开发Winform界面程序。支持新建云软件项目,新建界面,可视化设计界面,编写脚本代码,还可以直接运行调试等。

 

三、efwplusStudio.exe开发工具说明

 

1、脚本资源

Config:配置当前程序有多少个云软件

WinAssembly:依赖的程序集

WinScript:云软件的脚本文件

2、代码编辑器,编写python代码、XML代码和界面设计

3、本地云软件,列出所有云软件,双击界面节点可以打开对应页面。

4、跟踪调试,显示调试日志

 

四、efwplusClient.exe客户端说明

 

efwplusClient有点像一个自定义的浏览器,支持打开网页和Winform程序,相当于BS和CS混合展示的客户端程序。

除了通过地址打开页面,efwplusClient还整合了管理软件的权限功能,点击左上角的菜单按钮,会弹出登录界面,登录后会根据用户权限加载对应功能菜单。

 

efwplusClient整合的功能包括:

1、组织机构,包括机构信息、科室维护、人员信息

2、用户权限,包括用户维护、系统菜单、角色权限

3、其他设置,包括系统参数、报表管理、消息管理、字典管理、图标管理

 

人员信息

 

图标管理

 

字典管理

 

五、快速开始(Hello实例)

1、新建云软件

 

2、查看Config/CloudSoftConfig.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <cloudsoftList>
  4.  
  5. <cloudsoftClient name="Login" path="WinScript/Login/config.xml" title="登录权限" version="1.0" />
  6.  
  7. <cloudsoftClient name="BasicSetting" path="WinScript/BasicSetting/config.xml" title="基础模块" version="1.0" />
  8.  
  9. <cloudsoftClient name="Hello" path="WinScript/Hello/config.xml" title="Hello" version="1.0" />
  10.  
  11. <cloudsoftClient name="BooksDemo" path="WinScript/BooksDemo1.0/config.xml" title="书籍示例" version="1.0" />
  12.  
  13. <cloudsoftClient name="Test" path="WinScript/Test/config.xml" title="测试" version="1.0" />
  14.  
  15. </cloudsoftList>

 

3、查看WinScript/Hello/config.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <configuration>
  4.  
  5. <cloudsoft name="Hello" title="Hello" version="1.0" author="kakake">
  6.  
  7. <baseinfo>
  8.  
  9. <data key="introduction" value="软件介绍" />
  10.  
  11. <data key="updaterecord" value="更新记录" />
  12.  
  13. </baseinfo>
  14.  
  15. <controllerList>
  16.  
  17. <WinformController ControllerName="Controller01" DllName="efwplusWinform.dll" TypeName="EFWCoreLib.WinformFrame.Controller.WinformController" DefaultViewName="View01" ScriptFile="WinScript\Hello\controller\Controller01.py">
  18.  
  19. <WinformView Name="View01" DllName="efwplusWinform.dll" ViewTypeName="EFWCoreLib.CoreFrame.Business.BaseFormBusiness" ViewFile="WinScript\Hello\view\View01.xml" Memo="" />
  20.  
  21. </WinformController>
  22.  
  23. </controllerList>
  24.  
  25. <AssemblyList>
  26.  
  27. </AssemblyList>
  28.  
  29. <fileList>
  30.  
  31. <file path="efwplusClient\WinScript\Hello\cloudsoft.py" />
  32.  
  33. <file path="efwplusClient\WinScript\Hello\config.xml" />
  34.  
  35. <file path="efwplusClient\WinScript\Hello\__init__.py" />
  36.  
  37. <file path="efwplusClient\WinScript\Hello\controller\Controller01.py" />
  38.  
  39. <file path="efwplusClient\WinScript\Hello\controller\__init__.py" />
  40.  
  41. <file path="efwplusClient\WinScript\Hello\model\Model01.py" />
  42.  
  43. <file path="efwplusClient\WinScript\Hello\model\__init__.py" />
  44.  
  45. <file path="efwplusClient\WinScript\Hello\view\View01.py" />
  46.  
  47. <file path="efwplusClient\WinScript\Hello\view\View01.xml" />
  48.  
  49. <file path="efwplusClient\WinScript\Hello\view\__init__.py" />
  50.  
  51. </fileList>
  52.  
  53. </cloudsoft>
  54.  
  55. </configuration>

 

4、查看WinScript/Hello/controller/Controller01.py

  1. # -*- coding: UTF-8 -*-
  2.  
  3. __author__ = 'kakake'
  4.  
  5. global trace
  6. #日志显示开始加载脚本
  7. trace.printlog('begin load Controller01.py',True)
  8. import sys
  9. sys.path.append("WinScript/Hello")
  10. #将trace设置为跨文件的全局变量
  11.  
  12. import cloudsoft as soft
  13. soft.set_trace(trace)
  14. #导入自己的模块
  15.  
  16. from model.Model01 import Model01
  17. from view.View01 import View01
  18. #导入常用的模块
  19.  
  20. import json
  21. from datetime import datetime
  22. #入口函数
  23.  
  24. def main(_controller):
  25. try:
  26. trace.printlog('call main')
  27. view01 = View01(_controller) # 有几个界面类就要实例化几个
  28. controller01 = Controller01(_controller,view01) # 先实列化控制器类,然后在把对象传给界面类,这样界面就可以直接调用控制器中的方法
  29.  
  30.  
  31. return 0;
  32. except Exception,ex:
  33. return ex;
  34. #控制器类
  35.  
  36. ##############################################################
  37.  
  38. class Controller01(object):
  39. def __init__(self, _controller,_view01):
  40. self.controller=_controller
  41. self.view01=_view01
  42. self.rview01=_controller.RenderList['View01']
  43. #注册事件
  44. self.rview01.initload(self.viewload)
  45. self.rview01.bind('btnHello', 'click', self.Hello)
  46. #界面初始化加载
  47.  
  48. def viewload(self):
  49. pass
  50.  
  51. def Hello(self,sender,e):
  52. self.rview01.msgbox('Hello World!','提示','ok','info')
  53. trace.printlog('hello world')
  54. ##############################################################
  55.  
  56.  
  57.  
  58.  
  59. #日志显示脚本加载完成
  60. trace.printlog('end load Controller01.py')

View Code

 

 

5、查看WinScript/Hello/view/View01.xml和View01.py

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <viewform>
  4.  
  5. <winform size="880,500" tabindex="0" text="Hello World" name="View01" visible="false" width="880">
  6.  
  7. <panel type="panelEx" dock="fill" location="0,0" name="PanelEx1" size="864,461" tabindex="0" width="864">
  8.  
  9. <button type="buttonX" text="Hello World" location="371,113" name="btnHello" size="95,23" tabindex="0" width="95" />
  10.  
  11. </panel>
  12.  
  13. </winform>
  14.  
  15. </viewform>

View Code

 

  1.  
  2. # -*- coding: UTF-8 -*-
  3.  
  4. __author__ = 'kakake'
  5.  
  6.  
  7. import sys
  8. import cloudsoft as soft
  9. trace=soft.get_trace()
  10. #日志开始加载脚本
  11. trace.printlog('begin load View01.py')
  12. # 界面类
  13.  
  14. ##############################################################
  15.  
  16. class View01(object):
  17. def __init__(self, _controller):
  18. self.view = _controller.RenderList['View01']
  19. ##############################################################
  20.  
  21.  
  22.  
  23. #日志显示脚本加载完成
  24. trace.printlog('end load View01.py')

View Code

 

6、查看WinScript/Hello/model/Model01.py

 

  1. # -*- coding: UTF-8 -*-
  2.  
  3. __author__ = 'kakake'
  4.  
  5. import sys
  6. import cloudsoft as soft
  7. trace=soft.get_trace()
  8. #日志开始加载脚本
  9. trace.printlog('begin load Model01.py')
  10. #实体类
  11.  
  12. ##############################################################
  13.  
  14. class Model01(object):
  15. def __init__(self):
  16. pass
  17.  
  18.  
  19. ##############################################################
  20.  
  21.  
  22. #日志显示脚本加载完成
  23. trace.printlog('end load Model01.py')

View Code

 

 

 

六、efwplusScript实现原理

1、云软件

.net开发是以dll程序集为最终程序文件,而efwplusScript开发为一个云软件。

一个云软件中包括controller、model、view各种代码文件,efwplusClient是按云软件为单位运行的。这些云软件配置在Config/CloudSoftConfig.xml文件中。

云软件的代码结构也是采用MVC模式,分为Controller、Model和View,config.xml为云软件配置文件,cloudsoft.py存放全局数据和函数。

云软件有多个入口,每个controller.py文件都可以是程序入口,一般的程序都只有一个入口函数。

2、可视化界面设计

3、数据库操作

4、调用efwplus微服务

5、调用RESTful API

 

efwplusScript程序下载:加QQ群399651389中共享文件中获取。

源代码获取:https://gitee.com/kakake/efwplusScript

 

程序安装教程:

1、还原数据库CloudSoftDB.bak(SqlServer2012,备份数据库群文件中获取),然后在efwplusServer\Config\EntLib.config文件中修改数据库连接字符串。

2、启动服务端程序efwplusServer\efwplusBase.exe(以管理员运行,第一次打开程序会提示自动获取授权码)

3、配置完以上,就可以启动efwplusClient\efwplusClient.exe和efwplusStudio.exe

 

版权声明:本文为kakake原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/kakake/p/9880153.html