crabatool 1.0.13 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/launch.json +17 -0
- package/{test/config.js → 8/craba.js} +41 -29
- package/8/package.json +17 -0
- package/8/readme.md +20 -0
- package/8/www/_Sys/UI/Grid/GridConfig.gspx +27 -0
- package/8/www/_Sys/UI/Grid/GridConfig.js +652 -0
- package/8/www/_Sys/UI/IFrame.gspx +7 -0
- package/8/www/_Sys/UI/IFrame.js +57 -0
- package/8/www/_Sys/UI/PanelConfig.gspx +55 -0
- package/8/www/_Sys/UI/PanelConfig.js +268 -0
- package/8/www/_Sys/UI/Print/ClientSelector.gspx +39 -0
- package/8/www/_Sys/UI/Print/ClientSelector.js +152 -0
- package/8/www/js/agency.js +2 -0
- package/8/www/js/craba.min.js +12 -0
- package/8/www/js/crabaEx.min.js +7 -0
- package/8/www/js/crabaNgp.js +1 -0
- package/8/www/js/echarts-all.js +1 -0
- package/8/www/js/math.min.js +10 -0
- package/8/www/skins/craba.min.css +174 -0
- package/8/www/skins/font/iconfont.eot +0 -0
- package/8/www/skins/font/iconfont.svg +1281 -0
- package/8/www/skins/font/iconfont.ttf +0 -0
- package/8/www/skins/font/iconfont.woff +0 -0
- package/8/www/skins/ui/icons/backTop.gif +0 -0
- package/8/www/skins/ui/icons/blank.gif +0 -0
- package/8/www/skins/ui/icons/browsers.jpg +0 -0
- package/8/www/skins/ui/icons/grid.png +0 -0
- package/8/www/skins/ui/icons/nodata.png +0 -0
- package/8/www/skins/ui/print/new.png +0 -0
- package/8/www/skins/ui/print/old.png +0 -0
- package/8/www/skins/ui/print/settings.gif +0 -0
- package/8/www/skins/ui/tree/first.gif +0 -0
- package/8/www/skins/ui/tree/firstNo.gif +0 -0
- package/8/www/skins/ui/tree/last.gif +0 -0
- package/8/www/skins/ui/tree/line.gif +0 -0
- package/8/www/skins/ui/tree/node.gif +0 -0
- package/8/www/skins/ui/tree/node0.gif +0 -0
- package/8/www/skins/ui/tree/none.gif +0 -0
- package/index.js +71 -28
- package/lib/config.js +19 -2
- package/lib/server.js +12 -10
- package/lib/utils.js +99 -21
- package/package.json +5 -3
- package/test/ngp.js +38 -3
- package/test/readme.md +10 -10
- package/test/test.js +38 -0
- package/tool/checkjs.js +93 -0
- package/{client → tool}/client.js +2 -2
- package/{merge → tool}/merge.js +11 -11
- package/{lib → tool}/ngptool.js +26 -26
- package/tool/progressbar.js +10 -6
- package/{lib → tool}/sockettool.js +9 -10
- package/tool/upgrade.js +121 -39
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/index.js
CHANGED
|
@@ -5,37 +5,34 @@ var fs = require('fs');
|
|
|
5
5
|
var path = require('path');
|
|
6
6
|
var readline = require('readline');
|
|
7
7
|
|
|
8
|
-
exports =
|
|
8
|
+
module.exports.run = function(options) {
|
|
9
|
+
console.log('当前环境:' + process.platform);
|
|
10
|
+
console.log('平台助手启动参数:', options);
|
|
9
11
|
|
|
10
|
-
exports.run = function(options) {
|
|
11
12
|
Object.assign(config, options);
|
|
12
13
|
checkConfig();
|
|
13
14
|
waitInput();
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
function checkConfig() {
|
|
17
|
-
console.log('当前环境:' + process.platform);
|
|
18
|
-
console.log('平台助手启动参数:', config);
|
|
19
|
-
|
|
20
18
|
if (!config.webPath) {
|
|
21
|
-
throw new Error('请检查
|
|
19
|
+
throw new Error('请检查craba.js,必须告诉工具当前项目的前端路径地址,填绝对路径哦');
|
|
22
20
|
}
|
|
23
21
|
if (!config.port) {
|
|
24
|
-
throw new Error('请检查
|
|
22
|
+
throw new Error('请检查craba.js,必须告诉工具当前项目前端服务器端口地址哦');
|
|
25
23
|
}
|
|
26
24
|
|
|
27
25
|
if (!fs.existsSync(config.webPath)) {
|
|
28
|
-
throw new Error(
|
|
26
|
+
throw new Error(`请检查craba.js,配置的webPath路径不存在,请检查拼写是否正确:${config.webPath}`);;
|
|
29
27
|
}
|
|
30
28
|
|
|
31
29
|
var crabaJs = path.join(config.webPath, 'js/craba.min.js');
|
|
32
30
|
if (!fs.existsSync(crabaJs)) {
|
|
33
|
-
throw new Error('
|
|
31
|
+
throw new Error('请检查craba.js,平台前端组件不存在,请检查指定的webPath路径是否为craba前端框架的根目录。' + crabaJs);
|
|
34
32
|
}
|
|
35
33
|
|
|
36
|
-
|
|
34
|
+
showLocalVersion();
|
|
37
35
|
|
|
38
|
-
console.log(`\r\n\r\n本地craba版本:[${localData.version}]\r\n本地craba日期:[${localData.date}]`);
|
|
39
36
|
console.log("---------------------------------------------------------------------------------------------------------");
|
|
40
37
|
}
|
|
41
38
|
|
|
@@ -56,18 +53,22 @@ function waitInput() {
|
|
|
56
53
|
|
|
57
54
|
(async () => {
|
|
58
55
|
var ques = [
|
|
59
|
-
"1. 启动服务。\t\t\t\t
|
|
60
|
-
"2.
|
|
61
|
-
"3. 查询最新平台版本和日期。\t\t
|
|
62
|
-
"4.
|
|
63
|
-
"5.
|
|
64
|
-
"6.
|
|
65
|
-
"7.
|
|
56
|
+
"1. 启动服务。\t\t\t\t主要包含:自动合并打包init.js和biz.js,查看本地平台的版本",
|
|
57
|
+
"2. 更新当前项目的平台,然后启动服务。\t主要包含:从<内网>拉取环境相关资源,再拷贝到webPath路径下覆盖老文件,替代手工操作,同时解决npm不稳定问题",
|
|
58
|
+
"3. 查询最新平台版本和日期。\t\t主要包含:从<内网>拉取最新平台版本,开发好及时更新补丁",
|
|
59
|
+
"4. 校验当前项目前端所有js语法兼容性。\t主要包含:对本地js语法做一次初步预检避免上线后才发现问题;比如:编码、let、const、=>、async、await、then、缺function",
|
|
60
|
+
"5. 打包当前项目前端所有js。\t\t主要包含:前端es6语法的打包和js的统一压缩处理",
|
|
61
|
+
"6. 安装或更新IDEA环境。\t\t\t主要包含:从<内网>拉取环境相关资源,包括智能语法、新增页面模板、更多新功能",
|
|
62
|
+
"7. 安装或更新vscode环境。\t\t主要包含:从<内网>拉取环境相关资源,包括智能语法、新增页面模板、ctrl+alt+n、alt+j快捷键",
|
|
63
|
+
"8. 新建Craba项目。\t\t\t主要包含:从<内网>拉取环境相关资源,根据模板创建新项目,避免手工拷贝文件",
|
|
64
|
+
"9. 结束 \t\t\t\t按Ctrl+C即可退出",
|
|
65
|
+
"#. 如果你对[nodejs版本的平台助手]有更多建议或想法可反馈给技术架构组改进哦",
|
|
66
|
+
"已实现功能:1、2、3、4、8、9",
|
|
66
67
|
"---------------------------------------------------------------------------------------------------------",
|
|
67
68
|
"请输入对应功能的编号(数字):"
|
|
68
69
|
];
|
|
69
70
|
const num = await question(ques.join('\r\n'));
|
|
70
|
-
if (num !=
|
|
71
|
+
if (num != 8) {
|
|
71
72
|
rl.close(); // 关闭输入等待
|
|
72
73
|
}
|
|
73
74
|
|
|
@@ -79,17 +80,43 @@ function waitInput() {
|
|
|
79
80
|
showNewVersion();
|
|
80
81
|
waitInput(); // 重复
|
|
81
82
|
} else if (num == 4) {
|
|
82
|
-
|
|
83
|
+
checkAllJs();
|
|
83
84
|
} else if (num == 5) {
|
|
84
|
-
|
|
85
|
+
compressAllJs();
|
|
85
86
|
} else if (num == 6) {
|
|
86
|
-
|
|
87
|
+
installIDEA();
|
|
88
|
+
} else if (num == 7) {
|
|
89
|
+
installvscode();
|
|
90
|
+
} else if (num == 8) {
|
|
91
|
+
var options = {};
|
|
92
|
+
options.projectPath = await waitFolder();
|
|
93
|
+
options.type = await question('选择项目类型:1. 普通craba项目; 2. ngp微前端项目; 输入编号:');
|
|
94
|
+
if (options.type != 1 && options.type != 2) options.type = 1;
|
|
95
|
+
if (options.type == 2) {
|
|
96
|
+
options.modName = await question('请输入微服务的模块名称:');
|
|
97
|
+
if (!options.modName) options.modName = 'emptyname';
|
|
98
|
+
}
|
|
87
99
|
rl.close(); // 关闭输入等待
|
|
88
|
-
createProject(
|
|
89
|
-
} else if (num !=
|
|
100
|
+
createProject(options);
|
|
101
|
+
} else if (num != 9) {
|
|
90
102
|
console.error('无效输入,请继续。\r\n\r\n');
|
|
91
103
|
waitInput(); // 重复
|
|
92
104
|
}
|
|
105
|
+
|
|
106
|
+
async function waitFolder() {
|
|
107
|
+
const projectPath = await question('请输入项目生成路径(必须为空路径):');
|
|
108
|
+
if (!path.isAbsolute(projectPath)) {
|
|
109
|
+
console.log('路径不合法,请输入绝对路径,如:f:\\craba_web');
|
|
110
|
+
return waitFolder();
|
|
111
|
+
}
|
|
112
|
+
if (fs.existsSync(projectPath)) {
|
|
113
|
+
if (fs.readdirSync(projectPath).length > 0) {
|
|
114
|
+
console.log(':::输入的项目路径不为空,避免文件覆盖或冲突,请重新输入一个空路径或不存在的路径:::');
|
|
115
|
+
return waitFolder();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return projectPath;
|
|
119
|
+
}
|
|
93
120
|
})();
|
|
94
121
|
}
|
|
95
122
|
|
|
@@ -103,10 +130,18 @@ function update() {
|
|
|
103
130
|
upgrade.updateCraba(start);
|
|
104
131
|
}
|
|
105
132
|
|
|
133
|
+
function showLocalVersion() {
|
|
134
|
+
var localData = upgrade.getLocalVersion();
|
|
135
|
+
console.log(`\r\n本地craba版本:[${localData.version}]\r\n本地craba日期:[${localData.date}]`);
|
|
136
|
+
}
|
|
137
|
+
|
|
106
138
|
function showNewVersion() {
|
|
139
|
+
showLocalVersion();
|
|
140
|
+
|
|
107
141
|
var data = upgrade.getNewVersion();
|
|
108
|
-
|
|
109
|
-
|
|
142
|
+
utils.error(`最新craba版本:[${data.version}]`);
|
|
143
|
+
utils.error(`最新craba日期:[${data.date}]`);
|
|
144
|
+
utils.log('');
|
|
110
145
|
}
|
|
111
146
|
|
|
112
147
|
// 安装或更新IDEA环境,主要包含:智能语法、新增页面模板
|
|
@@ -119,7 +154,15 @@ function installvscode() {
|
|
|
119
154
|
console.log('待实现');
|
|
120
155
|
}
|
|
121
156
|
|
|
122
|
-
|
|
123
|
-
|
|
157
|
+
function checkAllJs() {
|
|
158
|
+
require('./tool/checkjs.js').start();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function compressAllJs() {
|
|
124
162
|
console.log('待实现');
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// 新建Craba空白项目,Hello
|
|
166
|
+
function createProject(options) {
|
|
167
|
+
upgrade.createProject(options);
|
|
125
168
|
}
|
package/lib/config.js
CHANGED
|
@@ -1,2 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
var path = require('path');
|
|
2
|
+
var os = require('os');
|
|
3
|
+
|
|
4
|
+
class Config {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.Debug = false;
|
|
7
|
+
this.Host = "http://crabadoc.mygjp.com.cn";
|
|
8
|
+
this.TempPath = path.join(os.tmpdir(), '_crabatemp');
|
|
9
|
+
this.ImageCache = path.join(this.TempPath, "_img");
|
|
10
|
+
this.JsonFile = path.join(this.TempPath, "craba.json");
|
|
11
|
+
this.SaveFilePath = path.join(this.TempPath, "_CrabaUpdate");
|
|
12
|
+
this.CachePath = path.join(this.SaveFilePath, "_unzip");
|
|
13
|
+
this.WebPath = path.join(this.CachePath, "www");
|
|
14
|
+
this.ServerPath = path.join(this.CachePath, "server");
|
|
15
|
+
this.CacheFileName = path.join(this.SaveFilePath, "craba.zip");
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
module.exports = new Config();
|
package/lib/server.js
CHANGED
|
@@ -9,7 +9,13 @@ var compression = require('compression');
|
|
|
9
9
|
var app = new express();
|
|
10
10
|
app.use(compression()); // 开启压缩
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
|
|
13
|
+
// 自定义打包js
|
|
14
|
+
if (config.modName && config.childModList && config.childModList.length > 0) {
|
|
15
|
+
require('../tool/ngptool.js');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// 自动刷新浏览器
|
|
13
19
|
if (config.refresh) {
|
|
14
20
|
utils.log('已开启自动刷新');
|
|
15
21
|
|
|
@@ -17,7 +23,7 @@ if (config.refresh) {
|
|
|
17
23
|
config.socketPort = config.port + 6000;
|
|
18
24
|
}
|
|
19
25
|
|
|
20
|
-
require('
|
|
26
|
+
require('../tool/sockettool.js');
|
|
21
27
|
|
|
22
28
|
// 统一拦截客户端的api路由
|
|
23
29
|
app.use(utils.rewriteCrabaJs);
|
|
@@ -25,7 +31,6 @@ if (config.refresh) {
|
|
|
25
31
|
|
|
26
32
|
app.use(express.static(config.webPath))
|
|
27
33
|
|
|
28
|
-
|
|
29
34
|
var server = http.createServer(app);
|
|
30
35
|
var hostname = '127.0.0.1';
|
|
31
36
|
server.listen(config.port, hostname, () => {
|
|
@@ -34,17 +39,14 @@ server.listen(config.port, hostname, () => {
|
|
|
34
39
|
var cmd = '';
|
|
35
40
|
switch (process.platform) {
|
|
36
41
|
case "darwin": //macos
|
|
37
|
-
cmd = 'open http://127.0.0.1:' + config.port + '/
|
|
42
|
+
cmd = 'open http://127.0.0.1:' + config.port + '/';
|
|
38
43
|
break;
|
|
39
44
|
case "win32": //windows
|
|
40
|
-
cmd = 'explorer http://127.0.0.1:' + config.port + '/
|
|
45
|
+
cmd = 'explorer http://127.0.0.1:' + config.port + '/';
|
|
41
46
|
break;
|
|
42
47
|
}
|
|
43
48
|
if (cmd) {
|
|
49
|
+
if (config.modName) cmd += 'login.html'; // ngp的启动文件
|
|
44
50
|
require('child_process').exec(cmd);
|
|
45
51
|
}
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
// 自定义打包js
|
|
50
|
-
require('./ngptool.js');
|
|
52
|
+
});
|
package/lib/utils.js
CHANGED
|
@@ -3,6 +3,7 @@ var path = require('path');
|
|
|
3
3
|
const crypto = require('crypto');
|
|
4
4
|
var iconv = require('iconv-lite');
|
|
5
5
|
var config = require('./config.js');
|
|
6
|
+
var logErr = console.dir.bind(console);
|
|
6
7
|
|
|
7
8
|
Buffer.prototype.toByteArray = function() {
|
|
8
9
|
return Array.prototype.slice.call(this, 0)
|
|
@@ -31,7 +32,7 @@ Date.prototype.toJSON = function() {
|
|
|
31
32
|
|
|
32
33
|
|
|
33
34
|
/* 全局公共类 */
|
|
34
|
-
class
|
|
35
|
+
class Utils {
|
|
35
36
|
constructor() {
|
|
36
37
|
this.cryptoKey = '$wssf20119@.Z+Q$';
|
|
37
38
|
}
|
|
@@ -93,7 +94,7 @@ class utils {
|
|
|
93
94
|
}
|
|
94
95
|
|
|
95
96
|
getQueryInt(req, key) {
|
|
96
|
-
var v =
|
|
97
|
+
var v = utils.getQueryValue(req, key);
|
|
97
98
|
if (v == null) return 0;
|
|
98
99
|
v = parseInt(v);
|
|
99
100
|
if (isNaN(v)) return 0;
|
|
@@ -101,7 +102,7 @@ class utils {
|
|
|
101
102
|
}
|
|
102
103
|
|
|
103
104
|
getFormValue(req, key) {
|
|
104
|
-
var query =
|
|
105
|
+
var query = utils.getReqBody(req);
|
|
105
106
|
if (!query) return null;
|
|
106
107
|
if (query[key] == undefined) return null;
|
|
107
108
|
var value = query[key];
|
|
@@ -134,7 +135,7 @@ class utils {
|
|
|
134
135
|
}
|
|
135
136
|
|
|
136
137
|
var errorObj = {
|
|
137
|
-
"Message":
|
|
138
|
+
"Message": utils.makeExceptionHtml(ex, false)
|
|
138
139
|
};
|
|
139
140
|
res.end(JSON.stringify(errorObj));
|
|
140
141
|
}
|
|
@@ -173,7 +174,7 @@ class utils {
|
|
|
173
174
|
// 设置允许跨域
|
|
174
175
|
var origin = res.req.headers["origin"];
|
|
175
176
|
var host = res.req.headers['host'];
|
|
176
|
-
if (origin == undefined ||
|
|
177
|
+
if (origin == undefined || utils.endsWithIgnoreCase(origin, host)) return; // 非跨域请求
|
|
177
178
|
if (allowOrigins.length > 0 && !allowOrigins.includes(origin)) return; // 如果当前请求域名不在运行范围内,不添加跨域请求头
|
|
178
179
|
|
|
179
180
|
if (!isOPTIONS) {
|
|
@@ -196,7 +197,7 @@ class utils {
|
|
|
196
197
|
var isOPTIONS = req.method == "OPTIONS";
|
|
197
198
|
var allowHeaders = 'X-Requested-With,Content-Type';
|
|
198
199
|
|
|
199
|
-
|
|
200
|
+
utils.setCORSHeader(res, [], allowHeaders, isOPTIONS); // 预先检查并统一输出跨域请求头
|
|
200
201
|
|
|
201
202
|
if (isOPTIONS) { // 跨域请求预检查
|
|
202
203
|
res.end('ok'); // 完成正常的响应,则允许跨域
|
|
@@ -206,27 +207,32 @@ class utils {
|
|
|
206
207
|
next(); // 继续处理
|
|
207
208
|
}
|
|
208
209
|
|
|
210
|
+
// 清空整个目录,包括子目录和文件
|
|
209
211
|
cleardirsSync(dirname) {
|
|
210
212
|
if (!fs.existsSync(dirname)) return;
|
|
211
213
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
var stat = fs.statSync(file);
|
|
216
|
-
if (stat.isDirectory()) {
|
|
214
|
+
fs.readdirSync(dirname).forEach(function(file) {
|
|
215
|
+
var filePath = path.join(dirname, file);
|
|
216
|
+
if (fs.statSync(filePath).isDirectory()) {
|
|
217
217
|
//递归读取文件
|
|
218
|
-
|
|
218
|
+
utils.cleardirsSync(filePath);
|
|
219
219
|
} else {
|
|
220
|
-
|
|
220
|
+
//utils.debug('del path ' + filePath);
|
|
221
|
+
fs.unlinkSync(filePath);
|
|
221
222
|
}
|
|
222
223
|
});
|
|
224
|
+
|
|
225
|
+
//utils.debug('del file ' + dirname);
|
|
226
|
+
fs.rmdirSync(dirname);
|
|
223
227
|
}
|
|
224
228
|
|
|
229
|
+
// 递归创建目录
|
|
225
230
|
mkdirsSync(dirname) {
|
|
231
|
+
if (dirname.indexOf('.') > 0) dirname = path.dirname(dirname);
|
|
226
232
|
if (fs.existsSync(dirname)) {
|
|
227
233
|
return true;
|
|
228
234
|
}
|
|
229
|
-
if (
|
|
235
|
+
if (utils.mkdirsSync(path.dirname(dirname))) {
|
|
230
236
|
fs.mkdirSync(dirname);
|
|
231
237
|
return true;
|
|
232
238
|
}
|
|
@@ -236,9 +242,21 @@ class utils {
|
|
|
236
242
|
if (byte[0] == 0xef && byte[1] == 0xbb || byte[0] == 0xfe && byte[1] == 0xff || byte[0] == 0xff && byte[1] == 0xfe) {
|
|
237
243
|
return byte.toString(); //utf8 + bom
|
|
238
244
|
} else {
|
|
239
|
-
var newByte = iconv.decode(byte,
|
|
245
|
+
var newByte = iconv.decode(byte, 'UTF8');
|
|
240
246
|
if (newByte.indexOf('�') > -1) return byte.toString(); // utf8上面没法识别出来,转换后反而会乱码,其实utf8不用转换,直接返回就行了
|
|
241
|
-
return newByte.toString(
|
|
247
|
+
return newByte.toString('UTF8');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
isUtf8(byte, from_code) {
|
|
252
|
+
// 84, 121
|
|
253
|
+
// 239, 187
|
|
254
|
+
if (byte[0] == 0xef && byte[1] == 0xbb || byte[0] == 0xfe && byte[1] == 0xff || byte[0] == 0xff && byte[1] == 0xfe) {
|
|
255
|
+
return true;
|
|
256
|
+
} else {
|
|
257
|
+
var newByte = iconv.decode(byte, from_code || 'utf-8');
|
|
258
|
+
if (newByte.indexOf('�') > -1) return true; // utf8上面没法识别出来,转换后反而会乱码,其实utf8不用转换,直接返回就行了
|
|
259
|
+
return false;
|
|
242
260
|
}
|
|
243
261
|
}
|
|
244
262
|
|
|
@@ -251,16 +269,25 @@ class utils {
|
|
|
251
269
|
|
|
252
270
|
log() {
|
|
253
271
|
var args = [];
|
|
254
|
-
args.push(`[${new Date().toString()}]`);
|
|
272
|
+
if (config.Debug) args.push(`[${new Date().toString()}]`);
|
|
255
273
|
for (var i = 0, count = arguments.length; i < count; i++) {
|
|
256
274
|
args.push(arguments[i]);
|
|
257
275
|
}
|
|
258
276
|
console.log.apply(console, args);
|
|
259
277
|
}
|
|
260
278
|
|
|
279
|
+
error(text) {
|
|
280
|
+
logErr(text);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
debug() {
|
|
284
|
+
if (!config.Debug) return;
|
|
285
|
+
utils.log.apply(utils, arguments);
|
|
286
|
+
}
|
|
287
|
+
|
|
261
288
|
rewriteCrabaJs(req, res, next) {
|
|
262
289
|
var url = req.originalUrl;
|
|
263
|
-
|
|
290
|
+
//utils.log(url);
|
|
264
291
|
|
|
265
292
|
/*
|
|
266
293
|
var apiStart = '/apis/';
|
|
@@ -278,7 +305,7 @@ class utils {
|
|
|
278
305
|
throw new Error('平台前端组件不存在,请检查:' + crabaJs);
|
|
279
306
|
}
|
|
280
307
|
|
|
281
|
-
var clientSocketJs = path.join(__dirname, '
|
|
308
|
+
var clientSocketJs = path.join(__dirname, '../tool/client.js');
|
|
282
309
|
var content = fs.readFileSync(crabaJs).toString();
|
|
283
310
|
|
|
284
311
|
var clientContent = fs.readFileSync(clientSocketJs).toString();
|
|
@@ -290,6 +317,57 @@ class utils {
|
|
|
290
317
|
});
|
|
291
318
|
res.end(content);
|
|
292
319
|
}
|
|
293
|
-
}
|
|
294
320
|
|
|
295
|
-
|
|
321
|
+
getFiles(options, fileList) {
|
|
322
|
+
var ignores = options.ignores;
|
|
323
|
+
var exts = options.exts;
|
|
324
|
+
var source = options.source;
|
|
325
|
+
if (ignores && !fileList) {
|
|
326
|
+
ignores = ignores.map((item) => { return path.join(source, item) });
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
if (!fileList) fileList = [];
|
|
330
|
+
var files = fs.readdirSync(source);
|
|
331
|
+
files.forEach(function(fileName) {
|
|
332
|
+
var filePath = path.join(source, fileName);
|
|
333
|
+
if (ignores && ignores.includes(filePath)) {
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
var stat = fs.statSync(filePath);
|
|
338
|
+
if (stat.isDirectory()) {
|
|
339
|
+
options.source = filePath;
|
|
340
|
+
utils.getFiles(options, fileList);
|
|
341
|
+
} else {
|
|
342
|
+
if (exts && !exts.includes(path.extname(filePath))) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
fileList.push(filePath);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
return fileList;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
copyFiles(source, dest, ignores, cb) {
|
|
353
|
+
var files = utils.getFiles({ source: source, ignores: ignores });
|
|
354
|
+
files.forEach(function(fileName) {
|
|
355
|
+
fileName = fileName.replace(source, ''); // 去掉根路径
|
|
356
|
+
|
|
357
|
+
var filePath = path.join(source, fileName);
|
|
358
|
+
var destPath = path.join(dest, fileName);
|
|
359
|
+
|
|
360
|
+
utils.mkdirsSync(destPath);
|
|
361
|
+
|
|
362
|
+
var content = fs.readFileSync(filePath);
|
|
363
|
+
if (cb) {
|
|
364
|
+
var result = cb(destPath, content); // 显示进度或者自定义替换文本内容
|
|
365
|
+
if (result) content = result;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
fs.writeFileSync(destPath, content, 'utf8');
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
var utils = new Utils();
|
|
373
|
+
module = module.exports = utils;
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "crabatool",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.18",
|
|
4
4
|
"description": "crabatool",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"start": "node index.js"
|
|
7
|
+
"start": "node index.js",
|
|
8
|
+
"test": "node ./test/test.js"
|
|
8
9
|
},
|
|
9
10
|
"author": "wssf",
|
|
10
11
|
"dependencies": {
|
|
@@ -20,7 +21,8 @@
|
|
|
20
21
|
"sync-request": "^6.1.0",
|
|
21
22
|
"axios": "^0.27.2",
|
|
22
23
|
"single-line-log": "^1.1.2",
|
|
23
|
-
"node-stream-zip": "^1.15.0"
|
|
24
|
+
"node-stream-zip": "^1.15.0",
|
|
25
|
+
"iconv-jschardet": "^2.0.26"
|
|
24
26
|
},
|
|
25
27
|
"repository": {
|
|
26
28
|
"type": "git",
|
package/test/ngp.js
CHANGED
|
@@ -1,3 +1,38 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 项目环境使用工具包
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
var crabaTool = require('crabatool'); // 引入craba脚手架工具包
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
// 当前项目相关配置,注意必填项和非必填项哦
|
|
9
|
+
var config = {
|
|
10
|
+
//【必填】
|
|
11
|
+
// 告诉工具当前项目的端路径地址,填绝对路径哦
|
|
12
|
+
webPath: "F:/shell_master/web/src/main/resources/static/shell",
|
|
13
|
+
|
|
14
|
+
//【必填】
|
|
15
|
+
// 告诉工具当前项目前端服务器端口地址
|
|
16
|
+
port: 3001,
|
|
17
|
+
|
|
18
|
+
//【ngp必填】【非ngp项目不是必填】
|
|
19
|
+
// 当前项目模块名称,各组按需修改
|
|
20
|
+
modName: "shell", // 如:modName:"jxc"
|
|
21
|
+
|
|
22
|
+
// 【不是必填】
|
|
23
|
+
// 告诉工具当webPath目录下面的js、css、gspx文件发生改变就自动刷新网页
|
|
24
|
+
refresh: false,
|
|
25
|
+
|
|
26
|
+
//【不是必填】
|
|
27
|
+
// 1. 当前模块是由哪些过去的模块合并来的,各组按需修改
|
|
28
|
+
// 2. 如果配置了子模块清单,工具会自动将所有子模块下的init.js和当前模块的jxc/js/jxc.js,合并打包到:jxc/js/init.js,实际运行过程中只加载:jxc/js/init.js,不会加载子模块下面的init.js,这样就可以大大减少http请求
|
|
29
|
+
// 3. 同2,biz.js也是相同思路进行合并打包
|
|
30
|
+
childModList: [], // 如: ['recordsheet', 'baseinfo', 'accounting'],
|
|
31
|
+
|
|
32
|
+
// 【不是必填】
|
|
33
|
+
// 上一步中打包后的文件是否压缩, true为忽略【不压缩】,false为【要压缩】,各组按需修改
|
|
34
|
+
ignoreCompress: true
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
crabaTool.run(config); // 传入配置参数,启动工具
|
package/test/readme.md
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
1. 命令行定位到当前目录.
|
|
4
4
|
1. 执行命令:npm install 或 npm update
|
|
5
|
-
1. 打开
|
|
6
|
-
1. 执行命令:node
|
|
5
|
+
1. 打开 craba.js,按需修改 craba.js 内的配置
|
|
6
|
+
1. 执行命令:node craba.js
|
|
7
7
|
|
|
8
8
|
# 平台助手功能介绍
|
|
9
9
|
|
|
10
|
-
1.
|
|
11
|
-
2. 自动刷新网页,监听到 css、js、gspx 文件有变动,会自动刷新网页,提高开发效率。配置项:config.refresh = true
|
|
12
|
-
3. 自动打包 biz.js 和 init.js,针对 ngp 的功能,减少 http
|
|
13
|
-
4.
|
|
10
|
+
1. 提供前端资源服务;
|
|
11
|
+
2. 自动刷新网页,监听到 css、js、gspx 文件有变动,会自动刷新网页,提高开发效率。配置项:config.refresh = true;
|
|
12
|
+
3. 自动打包 biz.js 和 init.js,针对 ngp 的功能,减少 http 请求;
|
|
13
|
+
4. 本地服务启动后自动打开浏览器预览页面;
|
|
14
14
|
|
|
15
|
-
5. 更新或安装本地 IDEA\VsCode
|
|
16
|
-
6. 更新或安装本地 IDEA\VSCode
|
|
17
|
-
7. 新建空白项目和 ngp
|
|
18
|
-
8. 根据配置将当前项目所有业务 js 文件统一打包、es6
|
|
15
|
+
5. 更新或安装本地 IDEA\VsCode 的智能语法提示;
|
|
16
|
+
6. 更新或安装本地 IDEA\VSCode 的新建页面模板;
|
|
17
|
+
7. 新建空白项目和 ngp 项目;
|
|
18
|
+
8. 根据配置将当前项目所有业务 js 文件统一打包、es6 语法转换、文件合并;
|
package/test/test.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本地测试工具包
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
var crabaTool = require('../index.js'); // 引入craba脚手架工具包
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
// 当前项目相关配置,注意必填项和非必填项哦
|
|
9
|
+
var config = {
|
|
10
|
+
//【必填】
|
|
11
|
+
// 告诉工具当前项目的端路径地址,填绝对路径哦
|
|
12
|
+
webPath: "F:/shell_master/web/src/main/resources/static/shell",
|
|
13
|
+
|
|
14
|
+
//【必填】
|
|
15
|
+
// 告诉工具当前项目前端服务器端口地址
|
|
16
|
+
port: 3001,
|
|
17
|
+
|
|
18
|
+
//【ngp必填】【非ngp项目不是必填】
|
|
19
|
+
// 当前项目模块名称,各组按需修改
|
|
20
|
+
modName: "shell", // 如:modName:"jxc"
|
|
21
|
+
|
|
22
|
+
// 【不是必填】
|
|
23
|
+
// 告诉工具当webPath目录下面的js、css、gspx文件发生改变就自动刷新网页
|
|
24
|
+
refresh: true,
|
|
25
|
+
|
|
26
|
+
//【不是必填】
|
|
27
|
+
// 1. 当前模块是由哪些过去的模块合并来的,各组按需修改
|
|
28
|
+
// 2. 如果配置了子模块清单,工具会自动将所有子模块下的init.js和当前模块的jxc/js/jxc.js,合并打包到:jxc/js/init.js,实际运行过程中只加载:jxc/js/init.js,不会加载子模块下面的init.js,这样就可以大大减少http请求
|
|
29
|
+
// 3. 同2,biz.js也是相同思路进行合并打包
|
|
30
|
+
childModList: ['recordsheet', 'baseinfo', 'accounting'],
|
|
31
|
+
|
|
32
|
+
// 【不是必填】
|
|
33
|
+
// 上一步中打包后的文件是否压缩, true为忽略【不压缩】,false为【要压缩】,各组按需修改
|
|
34
|
+
ignoreCompress: true
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
crabaTool.run(config); // 传入配置参数,启动工具
|