这个我在上家公司上班时,当时公司采用的技术结构,希望对有需要朋友有帮助。需求是客户需要一个窗口售票软件。之前为哪家客户提供软件的公司由于合同到期,不再提供服务。由于提供服务的公司可能由于资金断裂吧,快玩不下去了。就找到我们公司。让我们给他们提供技术支持以及开发新需求、升级系统等服务。但问题在于哪款软件是用C#开发的。而我们公司是开发微信公众号的,除了项目经理会C#没有其他C#程序员。而且公司也看中了这个商机,想要在上面做长远发展。开会讨论后放弃C#,并且由项目经理提供另一个框架。替代之前C#窗口程序。
java + node-webkit(下文简称NW) + C#插件 + HTML5
技术介绍:
总结一下就是Java只负责处理业务和提供数据,NW作为桌面应用外壳。C#对接设备供NW调用。HTML5负责界面。
由于java是独立的,所以演示就不包含Java部分了。
准备工作:
OK准备完了,下载压缩工具和图标替换工具是干嘛的呢,你看了NW之后就会知道,所有的页面都要放在app.zip里,NW是通过对编译打包好的app.zip来生成.exe文件的。所以要用来开发一个打包工具。
{
"main": "page/index.html", //这里配置你的欢迎页面。
"name": "nw-demo", //项目名称
"version": "0.1.0", //你的项目版本号
"description": "demo", //项目描述
"keywords": [
"demo",
"node-webkit"
],
"window": {
"title": "node-webkit demo", //系统内显示
"icon": "tbd.png", //窗体标
"toolbar": false,
"frame": false,
"fullscreen": false,
"width": 1200, //窗口宽度
"height": 700, //窗口高度
"min_width": 1200, //最小宽度
"min_height": 700 //最小高度
},
"webkit": {
"plugin": true,
"page-cache": false
},
"dependencies": {
"nsync": "0.0.3"
}
}
<html>
<head>
<meta charset="utf-8">
<link href="https://cdnjs.cloudflare.com/ajax/libs/element-ui/2.4.9/theme-chalk/index.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/vue/2.5.17/vue.min.js">script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/element-ui/2.4.9/index.js">script>
<script src="https://cdn.bootcss.com/lodash.js/4.17.11/lodash.min.js">script>
head>
<body>
<div id="app" style="padding-right: 25px;">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="集合A">
<el-input type="textarea" v-model="form.A" :rows="10">el-input>
<el-collapse>
<el-collapse-item :title="ACount">
<div>{{ACollect}}div>
el-collapse-item>
el-collapse>
el-form-item>
<el-form-item label="集合B">
<el-input type="textarea" v-model="form.B" :rows="10">el-input>
<el-collapse>
<el-collapse-item :title="BCount">
<div>{{BCollect}}div>
el-collapse-item>
el-collapse>
el-form-item>
<el-form-item label="计算方式">
<el-radio-group v-model="form.type" style="margin-top: 12px;">
<el-tooltip content="两个集合中都含有的元素" placement="bottom">
<el-radio label="jj">交集[*]el-radio>
el-tooltip>
<el-tooltip content="两个集合并在一起并去除其中重复元素的集合" placement="bottom">
<el-radio label="bj">并集[+]el-radio>
el-tooltip>
<el-tooltip content="第一个集合减去第二个集合所包含的元素" placement="bottom">
<el-radio label="cj">差集[-]el-radio>
el-tooltip>
el-radio-group>
el-form-item>
<el-form-item label="计算结果">
<el-collapse>
<el-collapse-item :title="resultText">
<div>{{result}}div>
el-collapse-item>
el-collapse>
el-form-item>
<el-form-item>
<el-button type="primary" @click="cacl">计算el-button>
<el-button @click="reset">重置el-button>
el-form-item>
el-form>
div>
<script>
window.app = new Vue({
el: '#app',
data: function() {
return {
form: {
A: '',
B: '',
type: 'jj'
},
result: [],
resultText: '点击下方计算按钮'
}
},
computed: {
ACount: function(){
var self = this;
var tmp = transform(self.form.A);
return '合计:' + tmp.length + '个';
},
ACollect: function(){
return transform(this.form.A);
},
BCount: function(){
var self = this;
var tmp = transform(self.form.B);
return '合计:' + tmp.length + '个';
},
BCollect: function(){
return transform(this.form.B);
}
},
methods: {
cacl: function(){
var self = this;
var A = transform(self.form.A);
var B = transform(self.form.B);
if(self.form.type === 'jj'){
// 交集[*]
self.result = _.intersection(A,B);
}else if(self.form.type === 'bj'){
// 并集[+]
self.result = _.uniq(_.union(A,B));
}else if(self.form.type === 'cj'){
// 差集[-]
self.result = _.difference(A,B);
}
self.resultText = self.result.length + '个';
},
reset: function(){
this.form.A = '';
this.form.B = '';
self.resultText = '点击下方计算按钮'
}
},
created: function () {
}
});
// 行列转换,去空格,去重复
function transform(arr){
var tmp = [];
try{
tmp = JSON.parse(arr);
}catch(e){
tmp = arr.split('\n');
}
tmp = _.uniq(tmp);
tmp = _.remove(tmp, function(item){return (item+"").trim() != '';})
return tmp;
}
script>
body>
html>
:: 设定命令不显示,当需要显示时,可以将下行命令注释
::@echo off
:: 获取当前路径
set NOWPATH=%~dp0
:: APP的开发的路径
set SRC=app/*.*
:: 打包的EXE的名称
set TAG=Client
:: EXE名称说明
set EXE=%TAG%.exe
:: 压缩后的ZIP文件
set ZIP=%NOWPATH%%TAG%.zip
:: 重要: 设置7zip的压缩目录
set ZIPPATH="%NOWPATH%\7-Zip\"
:: 重要: 这里改成你的运行环境目录,需要注意的时调试时的运行环境带了JDK,非调试是没有JDK的
set TOPATH=C:\nwjs\nwjs-sdk-v0.30.0-win-x64
:: 重要: 这里是你的图标替换工具目录
set ICONPATH="%NOWPATH%\Resource Hacker\ResourceHacker.exe"
set ICON=app/icon.ico
:: 显示当前路径
echo 当前路径:%NOWPATH%
:: 显示开始压缩
echo 开始压缩文件
:: 删除已经压缩过的文件
del /F /S /Q %ZIP%
:: 开始压缩
%ZIPPATH%7z.exe a -tzip %ZIP% %NOWPATH%%SRC% -r
:: 显示开始压缩
echo 正在打包Exe
:: 进入运行环境目录
cd %TOPATH%
:: 重要:当你的目录和当前目录不在同一个盘时,需要运行下面的盘符命令,否则不需要
C:
:: 关闭已经打开的EXE
taskkill /f /im %EXE%
:: 删除历史生成的EXE,需要源程序已经关闭
del /F /S /Q %EXE%.temp
:: 打包生成EXE
copy /b nw.exe+%ZIP% %EXE%.temp
:: 删除中间生成的ZIP包
del /F /S /Q %ZIP%
:: 显示开始压缩
echo 正在替换图标
:: 等待Exe被完全关闭
cscript %NOWPATH%wait.vbs
:: 删除历史生成的EXE,需要源程序已经关闭
del /F /S /Q %EXE%
:: 替换图标
%ICONPATH% -open %EXE%.temp -save %EXE% -action addoverwrite -res %NOWPATH%%ICON% -mask ICONGROUP,IDR_MAINFRAME,
:: 删除历史生成的EXE,需要源程序已经关闭
del /F /S /Q %EXE%.temp
:: 创建文件夹
md %TOPATH%\Config
:: 复制扩展文件到指定目录
xcopy %NOWPATH%Config %TOPATH%\Config /e /s /y
echo 开始创建桌面快捷方式
::设置程序或文件的完整路径(必选)
set Program=%TOPATH%\%EXE%
::设置快捷方式名称(必选)
set LnkName=%TAG%
::设置程序的工作路径,一般为程序主目录,此项若留空,脚本将自行分析路径
set WorkDir=%TOPATH%
::设置快捷方式显示的说明(可选)
set Desc=
if not defined WorkDir call:GetWorkDir "%Program%"
(echo Set WshShell=CreateObject("WScript.Shell"^)
echo strDesKtop=WshShell.SpecialFolders("DesKtop"^)
echo Set oShellLink=WshShell.CreateShortcut(strDesKtop^&"\%LnkName%.lnk"^)
echo oShellLink.TargetPath="%Program%"
echo oShellLink.WorkingDirectory="%WorkDir%"
echo oShellLink.WindowStyle=3
echo oShellLink.Description="%Desc%"
echo oShellLink.Save
)>makelnk.vbs
echo 桌面快捷方式创建成功!
makelnk.vbs
del /f /q makelnk.vbs
:: 执行EXE,该EXE是发布之后的EXE文件,发布时仅仅需要EXE文件和 node-webkit 的运行环境即可
::%EXE%
::出错时取消下面注释,可以看到错误的内容
::pause
到这里就结束了,演示的代码:ttps://gitee.com/LearnToStrong_admin/NW-demo/,如有疑问可以留言,或者qq:1146527359联系我。尽我所能帮助你。
文章写得差,还请谅解。