一、前言

本人从事多年医疗管理软件的开发,在医院大多数的软件都还是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

<?xml version="1.0" encoding="utf-8"?>

<cloudsoftList>

<cloudsoftClient name="Login" path="WinScript/Login/config.xml" title="登录权限" version="1.0" />

<cloudsoftClient name="BasicSetting" path="WinScript/BasicSetting/config.xml" title="基础模块" version="1.0" />

<cloudsoftClient name="Hello" path="WinScript/Hello/config.xml" title="Hello" version="1.0" />

<cloudsoftClient name="BooksDemo" path="WinScript/BooksDemo1.0/config.xml" title="书籍示例" version="1.0" />

<cloudsoftClient name="Test" path="WinScript/Test/config.xml" title="测试" version="1.0" />

</cloudsoftList>

3、查看WinScript/Hello/config.xml

<?xml version="1.0" encoding="utf-8"?>

<configuration>

<cloudsoft name="Hello" title="Hello" version="1.0" author="kakake">

<baseinfo>

<data key="introduction" value="软件介绍" />

<data key="updaterecord" value="更新记录" />

</baseinfo>

<controllerList>

<WinformController ControllerName="Controller01" DllName="efwplusWinform.dll" TypeName="EFWCoreLib.WinformFrame.Controller.WinformController" DefaultViewName="View01" ScriptFile="WinScript\Hello\controller\Controller01.py">

<WinformView Name="View01" DllName="efwplusWinform.dll" ViewTypeName="EFWCoreLib.CoreFrame.Business.BaseFormBusiness" ViewFile="WinScript\Hello\view\View01.xml" Memo="" />

</WinformController>

</controllerList>

<AssemblyList>

</AssemblyList>

<fileList>

<file path="efwplusClient\WinScript\Hello\cloudsoft.py" />

<file path="efwplusClient\WinScript\Hello\config.xml" />

<file path="efwplusClient\WinScript\Hello\__init__.py" />

<file path="efwplusClient\WinScript\Hello\controller\Controller01.py" />

<file path="efwplusClient\WinScript\Hello\controller\__init__.py" />

<file path="efwplusClient\WinScript\Hello\model\Model01.py" />

<file path="efwplusClient\WinScript\Hello\model\__init__.py" />

<file path="efwplusClient\WinScript\Hello\view\View01.py" />

<file path="efwplusClient\WinScript\Hello\view\View01.xml" />

<file path="efwplusClient\WinScript\Hello\view\__init__.py" />

</fileList>

</cloudsoft>

</configuration>

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

# -*- coding: UTF-8 -*-

__author__ = 'kakake'

global trace

#日志显示开始加载脚本

trace.printlog('begin load Controller01.py',True)

import sys

sys.path.append("WinScript/Hello")

#将trace设置为跨文件的全局变量

import cloudsoft as soft

soft.set_trace(trace)

#导入自己的模块

from model.Model01 import Model01

from view.View01 import View01

#导入常用的模块

import json

from datetime import datetime

#入口函数

def main(_controller):

try:

trace.printlog('call main')

view01 = View01(_controller) # 有几个界面类就要实例化几个

controller01 = Controller01(_controller,view01) # 先实列化控制器类,然后在把对象传给界面类,这样界面就可以直接调用控制器中的方法

return 0;

except Exception,ex:

return ex;

#控制器类

##############################################################

class Controller01(object):

def __init__(self, _controller,_view01):

self.controller=_controller

self.view01=_view01

self.rview01=_controller.RenderList['View01']

#注册事件

self.rview01.initload(self.viewload)

self.rview01.bind('btnHello', 'click', self.Hello)

#界面初始化加载

def viewload(self):

pass

def Hello(self,sender,e):

self.rview01.msgbox('Hello World!','提示','ok','info')

trace.printlog('hello world')

##############################################################

#日志显示脚本加载完成

trace.printlog('end load Controller01.py')

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

<?xml version="1.0" encoding="utf-8"?>

<viewform>

<winform size="880,500" tabindex="0" text="Hello World" name="View01" visible="false" width="880">

<panel type="panelEx" dock="fill" location="0,0" name="PanelEx1" size="864,461" tabindex="0" width="864">

<button type="buttonX" text="Hello World" location="371,113" name="btnHello" size="95,23" tabindex="0" width="95" />

</panel>

</winform>

</viewform>

# -*- coding: UTF-8 -*-

__author__ = 'kakake'

import sys

import cloudsoft as soft

trace=soft.get_trace()

#日志开始加载脚本

trace.printlog('begin load View01.py')

# 界面类

##############################################################

class View01(object):

def __init__(self, _controller):

self.view = _controller.RenderList['View01']

##############################################################

#日志显示脚本加载完成

trace.printlog('end load View01.py')

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

# -*- coding: UTF-8 -*-

__author__ = 'kakake'

import sys

import cloudsoft as soft

trace=soft.get_trace()

#日志开始加载脚本

trace.printlog('begin load Model01.py')

#实体类

##############################################################

class Model01(object):

def __init__(self):

pass

##############################################################

#日志显示脚本加载完成

trace.printlog('end load Model01.py')

六、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

使用efwplusScript开发Winform程序【像小程序那样开发PC软件】的更多相关文章

  1. TODO:即将开发的第一个小程序

    TODO:即将开发的第一个小程序 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验.个人理解小程序是寄宿在微信平台上的一个前端框架,具有跨平台功能, ...

  2. 移动开发之【微信小程序】的原理与权限问题以及相关的简易教程

    这几天圈子里到处都在传播着这样一个东西,微信公众平台提供了一种新的开放能力,开发者可以快速开发一个小程序,取名曰:微信公众平台-小程序 据说取代移动开发安卓和苹果,那这个东东究竟是干吗用的?但很多人觉 ...

  3. 微信小程序的开发:通过微信小程序看前端

    前言 2016年9月22日凌晨,微信官方通过"微信公开课"公众号发布了关于微信小程序(微信应用号)的内测通知.整个朋友圈瞬间便像炸开了锅似的,各种揣测.介绍性文章在一夜里诞生.而真 ...

  4. 零基础开发一款微信小程序商城

    零基础开发一款微信小程序商城 一个朋友问我能不能帮忙做个商城?我一个完整网页都写不出的 菜鸟程序员,我该怎么拒绝呢?好吧,看在小程序这么火的形势下,我还是答应了!找了个开源项目,差不多花了三天时间搞定 ...

  5. 微信小程序开发教程 #043 - 在小程序开发中使用 npm

    本文介绍了如何在微信小程序开发中使用 npm 中包的功能,大大提高微信小程序的开发效率,同时也是微信小程序系列教程的视频版更新. 微信小程序在发布之初没有对 npm 的支持功能,这也是目前很多前端开发 ...

  6. 微信小程序(三)--小程序UI开发

    一.UI介绍 所谓的UI(user Interface)开发指的就是小程序应用界面的开发,在小程序开发框架中会为我们提供一系列的基础组件,例如HTML开发中为我们所提供的一些最基础的标签.需要注意的是 ...

  7. Android | 教你如何用代码开发一个拍照翻译小程序

    引子   想必有很多小伙伴喜欢外出旅游,能去海外玩一圈那是更好不过了,旅游前大家一定会对吃.穿.住.行.游玩路线做各种攻略,然后满怀期待的出发- 想象中的旅游   出发前,想象中的旅游目的地可能有漂亮 ...

  8. 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇)

    系列文章 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇) 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇) 前言 好久不见,很久没更新博客了,前段时间 ...

  9. 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇)

    系列文章 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇) 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇) 扫码体验,先睹为快 可以扫描下微信小程序的 ...

  10. Taro 开发踩坑指南 (小程序,H5, RN)

    Taro 开发踩坑指南 (小程序,H5, RN) css taro 如何展示多行文本省略号 https://www.cnblogs.com/xgqfrms/p/12569057.html UI 设计稿 ...

随机推荐

  1. 第 6 章 C控制语句:循环

    6.16.3 使用嵌套循环,按下面格式打印字母: F FE FED FEDC FEDCB FEDCBA #include <stdio.h> int main() { ; ); row ! ...

  2. C#综合揭秘——分部类和分部方法

    在面向对象的“封装闭合性”开发原则中,一向提倡的是把独立的功能封装在一个类里面的!但从Visual Studio 2005开发,系统提供了一个分部类的开发方式一直受到争议,很多人认为把同一类的功能分布 ...

  3. 【转】【Flex】#010 操作XML文件(E4X)

    该教程转载来自于:http://blog.chinaunix.net/uid-14767524-id-2785506.html    [看到这边文章的位置,具体原作者未知] 经过一些排版的修改,其他内 ...

  4. Python的多线程理解,转自虫师https://www.cnblogs.com/fnng/p/3670789.html

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...

  5. hihocoder Round #c1(hihoCoder太阁最新面经算法竞赛1 )

    Test链接:https://cn.vjudge.net/contest/231849 选自hihoCoder太阁最新面经算法竞赛1 更多Test:传送门 A:区间求差 给一组区间集合A和区间集合B, ...

  6. NSKeyValueObserving.m

    https://github.com/farcaller/cocotron/blob/af740de86c9bee84c59ffc74d27e5df9e22e1391/Foundation/NSKey ...

  7. 起床困难综合症 NOI_2014_D1T1

    这道题的正解其实没什么好说的,反而是部分分设计非常巧妙. 之所以要单开一篇是因为当时机房的部分同学刚学位运算,我拿这个题去讲想毒瘤大家一下,于是做了一个挺好看的课件. ppt -> pdf -& ...

  8. 1084. [SCOI2005]最大子矩阵【网格DP】

    Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵 不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤ ...

  9. PAT乙级1014

    1014 福尔摩斯的约会 (20 分)   大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d& ...

  10. C语言程序设计I—第三周教学

    由于本课程是从教学周的第二周开始上课,所以第二次授课是发生在第三周,为了让PTA.云班课和博客能统一,所以将教学周作为随笔的标题.本周由于处理外聘教师随意退课等事情,总结有些延后了. 第三周教学安排 ...