fkg 1.1.2 → 1.1.4
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/README.md +52 -38
- package/bin/fkg +2 -0
- package/index.js +3 -0
- package/lib/comm.js +18 -0
- package/lib/json/command.json +1 -0
- package/lib/order/init.js +52 -0
- package/lib/order/login.js +36 -0
- package/lib/order/server/index.js +9 -0
- package/lib/order/server/tcp.js +145 -0
- package/lib/order/user/add.js +37 -0
- package/lib/order/user/dele.js +41 -0
- package/lib/order/user/edit.js +54 -0
- package/lib/order/user/index.js +16 -0
- package/lib/order/user/scode.js +44 -0
- package/lib/utils/input.js +35 -0
- package/lib/utils/logs.js +43 -0
- package/lib/utils/utils.js +4 -0
- package/package.json +28 -18
- package/lib/index.js +0 -108
- package/lib/utils/fs.js +0 -146
- package/lib/utils/type.js +0 -45
package/README.md
CHANGED
|
@@ -1,57 +1,71 @@
|
|
|
1
|
-
##
|
|
2
|
-
|
|
1
|
+
## FKG
|
|
2
|
+
===================================
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
[![NPM version][npm-v-2]][npm-url]
|
|
5
|
+
[![NPM Install Size][size]][size-url]
|
|
6
|
+
[![NPM Downloads][download]][download-url]
|
|
7
|
+
[![NPM License][license]][license-url]
|
|
8
|
+
|
|
9
|
+
### FKG Introduction...
|
|
10
|
+
===================================
|
|
6
11
|
|
|
7
|
-
**
|
|
12
|
+
**Installing FKG**
|
|
8
13
|
|
|
9
|
-
```shell
|
|
10
|
-
npm install fkg
|
|
14
|
+
```shell
|
|
15
|
+
$ npm install fkg -g
|
|
11
16
|
```
|
|
12
17
|
|
|
18
|
+
**Initialize service**
|
|
13
19
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
key:'exgeg2233', //key不为空时,储存的数据会被加密
|
|
21
|
-
db:['user','name'] //db必须存在,且必须为数组
|
|
22
|
-
});
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
**3. Create user data**
|
|
26
|
-
```javascript
|
|
27
|
-
const data = {name:'xxx'};
|
|
28
|
-
db.user.add('id_1',data); //数据储存在本地
|
|
29
|
-
db.user.set('id_2',data); //数据储存在缓存
|
|
20
|
+
```shell
|
|
21
|
+
$ cd E:\fkgdb
|
|
22
|
+
$ fkg init
|
|
23
|
+
The security code must consist of no less than 8 strings
|
|
24
|
+
ecurity code :12345678
|
|
25
|
+
Confirm code :12345678
|
|
30
26
|
```
|
|
31
27
|
|
|
32
|
-
**5. Get user data**
|
|
33
28
|
|
|
34
|
-
```
|
|
35
|
-
|
|
29
|
+
```shell
|
|
30
|
+
$ fkg user add
|
|
31
|
+
Enter security code:12345678
|
|
32
|
+
Account Name:admin
|
|
33
|
+
Account Password:admin
|
|
36
34
|
```
|
|
37
35
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
```shell
|
|
37
|
+
$ fkg user edit
|
|
38
|
+
Enter security code:12345678
|
|
39
|
+
Enter account name:admin
|
|
40
|
+
admin:(Allow login)
|
|
41
|
+
Modify login status (1 allows or 0 prohibits):1
|
|
43
42
|
```
|
|
44
43
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
db.user.del('id_1'); //删除user表中指定缓存和本地数据
|
|
44
|
+
```shell
|
|
45
|
+
$ fkg user dele
|
|
46
|
+
Enter security code:88888888
|
|
47
|
+
Enter account name:admin
|
|
48
|
+
Confirm deletion (yes or no):yes
|
|
51
49
|
```
|
|
52
50
|
|
|
51
|
+
```shell
|
|
52
|
+
$ fkg login
|
|
53
|
+
Account Name:admin
|
|
54
|
+
Account Password:admin
|
|
55
|
+
```
|
|
53
56
|
|
|
57
|
+
```shell
|
|
58
|
+
$ fkg server 3308 127.0.0.1
|
|
59
|
+
```
|
|
54
60
|
|
|
55
61
|
|
|
56
62
|
|
|
57
|
-
|
|
63
|
+
[npm-v-1]: https://badgen.net/npm/v/fkg
|
|
64
|
+
[npm-v-2]: https://img.shields.io/npm/v/fkg
|
|
65
|
+
[npm-url]: https://www.npmjs.com/package/fkg
|
|
66
|
+
[size]: https://badgen.net/packagephobia/install/fkg
|
|
67
|
+
[size-url]: https://packagephobia.com/result?p=fkg
|
|
68
|
+
[download]: https://badgen.net/npm/dt/fkg
|
|
69
|
+
[download-url]: https://npmcharts.com/compare/fkg?minimal=true
|
|
70
|
+
[license]:https://badgen.net/npm/license/fkg
|
|
71
|
+
[license-url]:https://npmmirror.com/package/fkg/files/LICENSE
|
package/bin/fkg
ADDED
package/index.js
ADDED
package/lib/comm.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
fkgConmm();
|
|
3
|
+
async function fkgConmm() {
|
|
4
|
+
const arg = process.argv;
|
|
5
|
+
const {version} = require('../package.json');
|
|
6
|
+
if (arg.length < 3) console.log(version);
|
|
7
|
+
if (arg.length > 2) {
|
|
8
|
+
const arr = require('./json/command.json');
|
|
9
|
+
const name = arg[2].toLowerCase(); // 字母转小写
|
|
10
|
+
if (name=='-v') {
|
|
11
|
+
console.log(version);
|
|
12
|
+
} else if(arr.includes(name)){
|
|
13
|
+
await require('./order/'+name)(arg.slice(3));
|
|
14
|
+
}else {
|
|
15
|
+
console.log(`Command '${name}' doesn't exist!`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["init","user","login","server"]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const {md5} = require('rrid');
|
|
3
|
+
const oss = require('oss-sdk');
|
|
4
|
+
const logs = require('../utils/logs');
|
|
5
|
+
module.exports = async(arg)=>{
|
|
6
|
+
const dbPath = process.cwd();
|
|
7
|
+
const dbDir = oss.dir(dbPath);
|
|
8
|
+
if(await dbDir.ok()){
|
|
9
|
+
const list = await dbDir.list();
|
|
10
|
+
if(list.length===0){
|
|
11
|
+
// Initialization started
|
|
12
|
+
logs.g('Security code>=8characters');
|
|
13
|
+
const input = require('../utils/input')
|
|
14
|
+
const arr = await input('ecurity code :','Confirm code :');
|
|
15
|
+
if(arr.length===2){
|
|
16
|
+
if(arr[0].length<8){
|
|
17
|
+
logs.r('The security code contains less than 8 strings');
|
|
18
|
+
}else{
|
|
19
|
+
if(arr[0]===arr[1]){
|
|
20
|
+
const addres = dbDir.add('cache','account','database');
|
|
21
|
+
if(addres){
|
|
22
|
+
// Configuration file creation
|
|
23
|
+
const data = {};
|
|
24
|
+
data.addTime = Date.now();
|
|
25
|
+
data.key = md5(data.addTime+arr[0]+data.addTime);
|
|
26
|
+
const file = oss.file(dbPath);
|
|
27
|
+
const fileRes = await file.add('config',JSON.stringify(data));
|
|
28
|
+
if(fileRes){
|
|
29
|
+
logs.g('Initialization completed');
|
|
30
|
+
logs.g('Remember the security code');
|
|
31
|
+
}else{
|
|
32
|
+
logs.g('Unknown error');
|
|
33
|
+
await dbDir.clear();
|
|
34
|
+
}
|
|
35
|
+
}else{
|
|
36
|
+
logs.r('Failed to create file');
|
|
37
|
+
await dbDir.clear();
|
|
38
|
+
}
|
|
39
|
+
}else{
|
|
40
|
+
logs.r('Inconsistent content input')
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}else{
|
|
44
|
+
logs.r('Unknown error')
|
|
45
|
+
}
|
|
46
|
+
}else{
|
|
47
|
+
logs.r('Not an empty directory');
|
|
48
|
+
}
|
|
49
|
+
}else{
|
|
50
|
+
logs.r('Directory does not exist');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const {md5} = require('rrid');
|
|
3
|
+
const oss = require('oss-sdk');
|
|
4
|
+
const logs = require('../utils/logs');
|
|
5
|
+
const input = require('../utils/input');
|
|
6
|
+
module.exports = async(arg)=>{
|
|
7
|
+
// Add administrator
|
|
8
|
+
const user = await input('Account Name:','Account Password:');
|
|
9
|
+
if(!user[0]||!user[1]){
|
|
10
|
+
logs.g('Account password cannot be empty');
|
|
11
|
+
}else{
|
|
12
|
+
const file = oss.file(process.cwd());
|
|
13
|
+
const name = md5(user[0]);
|
|
14
|
+
let data = await file.get('account/'+name);
|
|
15
|
+
if(data){
|
|
16
|
+
try{
|
|
17
|
+
data = JSON.parse(data);
|
|
18
|
+
}catch(err){
|
|
19
|
+
logs.r(err);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const key = md5(data.addTime+user[0]+user[1]+data.addTime);
|
|
23
|
+
if(data.key===key){
|
|
24
|
+
if(data.code==1){
|
|
25
|
+
logs.g('Login successful');
|
|
26
|
+
}else{
|
|
27
|
+
logs.r('Login prohibited');
|
|
28
|
+
}
|
|
29
|
+
}else{
|
|
30
|
+
logs.r('Login failed!');
|
|
31
|
+
}
|
|
32
|
+
}else{
|
|
33
|
+
logs.r('Account does not exist');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const net = require('net');
|
|
3
|
+
module.exports = async(arg)=>{
|
|
4
|
+
const port = arg[0]>0?arg[0]:3308;
|
|
5
|
+
const host = arg[1]?arg[1]:'127.0.0.1';
|
|
6
|
+
const server = net.createServer();
|
|
7
|
+
const clients = new Map(); // 存储在线客户端:key=clientId,value=socket实例
|
|
8
|
+
|
|
9
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
const net = require('net');
|
|
2
|
+
class TCPServer {
|
|
3
|
+
constructor() {
|
|
4
|
+
// 合并默认配置与自定义配置
|
|
5
|
+
this.config = {
|
|
6
|
+
...serverConfig,
|
|
7
|
+
...customConfig
|
|
8
|
+
};
|
|
9
|
+
// 创建TCP服务实例
|
|
10
|
+
this.server = net.createServer();
|
|
11
|
+
// 存储在线客户端(key: clientId, value: socket)
|
|
12
|
+
this.clients = new Map();
|
|
13
|
+
this.clientIdCounter = 0; // 客户端唯一ID计数器
|
|
14
|
+
|
|
15
|
+
// 绑定事件(核心通信逻辑)
|
|
16
|
+
this.bindEvents();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 绑定所有核心事件
|
|
21
|
+
*/
|
|
22
|
+
bindEvents() {
|
|
23
|
+
// 1. 新客户端连接事件
|
|
24
|
+
this.server.on('connection', (socket) => this.handleConnection(socket));
|
|
25
|
+
// 2. 服务端启动错误事件
|
|
26
|
+
this.server.on('error', (err) => this.handleServerError(err));
|
|
27
|
+
// 3. 进程退出事件(优雅关闭)
|
|
28
|
+
process.on('SIGINT', () => this.gracefulShutdown());
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* 处理新客户端连接
|
|
33
|
+
* @param {net.Socket} socket 客户端Socket实例
|
|
34
|
+
*/
|
|
35
|
+
handleConnection(socket) {
|
|
36
|
+
// 生成客户端唯一ID
|
|
37
|
+
const clientId = ++this.clientIdCounter;
|
|
38
|
+
const clientAddr = `${socket.remoteAddress}:${socket.remotePort}`;
|
|
39
|
+
|
|
40
|
+
// 存储客户端Socket
|
|
41
|
+
this.clients.set(clientId, socket);
|
|
42
|
+
console.log(`✅ [客户端${clientId}] ${clientAddr} 接入,当前在线:${this.clients.size}`);
|
|
43
|
+
|
|
44
|
+
// 客户端连接配置
|
|
45
|
+
socket.setTimeout(this.config.timeout);
|
|
46
|
+
socket.write(`欢迎连接TCP服务端(ID:${clientId}),请输入指令\n`);
|
|
47
|
+
|
|
48
|
+
// 缓存未完整接收的消息(解决分片/粘包)
|
|
49
|
+
let buffer = '';
|
|
50
|
+
|
|
51
|
+
// 绑定客户端Socket事件
|
|
52
|
+
socket.on('data', (data) => {
|
|
53
|
+
// 拼接缓存,解决分片问题
|
|
54
|
+
buffer += data.toString();
|
|
55
|
+
// 按结束符分割完整指令
|
|
56
|
+
const cmdList = buffer.split(this.config.commandEndChar);
|
|
57
|
+
// 最后一个元素可能是未完整接收的消息,重新缓存
|
|
58
|
+
buffer = cmdList.pop() || '';
|
|
59
|
+
|
|
60
|
+
// 遍历处理每一条完整指令
|
|
61
|
+
cmdList.forEach((cmdStr) => {
|
|
62
|
+
cmdStr = cmdStr.trim();
|
|
63
|
+
if (cmdStr) {
|
|
64
|
+
console.log(`📥 [客户端${clientId}] 接收指令:${cmdStr}`);
|
|
65
|
+
// 路由到业务逻辑
|
|
66
|
+
commandRouter.route(socket, cmdStr);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// 客户端断开连接
|
|
72
|
+
socket.on('end', () => {
|
|
73
|
+
this.clients.delete(clientId);
|
|
74
|
+
console.log(`❌ [客户端${clientId}] ${clientAddr} 断开,当前在线:${this.clients.size}`);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// 客户端连接超时
|
|
78
|
+
socket.on('timeout', () => {
|
|
79
|
+
console.log(`⏰ [客户端${clientId}] ${clientAddr} 连接超时`);
|
|
80
|
+
socket.end('连接超时,已断开\n');
|
|
81
|
+
this.clients.delete(clientId);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// 客户端连接错误
|
|
85
|
+
socket.on('error', (err) => {
|
|
86
|
+
console.error(`⚠️ [客户端${clientId}] ${clientAddr} 错误:${err.message}`);
|
|
87
|
+
this.clients.delete(clientId);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* 处理服务端启动错误
|
|
93
|
+
* @param {Error} err 错误对象
|
|
94
|
+
*/
|
|
95
|
+
handleServerError(err) {
|
|
96
|
+
if (err.code === 'EADDRINUSE') {
|
|
97
|
+
console.error(`❌ 端口${this.config.port}已被占用,请更换端口`);
|
|
98
|
+
} else {
|
|
99
|
+
console.error(`❌ 服务端错误:${err.message}`);
|
|
100
|
+
}
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* 优雅关闭服务端
|
|
106
|
+
*/
|
|
107
|
+
gracefulShutdown() {
|
|
108
|
+
console.log('\n🛑 正在关闭TCP服务端...');
|
|
109
|
+
// 断开所有客户端连接
|
|
110
|
+
this.clients.forEach((socket, clientId) => {
|
|
111
|
+
socket.end('服务端即将关闭,连接断开\n');
|
|
112
|
+
socket.destroy();
|
|
113
|
+
});
|
|
114
|
+
// 关闭服务端监听
|
|
115
|
+
this.server.close(() => {
|
|
116
|
+
console.log('✅ TCP服务端已优雅关闭');
|
|
117
|
+
process.exit(0);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* 启动服务端(对外暴露的核心API)
|
|
123
|
+
*/
|
|
124
|
+
start() {
|
|
125
|
+
this.server.listen(this.config.port, this.config.host, () => {
|
|
126
|
+
console.log(`🚀 TCP服务端已启动:${this.config.host}:${this.config.port}`);
|
|
127
|
+
console.log(`📌 连接超时时间:${this.config.timeout / 1000 / 60}分钟`);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* 广播消息给所有在线客户端(扩展API)
|
|
133
|
+
* @param {string} msg 广播消息
|
|
134
|
+
* @param {number} excludeClientId 排除的客户端ID(避免给自己广播)
|
|
135
|
+
*/
|
|
136
|
+
broadcast(msg, excludeClientId = 0) {
|
|
137
|
+
this.clients.forEach((socket, clientId) => {
|
|
138
|
+
if (clientId !== excludeClientId && !socket.destroyed) {
|
|
139
|
+
socket.write(`[广播] ${msg}\n`);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
module.exports = TCPServer;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const {md5} = require('rrid');
|
|
3
|
+
const oss = require('oss-sdk');
|
|
4
|
+
const logs = require('../../utils/logs');
|
|
5
|
+
const input = require('../../utils/input');
|
|
6
|
+
module.exports = async(arg)=>{
|
|
7
|
+
// Add administrator
|
|
8
|
+
const user = await input('Account Name:','Account Password:');
|
|
9
|
+
if(!user[0]||!user[1]){
|
|
10
|
+
logs.g('Account password cannot be empty');
|
|
11
|
+
}else{
|
|
12
|
+
const dirs = oss.dir(process.cwd());
|
|
13
|
+
if(await dirs.ok('account')){
|
|
14
|
+
const files = oss.file(process.cwd());
|
|
15
|
+
const name = md5(user[0]);
|
|
16
|
+
if(await files.ok('account/'+name)){
|
|
17
|
+
logs.r('The account already exists');
|
|
18
|
+
}else{
|
|
19
|
+
const info = {};
|
|
20
|
+
info.code = 1;
|
|
21
|
+
info.addTime = Date.now();
|
|
22
|
+
info.key = md5(info.addTime+user[0]+user[1]+info.addTime);
|
|
23
|
+
const dirRes = await dirs.add('database/'+name);
|
|
24
|
+
const fileRes = await files.add('account/'+name,JSON.stringify(info));
|
|
25
|
+
if(dirRes&&fileRes){
|
|
26
|
+
logs.g('Added successfully');
|
|
27
|
+
logs.y('Please remember your account password');
|
|
28
|
+
}else{
|
|
29
|
+
logs.r('Failed to add');
|
|
30
|
+
logs.r('Unknown error');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}else{
|
|
34
|
+
logs.r('Important folder lost');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const {md5} = require('rrid');
|
|
3
|
+
const oss = require('oss-sdk');
|
|
4
|
+
const logs = require("../../utils/logs");
|
|
5
|
+
const input = require('../../utils/input');
|
|
6
|
+
module.exports = async()=>{
|
|
7
|
+
const dir = oss.dir(process.cwd());
|
|
8
|
+
const list = await dir.list('account');
|
|
9
|
+
if(list&&list.length>0){
|
|
10
|
+
const res = await input('Enter account name:');
|
|
11
|
+
if(res[0]){
|
|
12
|
+
// Verify account
|
|
13
|
+
const name = md5(res[0]);
|
|
14
|
+
const file = oss.file(process.cwd());
|
|
15
|
+
let ok = await file.ok('account/'+name);
|
|
16
|
+
const ress = await input('Confirm deletion (yes or no):');
|
|
17
|
+
if(ress[0]==='yes'){
|
|
18
|
+
// Does the database exist
|
|
19
|
+
const lists = await dir.list('database/'+name);
|
|
20
|
+
if(lists&&lists.length>0){
|
|
21
|
+
logs.r('Delete the database of this account first');
|
|
22
|
+
}else{
|
|
23
|
+
const dele = await dir.dele('database/'+name);
|
|
24
|
+
const deles = await file.dele('account/'+name);
|
|
25
|
+
if(dele&&deles){
|
|
26
|
+
logs.g('Deleted successfully')
|
|
27
|
+
}else{
|
|
28
|
+
logs.r('Deletion failed')
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}else{
|
|
32
|
+
logs.g('Choose not to delete')
|
|
33
|
+
}
|
|
34
|
+
}else{
|
|
35
|
+
logs.r('Account name cannot be empty');
|
|
36
|
+
}
|
|
37
|
+
}else{
|
|
38
|
+
logs.r('No account exists');
|
|
39
|
+
logs.y('Please add an account');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const {md5} = require('rrid');
|
|
3
|
+
const oss = require('oss-sdk');
|
|
4
|
+
const logs = require('../../utils/logs');
|
|
5
|
+
const input = require('../../utils/input');
|
|
6
|
+
module.exports = async()=>{
|
|
7
|
+
const dir = oss.dir(process.cwd());
|
|
8
|
+
const list = await dir.list('account');
|
|
9
|
+
if(list&&list.length>0){
|
|
10
|
+
const res = await input('Enter account name:');
|
|
11
|
+
if(res[0]){
|
|
12
|
+
// Verify account
|
|
13
|
+
const name = 'account/'+md5(res[0]);
|
|
14
|
+
const file = oss.file(process.cwd());
|
|
15
|
+
let data = await file.get(name);
|
|
16
|
+
if(data){
|
|
17
|
+
try{
|
|
18
|
+
data = JSON.parse(data);
|
|
19
|
+
if(data.code==1){
|
|
20
|
+
logs.g(res[0]+':(Allow login)');
|
|
21
|
+
}else{
|
|
22
|
+
logs.r(res[0]+':(Login prohibited)');
|
|
23
|
+
}
|
|
24
|
+
const status = await input('Modify login status (1 allows or 0 prohibits):');
|
|
25
|
+
if(data.code==status[0]) {
|
|
26
|
+
logs.g('Modified successfully');
|
|
27
|
+
}else{
|
|
28
|
+
if(status[0]=='0'||status[0]=='1'){
|
|
29
|
+
data.code = status[0];
|
|
30
|
+
data = JSON.stringify(data);
|
|
31
|
+
const edit = await file.edit(name,data);
|
|
32
|
+
if(edit){
|
|
33
|
+
logs.g('Modified successfully');
|
|
34
|
+
}else{
|
|
35
|
+
logs.r('Modification failed');
|
|
36
|
+
}
|
|
37
|
+
}else{
|
|
38
|
+
logs.r('Invalid input:'+status[0]);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}catch(err){
|
|
42
|
+
logs.r(err);
|
|
43
|
+
}
|
|
44
|
+
}else{
|
|
45
|
+
logs.r('The account does not exist');
|
|
46
|
+
}
|
|
47
|
+
}else{
|
|
48
|
+
logs.r('Account name cannot be empty');
|
|
49
|
+
}
|
|
50
|
+
}else{
|
|
51
|
+
logs.r('No account exists');
|
|
52
|
+
logs.y('Please add an account');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const scode = require('./scode')
|
|
3
|
+
const logs = require('../../utils/logs');
|
|
4
|
+
module.exports = async(arg)=>{
|
|
5
|
+
if(arg[0]===undefined) {
|
|
6
|
+
logs.r('Please enter parameters');
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const list = ['add','edit','dele'];
|
|
10
|
+
if(list.includes(arg[0])){
|
|
11
|
+
const code = await scode(arg.slice(1));
|
|
12
|
+
if(code) require('./'+arg[0])(arg.slice(1));
|
|
13
|
+
}else{
|
|
14
|
+
logs.r('Wrong parameter');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const {md5} = require('rrid');
|
|
3
|
+
const oss = require('oss-sdk');
|
|
4
|
+
const logs = require('../../utils/logs');
|
|
5
|
+
const input = require('../../utils/input');
|
|
6
|
+
module.exports = async (arg) => {
|
|
7
|
+
let code;
|
|
8
|
+
if (arg[0]) {
|
|
9
|
+
code = arg[0];
|
|
10
|
+
} else {
|
|
11
|
+
const arr = await input('Enter security code:');
|
|
12
|
+
if (arr.length === 0) {
|
|
13
|
+
logs.r('Unknown error');
|
|
14
|
+
return false;
|
|
15
|
+
} else {
|
|
16
|
+
code = arr[0];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const file = oss.file(process.cwd());
|
|
20
|
+
let data = await file.get('config');
|
|
21
|
+
if (data === null) {
|
|
22
|
+
logs.r('Configuration file missing');
|
|
23
|
+
return false;
|
|
24
|
+
} else {
|
|
25
|
+
try {
|
|
26
|
+
data = JSON.parse(data);
|
|
27
|
+
} catch (err) {
|
|
28
|
+
logs.r(err);
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
if (!data.addTime || !data.key) {
|
|
32
|
+
logs.r('bad configuration file');
|
|
33
|
+
return false;
|
|
34
|
+
} else {
|
|
35
|
+
const keys = md5(data.addTime+code+data.addTime);
|
|
36
|
+
if (keys === data.key) {
|
|
37
|
+
return true;
|
|
38
|
+
} else {
|
|
39
|
+
logs.r('Wrong security code');
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const logs = require('./logs')
|
|
2
|
+
const readline = require('readline');
|
|
3
|
+
module.exports = (...arg) => {
|
|
4
|
+
let arr = [];
|
|
5
|
+
return new Promise(async (resolve) => {
|
|
6
|
+
if (arg.length > 0) {
|
|
7
|
+
try{
|
|
8
|
+
const ps = readline.createInterface({
|
|
9
|
+
input: process.stdin, // 输入源:终端标准输入
|
|
10
|
+
output: process.stdout // 输出源:终端标准输出
|
|
11
|
+
});
|
|
12
|
+
process.stdin.setEncoding('utf8');
|
|
13
|
+
const inputs = (text)=>{
|
|
14
|
+
return new Promise((resolves) => {
|
|
15
|
+
ps.question('\033[33m'+text, (answer) => {
|
|
16
|
+
console.log('\033[0m');
|
|
17
|
+
resolves(answer.trim());
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
for (let i = 0; i < arg.length; i++) {
|
|
22
|
+
arr.push(await inputs(arg[i]));
|
|
23
|
+
if(arg.length-1===i) ps.close();
|
|
24
|
+
}
|
|
25
|
+
resolve(arr);
|
|
26
|
+
}catch(err){
|
|
27
|
+
logs.r(err);
|
|
28
|
+
resolve(arr);
|
|
29
|
+
}
|
|
30
|
+
} else {
|
|
31
|
+
resolve(arr);
|
|
32
|
+
logs.r('Please enter parameters');
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const logs = (d)=> {console.log(d);}
|
|
2
|
+
module.exports = {
|
|
3
|
+
b(...d){
|
|
4
|
+
for (var i = 0; i < d.length; i++) {
|
|
5
|
+
logs('\033[30m'+d[i]+'\033[0m');
|
|
6
|
+
}
|
|
7
|
+
},
|
|
8
|
+
r(...d){
|
|
9
|
+
for (var i = 0; i < d.length; i++) {
|
|
10
|
+
logs('\033[31m'+d[i]+'\033[0m');
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
g(...d){
|
|
14
|
+
for (var i = 0; i < d.length; i++) {
|
|
15
|
+
logs('\033[32m'+d[i]+'\033[0m');
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
y(...d){
|
|
19
|
+
for (var i = 0; i < d.length; i++) {
|
|
20
|
+
logs('\033[33m'+d[i]+'\033[0m');
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
blue(...d){
|
|
24
|
+
for (var i = 0; i < d.length; i++) {
|
|
25
|
+
logs('\033[34m'+d[i]+'\033[0m');
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
p(...d){
|
|
29
|
+
for (var i = 0; i < d.length; i++) {
|
|
30
|
+
logs('\033[35m'+d[i]+'\033[0m');
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
sblue(...d){
|
|
34
|
+
for (var i = 0; i < d.length; i++) {
|
|
35
|
+
logs('\033[36m'+d[i]+'\033[0m');
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
w(...d){
|
|
39
|
+
for (var i = 0; i < d.length; i++) {
|
|
40
|
+
logs('\033[37m'+d[i]+'\033[0m');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
package/package.json
CHANGED
|
@@ -1,19 +1,29 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
2
|
+
"name": "fkg",
|
|
3
|
+
"version": "1.1.4",
|
|
4
|
+
"description": "Read and set memory key!",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"fkg": "bin/fkg"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [
|
|
10
|
+
"db",
|
|
11
|
+
"key",
|
|
12
|
+
"disk",
|
|
13
|
+
"data",
|
|
14
|
+
"cache",
|
|
15
|
+
"database"
|
|
16
|
+
],
|
|
17
|
+
"author": "weduu",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"files": [
|
|
20
|
+
"lib/",
|
|
21
|
+
"bin/",
|
|
22
|
+
"index.js",
|
|
23
|
+
"README.md"
|
|
24
|
+
],
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"oss-sdk": "^1.0.5",
|
|
27
|
+
"rrid": "^1.0.7"
|
|
28
|
+
}
|
|
29
|
+
}
|
package/lib/index.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
module.exports = (arg)=>{
|
|
3
|
-
const fs = require('./utils/fs');
|
|
4
|
-
const {md5,ekey,dkey} = require('rrid');
|
|
5
|
-
const {str,obj,arr} = require('./utils/type');
|
|
6
|
-
if(arg&&obj(arg)) {
|
|
7
|
-
let io = {};
|
|
8
|
-
let dirs = {};
|
|
9
|
-
let datas = {};
|
|
10
|
-
if(arg.dir&&fs.isDir(arg.dir)) {
|
|
11
|
-
arg.dir = fs.link(arg.dir,'./data');
|
|
12
|
-
if(!fs.isDir(arg.dir)) fs.addDir(arg.dir);
|
|
13
|
-
}else{
|
|
14
|
-
delete arg.dir;
|
|
15
|
-
}
|
|
16
|
-
if(arg.db&&arr(arg.db)){
|
|
17
|
-
if(arg.db.length>0){
|
|
18
|
-
for (let i = 0;i < arg.db.length;i++) {
|
|
19
|
-
const n = arg.db[i];
|
|
20
|
-
if(!str(n)){
|
|
21
|
-
console.log(`The db.${n} is not string`);
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
if(arg.dir) {
|
|
25
|
-
dirs[n] = fs.link(arg.dir,'./'+n);
|
|
26
|
-
if(!fs.isDir(dirs[n])) fs.addDir(dirs[n]);
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
}else{
|
|
30
|
-
console.log("The length of 'db' is not 0");
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
}else{
|
|
34
|
-
console.log('The db is array');
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
if(arg.key&&str(arg.key)) {
|
|
38
|
-
arg.key = md5(arg.key+'fkg');
|
|
39
|
-
}else{
|
|
40
|
-
delete arg.key;
|
|
41
|
-
}
|
|
42
|
-
const def = (n) => {
|
|
43
|
-
return {
|
|
44
|
-
set(id,data){
|
|
45
|
-
if(!id||!str(id)||!data) return false;
|
|
46
|
-
datas[n][id] = data;
|
|
47
|
-
return true;
|
|
48
|
-
},
|
|
49
|
-
add(id,data){
|
|
50
|
-
if(!id||!str(id)||!data||!arg.dir) return false;
|
|
51
|
-
if(arg.key) data = ekey(JSON.stringify(data),arg.key+id);
|
|
52
|
-
return fs.addJson(fs.link(dirs[n],'./'+id),data);
|
|
53
|
-
},
|
|
54
|
-
get(id){
|
|
55
|
-
if(!id||!str(id)) return null;
|
|
56
|
-
let ids = datas[n][id];
|
|
57
|
-
if(!ids&&arg.dir){
|
|
58
|
-
const url = fs.link(dirs[n],'./'+id);
|
|
59
|
-
if(fs.isFile(url)){
|
|
60
|
-
ids = fs.readJson(url);
|
|
61
|
-
if(ids&&arg.key) ids = JSON.parse(dkey(ids,arg.key+id));
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return ids;
|
|
65
|
-
},
|
|
66
|
-
list(){
|
|
67
|
-
let arr = Object.keys(datas[n]);
|
|
68
|
-
if(arg.dir) arr = [...arr,...fs.readdirSync(dirs[n])];
|
|
69
|
-
return arr;
|
|
70
|
-
},
|
|
71
|
-
del(id){
|
|
72
|
-
let res = true;
|
|
73
|
-
if(!id||!str(id)) return false;
|
|
74
|
-
if(datas[n][id]) delete datas[n][id];
|
|
75
|
-
if(arg.dir){
|
|
76
|
-
const url = fs.link(dirs[n],'./'+id);
|
|
77
|
-
if(fs.isFile(url)) res = fs.delFile(url);
|
|
78
|
-
if(!res) return res;
|
|
79
|
-
}
|
|
80
|
-
return res;
|
|
81
|
-
},
|
|
82
|
-
clear(){
|
|
83
|
-
datas[n] = {}
|
|
84
|
-
return true;
|
|
85
|
-
},
|
|
86
|
-
kill(){
|
|
87
|
-
if(arg.dir){
|
|
88
|
-
const list = fs.readdirSync(dirs[n]);
|
|
89
|
-
for (let i = 0;i < list.length;i++) {
|
|
90
|
-
fs.delFile(fs.link(dirs[n],'./'+list[i]));
|
|
91
|
-
};
|
|
92
|
-
return true;
|
|
93
|
-
}else{
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
for (let i = 0;i < arg.db.length;i++) {
|
|
100
|
-
const n = arg.db[i];
|
|
101
|
-
datas[n] = {};
|
|
102
|
-
io[n] = def(n);
|
|
103
|
-
};
|
|
104
|
-
return io;
|
|
105
|
-
}else{
|
|
106
|
-
console.log('Missing parameters');
|
|
107
|
-
}
|
|
108
|
-
}
|
package/lib/utils/fs.js
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
const isDir = (url) => {
|
|
4
|
-
if (fs.existsSync(url)) {
|
|
5
|
-
const stat = fs.statSync(url);
|
|
6
|
-
return stat.isDirectory();
|
|
7
|
-
} else {
|
|
8
|
-
return false;
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
const addFile = (url, data)=>{
|
|
12
|
-
try {
|
|
13
|
-
fs.writeFileSync(url, data,{encoding:'utf8'});
|
|
14
|
-
return true;
|
|
15
|
-
} catch (err) {
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
module.exports = {
|
|
20
|
-
isDir,
|
|
21
|
-
addFile,
|
|
22
|
-
link(...args){
|
|
23
|
-
return path.resolve(...args)
|
|
24
|
-
},
|
|
25
|
-
isFile(url) {
|
|
26
|
-
if (fs.existsSync(url)) {
|
|
27
|
-
const stats = fs.statSync(url);
|
|
28
|
-
return stats.isFile();
|
|
29
|
-
} else {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
addJson(url,data){
|
|
34
|
-
return addFile(url,JSON.stringify(data));
|
|
35
|
-
},
|
|
36
|
-
file(url){
|
|
37
|
-
try {
|
|
38
|
-
return fs.statSync(url)
|
|
39
|
-
} catch (error) {
|
|
40
|
-
return false
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
readJson(url){
|
|
44
|
-
try {
|
|
45
|
-
return JSON.parse(fs.readFileSync(url));
|
|
46
|
-
} catch (error) {
|
|
47
|
-
return null
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
readFile(url) {
|
|
51
|
-
return new Promise((resolve) => {
|
|
52
|
-
fs.readFile(url, 'utf8', (err, data) => {
|
|
53
|
-
if (err) {
|
|
54
|
-
resolve(null);
|
|
55
|
-
}else{
|
|
56
|
-
resolve(data) ;
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
})
|
|
60
|
-
},
|
|
61
|
-
readdirSync(url){
|
|
62
|
-
try {
|
|
63
|
-
return fs.readdirSync(url);
|
|
64
|
-
} catch (error) {
|
|
65
|
-
return []
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
dirFile(paths) {
|
|
69
|
-
let obj = {};
|
|
70
|
-
obj[paths] = 'dir';
|
|
71
|
-
const arrFile = (url) => {
|
|
72
|
-
const item = fs.readdirSync(url);
|
|
73
|
-
if (item.length > 0) {
|
|
74
|
-
let dir = [];
|
|
75
|
-
item.forEach(e => {
|
|
76
|
-
const ets = path.resolve(url, e);
|
|
77
|
-
if (isDir(ets)) {
|
|
78
|
-
dir.push(ets);
|
|
79
|
-
obj[ets] = 'dir';
|
|
80
|
-
} else {
|
|
81
|
-
obj[ets] = 'file';
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
for (let i = 0; i < dir.length; i++) {
|
|
85
|
-
arrFile(dir[i]);
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
arrFile(paths);
|
|
90
|
-
return obj;
|
|
91
|
-
},
|
|
92
|
-
addDir(url) {
|
|
93
|
-
try {
|
|
94
|
-
fs.mkdirSync(url);
|
|
95
|
-
return true;
|
|
96
|
-
} catch (error) {
|
|
97
|
-
return false
|
|
98
|
-
}
|
|
99
|
-
},
|
|
100
|
-
mkdirSync(url) {
|
|
101
|
-
return fs.mkdirSync(url);
|
|
102
|
-
},
|
|
103
|
-
delFile(url) {
|
|
104
|
-
try {
|
|
105
|
-
fs.unlinkSync(url);
|
|
106
|
-
return true
|
|
107
|
-
} catch (error) {
|
|
108
|
-
return false
|
|
109
|
-
}
|
|
110
|
-
},
|
|
111
|
-
getSize(obj) {
|
|
112
|
-
let size = 0;
|
|
113
|
-
for (const key in obj) {
|
|
114
|
-
if (obj[key] === 'file') {
|
|
115
|
-
size += fs.statSync(key).size;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return size
|
|
119
|
-
},
|
|
120
|
-
copyFile(old, news, def) {
|
|
121
|
-
return new Promise((resolve) => {
|
|
122
|
-
// 创建可读流来读取源文件
|
|
123
|
-
const oldStream = fs.createReadStream(old);
|
|
124
|
-
// 创建可写流来写入目标文件
|
|
125
|
-
const newStream = fs.createWriteStream(news);
|
|
126
|
-
// 使用管道将源文件的流复制到目标文件流中
|
|
127
|
-
oldStream.pipe(newStream);
|
|
128
|
-
// 处理错误和结束事件
|
|
129
|
-
oldStream.on('data', (data) => {
|
|
130
|
-
if (def) def(data.length);
|
|
131
|
-
})
|
|
132
|
-
oldStream.on('error', () => {
|
|
133
|
-
newStream.close();
|
|
134
|
-
resolve(false);
|
|
135
|
-
});
|
|
136
|
-
newStream.on('error', () => {
|
|
137
|
-
oldStream.close();
|
|
138
|
-
resolve(false);
|
|
139
|
-
});
|
|
140
|
-
// 当源文件流结束时,表示复制完成,可以处理结束事件
|
|
141
|
-
oldStream.on('end', () => {
|
|
142
|
-
resolve(true);
|
|
143
|
-
});
|
|
144
|
-
})
|
|
145
|
-
}
|
|
146
|
-
}
|
package/lib/utils/type.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
const conf = {
|
|
3
|
-
n:/^[1-9]\d*$/,
|
|
4
|
-
ip:/^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^::([\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:):([\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){2}:([\da-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){3}:([\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$|^:((:[\da-fA-F]{1,4}){1,6}|:)$|^[\da-fA-F]{1,4}:((:[\da-fA-F]{1,4}){1,5}|:)$|^([\da-fA-F]{1,4}:){2}((:[\da-fA-F]{1,4}){1,4}|:)$|^([\da-fA-F]{1,4}:){3}((:[\da-fA-F]{1,4}){1,3}|:)$|^([\da-fA-F]{1,4}:){4}((:[\da-fA-F]{1,4}){1,2}|:)$|^([\da-fA-F]{1,4}:){5}:([\da-fA-F]{1,4})?$|^([\da-fA-F]{1,4}:){6}:$/,
|
|
5
|
-
domain:/^([a-zA-Z0-9]([a-zA-Z0-9-_]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,11}$/, //域名
|
|
6
|
-
};
|
|
7
|
-
module.exports = {
|
|
8
|
-
ip(d){
|
|
9
|
-
// 验证ipv4 ipv6
|
|
10
|
-
return conf.ip.test(d);
|
|
11
|
-
},
|
|
12
|
-
domain(d){
|
|
13
|
-
// 验证域名
|
|
14
|
-
return conf.domain.test(d);
|
|
15
|
-
},
|
|
16
|
-
host(d){
|
|
17
|
-
// 验证主机host
|
|
18
|
-
return d=='localhost'||conf.ip.test(d)||conf.domain.test(d);
|
|
19
|
-
},
|
|
20
|
-
number(d) {
|
|
21
|
-
return typeof d=='number'&&conf.n.test(d);
|
|
22
|
-
},
|
|
23
|
-
port(d){
|
|
24
|
-
return 0<=d&&d<=65536&&conf.n.test(d);
|
|
25
|
-
},
|
|
26
|
-
str(d){
|
|
27
|
-
return typeof(d)=='string';
|
|
28
|
-
},
|
|
29
|
-
arr(d){
|
|
30
|
-
return Object.prototype.toString.call(d) === '[object Array]';
|
|
31
|
-
},
|
|
32
|
-
def(d){
|
|
33
|
-
return typeof d === 'function';
|
|
34
|
-
},
|
|
35
|
-
reg(d){
|
|
36
|
-
try {
|
|
37
|
-
return Object.prototype.toString.call(d) === '[object RegExp]';
|
|
38
|
-
} catch (error) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
obj(d){
|
|
43
|
-
return Object.prototype.toString.call(d) === '[object Object]';
|
|
44
|
-
}
|
|
45
|
-
}
|