mirror of
https://gitee.com/js-yhsec/energy_storage.git
synced 2026-05-27 18:59:26 +08:00
引入海康威视插件
This commit is contained in:
Binary file not shown.
@@ -1,12 +0,0 @@
|
||||
module.exports = {
|
||||
plugins: [
|
||||
[
|
||||
'import',
|
||||
{
|
||||
libraryName: 'ant-design-vue',
|
||||
libraryDirectory: 'es',
|
||||
style: true // 或 true(使用 less)
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
72
web/components.d.ts
vendored
Normal file
72
web/components.d.ts
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
/* eslint-disable */
|
||||
// @ts-nocheck
|
||||
// Generated by unplugin-vue-components
|
||||
// Read more: https://github.com/vuejs/core/pull/3399
|
||||
// biome-ignore lint: disable
|
||||
export {}
|
||||
|
||||
/* prettier-ignore */
|
||||
declare module 'vue' {
|
||||
export interface GlobalComponents {
|
||||
AButton: typeof import('ant-design-vue/es')['Button']
|
||||
ACard: typeof import('ant-design-vue/es')['Card']
|
||||
ACascader: typeof import('ant-design-vue/es')['Cascader']
|
||||
ACheckbox: typeof import('ant-design-vue/es')['Checkbox']
|
||||
AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider']
|
||||
ADatePicker: typeof import('ant-design-vue/es')['DatePicker']
|
||||
AForm: typeof import('ant-design-vue/es')['Form']
|
||||
AFormItem: typeof import('ant-design-vue/es')['FormItem']
|
||||
AImage: typeof import('ant-design-vue/es')['Image']
|
||||
AInput: typeof import('ant-design-vue/es')['Input']
|
||||
AInputNumber: typeof import('ant-design-vue/es')['InputNumber']
|
||||
AInputPassword: typeof import('ant-design-vue/es')['InputPassword']
|
||||
Alarm: typeof import('./src/components/Home/Alarm.vue')['default']
|
||||
AModal: typeof import('ant-design-vue/es')['Modal']
|
||||
APagination: typeof import('ant-design-vue/es')['Pagination']
|
||||
ARadio: typeof import('ant-design-vue/es')['Radio']
|
||||
ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup']
|
||||
ARangePicker: typeof import('ant-design-vue/es')['RangePicker']
|
||||
ASelect: typeof import('ant-design-vue/es')['Select']
|
||||
ASelectOption: typeof import('ant-design-vue/es')['SelectOption']
|
||||
ASwitch: typeof import('ant-design-vue/es')['Switch']
|
||||
ATable: typeof import('ant-design-vue/es')['Table']
|
||||
ATag: typeof import('ant-design-vue/es')['Tag']
|
||||
ATextarea: typeof import('ant-design-vue/es')['Textarea']
|
||||
ATimePicker: typeof import('ant-design-vue/es')['TimePicker']
|
||||
ATimeRangePicker: typeof import('ant-design-vue/es')['TimeRangePicker']
|
||||
ATooltip: typeof import('ant-design-vue/es')['Tooltip']
|
||||
ATreeSelect: typeof import('ant-design-vue/es')['TreeSelect']
|
||||
Charge: typeof import('./src/components/Home/Charge.vue')['default']
|
||||
ComTable: typeof import('./src/components/ComTable.vue')['default']
|
||||
DetailInfo: typeof import('./src/components/DetailInfo.vue')['default']
|
||||
Device: typeof import('./src/components/monitor/device.vue')['default']
|
||||
DisCharge: typeof import('./src/components/Home/Modal/DisCharge.vue')['default']
|
||||
EditCom: typeof import('./src/components/EditCom.vue')['default']
|
||||
Energy: typeof import('./src/components/Home/Energy.vue')['default']
|
||||
EnergyEchart: typeof import('./src/components/statisticalAnalysis/energyEchart.vue')['default']
|
||||
EnvInfo: typeof import('./src/components/Home/Modal/EnvInfo.vue')['default']
|
||||
Haikang: typeof import('./src/components/monitor/haikang.vue')['default']
|
||||
LockOutlined: typeof import('@ant-design/icons-vue')['LockOutlined']
|
||||
Map: typeof import('./src/components/Home/Map.vue')['default']
|
||||
Map_tianditu: typeof import('./src/components/Home/Map_tianditu.vue')['default']
|
||||
Modal: typeof import('./src/components/Home/Modal.vue')['default']
|
||||
OnLine: typeof import('./src/components/Home/onLine.vue')['default']
|
||||
OperateCom: typeof import('./src/components/OperateCom.vue')['default']
|
||||
Operational: typeof import('./src/components/Home/Operational.vue')['default']
|
||||
OperationalInfo: typeof import('./src/components/Home/Modal/OperationalInfo.vue')['default']
|
||||
PolicyForm: typeof import('./src/components/system/policyForm.vue')['default']
|
||||
'PolicyForm copy': typeof import('./src/components/system/policyForm copy.vue')['default']
|
||||
PredictEcharts: typeof import('./src/components/predict/predictEcharts.vue')['default']
|
||||
PrefabCabin: typeof import('./src/components/Home/Modal/PrefabCabin.vue')['default']
|
||||
Pv: typeof import('./src/components/Home/Pv.vue')['default']
|
||||
Revenue: typeof import('./src/components/Home/Modal/Revenue.vue')['default']
|
||||
RouterLink: typeof import('vue-router')['RouterLink']
|
||||
RouterView: typeof import('vue-router')['RouterView']
|
||||
SearchBox: typeof import('./src/components/SearchBox.vue')['default']
|
||||
StatisticalInfo: typeof import('./src/components/Home/Modal/StatisticalInfo.vue')['default']
|
||||
TreeTable: typeof import('./src/components/TreeTable.vue')['default']
|
||||
UserOutlined: typeof import('@ant-design/icons-vue')['UserOutlined']
|
||||
Utilization: typeof import('./src/components/Home/Modal/Utilization.vue')['default']
|
||||
Videos: typeof import('./src/components/monitor/videos.vue')['default']
|
||||
}
|
||||
}
|
||||
2537
web/package-lock.json
generated
2537
web/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -14,10 +14,10 @@
|
||||
"core-js": "^3.8.3",
|
||||
"echarts": "^6.0.0",
|
||||
"moment": "^2.30.1",
|
||||
"qs": "^6.12.3",
|
||||
"vue": "^3.2.13",
|
||||
"vue-router": "^4.0.3",
|
||||
"vuex": "^4.0.0",
|
||||
"qs": "^6.12.3"
|
||||
"vuex": "^4.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.12.16",
|
||||
@@ -34,13 +34,16 @@
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
"eslint-plugin-react": "^7.37.5",
|
||||
"eslint-plugin-vue": "^8.7.1",
|
||||
"less": "^4.4.1",
|
||||
"less-loader": "^12.3.0",
|
||||
"prettier": "^2.8.8",
|
||||
"sass": "^1.32.7",
|
||||
"sass-loader": "^12.0.0",
|
||||
"unplugin-vue-components": "^29.0.0",
|
||||
"vue-eslint-parser": "^10.2.0",
|
||||
"vue-tianditu": "^2.7.6",
|
||||
"webpack-cli": "^6.0.1",
|
||||
"webpack-dev-server": "^5.2.2",
|
||||
"vue-tianditu": "^2.7.6"
|
||||
"webpack-dev-server": "^5.2.2"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"root": true,
|
||||
|
||||
621
web/public/codebase/encryption/AES.js
Normal file
621
web/public/codebase/encryption/AES.js
Normal file
@@ -0,0 +1,621 @@
|
||||
(function() {
|
||||
var Nr = 10;
|
||||
// convert two-dimensional indicies to one-dim array indices
|
||||
var I00 = 0;
|
||||
var I01 = 1;
|
||||
var I02 = 2;
|
||||
var I03 = 3;
|
||||
var I10 = 4;
|
||||
var I11 = 5;
|
||||
var I12 = 6;
|
||||
var I13 = 7;
|
||||
var I20 = 8;
|
||||
var I21 = 9;
|
||||
var I22 = 10;
|
||||
var I23 = 11;
|
||||
var I30 = 12;
|
||||
var I31 = 13;
|
||||
var I32 = 14;
|
||||
var I33 = 15;
|
||||
|
||||
// S-Box substitution table
|
||||
var S_enc = new Array(
|
||||
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
|
||||
0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
|
||||
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
|
||||
0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
|
||||
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
|
||||
0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
|
||||
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
|
||||
0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
|
||||
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
|
||||
0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
|
||||
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
|
||||
0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
|
||||
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
|
||||
0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
|
||||
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
|
||||
0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
|
||||
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
|
||||
0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
|
||||
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
|
||||
0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
|
||||
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
|
||||
0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
|
||||
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
|
||||
0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
|
||||
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
|
||||
0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
|
||||
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
|
||||
0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
|
||||
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
|
||||
0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
|
||||
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
|
||||
0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16);
|
||||
|
||||
// inverse S-Box for decryptions
|
||||
var S_dec = new Array(
|
||||
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,
|
||||
0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
|
||||
0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
|
||||
0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
|
||||
0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,
|
||||
0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
|
||||
0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,
|
||||
0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
|
||||
0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
|
||||
0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
|
||||
0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
|
||||
0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
|
||||
0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
|
||||
0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
|
||||
0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
|
||||
0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
|
||||
0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,
|
||||
0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
|
||||
0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,
|
||||
0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
|
||||
0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
|
||||
0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
|
||||
0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,
|
||||
0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
|
||||
0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,
|
||||
0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
|
||||
0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
|
||||
0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
|
||||
0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,
|
||||
0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
|
||||
0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,
|
||||
0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d);
|
||||
|
||||
function cvt_hex8 (val) {
|
||||
var vh = (val>>>4)&0x0f;
|
||||
return vh.toString(16) + (val&0x0f).toString(16);
|
||||
}
|
||||
function cvt_byte (str) {
|
||||
// get the first hex digit
|
||||
var val1 = str.charCodeAt(0);
|
||||
// do some error checking
|
||||
if (val1 >= 48 && val1 <= 57) {
|
||||
// have a valid digit 0-9
|
||||
val1 -= 48;
|
||||
} else if (val1 >= 65 && val1 <= 70) {
|
||||
// have a valid digit A-F
|
||||
val1 -= 55;
|
||||
} else if (val1 >= 97 && val1 <= 102) {
|
||||
// have a valid digit A-F
|
||||
val1 -= 87;
|
||||
} else {
|
||||
// not 0-9 or A-F, complain
|
||||
console.log( str.charAt(1)+" is not a valid hex digit" );
|
||||
return -1;
|
||||
}
|
||||
// get the second hex digit
|
||||
var val2 = str.charCodeAt(1);
|
||||
// do some error checking
|
||||
if ( val2 >= 48 && val2 <= 57 ) {
|
||||
// have a valid digit 0-9
|
||||
val2 -= 48;
|
||||
} else if ( val2 >= 65 && val2 <= 70 ) {
|
||||
// have a valid digit A-F
|
||||
val2 -= 55;
|
||||
} else if ( val2 >= 97 && val2 <= 102 ) {
|
||||
// have a valid digit A-F
|
||||
val2 -= 87;
|
||||
} else {
|
||||
// not 0-9 or A-F, complain
|
||||
console.log( str.charAt(2)+" is not a valid hex digit" );
|
||||
return -1;
|
||||
}
|
||||
// all is ok, return the value
|
||||
return val1*16 + val2;
|
||||
}
|
||||
|
||||
// conversion function for non-constant subscripts
|
||||
// assume subscript range 0..3
|
||||
function I(x,y) {
|
||||
return (x*4) + y;
|
||||
}
|
||||
|
||||
// remove spaces from input
|
||||
function remove_spaces(instr) {
|
||||
var i;
|
||||
var outstr = "";
|
||||
for(i=0; i<instr.length; i++) {
|
||||
if ( instr.charAt(i) != " " )
|
||||
// not a space, include it
|
||||
outstr += instr.charAt(i);
|
||||
}
|
||||
return outstr;
|
||||
}
|
||||
|
||||
// get the message to encrypt/decrypt or the key
|
||||
// return as a 16-byte array
|
||||
function get_value(str, isASCII) {
|
||||
var dbyte = new Array(16);
|
||||
var i;
|
||||
var val; // one hex digit
|
||||
if (isASCII) {
|
||||
// check length of data
|
||||
if (str.length > 16) {
|
||||
console.log("is too long, using the first 16 ASCII characters" );
|
||||
}
|
||||
// have ASCII data
|
||||
// 16 characters?
|
||||
if (str.length >= 16) {
|
||||
// 16 or more characters
|
||||
for(i=0; i<16; i++) {
|
||||
dbyte[i] = str.charCodeAt(i);
|
||||
}
|
||||
} else {
|
||||
// less than 16 characters - fill with NULLs
|
||||
for(i=0; i<str.length; i++) {
|
||||
dbyte[i] = str.charCodeAt(i);
|
||||
}
|
||||
for( i=str.length; i<16; i++) {
|
||||
dbyte[i] = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// have hex data - remove any spaces they used, then convert
|
||||
//str = remove_spaces(str);
|
||||
// check length of data
|
||||
if ( str.length != 32 ) {
|
||||
//console.log("\tget_value:\tstr = " + str + "\tisASCII = " + isASCII); //isASCII = false
|
||||
console.log("length wrong: Is " + str.length + " hex digits, but must be 128 bits (32 hex digits)");
|
||||
dbyte[0] = -1;
|
||||
return dbyte;
|
||||
}
|
||||
for( i=0; i<16; i++ ) {
|
||||
// isolate and convert this substring
|
||||
dbyte[i] = cvt_byte( str.substr(i*2,2) );
|
||||
if( dbyte[i] < 0 ) {
|
||||
// have an error
|
||||
dbyte[0] = -1;
|
||||
return dbyte;
|
||||
}
|
||||
}
|
||||
}
|
||||
// return successful conversion
|
||||
return dbyte;
|
||||
}
|
||||
//do the AES GF(2**8) multiplication
|
||||
// do this by the shift-and-"add" approach
|
||||
function aes_mul(a, b) {
|
||||
var res = 0;
|
||||
while(a > 0) {
|
||||
if((a&1) != 0)
|
||||
res = res ^ b; // "add" to the result
|
||||
a >>>= 1; // shift a to get next higher-order bit
|
||||
b <<= 1; // shift multiplier also
|
||||
}
|
||||
// now reduce it modulo x**8 + x**4 + x**3 + x + 1
|
||||
var hbit = 0x10000; // bit to test if we need to take action
|
||||
var modulus = 0x11b00; // modulus - XOR by this to change value
|
||||
while(hbit >= 0x100) {
|
||||
if ((res & hbit) != 0) {
|
||||
res ^= modulus; // XOR with the modulus
|
||||
}
|
||||
// prepare for the next loop
|
||||
hbit >>= 1;
|
||||
modulus >>= 1;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
// apply the S-box substitution to the key expansion
|
||||
function SubWord(word_ary) {
|
||||
var i;
|
||||
for(i=0; i<16; i++) {
|
||||
word_ary[i] = S_enc[word_ary[i]];
|
||||
}
|
||||
return word_ary;
|
||||
}
|
||||
|
||||
// rotate the bytes in a word
|
||||
function RotWord(word_ary) {
|
||||
return new Array(word_ary[1], word_ary[2], word_ary[3], word_ary[0]);
|
||||
}
|
||||
|
||||
// calculate the first item Rcon[i] = { x^(i-1), 0, 0, 0 }
|
||||
// note we only return the first item
|
||||
function Rcon(exp) {
|
||||
var val = 2;
|
||||
var result = 1;
|
||||
|
||||
// remember to calculate x^(exp-1)
|
||||
exp--;
|
||||
|
||||
// process the exponent using normal shift and multiply
|
||||
while ( exp > 0 )
|
||||
{
|
||||
if ( (exp & 1) != 0 )
|
||||
result = aes_mul( result, val );
|
||||
|
||||
// square the value
|
||||
val = aes_mul( val, val );
|
||||
|
||||
// move to the next bit
|
||||
exp >>= 1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
// round key generation
|
||||
// return a byte array with the expanded key information
|
||||
function key_expand( key )
|
||||
{
|
||||
var temp = new Array(4);
|
||||
var i, j;
|
||||
var w = new Array(4*(Nr+1));
|
||||
|
||||
// copy initial key stuff
|
||||
for( i=0; i<16; i++ )
|
||||
{
|
||||
w[i] = key[i];
|
||||
}
|
||||
|
||||
// generate rest of key schedule using 32-bit words
|
||||
i = 4;
|
||||
while ( i < 4*(Nr+1)) // blocksize * ( rounds + 1 )
|
||||
{
|
||||
// copy word W[i-1] to temp
|
||||
for( j=0; j<4; j++ )
|
||||
temp[j] = w[(i-1)*4+j];
|
||||
|
||||
if ( i % 4 == 0)
|
||||
{
|
||||
// temp = SubWord(RotWord(temp)) ^ Rcon[i/4];
|
||||
temp = RotWord( temp );
|
||||
temp = SubWord( temp );
|
||||
temp[0] ^= Rcon( i>>>2 );
|
||||
}
|
||||
|
||||
// word = word ^ temp
|
||||
for( j=0; j<4; j++ )
|
||||
w[i*4+j] = w[(i-4)*4+j] ^ temp[j];
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
// do S-Box substitution
|
||||
function SubBytes(state, Sbox)
|
||||
{
|
||||
var i;
|
||||
|
||||
for( i=0; i<16; i++ )
|
||||
state[i] = Sbox[ state[i] ];
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
// shift each row as appropriate
|
||||
function ShiftRows(state)
|
||||
{
|
||||
var t0, t1, t2, t3;
|
||||
|
||||
// top row (row 0) isn't shifted
|
||||
|
||||
// next row (row 1) rotated left 1 place
|
||||
t0 = state[I10];
|
||||
t1 = state[I11];
|
||||
t2 = state[I12];
|
||||
t3 = state[I13];
|
||||
state[I10] = t1;
|
||||
state[I11] = t2;
|
||||
state[I12] = t3;
|
||||
state[I13] = t0;
|
||||
|
||||
// next row (row 2) rotated left 2 places
|
||||
t0 = state[I20];
|
||||
t1 = state[I21];
|
||||
t2 = state[I22];
|
||||
t3 = state[I23];
|
||||
state[I20] = t2;
|
||||
state[I21] = t3;
|
||||
state[I22] = t0;
|
||||
state[I23] = t1;
|
||||
|
||||
// bottom row (row 3) rotated left 3 places
|
||||
t0 = state[I30];
|
||||
t1 = state[I31];
|
||||
t2 = state[I32];
|
||||
t3 = state[I33];
|
||||
state[I30] = t3;
|
||||
state[I31] = t0;
|
||||
state[I32] = t1;
|
||||
state[I33] = t2;
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
// inverset shift each row as appropriate
|
||||
function InvShiftRows(state)
|
||||
{
|
||||
var t0, t1, t2, t3;
|
||||
|
||||
// top row (row 0) isn't shifted
|
||||
|
||||
// next row (row 1) rotated left 1 place
|
||||
t0 = state[I10];
|
||||
t1 = state[I11];
|
||||
t2 = state[I12];
|
||||
t3 = state[I13];
|
||||
state[I10] = t3;
|
||||
state[I11] = t0;
|
||||
state[I12] = t1;
|
||||
state[I13] = t2;
|
||||
|
||||
// next row (row 2) rotated left 2 places
|
||||
t0 = state[I20];
|
||||
t1 = state[I21];
|
||||
t2 = state[I22];
|
||||
t3 = state[I23];
|
||||
state[I20] = t2;
|
||||
state[I21] = t3;
|
||||
state[I22] = t0;
|
||||
state[I23] = t1;
|
||||
|
||||
// bottom row (row 3) rotated left 3 places
|
||||
t0 = state[I30];
|
||||
t1 = state[I31];
|
||||
t2 = state[I32];
|
||||
t3 = state[I33];
|
||||
state[I30] = t1;
|
||||
state[I31] = t2;
|
||||
state[I32] = t3;
|
||||
state[I33] = t0;
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
// process column info
|
||||
function MixColumns(state)
|
||||
{
|
||||
var col;
|
||||
var c0, c1, c2, c3;
|
||||
|
||||
for( col=0; col<4; col++ )
|
||||
{
|
||||
c0 = state[I(0,col)];
|
||||
c1 = state[I(1,col)];
|
||||
c2 = state[I(2,col)];
|
||||
c3 = state[I(3,col)];
|
||||
|
||||
// do mixing, and put back into array
|
||||
state[I(0,col)] = aes_mul(2,c0) ^ aes_mul(3,c1) ^ c2 ^ c3;
|
||||
state[I(1,col)] = c0 ^ aes_mul(2,c1) ^ aes_mul(3,c2) ^ c3;
|
||||
state[I(2,col)] = c0 ^ c1 ^ aes_mul(2,c2) ^ aes_mul(3,c3);
|
||||
state[I(3,col)] = aes_mul(3,c0) ^ c1 ^ c2 ^ aes_mul(2,c3);
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
// inverse process column info
|
||||
function InvMixColumns(state)
|
||||
{
|
||||
var col;
|
||||
var c0, c1, c2, c3;
|
||||
|
||||
for( col=0; col<4; col++ )
|
||||
{
|
||||
c0 = state[I(0,col)];
|
||||
c1 = state[I(1,col)];
|
||||
c2 = state[I(2,col)];
|
||||
c3 = state[I(3,col)];
|
||||
|
||||
// do inverse mixing, and put back into array
|
||||
state[I(0,col)] = aes_mul(0x0e,c0) ^ aes_mul(0x0b,c1)
|
||||
^ aes_mul(0x0d,c2) ^ aes_mul(0x09,c3);
|
||||
state[I(1,col)] = aes_mul(0x09,c0) ^ aes_mul(0x0e,c1)
|
||||
^ aes_mul(0x0b,c2) ^ aes_mul(0x0d,c3);
|
||||
state[I(2,col)] = aes_mul(0x0d,c0) ^ aes_mul(0x09,c1)
|
||||
^ aes_mul(0x0e,c2) ^ aes_mul(0x0b,c3);
|
||||
state[I(3,col)] = aes_mul(0x0b,c0) ^ aes_mul(0x0d,c1)
|
||||
^ aes_mul(0x09,c2) ^ aes_mul(0x0e,c3);
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
// insert subkey information
|
||||
function AddRoundKey( state, w, base )
|
||||
{
|
||||
var col;
|
||||
|
||||
for( col=0; col<4; col++ )
|
||||
{
|
||||
state[I(0,col)] ^= w[base+col*4];
|
||||
state[I(1,col)] ^= w[base+col*4+1];
|
||||
state[I(2,col)] ^= w[base+col*4+2];
|
||||
state[I(3,col)] ^= w[base+col*4+3];
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
// return a transposed array
|
||||
function transpose( msg )
|
||||
{
|
||||
var row, col;
|
||||
var state = new Array( 16 );
|
||||
|
||||
for( row=0; row<4; row++ )
|
||||
for( col=0; col<4; col++ )
|
||||
state[I(row,col)] = msg[I(col,row)];
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
// final AES state
|
||||
var AES_output = new Array(16);
|
||||
|
||||
// format AES output
|
||||
// -- uses the global array DES_output
|
||||
function format_AES_output(bASCII)
|
||||
{
|
||||
var i;
|
||||
var bits;
|
||||
var str="";
|
||||
|
||||
// what type of data do we have to work with?
|
||||
if (bASCII)
|
||||
{
|
||||
// convert each set of bits back to ASCII
|
||||
for( i=0; i<16; i++ )
|
||||
str += String.fromCharCode( AES_output[i] );
|
||||
}
|
||||
else
|
||||
{
|
||||
// output hexdecimal data (insert spaces)
|
||||
str = cvt_hex8( AES_output[0] );
|
||||
for( i=1; i<16; i++ )
|
||||
{
|
||||
str += "" + cvt_hex8( AES_output[i] );
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
// do encrytion
|
||||
function aes_encrypt(str, key, bASCII)
|
||||
{
|
||||
//console.log(" aes_encrypt:\tstr = " + str + "\tkey = " + key + "\t bASCII = " + bASCII);
|
||||
var w = new Array( 4*(Nr+1) ); // subkey information
|
||||
var state = new Array( 16 ); // working state
|
||||
var round;
|
||||
|
||||
//accumulated_output_info = "";
|
||||
|
||||
// get the message from the user
|
||||
// also check if it is ASCII or hex
|
||||
var msg = get_value(str, bASCII);
|
||||
|
||||
// problems??
|
||||
if ( msg[0] < 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// get the key from the user
|
||||
var key = get_value(key, false);
|
||||
// problems??
|
||||
if ( key[0] < 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// expand the key
|
||||
w = key_expand( key );
|
||||
|
||||
// initial state = message in columns (transposed from what we input)
|
||||
state = transpose( msg );
|
||||
|
||||
// display the round key - Transpose due to the way it is stored/used
|
||||
state = AddRoundKey(state, w, 0);
|
||||
|
||||
for( round=1; round<Nr; round++ )
|
||||
{
|
||||
state = SubBytes(state, S_enc);
|
||||
state = ShiftRows(state);
|
||||
state = MixColumns(state);
|
||||
// display the round key - Transpose due to the way it is stored/used
|
||||
// note here the spec uses 32-bit words, we are using bytes, so an extra *4
|
||||
state = AddRoundKey(state, w, round*4*4);
|
||||
}
|
||||
|
||||
SubBytes(state, S_enc);
|
||||
ShiftRows(state);
|
||||
AddRoundKey(state, w, Nr*4*4);
|
||||
|
||||
// process output
|
||||
AES_output = transpose( state );
|
||||
var szOutput = format_AES_output(!bASCII);
|
||||
return szOutput;
|
||||
}
|
||||
|
||||
// do decryption
|
||||
function aes_decrypt(str, key, bASCII)
|
||||
{
|
||||
//console.log(" aes_decrypt:\tstr = " + str + "\tkey = " + key + "\tbASCII = " + bASCII);
|
||||
var w = new Array( 4*(Nr+1) ); // subkey information
|
||||
var state = new Array( 16 ); // working state
|
||||
var round;
|
||||
|
||||
//accumulated_output_info = "";
|
||||
|
||||
// get the message from the user
|
||||
// also check if it is ASCII or hex
|
||||
var msg = get_value(str, bASCII);
|
||||
|
||||
// problems??
|
||||
if ( msg[0] < 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// get the key from the user
|
||||
var key = get_value(key, false);
|
||||
// problems??
|
||||
if ( key[0] < 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// expand the key
|
||||
w = key_expand( key );
|
||||
|
||||
// initial state = message
|
||||
state = transpose( msg );
|
||||
// display the round key - Transpose due to the way it is stored/used
|
||||
state = AddRoundKey(state, w, Nr*4*4);
|
||||
|
||||
for( round=Nr-1; round>=1; round-- )
|
||||
{
|
||||
state = InvShiftRows(state);
|
||||
state = SubBytes(state, S_dec);
|
||||
// display the round key - Transpose due to the way it is stored/used
|
||||
// note here the spec uses 32-bit words, we are using bytes, so an extra *4
|
||||
state = AddRoundKey(state, w, round*4*4);
|
||||
state = InvMixColumns(state);
|
||||
}
|
||||
|
||||
InvShiftRows(state);
|
||||
SubBytes(state, S_dec);
|
||||
AddRoundKey(state, w, 0);
|
||||
|
||||
// process output
|
||||
AES_output = transpose( state );
|
||||
var szOutput = format_AES_output(!bASCII);
|
||||
return szOutput;
|
||||
}
|
||||
window.aes_encrypt = aes_encrypt;
|
||||
window.aes_decrypt = aes_decrypt;
|
||||
window.console = window.console || {
|
||||
log: function() {}
|
||||
};
|
||||
}());
|
||||
106
web/public/codebase/encryption/cryptico.min.js
vendored
Normal file
106
web/public/codebase/encryption/cryptico.min.js
vendored
Normal file
@@ -0,0 +1,106 @@
|
||||
var dbits,canary=244837814094590,j_lm=(canary&16777215)==15715070;function BigInteger(a,b,c){a!=null&&("number"==typeof a?this.fromNumber(a,b,c):b==null&&"string"!=typeof a?this.fromString(a,256):this.fromString(a,b))}function nbi(){return new BigInteger(null)}function am1(a,b,c,d,e,g){for(;--g>=0;){var h=b*this[a++]+c[d]+e,e=Math.floor(h/67108864);c[d++]=h&67108863}return e}
|
||||
function am2(a,b,c,d,e,g){var h=b&32767;for(b>>=15;--g>=0;){var f=this[a]&32767,o=this[a++]>>15,p=b*f+o*h,f=h*f+((p&32767)<<15)+c[d]+(e&1073741823),e=(f>>>30)+(p>>>15)+b*o+(e>>>30);c[d++]=f&1073741823}return e}function am3(a,b,c,d,e,g){var h=b&16383;for(b>>=14;--g>=0;){var f=this[a]&16383,o=this[a++]>>14,p=b*f+o*h,f=h*f+((p&16383)<<14)+c[d]+e,e=(f>>28)+(p>>14)+b*o;c[d++]=f&268435455}return e}
|
||||
j_lm&&navigator.appName=="Microsoft Internet Explorer"?(BigInteger.prototype.am=am2,dbits=30):j_lm&&navigator.appName!="Netscape"?(BigInteger.prototype.am=am1,dbits=26):(BigInteger.prototype.am=am3,dbits=28);BigInteger.prototype.DB=dbits;BigInteger.prototype.DM=(1<<dbits)-1;BigInteger.prototype.DV=1<<dbits;var BI_FP=52;BigInteger.prototype.FV=Math.pow(2,BI_FP);BigInteger.prototype.F1=BI_FP-dbits;BigInteger.prototype.F2=2*dbits-BI_FP;var BI_RM="0123456789abcdefghijklmnopqrstuvwxyz",BI_RC=[],rr,vv;
|
||||
rr="0".charCodeAt(0);for(vv=0;vv<=9;++vv)BI_RC[rr++]=vv;rr="a".charCodeAt(0);for(vv=10;vv<36;++vv)BI_RC[rr++]=vv;rr="A".charCodeAt(0);for(vv=10;vv<36;++vv)BI_RC[rr++]=vv;function int2char(a){return BI_RM.charAt(a)}function intAt(a,b){var c=BI_RC[a.charCodeAt(b)];return c==null?-1:c}function bnpCopyTo(a){for(var b=this.t-1;b>=0;--b)a[b]=this[b];a.t=this.t;a.s=this.s}function bnpFromInt(a){this.t=1;this.s=a<0?-1:0;a>0?this[0]=a:a<-1?this[0]=a+DV:this.t=0}
|
||||
function nbv(a){var b=nbi();b.fromInt(a);return b}
|
||||
function bnpFromString(a,b){var c;if(b==16)c=4;else if(b==8)c=3;else if(b==256)c=8;else if(b==2)c=1;else if(b==32)c=5;else if(b==4)c=2;else{this.fromRadix(a,b);return}this.s=this.t=0;for(var d=a.length,e=!1,g=0;--d>=0;){var h=c==8?a[d]&255:intAt(a,d);h<0?a.charAt(d)=="-"&&(e=!0):(e=!1,g==0?this[this.t++]=h:g+c>this.DB?(this[this.t-1]|=(h&(1<<this.DB-g)-1)<<g,this[this.t++]=h>>this.DB-g):this[this.t-1]|=h<<g,g+=c,g>=this.DB&&(g-=this.DB))}if(c==8&&(a[0]&128)!=0)this.s=-1,g>0&&(this[this.t-1]|=(1<<
|
||||
this.DB-g)-1<<g);this.clamp();e&&BigInteger.ZERO.subTo(this,this)}function bnpClamp(){for(var a=this.s&this.DM;this.t>0&&this[this.t-1]==a;)--this.t}
|
||||
function bnToString(a){if(this.s<0)return"-"+this.negate().toString(a);if(a==16)a=4;else if(a==8)a=3;else if(a==2)a=1;else if(a==32)a=5;else if(a==64)a=6;else if(a==4)a=2;else return this.toRadix(a);var b=(1<<a)-1,c,d=!1,e="",g=this.t,h=this.DB-g*this.DB%a;if(g-- >0){if(h<this.DB&&(c=this[g]>>h)>0)d=!0,e=int2char(c);for(;g>=0;)h<a?(c=(this[g]&(1<<h)-1)<<a-h,c|=this[--g]>>(h+=this.DB-a)):(c=this[g]>>(h-=a)&b,h<=0&&(h+=this.DB,--g)),c>0&&(d=!0),d&&(e+=int2char(c))}return d?e:"0"}
|
||||
function bnNegate(){var a=nbi();BigInteger.ZERO.subTo(this,a);return a}function bnAbs(){return this.s<0?this.negate():this}function bnCompareTo(a){var b=this.s-a.s;if(b!=0)return b;var c=this.t,b=c-a.t;if(b!=0)return b;for(;--c>=0;)if((b=this[c]-a[c])!=0)return b;return 0}function nbits(a){var b=1,c;if((c=a>>>16)!=0)a=c,b+=16;if((c=a>>8)!=0)a=c,b+=8;if((c=a>>4)!=0)a=c,b+=4;if((c=a>>2)!=0)a=c,b+=2;a>>1!=0&&(b+=1);return b}
|
||||
function bnBitLength(){return this.t<=0?0:this.DB*(this.t-1)+nbits(this[this.t-1]^this.s&this.DM)}function bnpDLShiftTo(a,b){var c;for(c=this.t-1;c>=0;--c)b[c+a]=this[c];for(c=a-1;c>=0;--c)b[c]=0;b.t=this.t+a;b.s=this.s}function bnpDRShiftTo(a,b){for(var c=a;c<this.t;++c)b[c-a]=this[c];b.t=Math.max(this.t-a,0);b.s=this.s}
|
||||
function bnpLShiftTo(a,b){var c=a%this.DB,d=this.DB-c,e=(1<<d)-1,g=Math.floor(a/this.DB),h=this.s<<c&this.DM,f;for(f=this.t-1;f>=0;--f)b[f+g+1]=this[f]>>d|h,h=(this[f]&e)<<c;for(f=g-1;f>=0;--f)b[f]=0;b[g]=h;b.t=this.t+g+1;b.s=this.s;b.clamp()}
|
||||
function bnpRShiftTo(a,b){b.s=this.s;var c=Math.floor(a/this.DB);if(c>=this.t)b.t=0;else{var d=a%this.DB,e=this.DB-d,g=(1<<d)-1;b[0]=this[c]>>d;for(var h=c+1;h<this.t;++h)b[h-c-1]|=(this[h]&g)<<e,b[h-c]=this[h]>>d;d>0&&(b[this.t-c-1]|=(this.s&g)<<e);b.t=this.t-c;b.clamp()}}
|
||||
function bnpSubTo(a,b){for(var c=0,d=0,e=Math.min(a.t,this.t);c<e;)d+=this[c]-a[c],b[c++]=d&this.DM,d>>=this.DB;if(a.t<this.t){for(d-=a.s;c<this.t;)d+=this[c],b[c++]=d&this.DM,d>>=this.DB;d+=this.s}else{for(d+=this.s;c<a.t;)d-=a[c],b[c++]=d&this.DM,d>>=this.DB;d-=a.s}b.s=d<0?-1:0;d<-1?b[c++]=this.DV+d:d>0&&(b[c++]=d);b.t=c;b.clamp()}
|
||||
function bnpMultiplyTo(a,b){var c=this.abs(),d=a.abs(),e=c.t;for(b.t=e+d.t;--e>=0;)b[e]=0;for(e=0;e<d.t;++e)b[e+c.t]=c.am(0,d[e],b,e,0,c.t);b.s=0;b.clamp();this.s!=a.s&&BigInteger.ZERO.subTo(b,b)}function bnpSquareTo(a){for(var b=this.abs(),c=a.t=2*b.t;--c>=0;)a[c]=0;for(c=0;c<b.t-1;++c){var d=b.am(c,b[c],a,2*c,0,1);if((a[c+b.t]+=b.am(c+1,2*b[c],a,2*c+1,d,b.t-c-1))>=b.DV)a[c+b.t]-=b.DV,a[c+b.t+1]=1}a.t>0&&(a[a.t-1]+=b.am(c,b[c],a,2*c,0,1));a.s=0;a.clamp()}
|
||||
function bnpDivRemTo(a,b,c){var d=a.abs();if(!(d.t<=0)){var e=this.abs();if(e.t<d.t)b!=null&&b.fromInt(0),c!=null&&this.copyTo(c);else{c==null&&(c=nbi());var g=nbi(),h=this.s,a=a.s,f=this.DB-nbits(d[d.t-1]);f>0?(d.lShiftTo(f,g),e.lShiftTo(f,c)):(d.copyTo(g),e.copyTo(c));d=g.t;e=g[d-1];if(e!=0){var o=e*(1<<this.F1)+(d>1?g[d-2]>>this.F2:0),p=this.FV/o,o=(1<<this.F1)/o,q=1<<this.F2,n=c.t,k=n-d,j=b==null?nbi():b;g.dlShiftTo(k,j);c.compareTo(j)>=0&&(c[c.t++]=1,c.subTo(j,c));BigInteger.ONE.dlShiftTo(d,
|
||||
j);for(j.subTo(g,g);g.t<d;)g[g.t++]=0;for(;--k>=0;){var l=c[--n]==e?this.DM:Math.floor(c[n]*p+(c[n-1]+q)*o);if((c[n]+=g.am(0,l,c,k,0,d))<l){g.dlShiftTo(k,j);for(c.subTo(j,c);c[n]<--l;)c.subTo(j,c)}}b!=null&&(c.drShiftTo(d,b),h!=a&&BigInteger.ZERO.subTo(b,b));c.t=d;c.clamp();f>0&&c.rShiftTo(f,c);h<0&&BigInteger.ZERO.subTo(c,c)}}}}function bnMod(a){var b=nbi();this.abs().divRemTo(a,null,b);this.s<0&&b.compareTo(BigInteger.ZERO)>0&&a.subTo(b,b);return b}function Classic(a){this.m=a}
|
||||
function cConvert(a){return a.s<0||a.compareTo(this.m)>=0?a.mod(this.m):a}function cRevert(a){return a}function cReduce(a){a.divRemTo(this.m,null,a)}function cMulTo(a,b,c){a.multiplyTo(b,c);this.reduce(c)}function cSqrTo(a,b){a.squareTo(b);this.reduce(b)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;
|
||||
function bnpInvDigit(){if(this.t<1)return 0;var a=this[0];if((a&1)==0)return 0;var b=a&3,b=b*(2-(a&15)*b)&15,b=b*(2-(a&255)*b)&255,b=b*(2-((a&65535)*b&65535))&65535,b=b*(2-a*b%this.DV)%this.DV;return b>0?this.DV-b:-b}function Montgomery(a){this.m=a;this.mp=a.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<<a.DB-15)-1;this.mt2=2*a.t}
|
||||
function montConvert(a){var b=nbi();a.abs().dlShiftTo(this.m.t,b);b.divRemTo(this.m,null,b);a.s<0&&b.compareTo(BigInteger.ZERO)>0&&this.m.subTo(b,b);return b}function montRevert(a){var b=nbi();a.copyTo(b);this.reduce(b);return b}
|
||||
function montReduce(a){for(;a.t<=this.mt2;)a[a.t++]=0;for(var b=0;b<this.m.t;++b){var c=a[b]&32767,d=c*this.mpl+((c*this.mph+(a[b]>>15)*this.mpl&this.um)<<15)&a.DM,c=b+this.m.t;for(a[c]+=this.m.am(0,d,a,b,0,this.m.t);a[c]>=a.DV;)a[c]-=a.DV,a[++c]++}a.clamp();a.drShiftTo(this.m.t,a);a.compareTo(this.m)>=0&&a.subTo(this.m,a)}function montSqrTo(a,b){a.squareTo(b);this.reduce(b)}function montMulTo(a,b,c){a.multiplyTo(b,c);this.reduce(c)}Montgomery.prototype.convert=montConvert;
|
||||
Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return(this.t>0?this[0]&1:this.s)==0}function bnpExp(a,b){if(a>4294967295||a<1)return BigInteger.ONE;var c=nbi(),d=nbi(),e=b.convert(this),g=nbits(a)-1;for(e.copyTo(c);--g>=0;)if(b.sqrTo(c,d),(a&1<<g)>0)b.mulTo(d,e,c);else var h=c,c=d,d=h;return b.revert(c)}
|
||||
function bnModPowInt(a,b){var c;c=a<256||b.isEven()?new Classic(b):new Montgomery(b);return this.exp(a,c)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;
|
||||
BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;
|
||||
BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);function bnClone(){var a=nbi();this.copyTo(a);return a}function bnIntValue(){if(this.s<0)if(this.t==1)return this[0]-this.DV;else{if(this.t==0)return-1}else if(this.t==1)return this[0];else if(this.t==0)return 0;return(this[1]&(1<<32-this.DB)-1)<<this.DB|this[0]}function bnByteValue(){return this.t==0?this.s:this[0]<<24>>24}function bnShortValue(){return this.t==0?this.s:this[0]<<16>>16}
|
||||
function bnpChunkSize(a){return Math.floor(Math.LN2*this.DB/Math.log(a))}function bnSigNum(){return this.s<0?-1:this.t<=0||this.t==1&&this[0]<=0?0:1}function bnpToRadix(a){a==null&&(a=10);if(this.signum()==0||a<2||a>36)return"0";var b=this.chunkSize(a),b=Math.pow(a,b),c=nbv(b),d=nbi(),e=nbi(),g="";for(this.divRemTo(c,d,e);d.signum()>0;)g=(b+e.intValue()).toString(a).substr(1)+g,d.divRemTo(c,d,e);return e.intValue().toString(a)+g}
|
||||
function bnpFromRadix(a,b){this.fromInt(0);b==null&&(b=10);for(var c=this.chunkSize(b),d=Math.pow(b,c),e=!1,g=0,h=0,f=0;f<a.length;++f){var o=intAt(a,f);o<0?a.charAt(f)=="-"&&this.signum()==0&&(e=!0):(h=b*h+o,++g>=c&&(this.dMultiply(d),this.dAddOffset(h,0),h=g=0))}g>0&&(this.dMultiply(Math.pow(b,g)),this.dAddOffset(h,0));e&&BigInteger.ZERO.subTo(this,this)}
|
||||
function bnpFromNumber(a,b,c){if("number"==typeof b)if(a<2)this.fromInt(1);else{this.fromNumber(a,c);this.testBit(a-1)||this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);for(this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(b);)this.dAddOffset(2,0),this.bitLength()>a&&this.subTo(BigInteger.ONE.shiftLeft(a-1),this)}else{var c=[],d=a&7;c.length=(a>>3)+1;b.nextBytes(c);d>0?c[0]&=(1<<d)-1:c[0]=0;this.fromString(c,256)}}
|
||||
function bnToByteArray(){var a=this.t,b=[];b[0]=this.s;var c=this.DB-a*this.DB%8,d,e=0;if(a-- >0){if(c<this.DB&&(d=this[a]>>c)!=(this.s&this.DM)>>c)b[e++]=d|this.s<<this.DB-c;for(;a>=0;)if(c<8?(d=(this[a]&(1<<c)-1)<<8-c,d|=this[--a]>>(c+=this.DB-8)):(d=this[a]>>(c-=8)&255,c<=0&&(c+=this.DB,--a)),(d&128)!=0&&(d|=-256),e==0&&(this.s&128)!=(d&128)&&++e,e>0||d!=this.s)b[e++]=d}return b}function bnEquals(a){return this.compareTo(a)==0}function bnMin(a){return this.compareTo(a)<0?this:a}
|
||||
function bnMax(a){return this.compareTo(a)>0?this:a}function bnpBitwiseTo(a,b,c){var d,e,g=Math.min(a.t,this.t);for(d=0;d<g;++d)c[d]=b(this[d],a[d]);if(a.t<this.t){e=a.s&this.DM;for(d=g;d<this.t;++d)c[d]=b(this[d],e);c.t=this.t}else{e=this.s&this.DM;for(d=g;d<a.t;++d)c[d]=b(e,a[d]);c.t=a.t}c.s=b(this.s,a.s);c.clamp()}function op_and(a,b){return a&b}function bnAnd(a){var b=nbi();this.bitwiseTo(a,op_and,b);return b}function op_or(a,b){return a|b}
|
||||
function bnOr(a){var b=nbi();this.bitwiseTo(a,op_or,b);return b}function op_xor(a,b){return a^b}function bnXor(a){var b=nbi();this.bitwiseTo(a,op_xor,b);return b}function op_andnot(a,b){return a&~b}function bnAndNot(a){var b=nbi();this.bitwiseTo(a,op_andnot,b);return b}function bnNot(){for(var a=nbi(),b=0;b<this.t;++b)a[b]=this.DM&~this[b];a.t=this.t;a.s=~this.s;return a}function bnShiftLeft(a){var b=nbi();a<0?this.rShiftTo(-a,b):this.lShiftTo(a,b);return b}
|
||||
function bnShiftRight(a){var b=nbi();a<0?this.lShiftTo(-a,b):this.rShiftTo(a,b);return b}function lbit(a){if(a==0)return-1;var b=0;(a&65535)==0&&(a>>=16,b+=16);(a&255)==0&&(a>>=8,b+=8);(a&15)==0&&(a>>=4,b+=4);(a&3)==0&&(a>>=2,b+=2);(a&1)==0&&++b;return b}function bnGetLowestSetBit(){for(var a=0;a<this.t;++a)if(this[a]!=0)return a*this.DB+lbit(this[a]);return this.s<0?this.t*this.DB:-1}function cbit(a){for(var b=0;a!=0;)a&=a-1,++b;return b}
|
||||
function bnBitCount(){for(var a=0,b=this.s&this.DM,c=0;c<this.t;++c)a+=cbit(this[c]^b);return a}function bnTestBit(a){var b=Math.floor(a/this.DB);return b>=this.t?this.s!=0:(this[b]&1<<a%this.DB)!=0}function bnpChangeBit(a,b){var c=BigInteger.ONE.shiftLeft(a);this.bitwiseTo(c,b,c);return c}function bnSetBit(a){return this.changeBit(a,op_or)}function bnClearBit(a){return this.changeBit(a,op_andnot)}function bnFlipBit(a){return this.changeBit(a,op_xor)}
|
||||
function bnpAddTo(a,b){for(var c=0,d=0,e=Math.min(a.t,this.t);c<e;)d+=this[c]+a[c],b[c++]=d&this.DM,d>>=this.DB;if(a.t<this.t){for(d+=a.s;c<this.t;)d+=this[c],b[c++]=d&this.DM,d>>=this.DB;d+=this.s}else{for(d+=this.s;c<a.t;)d+=a[c],b[c++]=d&this.DM,d>>=this.DB;d+=a.s}b.s=d<0?-1:0;d>0?b[c++]=d:d<-1&&(b[c++]=this.DV+d);b.t=c;b.clamp()}function bnAdd(a){var b=nbi();this.addTo(a,b);return b}function bnSubtract(a){var b=nbi();this.subTo(a,b);return b}
|
||||
function bnMultiply(a){var b=nbi();this.multiplyTo(a,b);return b}function bnSquare(){var a=nbi();this.squareTo(a);return a}function bnDivide(a){var b=nbi();this.divRemTo(a,b,null);return b}function bnRemainder(a){var b=nbi();this.divRemTo(a,null,b);return b}function bnDivideAndRemainder(a){var b=nbi(),c=nbi();this.divRemTo(a,b,c);return[b,c]}function bnpDMultiply(a){this[this.t]=this.am(0,a-1,this,0,0,this.t);++this.t;this.clamp()}
|
||||
function bnpDAddOffset(a,b){if(a!=0){for(;this.t<=b;)this[this.t++]=0;for(this[b]+=a;this[b]>=this.DV;)this[b]-=this.DV,++b>=this.t&&(this[this.t++]=0),++this[b]}}function NullExp(){}function nNop(a){return a}function nMulTo(a,b,c){a.multiplyTo(b,c)}function nSqrTo(a,b){a.squareTo(b)}NullExp.prototype.convert=nNop;NullExp.prototype.revert=nNop;NullExp.prototype.mulTo=nMulTo;NullExp.prototype.sqrTo=nSqrTo;function bnPow(a){return this.exp(a,new NullExp)}
|
||||
function bnpMultiplyLowerTo(a,b,c){var d=Math.min(this.t+a.t,b);c.s=0;for(c.t=d;d>0;)c[--d]=0;var e;for(e=c.t-this.t;d<e;++d)c[d+this.t]=this.am(0,a[d],c,d,0,this.t);for(e=Math.min(a.t,b);d<e;++d)this.am(0,a[d],c,d,0,b-d);c.clamp()}function bnpMultiplyUpperTo(a,b,c){--b;var d=c.t=this.t+a.t-b;for(c.s=0;--d>=0;)c[d]=0;for(d=Math.max(b-this.t,0);d<a.t;++d)c[this.t+d-b]=this.am(b-d,a[d],c,0,0,this.t+d-b);c.clamp();c.drShiftTo(1,c)}
|
||||
function Barrett(a){this.r2=nbi();this.q3=nbi();BigInteger.ONE.dlShiftTo(2*a.t,this.r2);this.mu=this.r2.divide(a);this.m=a}function barrettConvert(a){if(a.s<0||a.t>2*this.m.t)return a.mod(this.m);else if(a.compareTo(this.m)<0)return a;else{var b=nbi();a.copyTo(b);this.reduce(b);return b}}function barrettRevert(a){return a}
|
||||
function barrettReduce(a){a.drShiftTo(this.m.t-1,this.r2);if(a.t>this.m.t+1)a.t=this.m.t+1,a.clamp();this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);for(this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);a.compareTo(this.r2)<0;)a.dAddOffset(1,this.m.t+1);for(a.subTo(this.r2,a);a.compareTo(this.m)>=0;)a.subTo(this.m,a)}function barrettSqrTo(a,b){a.squareTo(b);this.reduce(b)}function barrettMulTo(a,b,c){a.multiplyTo(b,c);this.reduce(c)}Barrett.prototype.convert=barrettConvert;
|
||||
Barrett.prototype.revert=barrettRevert;Barrett.prototype.reduce=barrettReduce;Barrett.prototype.mulTo=barrettMulTo;Barrett.prototype.sqrTo=barrettSqrTo;
|
||||
function bnModPow(a,b){var c=a.bitLength(),d,e=nbv(1),g;if(c<=0)return e;else d=c<18?1:c<48?3:c<144?4:c<768?5:6;g=c<8?new Classic(b):b.isEven()?new Barrett(b):new Montgomery(b);var h=[],f=3,o=d-1,p=(1<<d)-1;h[1]=g.convert(this);if(d>1){c=nbi();for(g.sqrTo(h[1],c);f<=p;)h[f]=nbi(),g.mulTo(c,h[f-2],h[f]),f+=2}for(var q=a.t-1,n,k=!0,j=nbi(),c=nbits(a[q])-1;q>=0;){c>=o?n=a[q]>>c-o&p:(n=(a[q]&(1<<c+1)-1)<<o-c,q>0&&(n|=a[q-1]>>this.DB+c-o));for(f=d;(n&1)==0;)n>>=1,--f;if((c-=f)<0)c+=this.DB,--q;if(k)h[n].copyTo(e),
|
||||
k=!1;else{for(;f>1;)g.sqrTo(e,j),g.sqrTo(j,e),f-=2;f>0?g.sqrTo(e,j):(f=e,e=j,j=f);g.mulTo(j,h[n],e)}for(;q>=0&&(a[q]&1<<c)==0;)g.sqrTo(e,j),f=e,e=j,j=f,--c<0&&(c=this.DB-1,--q)}return g.revert(e)}
|
||||
function bnGCD(a){var b=this.s<0?this.negate():this.clone(),a=a.s<0?a.negate():a.clone();if(b.compareTo(a)<0)var c=b,b=a,a=c;var c=b.getLowestSetBit(),d=a.getLowestSetBit();if(d<0)return b;c<d&&(d=c);d>0&&(b.rShiftTo(d,b),a.rShiftTo(d,a));for(;b.signum()>0;)(c=b.getLowestSetBit())>0&&b.rShiftTo(c,b),(c=a.getLowestSetBit())>0&&a.rShiftTo(c,a),b.compareTo(a)>=0?(b.subTo(a,b),b.rShiftTo(1,b)):(a.subTo(b,a),a.rShiftTo(1,a));d>0&&a.lShiftTo(d,a);return a}
|
||||
function bnpModInt(a){if(a<=0)return 0;var b=this.DV%a,c=this.s<0?a-1:0;if(this.t>0)if(b==0)c=this[0]%a;else for(var d=this.t-1;d>=0;--d)c=(b*c+this[d])%a;return c}
|
||||
function bnModInverse(a){var b=a.isEven();if(this.isEven()&&b||a.signum()==0)return BigInteger.ZERO;for(var c=a.clone(),d=this.clone(),e=nbv(1),g=nbv(0),h=nbv(0),f=nbv(1);c.signum()!=0;){for(;c.isEven();){c.rShiftTo(1,c);if(b){if(!e.isEven()||!g.isEven())e.addTo(this,e),g.subTo(a,g);e.rShiftTo(1,e)}else g.isEven()||g.subTo(a,g);g.rShiftTo(1,g)}for(;d.isEven();){d.rShiftTo(1,d);if(b){if(!h.isEven()||!f.isEven())h.addTo(this,h),f.subTo(a,f);h.rShiftTo(1,h)}else f.isEven()||f.subTo(a,f);f.rShiftTo(1,
|
||||
f)}c.compareTo(d)>=0?(c.subTo(d,c),b&&e.subTo(h,e),g.subTo(f,g)):(d.subTo(c,d),b&&h.subTo(e,h),f.subTo(g,f))}if(d.compareTo(BigInteger.ONE)!=0)return BigInteger.ZERO;if(f.compareTo(a)>=0)return f.subtract(a);if(f.signum()<0)f.addTo(a,f);else return f;return f.signum()<0?f.add(a):f}
|
||||
var lowprimes=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,
|
||||
733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],lplim=67108864/lowprimes[lowprimes.length-1];
|
||||
function bnIsProbablePrime(a){var b,c=this.abs();if(c.t==1&&c[0]<=lowprimes[lowprimes.length-1]){for(b=0;b<lowprimes.length;++b)if(c[0]==lowprimes[b])return!0;return!1}if(c.isEven())return!1;for(b=1;b<lowprimes.length;){for(var d=lowprimes[b],e=b+1;e<lowprimes.length&&d<lplim;)d*=lowprimes[e++];for(d=c.modInt(d);b<e;)if(d%lowprimes[b++]==0)return!1}return c.millerRabin(a)}
|
||||
function bnpMillerRabin(a){var b=this.subtract(BigInteger.ONE),c=b.getLowestSetBit();if(c<=0)return!1;var d=b.shiftRight(c),a=a+1>>1;if(a>lowprimes.length)a=lowprimes.length;for(var e=nbi(),g=0;g<a;++g){e.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);var h=e.modPow(d,this);if(h.compareTo(BigInteger.ONE)!=0&&h.compareTo(b)!=0){for(var f=1;f++<c&&h.compareTo(b)!=0;)if(h=h.modPowInt(2,this),h.compareTo(BigInteger.ONE)==0)return!1;if(h.compareTo(b)!=0)return!1}}return!0}
|
||||
BigInteger.prototype.chunkSize=bnpChunkSize;BigInteger.prototype.toRadix=bnpToRadix;BigInteger.prototype.fromRadix=bnpFromRadix;BigInteger.prototype.fromNumber=bnpFromNumber;BigInteger.prototype.bitwiseTo=bnpBitwiseTo;BigInteger.prototype.changeBit=bnpChangeBit;BigInteger.prototype.addTo=bnpAddTo;BigInteger.prototype.dMultiply=bnpDMultiply;BigInteger.prototype.dAddOffset=bnpDAddOffset;BigInteger.prototype.multiplyLowerTo=bnpMultiplyLowerTo;BigInteger.prototype.multiplyUpperTo=bnpMultiplyUpperTo;
|
||||
BigInteger.prototype.modInt=bnpModInt;BigInteger.prototype.millerRabin=bnpMillerRabin;BigInteger.prototype.clone=bnClone;BigInteger.prototype.intValue=bnIntValue;BigInteger.prototype.byteValue=bnByteValue;BigInteger.prototype.shortValue=bnShortValue;BigInteger.prototype.signum=bnSigNum;BigInteger.prototype.toByteArray=bnToByteArray;BigInteger.prototype.equals=bnEquals;BigInteger.prototype.min=bnMin;BigInteger.prototype.max=bnMax;BigInteger.prototype.and=bnAnd;BigInteger.prototype.or=bnOr;
|
||||
BigInteger.prototype.xor=bnXor;BigInteger.prototype.andNot=bnAndNot;BigInteger.prototype.not=bnNot;BigInteger.prototype.shiftLeft=bnShiftLeft;BigInteger.prototype.shiftRight=bnShiftRight;BigInteger.prototype.getLowestSetBit=bnGetLowestSetBit;BigInteger.prototype.bitCount=bnBitCount;BigInteger.prototype.testBit=bnTestBit;BigInteger.prototype.setBit=bnSetBit;BigInteger.prototype.clearBit=bnClearBit;BigInteger.prototype.flipBit=bnFlipBit;BigInteger.prototype.add=bnAdd;BigInteger.prototype.subtract=bnSubtract;
|
||||
BigInteger.prototype.multiply=bnMultiply;BigInteger.prototype.divide=bnDivide;BigInteger.prototype.remainder=bnRemainder;BigInteger.prototype.divideAndRemainder=bnDivideAndRemainder;BigInteger.prototype.modPow=bnModPow;BigInteger.prototype.modInverse=bnModInverse;BigInteger.prototype.pow=bnPow;BigInteger.prototype.gcd=bnGCD;BigInteger.prototype.isProbablePrime=bnIsProbablePrime;BigInteger.prototype.square=bnSquare;
|
||||
(function(a,b,c,d,e,g,h){function f(a){var b,d,e=this,g=a.length,f=0,h=e.i=e.j=e.m=0;e.S=[];e.c=[];for(g||(a=[g++]);f<c;)e.S[f]=f++;for(f=0;f<c;f++)b=e.S[f],h=h+b+a[f%g]&c-1,d=e.S[h],e.S[f]=d,e.S[h]=b;e.g=function(a){var b=e.S,d=e.i+1&c-1,g=b[d],f=e.j+g&c-1,h=b[f];b[d]=h;b[f]=g;for(var k=b[g+h&c-1];--a;)d=d+1&c-1,g=b[d],f=f+g&c-1,h=b[f],b[d]=h,b[f]=g,k=k*c+b[g+h&c-1];e.i=d;e.j=f;return k};e.g(c)}function o(a,b,c,d,e){c=[];e=typeof a;if(b&&e=="object")for(d in a)if(d.indexOf("S")<5)try{c.push(o(a[d],
|
||||
b-1))}catch(g){}return c.length?c:a+(e!="string"?"\x00":"")}function p(a,b,d,e){a+="";for(e=d=0;e<a.length;e++){var g=b,f=e&c-1,h=(d^=b[e&c-1]*19)+a.charCodeAt(e);g[f]=h&c-1}a="";for(e in b)a+=String.fromCharCode(b[e]);return a}b.seedrandom=function(q,n){var k=[],j,q=p(o(n?[q,a]:arguments.length?q:[(new Date).getTime(),a,window],3),k);j=new f(k);p(j.S,a);b.random=function(){for(var a=j.g(d),b=h,f=0;a<e;)a=(a+f)*c,b*=c,f=j.g(1);for(;a>=g;)a/=2,b/=2,f>>>=1;return(a+f)/b};return q};h=b.pow(c,d);e=b.pow(2,
|
||||
e);g=e*2;p(b.random(),a)})([],Math,256,6,52);function SeededRandom(){}function SRnextBytes(a){var b;for(b=0;b<a.length;b++)a[b]=Math.floor(Math.random()*256)}SeededRandom.prototype.nextBytes=SRnextBytes;function Arcfour(){this.j=this.i=0;this.S=[]}function ARC4init(a){var b,c,d;for(b=0;b<256;++b)this.S[b]=b;for(b=c=0;b<256;++b)c=c+this.S[b]+a[b%a.length]&255,d=this.S[b],this.S[b]=this.S[c],this.S[c]=d;this.j=this.i=0}
|
||||
function ARC4next(){var a;this.i=this.i+1&255;this.j=this.j+this.S[this.i]&255;a=this.S[this.i];this.S[this.i]=this.S[this.j];this.S[this.j]=a;return this.S[a+this.S[this.i]&255]}Arcfour.prototype.init=ARC4init;Arcfour.prototype.next=ARC4next;function prng_newstate(){return new Arcfour}var rng_psize=256,rng_state,rng_pool,rng_pptr;
|
||||
function rng_seed_int(a){rng_pool[rng_pptr++]^=a&255;rng_pool[rng_pptr++]^=a>>8&255;rng_pool[rng_pptr++]^=a>>16&255;rng_pool[rng_pptr++]^=a>>24&255;rng_pptr>=rng_psize&&(rng_pptr-=rng_psize)}function rng_seed_time(){rng_seed_int((new Date).getTime())}
|
||||
if(rng_pool==null){rng_pool=[];rng_pptr=0;var t;if(navigator.appName=="Netscape"&&navigator.appVersion<"5"&&window.crypto){var z=window.crypto.random(32);for(t=0;t<z.length;++t)rng_pool[rng_pptr++]=z.charCodeAt(t)&255}for(;rng_pptr<rng_psize;)t=Math.floor(65536*Math.random()),rng_pool[rng_pptr++]=t>>>8,rng_pool[rng_pptr++]=t&255;rng_pptr=0;rng_seed_time()}
|
||||
function rng_get_byte(){if(rng_state==null){rng_seed_time();rng_state=prng_newstate();rng_state.init(rng_pool);for(rng_pptr=0;rng_pptr<rng_pool.length;++rng_pptr)rng_pool[rng_pptr]=0;rng_pptr=0}return rng_state.next()}function rng_get_bytes(a){var b;for(b=0;b<a.length;++b)a[b]=rng_get_byte()}function SecureRandom(){}SecureRandom.prototype.nextBytes=rng_get_bytes;
|
||||
function SHA256(a){function b(a,b){var c=(a&65535)+(b&65535);return(a>>16)+(b>>16)+(c>>16)<<16|c&65535}function c(a,b){return a>>>b|a<<32-b}a=function(a){for(var a=a.replace(/\r\n/g,"\n"),b="",c=0;c<a.length;c++){var h=a.charCodeAt(c);h<128?b+=String.fromCharCode(h):(h>127&&h<2048?b+=String.fromCharCode(h>>6|192):(b+=String.fromCharCode(h>>12|224),b+=String.fromCharCode(h>>6&63|128)),b+=String.fromCharCode(h&63|128))}return b}(a);return function(a){for(var b="",c=0;c<a.length*4;c++)b+="0123456789abcdef".charAt(a[c>>
|
||||
2]>>(3-c%4)*8+4&15)+"0123456789abcdef".charAt(a[c>>2]>>(3-c%4)*8&15);return b}(function(a,e){var g=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,
|
||||
2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],h=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],f=Array(64),o,p,q,n,k,j,l,m,s,r,u,w;a[e>>5]|=128<<24-e%32;a[(e+64>>9<<4)+15]=e;for(s=0;s<a.length;s+=16){o=h[0];p=h[1];q=h[2];n=h[3];
|
||||
k=h[4];j=h[5];l=h[6];m=h[7];for(r=0;r<64;r++)f[r]=r<16?a[r+s]:b(b(b(c(f[r-2],17)^c(f[r-2],19)^f[r-2]>>>10,f[r-7]),c(f[r-15],7)^c(f[r-15],18)^f[r-15]>>>3),f[r-16]),u=b(b(b(b(m,c(k,6)^c(k,11)^c(k,25)),k&j^~k&l),g[r]),f[r]),w=b(c(o,2)^c(o,13)^c(o,22),o&p^o&q^p&q),m=l,l=j,j=k,k=b(n,u),n=q,q=p,p=o,o=b(u,w);h[0]=b(o,h[0]);h[1]=b(p,h[1]);h[2]=b(q,h[2]);h[3]=b(n,h[3]);h[4]=b(k,h[4]);h[5]=b(j,h[5]);h[6]=b(l,h[6]);h[7]=b(m,h[7])}return h}(function(a){for(var b=[],c=0;c<a.length*8;c+=8)b[c>>5]|=(a.charCodeAt(c/
|
||||
8)&255)<<24-c%32;return b}(a),a.length*8))}var sha256={hex:function(a){return SHA256(a)}};
|
||||
function SHA1(a){function b(a,b){return a<<b|a>>>32-b}function c(a){var b="",c,d;for(c=7;c>=0;c--)d=a>>>c*4&15,b+=d.toString(16);return b}var d,e,g=Array(80),h=1732584193,f=4023233417,o=2562383102,p=271733878,q=3285377520,n,k,j,l,m,a=function(a){for(var a=a.replace(/\r\n/g,"\n"),b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);d<128?b+=String.fromCharCode(d):(d>127&&d<2048?b+=String.fromCharCode(d>>6|192):(b+=String.fromCharCode(d>>12|224),b+=String.fromCharCode(d>>6&63|128)),b+=String.fromCharCode(d&
|
||||
63|128))}return b}(a);n=a.length;var s=[];for(d=0;d<n-3;d+=4)e=a.charCodeAt(d)<<24|a.charCodeAt(d+1)<<16|a.charCodeAt(d+2)<<8|a.charCodeAt(d+3),s.push(e);switch(n%4){case 0:d=2147483648;break;case 1:d=a.charCodeAt(n-1)<<24|8388608;break;case 2:d=a.charCodeAt(n-2)<<24|a.charCodeAt(n-1)<<16|32768;break;case 3:d=a.charCodeAt(n-3)<<24|a.charCodeAt(n-2)<<16|a.charCodeAt(n-1)<<8|128}for(s.push(d);s.length%16!=14;)s.push(0);s.push(n>>>29);s.push(n<<3&4294967295);for(a=0;a<s.length;a+=16){for(d=0;d<16;d++)g[d]=
|
||||
s[a+d];for(d=16;d<=79;d++)g[d]=b(g[d-3]^g[d-8]^g[d-14]^g[d-16],1);e=h;n=f;k=o;j=p;l=q;for(d=0;d<=19;d++)m=b(e,5)+(n&k|~n&j)+l+g[d]+1518500249&4294967295,l=j,j=k,k=b(n,30),n=e,e=m;for(d=20;d<=39;d++)m=b(e,5)+(n^k^j)+l+g[d]+1859775393&4294967295,l=j,j=k,k=b(n,30),n=e,e=m;for(d=40;d<=59;d++)m=b(e,5)+(n&k|n&j|k&j)+l+g[d]+2400959708&4294967295,l=j,j=k,k=b(n,30),n=e,e=m;for(d=60;d<=79;d++)m=b(e,5)+(n^k^j)+l+g[d]+3395469782&4294967295,l=j,j=k,k=b(n,30),n=e,e=m;h=h+e&4294967295;f=f+n&4294967295;o=o+k&4294967295;
|
||||
p=p+j&4294967295;q=q+l&4294967295}m=c(h)+c(f)+c(o)+c(p)+c(q);return m.toLowerCase()}
|
||||
var sha1={hex:function(a){return SHA1(a)}},MD5=function(a){function b(a,b){var c,d,e,f,g;e=a&2147483648;f=b&2147483648;c=a&1073741824;d=b&1073741824;g=(a&1073741823)+(b&1073741823);return c&d?g^2147483648^e^f:c|d?g&1073741824?g^3221225472^e^f:g^1073741824^e^f:g^e^f}function c(a,c,d,e,f,g,h){a=b(a,b(b(c&d|~c&e,f),h));return b(a<<g|a>>>32-g,c)}function d(a,c,d,e,f,g,h){a=b(a,b(b(c&e|d&~e,f),h));return b(a<<g|a>>>32-g,c)}function e(a,c,d,e,f,g,h){a=b(a,b(b(c^d^e,f),h));return b(a<<g|a>>>32-g,c)}function g(a,
|
||||
c,d,e,f,g,h){a=b(a,b(b(d^(c|~e),f),h));return b(a<<g|a>>>32-g,c)}function h(a){var b="",c="",d;for(d=0;d<=3;d++)c=a>>>d*8&255,c="0"+c.toString(16),b+=c.substr(c.length-2,2);return b}var f=[],o,p,q,n,k,j,l,m,a=function(a){for(var a=a.replace(/\r\n/g,"\n"),b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);d<128?b+=String.fromCharCode(d):(d>127&&d<2048?b+=String.fromCharCode(d>>6|192):(b+=String.fromCharCode(d>>12|224),b+=String.fromCharCode(d>>6&63|128)),b+=String.fromCharCode(d&63|128))}return b}(a),
|
||||
f=function(a){var b,c=a.length;b=c+8;for(var d=((b-b%64)/64+1)*16,e=Array(d-1),f=0,g=0;g<c;)b=(g-g%4)/4,f=g%4*8,e[b]|=a.charCodeAt(g)<<f,g++;e[(g-g%4)/4]|=128<<g%4*8;e[d-2]=c<<3;e[d-1]=c>>>29;return e}(a);k=1732584193;j=4023233417;l=2562383102;m=271733878;for(a=0;a<f.length;a+=16)o=k,p=j,q=l,n=m,k=c(k,j,l,m,f[a+0],7,3614090360),m=c(m,k,j,l,f[a+1],12,3905402710),l=c(l,m,k,j,f[a+2],17,606105819),j=c(j,l,m,k,f[a+3],22,3250441966),k=c(k,j,l,m,f[a+4],7,4118548399),m=c(m,k,j,l,f[a+5],12,1200080426),l=c(l,
|
||||
m,k,j,f[a+6],17,2821735955),j=c(j,l,m,k,f[a+7],22,4249261313),k=c(k,j,l,m,f[a+8],7,1770035416),m=c(m,k,j,l,f[a+9],12,2336552879),l=c(l,m,k,j,f[a+10],17,4294925233),j=c(j,l,m,k,f[a+11],22,2304563134),k=c(k,j,l,m,f[a+12],7,1804603682),m=c(m,k,j,l,f[a+13],12,4254626195),l=c(l,m,k,j,f[a+14],17,2792965006),j=c(j,l,m,k,f[a+15],22,1236535329),k=d(k,j,l,m,f[a+1],5,4129170786),m=d(m,k,j,l,f[a+6],9,3225465664),l=d(l,m,k,j,f[a+11],14,643717713),j=d(j,l,m,k,f[a+0],20,3921069994),k=d(k,j,l,m,f[a+5],5,3593408605),
|
||||
m=d(m,k,j,l,f[a+10],9,38016083),l=d(l,m,k,j,f[a+15],14,3634488961),j=d(j,l,m,k,f[a+4],20,3889429448),k=d(k,j,l,m,f[a+9],5,568446438),m=d(m,k,j,l,f[a+14],9,3275163606),l=d(l,m,k,j,f[a+3],14,4107603335),j=d(j,l,m,k,f[a+8],20,1163531501),k=d(k,j,l,m,f[a+13],5,2850285829),m=d(m,k,j,l,f[a+2],9,4243563512),l=d(l,m,k,j,f[a+7],14,1735328473),j=d(j,l,m,k,f[a+12],20,2368359562),k=e(k,j,l,m,f[a+5],4,4294588738),m=e(m,k,j,l,f[a+8],11,2272392833),l=e(l,m,k,j,f[a+11],16,1839030562),j=e(j,l,m,k,f[a+14],23,4259657740),
|
||||
k=e(k,j,l,m,f[a+1],4,2763975236),m=e(m,k,j,l,f[a+4],11,1272893353),l=e(l,m,k,j,f[a+7],16,4139469664),j=e(j,l,m,k,f[a+10],23,3200236656),k=e(k,j,l,m,f[a+13],4,681279174),m=e(m,k,j,l,f[a+0],11,3936430074),l=e(l,m,k,j,f[a+3],16,3572445317),j=e(j,l,m,k,f[a+6],23,76029189),k=e(k,j,l,m,f[a+9],4,3654602809),m=e(m,k,j,l,f[a+12],11,3873151461),l=e(l,m,k,j,f[a+15],16,530742520),j=e(j,l,m,k,f[a+2],23,3299628645),k=g(k,j,l,m,f[a+0],6,4096336452),m=g(m,k,j,l,f[a+7],10,1126891415),l=g(l,m,k,j,f[a+14],15,2878612391),
|
||||
j=g(j,l,m,k,f[a+5],21,4237533241),k=g(k,j,l,m,f[a+12],6,1700485571),m=g(m,k,j,l,f[a+3],10,2399980690),l=g(l,m,k,j,f[a+10],15,4293915773),j=g(j,l,m,k,f[a+1],21,2240044497),k=g(k,j,l,m,f[a+8],6,1873313359),m=g(m,k,j,l,f[a+15],10,4264355552),l=g(l,m,k,j,f[a+6],15,2734768916),j=g(j,l,m,k,f[a+13],21,1309151649),k=g(k,j,l,m,f[a+4],6,4149444226),m=g(m,k,j,l,f[a+11],10,3174756917),l=g(l,m,k,j,f[a+2],15,718787259),j=g(j,l,m,k,f[a+9],21,3951481745),k=b(k,o),j=b(j,p),l=b(l,q),m=b(m,n);return(h(k)+h(j)+h(l)+
|
||||
h(m)).toLowerCase()};function parseBigInt(a,b){return new BigInteger(a,b)}function linebrk(a,b){for(var c="",d=0;d+b<a.length;)c+=a.substring(d,d+b)+"\n",d+=b;return c+a.substring(d,a.length)}function byte2Hex(a){return a<16?"0"+a.toString(16):a.toString(16)}
|
||||
function pkcs1pad2(a,b){if(b<a.length+11)throw"Message too long for RSA (n="+b+", l="+a.length+")";for(var c=[],d=a.length-1;d>=0&&b>0;){var e=a.charCodeAt(d--);e<128?c[--b]=e:e>127&&e<2048?(c[--b]=e&63|128,c[--b]=e>>6|192):(c[--b]=e&63|128,c[--b]=e>>6&63|128,c[--b]=e>>12|224)}c[--b]=0;d=new SecureRandom;for(e=[];b>2;){for(e[0]=0;e[0]==0;)d.nextBytes(e);c[--b]=e[0]}c[--b]=2;c[--b]=0;return new BigInteger(c)}
|
||||
function RSAKey(){this.n=null;this.e=0;this.coeff=this.dmq1=this.dmp1=this.q=this.p=this.d=null}function RSASetPublic(a,b){a!=null&&b!=null&&a.length>0&&b.length>0?(this.n=parseBigInt(a,16),this.e=parseInt(b,16)):alert("Invalid RSA public key")}function RSADoPublic(a){return a.modPowInt(this.e,this.n)}function RSAEncrypt(a){a=pkcs1pad2(a,this.n.bitLength()+7>>3);if(a==null)return null;a=this.doPublic(a);if(a==null)return null;a=a.toString(16);return(a.length&1)==0?a:"0"+a}
|
||||
RSAKey.prototype.doPublic=RSADoPublic;RSAKey.prototype.setPublic=RSASetPublic;RSAKey.prototype.encrypt=RSAEncrypt;function pkcs1unpad2(a,b){for(var c=a.toByteArray(),d=0;d<c.length&&c[d]==0;)++d;if(c.length-d!=b-1||c[d]!=2)return null;for(++d;c[d]!=0;)if(++d>=c.length)return null;for(var e="";++d<c.length;){var g=c[d]&255;g<128?e+=String.fromCharCode(g):g>191&&g<224?(e+=String.fromCharCode((g&31)<<6|c[d+1]&63),++d):(e+=String.fromCharCode((g&15)<<12|(c[d+1]&63)<<6|c[d+2]&63),d+=2)}return e}
|
||||
function RSASetPrivate(a,b,c){a!=null&&b!=null&&a.length>0&&b.length>0?(this.n=parseBigInt(a,16),this.e=parseInt(b,16),this.d=parseBigInt(c,16)):alert("Invalid RSA private key")}
|
||||
function RSASetPrivateEx(a,b,c,d,e,g,h,f){a!=null&&b!=null&&a.length>0&&b.length>0?(this.n=parseBigInt(a,16),this.e=parseInt(b,16),this.d=parseBigInt(c,16),this.p=parseBigInt(d,16),this.q=parseBigInt(e,16),this.dmp1=parseBigInt(g,16),this.dmq1=parseBigInt(h,16),this.coeff=parseBigInt(f,16)):alert("Invalid RSA private key")}
|
||||
function RSAGenerate(a,b){var c=new SeededRandom,d=a>>1;this.e=parseInt(b,16);for(var e=new BigInteger(b,16);;){for(;;)if(this.p=new BigInteger(a-d,1,c),this.p.subtract(BigInteger.ONE).gcd(e).compareTo(BigInteger.ONE)==0&&this.p.isProbablePrime(10))break;for(;;)if(this.q=new BigInteger(d,1,c),this.q.subtract(BigInteger.ONE).gcd(e).compareTo(BigInteger.ONE)==0&&this.q.isProbablePrime(10))break;if(this.p.compareTo(this.q)<=0){var g=this.p;this.p=this.q;this.q=g}var g=this.p.subtract(BigInteger.ONE),
|
||||
h=this.q.subtract(BigInteger.ONE),f=g.multiply(h);if(f.gcd(e).compareTo(BigInteger.ONE)==0){this.n=this.p.multiply(this.q);this.d=e.modInverse(f);this.dmp1=this.d.mod(g);this.dmq1=this.d.mod(h);this.coeff=this.q.modInverse(this.p);break}}}
|
||||
function RSADoPrivate(a){if(this.p==null||this.q==null)return a.modPow(this.d,this.n);for(var b=a.mod(this.p).modPow(this.dmp1,this.p),a=a.mod(this.q).modPow(this.dmq1,this.q);b.compareTo(a)<0;)b=b.add(this.p);return b.subtract(a).multiply(this.coeff).mod(this.p).multiply(this.q).add(a)}function RSADecrypt(a){a=this.doPrivate(parseBigInt(a,16));return a==null?null:pkcs1unpad2(a,this.n.bitLength()+7>>3)}RSAKey.prototype.doPrivate=RSADoPrivate;RSAKey.prototype.setPrivate=RSASetPrivate;
|
||||
RSAKey.prototype.setPrivateEx=RSASetPrivateEx;RSAKey.prototype.generate=RSAGenerate;RSAKey.prototype.decrypt=RSADecrypt;var _RSASIGN_DIHEAD=[];_RSASIGN_DIHEAD.sha1="3021300906052b0e03021a05000414";_RSASIGN_DIHEAD.sha256="3031300d060960864801650304020105000420";var _RSASIGN_HASHHEXFUNC=[];_RSASIGN_HASHHEXFUNC.sha1=sha1.hex;_RSASIGN_HASHHEXFUNC.sha256=sha256.hex;
|
||||
function _rsasign_getHexPaddedDigestInfoForString(a,b,c){b/=4;for(var a=(0,_RSASIGN_HASHHEXFUNC[c])(a),c="00"+_RSASIGN_DIHEAD[c]+a,a="",b=b-4-c.length,d=0;d<b;d+=2)a+="ff";return sPaddedMessageHex="0001"+a+c}function _rsasign_signString(a,b){var c=_rsasign_getHexPaddedDigestInfoForString(a,this.n.bitLength(),b);return this.doPrivate(parseBigInt(c,16)).toString(16)}
|
||||
function _rsasign_signStringWithSHA1(a){a=_rsasign_getHexPaddedDigestInfoForString(a,this.n.bitLength(),"sha1");return this.doPrivate(parseBigInt(a,16)).toString(16)}function _rsasign_signStringWithSHA256(a){a=_rsasign_getHexPaddedDigestInfoForString(a,this.n.bitLength(),"sha256");return this.doPrivate(parseBigInt(a,16)).toString(16)}function _rsasign_getDecryptSignatureBI(a,b,c){var d=new RSAKey;d.setPublic(b,c);return d.doPublic(a)}
|
||||
function _rsasign_getHexDigestInfoFromSig(a,b,c){return _rsasign_getDecryptSignatureBI(a,b,c).toString(16).replace(/^1f+00/,"")}function _rsasign_getAlgNameAndHashFromHexDisgestInfo(a){for(var b in _RSASIGN_DIHEAD){var c=_RSASIGN_DIHEAD[b],d=c.length;if(a.substring(0,d)==c)return[b,a.substring(d)]}return[]}
|
||||
function _rsasign_verifySignatureWithArgs(a,b,c,d){b=_rsasign_getHexDigestInfoFromSig(b,c,d);c=_rsasign_getAlgNameAndHashFromHexDisgestInfo(b);if(c.length==0)return!1;b=c[1];a=(0,_RSASIGN_HASHHEXFUNC[c[0]])(a);return b==a}function _rsasign_verifyHexSignatureForMessage(a,b){var c=parseBigInt(a,16);return _rsasign_verifySignatureWithArgs(b,c,this.n.toString(16),this.e.toString(16))}
|
||||
function _rsasign_verifyString(a,b){var b=b.replace(/[ \n]+/g,""),c=this.doPublic(parseBigInt(b,16)).toString(16).replace(/^1f+00/,""),d=_rsasign_getAlgNameAndHashFromHexDisgestInfo(c);if(d.length==0)return!1;c=d[1];d=(0,_RSASIGN_HASHHEXFUNC[d[0]])(a);return c==d}RSAKey.prototype.signString=_rsasign_signString;RSAKey.prototype.signStringWithSHA1=_rsasign_signStringWithSHA1;RSAKey.prototype.signStringWithSHA256=_rsasign_signStringWithSHA256;RSAKey.prototype.verifyString=_rsasign_verifyString;
|
||||
RSAKey.prototype.verifyHexSignatureForMessage=_rsasign_verifyHexSignatureForMessage;
|
||||
var aes=function(){var a={Sbox:[99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,
|
||||
95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22],ShiftRowTab:[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11]};a.Init=
|
||||
function(){a.Sbox_Inv=Array(256);for(var b=0;b<256;b++)a.Sbox_Inv[a.Sbox[b]]=b;a.ShiftRowTab_Inv=Array(16);for(b=0;b<16;b++)a.ShiftRowTab_Inv[a.ShiftRowTab[b]]=b;a.xtime=Array(256);for(b=0;b<128;b++)a.xtime[b]=b<<1,a.xtime[128+b]=b<<1^27};a.Done=function(){delete a.Sbox_Inv;delete a.ShiftRowTab_Inv;delete a.xtime};a.ExpandKey=function(b){var c=b.length,d,e=1;switch(c){case 16:d=176;break;case 24:d=208;break;case 32:d=240;break;default:alert("my.ExpandKey: Only key lengths of 16, 24 or 32 bytes allowed!")}for(var g=
|
||||
c;g<d;g+=4){var h=b.slice(g-4,g);if(g%c==0){if(h=[a.Sbox[h[1]]^e,a.Sbox[h[2]],a.Sbox[h[3]],a.Sbox[h[0]]],(e<<=1)>=256)e^=283}else c>24&&g%c==16&&(h=[a.Sbox[h[0]],a.Sbox[h[1]],a.Sbox[h[2]],a.Sbox[h[3]]]);for(var f=0;f<4;f++)b[g+f]=b[g+f-c]^h[f]}};a.Encrypt=function(b,c){var d=c.length;a.AddRoundKey(b,c.slice(0,16));for(var e=16;e<d-16;e+=16)a.SubBytes(b,a.Sbox),a.ShiftRows(b,a.ShiftRowTab),a.MixColumns(b),a.AddRoundKey(b,c.slice(e,e+16));a.SubBytes(b,a.Sbox);a.ShiftRows(b,a.ShiftRowTab);a.AddRoundKey(b,
|
||||
c.slice(e,d))};a.Decrypt=function(b,c){var d=c.length;a.AddRoundKey(b,c.slice(d-16,d));a.ShiftRows(b,a.ShiftRowTab_Inv);a.SubBytes(b,a.Sbox_Inv);for(d-=32;d>=16;d-=16)a.AddRoundKey(b,c.slice(d,d+16)),a.MixColumns_Inv(b),a.ShiftRows(b,a.ShiftRowTab_Inv),a.SubBytes(b,a.Sbox_Inv);a.AddRoundKey(b,c.slice(0,16))};a.SubBytes=function(a,c){for(var d=0;d<16;d++)a[d]=c[a[d]]};a.AddRoundKey=function(a,c){for(var d=0;d<16;d++)a[d]^=c[d]};a.ShiftRows=function(a,c){for(var d=[].concat(a),e=0;e<16;e++)a[e]=d[c[e]]};
|
||||
a.MixColumns=function(b){for(var c=0;c<16;c+=4){var d=b[c+0],e=b[c+1],g=b[c+2],h=b[c+3],f=d^e^g^h;b[c+0]^=f^a.xtime[d^e];b[c+1]^=f^a.xtime[e^g];b[c+2]^=f^a.xtime[g^h];b[c+3]^=f^a.xtime[h^d]}};a.MixColumns_Inv=function(b){for(var c=0;c<16;c+=4){var d=b[c+0],e=b[c+1],g=b[c+2],h=b[c+3],f=d^e^g^h,o=a.xtime[f],p=a.xtime[a.xtime[o^d^g]]^f;f^=a.xtime[a.xtime[o^e^h]];b[c+0]^=p^a.xtime[d^e];b[c+1]^=f^a.xtime[e^g];b[c+2]^=p^a.xtime[g^h];b[c+3]^=f^a.xtime[h^d]}};return a}(),cryptico=function(){var a={};aes.Init();
|
||||
a.b256to64=function(a){var c,d,e,g="",h=0,f=0,o=a.length;for(e=0;e<o;e++)d=a.charCodeAt(e),f==0?(g+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d>>2&63),c=(d&3)<<4):f==1?(g+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(c|d>>4&15),c=(d&15)<<2):f==2&&(g+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(c|d>>6&3),h+=1,g+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d&63)),h+=1,f+=1,f==3&&
|
||||
(f=0);f>0&&(g+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(c),g+="=");f==1&&(g+="=");return g};a.b64to256=function(a){var c,d,e="",g=0,h=0,f=a.length;for(d=0;d<f;d++)c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(d)),c>=0&&(g&&(e+=String.fromCharCode(h|c>>6-g&255)),g=g+2&7,h=c<<g&255);return e};a.b16to64=function(a){var c,d,e="";a.length%2==1&&(a="0"+a);for(c=0;c+3<=a.length;c+=3)d=parseInt(a.substring(c,c+3),16),e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d>>
|
||||
6)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d&63);c+1==a.length?(d=parseInt(a.substring(c,c+1),16),e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d<<2)):c+2==a.length&&(d=parseInt(a.substring(c,c+2),16),e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d>>2)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt((d&3)<<4));for(;(e.length&3)>0;)e+="=";return e};a.b64to16=function(a){var c="",
|
||||
d,e=0,g;for(d=0;d<a.length;++d){if(a.charAt(d)=="=")break;v="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(d));v<0||(e==0?(c+=int2char(v>>2),g=v&3,e=1):e==1?(c+=int2char(g<<2|v>>4),g=v&15,e=2):e==2?(c+=int2char(g),c+=int2char(v>>2),g=v&3,e=3):(c+=int2char(g<<2|v>>4),c+=int2char(v&15),e=0))}e==1&&(c+=int2char(g<<2));return c};a.string2bytes=function(a){for(var c=[],d=0;d<a.length;d++)c.push(a.charCodeAt(d));return c};a.bytes2string=function(a){for(var c="",d=0;d<
|
||||
a.length;d++)c+=String.fromCharCode(a[d]);return c};a.blockXOR=function(a,c){for(var d=Array(16),e=0;e<16;e++)d[e]=a[e]^c[e];return d};a.blockIV=function(){var a=new SecureRandom,c=Array(16);a.nextBytes(c);return c};a.pad16=function(a){var c=a.slice(0),d=(16-a.length%16)%16;for(i=a.length;i<a.length+d;i++)c.push(0);return c};a.depad=function(a){for(a=a.slice(0);a[a.length-1]==0;)a=a.slice(0,a.length-1);return a};a.encryptAESCBC=function(b,c){var d=c.slice(0);aes.ExpandKey(d);for(var e=a.string2bytes(b),
|
||||
e=a.pad16(e),g=a.blockIV(),h=0;h<e.length/16;h++){var f=e.slice(h*16,h*16+16),o=g.slice(h*16,h*16+16),f=a.blockXOR(o,f);aes.Encrypt(f,d);g=g.concat(f)}d=a.bytes2string(g);return a.b256to64(d)};a.decryptAESCBC=function(b,c){var d=c.slice(0);aes.ExpandKey(d);for(var b=a.b64to256(b),e=a.string2bytes(b),g=[],h=1;h<e.length/16;h++){var f=e.slice(h*16,h*16+16),o=e.slice((h-1)*16,(h-1)*16+16);aes.Decrypt(f,d);f=a.blockXOR(o,f);g=g.concat(f)}g=a.depad(g);return a.bytes2string(g)};a.wrap60=function(a){for(var c=
|
||||
"",d=0;d<a.length;d++)d%60==0&&d!=0&&(c+="\n"),c+=a[d];return c};a.generateAESKey=function(){var a=Array(16);(new SecureRandom).nextBytes(a);return a};a.generateRSAKey=function(a,c){Math.seedrandom(sha256.hex(a));var d=new RSAKey;d.generate(c,"10001");return d};a.publicKeyString=function(b){return pubkey=b.n.toString(16)};a.publicKeyID=function(a){return MD5(a)};a.publicKeyFromString=function(b){var b=b.split("|")[0],c=new RSAKey;c.setPublic(b,"10001");return c};a.encrypt=function(b,
|
||||
c,d){var e="";try{var h=a.publicKeyFromString(c);e+=h.encrypt(b)+"?"}catch(f){return{status:"Invalid public key"}};return{status:"success",cipher:e}};a.decrypt=function(b,c){var d=b.split("?"),e=c.decrypt(d[0]);return{status:"success",plaintext:e,signature:"unsigned"}};return a}();
|
||||
35
web/public/codebase/encryption/crypto-3.1.2.min.js
vendored
Normal file
35
web/public/codebase/encryption/crypto-3.1.2.min.js
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
CryptoJS v3.1.2
|
||||
code.google.com/p/crypto-js
|
||||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||||
code.google.com/p/crypto-js/wiki/License
|
||||
*/
|
||||
var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
|
||||
r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
|
||||
32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
|
||||
2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
|
||||
q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
|
||||
a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
|
||||
e)).finalize(b)}}});var n=d.algo={};return d}(Math);
|
||||
(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
|
||||
l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
|
||||
(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
|
||||
_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
|
||||
f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
|
||||
m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
|
||||
E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
|
||||
4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
|
||||
(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
|
||||
l)}})();
|
||||
CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
|
||||
finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
|
||||
c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
|
||||
e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
|
||||
this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
|
||||
1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
|
||||
decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
|
||||
b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
|
||||
(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
|
||||
16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
|
||||
8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
|
||||
d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();
|
||||
111
web/public/codebase/encryption/encryption.js
Normal file
111
web/public/codebase/encryption/encryption.js
Normal file
@@ -0,0 +1,111 @@
|
||||
define(function(require, exports, module) {
|
||||
var _oCommon, _oUtils, _oBase64;
|
||||
|
||||
require("websdk");
|
||||
_oCommon = require("common");
|
||||
_oUtils = require("utils");
|
||||
_oBase64 = require("base64");
|
||||
|
||||
function EncryptionFac () {}
|
||||
|
||||
EncryptionFac.prototype.encrypt = function (oStr, iRSABits, bBase64Encrypted, cbFun) {
|
||||
//var that = this;
|
||||
var iBits = 1024;
|
||||
|
||||
if (iRSABits) {
|
||||
iBits = iRSABits;
|
||||
}
|
||||
|
||||
var szPassPhrase = new Date() + "",
|
||||
szMattsRSAkey = cryptico.generateRSAKey(szPassPhrase, iBits),
|
||||
szPublicKeyString = cryptico.publicKeyString(szMattsRSAkey),
|
||||
szXml = "<?xml version='1.0' encoding='UTF-8'?><PublicKey><key>" + _oBase64.encode(szPublicKeyString) + "</key></PublicKey>",
|
||||
oXmlDoc = _oUtils.parseXmlFromStr(szXml);
|
||||
|
||||
WebSDK.WSDK_Request(_oCommon.m_szHostName, _oCommon.m_iHttpProtocal, _oCommon.m_iHttpPort, {
|
||||
cmd: "challenge",
|
||||
type: "POST",
|
||||
data: oXmlDoc,
|
||||
success: function (status, xmlDoc) {
|
||||
var szDecryptionResult = cryptico.decrypt(_oBase64.decode(_oUtils.nodeValue(xmlDoc, "key")), szMattsRSAkey);
|
||||
if(szDecryptionResult.plaintext != null) {
|
||||
var szKey,szEncryptPassword;
|
||||
var aResult = [];
|
||||
if (iBits === 256) {
|
||||
szKey = _oUtils.toHex(szDecryptionResult.plaintext);
|
||||
} else {
|
||||
szKey = szDecryptionResult.plaintext;
|
||||
}
|
||||
|
||||
szEncryptPassword = aes_encrypt(szDecryptionResult.plaintext.substring(0, 16), szKey, true);
|
||||
|
||||
if("function" === typeof cbFun) {
|
||||
if("string" === typeof oStr) {
|
||||
bBase64Encrypted && ( oStr = _oBase64.encode(oStr) );
|
||||
cbFun( _oBase64.encode( szEncryptPassword + _oUtils.encodeAES(oStr, szKey, "", "ecb") ) );
|
||||
} else if("[object Array]" === Object.prototype.toString.call(oStr)) {
|
||||
for(var i = 0, iArrayLen = oStr.length; i < iArrayLen; i++) {
|
||||
bBase64Encrypted && ( oStr[i] = _oBase64.encode(oStr[i]) );
|
||||
var szTemp = szEncryptPassword + _oUtils.encodeAES(oStr[i], szKey, "", "ecb");
|
||||
aResult.push( _oBase64.encode(szTemp) );
|
||||
}
|
||||
cbFun(aResult);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
EncryptionFac.prototype.encryptSync = function (oStr, iRSABits, bBase64Encrypted) {
|
||||
//var that = this;
|
||||
var iBits = 1024;
|
||||
var aResult = [];
|
||||
|
||||
if (iRSABits) {
|
||||
iBits = iRSABits;
|
||||
}
|
||||
|
||||
var szPassPhrase = new Date() + "",
|
||||
szMattsRSAkey = cryptico.generateRSAKey(szPassPhrase, iBits),
|
||||
szPublicKeyString = cryptico.publicKeyString(szMattsRSAkey),
|
||||
szXml = "<?xml version='1.0' encoding='UTF-8'?><PublicKey><key>" + _oBase64.encode(szPublicKeyString) + "</key></PublicKey>",
|
||||
oXmlDoc = _oUtils.parseXmlFromStr(szXml);
|
||||
|
||||
WebSDK.WSDK_Request(_oCommon.m_szHostName, _oCommon.m_iHttpProtocal, _oCommon.m_iHttpPort, {
|
||||
cmd: "challenge",
|
||||
type: "POST",
|
||||
async: false,
|
||||
data: oXmlDoc,
|
||||
success: function (status, xmlDoc) {
|
||||
var szDecryptionResult = cryptico.decrypt(_oBase64.decode(_oUtils.nodeValue(xmlDoc, "key")), szMattsRSAkey);
|
||||
if(szDecryptionResult.plaintext != null) {
|
||||
var szKey, szEncryptPassword;
|
||||
if (iBits === 256) {
|
||||
szKey = _oUtils.toHex(szDecryptionResult.plaintext);
|
||||
} else {
|
||||
szKey = szDecryptionResult.plaintext;
|
||||
}
|
||||
szEncryptPassword = aes_encrypt(szDecryptionResult.plaintext.substring(0, 16), szKey, true);
|
||||
if("string" === typeof oStr) {
|
||||
bBase64Encrypted && ( oStr = _oBase64.encode(oStr) );
|
||||
aResult.push( _oBase64.encode( szEncryptPassword + _oUtils.encodeAES(oStr, szKey, "", "ecb") ) );
|
||||
} else {
|
||||
for(var i = 0, iArrayLen = oStr.length; i < iArrayLen; i++) {
|
||||
bBase64Encrypted && ( oStr[i] = _oBase64.encode(oStr[i]) );
|
||||
var szTemp = szEncryptPassword + _oUtils.encodeAES(oStr[i], szKey, "", "ecb");
|
||||
aResult.push( _oBase64.encode(szTemp) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
if("string" === typeof oStr) {
|
||||
return aResult[0];
|
||||
} else {
|
||||
return aResult;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = new EncryptionFac();
|
||||
});
|
||||
21
web/public/codebase/jsPlugin/audioMixer/AudioAMER.js
Normal file
21
web/public/codebase/jsPlugin/audioMixer/AudioAMER.js
Normal file
File diff suppressed because one or more lines are too long
BIN
web/public/codebase/jsPlugin/audioMixer/AudioAMER.wasm
Normal file
BIN
web/public/codebase/jsPlugin/audioMixer/AudioAMER.wasm
Normal file
Binary file not shown.
87
web/public/codebase/jsPlugin/audioMixer/audioMixer-worker.js
Normal file
87
web/public/codebase/jsPlugin/audioMixer/audioMixer-worker.js
Normal file
@@ -0,0 +1,87 @@
|
||||
importScripts('AudioAMER.js');
|
||||
|
||||
let channelNum = 2; // 通道数(需求上只需要2通道,不用改)
|
||||
let sampleRate = 32000; // 采样率,支持8K/16K/32K/48K
|
||||
let bitsPerSample = 16; // 采样精度,支持16/32
|
||||
let dataLen = 320; // 一帧数据长度(采样点数),320个16位采样点即640B,支持4/8/10/16/20/24/30/32/40ms
|
||||
|
||||
// self.JSAudioCodecModule['onRuntimeInitialized'] = function () {
|
||||
// JSAudioCodecModule().then(instance => {
|
||||
// AudioModule = instance;
|
||||
// });
|
||||
// postMessage({type: "loaded"});
|
||||
// };
|
||||
|
||||
JSAudioCodecModule().then(instance => {
|
||||
AudioModule = instance;
|
||||
postMessage({type: "loaded"});
|
||||
});
|
||||
|
||||
onmessage = function (e) {
|
||||
let data = e.data;
|
||||
if ("create" === data.type) {
|
||||
let size = AudioModule._malloc(4);
|
||||
let alignment = AudioModule._malloc(4);
|
||||
if (size === null || alignment === null) {
|
||||
console.log("inputdata malloc failed!!!");
|
||||
return -1;
|
||||
}
|
||||
channelNum = data.channelNum;
|
||||
sampleRate = data.sampleRate;
|
||||
bitsPerSample = data.bitsPerSample;
|
||||
dataLen = data.dataLen;
|
||||
|
||||
let iRet = AudioModule._JSHIK_AMER_GetMemSize(channelNum, sampleRate, bitsPerSample, dataLen, size, alignment);
|
||||
if (iRet !== 1) {
|
||||
console.log("_CreatHandle failed!" + iRet);
|
||||
} else {
|
||||
let sizeOut = AudioModule.getValue(size, "i32");
|
||||
let alignmentOut = AudioModule.getValue(alignment, "i32");
|
||||
iRet = AudioModule._JSHIK_AMER_Create(channelNum, sampleRate, bitsPerSample, dataLen, sizeOut, alignmentOut);
|
||||
console.log("Create_res:" + iRet);
|
||||
postMessage({type: "created"});
|
||||
}
|
||||
if (size !== null) {
|
||||
AudioModule._free(size);
|
||||
size = null;
|
||||
}
|
||||
if (alignment !== null) {
|
||||
AudioModule._free(alignment);
|
||||
alignment = null;
|
||||
}
|
||||
} else if ("inputData" === data.type) {
|
||||
let inputSize = dataLen * 2;//dataLen为320,inputSize应该是 320 * 2 = 640
|
||||
let pInputData1 = AudioModule._malloc(inputSize);
|
||||
let pInputData2 = AudioModule._malloc(inputSize);
|
||||
|
||||
let pOutputData1 = AudioModule._malloc(inputSize);
|
||||
let pOutputData2 = AudioModule._malloc(inputSize);
|
||||
let pOutputData3 = AudioModule._malloc(inputSize);
|
||||
if (pInputData1 === null || pInputData2 === null || pOutputData1 === null || pOutputData2 === null || pOutputData3 === null) {
|
||||
console.log("inputdata or outputData malloc failed!!!");
|
||||
return -1;
|
||||
}
|
||||
let inputData1 = new Uint8Array(data.buf1);
|
||||
let inputData2 = new Uint8Array(data.buf2);
|
||||
AudioModule.writeArrayToMemory(inputData1, pInputData1);
|
||||
AudioModule.writeArrayToMemory(inputData2, pInputData2);
|
||||
inputData1 = null;
|
||||
inputData2 = null;
|
||||
// 开始处理
|
||||
let res = AudioModule._JSHIK_AMER_Process(pInputData1, pInputData2, pOutputData1, pOutputData2, pOutputData3, parseInt(inputSize / 2, 10));
|
||||
if (res === 1) {
|
||||
let aOutputData = new Uint8Array(inputSize);
|
||||
aOutputData.set(AudioModule.HEAPU8.subarray(pOutputData3, pOutputData3 + inputSize)); // 必须取pOutputData3的数据
|
||||
// postMessage({ type: "outputData", buf: aOutputData}, [aOutputData]);
|
||||
postMessage({ type: "outputData", dType: 1, buf: aOutputData.buffer}, [aOutputData.buffer]);
|
||||
}
|
||||
AudioModule._free(pInputData1);
|
||||
AudioModule._free(pInputData2);
|
||||
AudioModule._free(pOutputData1);
|
||||
AudioModule._free(pOutputData2);
|
||||
AudioModule._free(pOutputData3);
|
||||
} else if ("release" === data.type) {
|
||||
//奇怪,到时和研究院确认一下,库为什么不提供释放资源或者停止的接口??
|
||||
close();
|
||||
}
|
||||
};
|
||||
2
web/public/codebase/jsPlugin/jquery.min.js
vendored
Normal file
2
web/public/codebase/jsPlugin/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
301
web/public/codebase/jsPlugin/jsPlugin-3.0.0.min.js
vendored
Normal file
301
web/public/codebase/jsPlugin/jsPlugin-3.0.0.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -0,0 +1 @@
|
||||
"use strict";var Module={};var initializedJS=false;function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=(info,receiveInstance)=>{var module=Module["wasmModule"];Module["wasmModule"]=null;var instance=new WebAssembly.Instance(module,info);return receiveInstance(instance)};self.onunhandledrejection=e=>{throw e.reason??e};function handleMessage(e){try{if(e.data.cmd==="load"){let messageQueue=[];self.onmessage=e=>messageQueue.push(e);self.startWorker=instance=>{Module=instance;postMessage({"cmd":"loaded"});for(let msg of messageQueue){handleMessage(msg)}self.onmessage=handleMessage};Module["wasmModule"]=e.data.wasmModule;for(const handler of e.data.handlers){Module[handler]=(...args)=>{postMessage({cmd:"callHandler",handler:handler,args:args})}}Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob=="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}JSPlayerModule(Module)}else if(e.data.cmd==="run"){Module["__emscripten_thread_init"](e.data.pthread_ptr,0,0,1);Module["__emscripten_thread_mailbox_await"](e.data.pthread_ptr);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInitTLS();if(!initializedJS){Module["__embind_initialize_bindings"]();initializedJS=true}try{Module["invokeEntryPoint"](e.data.start_routine,e.data.arg)}catch(ex){if(ex!="unwind"){throw ex}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="checkMailbox"){if(initializedJS){Module["checkMailbox"]()}}else if(e.data.cmd){err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){if(Module["__emscripten_thread_crashed"]){Module["__emscripten_thread_crashed"]()}throw ex}}self.onmessage=handleMessage;
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -0,0 +1 @@
|
||||
"use strict";var Module={};var initializedJS=false;function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=(info,receiveInstance)=>{var module=Module["wasmModule"];Module["wasmModule"]=null;var instance=new WebAssembly.Instance(module,info);return receiveInstance(instance)};self.onunhandledrejection=e=>{throw e.reason??e};function handleMessage(e){try{if(e.data.cmd==="load"){let messageQueue=[];self.onmessage=e=>messageQueue.push(e);self.startWorker=instance=>{Module=instance;postMessage({"cmd":"loaded"});for(let msg of messageQueue){handleMessage(msg)}self.onmessage=handleMessage};Module["wasmModule"]=e.data.wasmModule;for(const handler of e.data.handlers){Module[handler]=(...args)=>{postMessage({cmd:"callHandler",handler:handler,args:args})}}Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob=="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}JSPlayerModule(Module)}else if(e.data.cmd==="run"){Module["__emscripten_thread_init"](e.data.pthread_ptr,0,0,1);Module["__emscripten_thread_mailbox_await"](e.data.pthread_ptr);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInitTLS();if(!initializedJS){Module["__embind_initialize_bindings"]();initializedJS=true}try{Module["invokeEntryPoint"](e.data.start_routine,e.data.arg)}catch(ex){if(ex!="unwind"){throw ex}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="checkMailbox"){if(initializedJS){Module["checkMailbox"]()}}else if(e.data.cmd){err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){if(Module["__emscripten_thread_crashed"]){Module["__emscripten_thread_crashed"]()}throw ex}}self.onmessage=handleMessage;
|
||||
1
web/public/codebase/jsPlugin/playctrl/PlayCtrlWasm/wasmplayer.min.js
vendored
Normal file
1
web/public/codebase/jsPlugin/playctrl/PlayCtrlWasm/wasmplayer.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
21
web/public/codebase/jsPlugin/talkW/AudioInterCom.js
Normal file
21
web/public/codebase/jsPlugin/talkW/AudioInterCom.js
Normal file
File diff suppressed because one or more lines are too long
BIN
web/public/codebase/jsPlugin/talkW/AudioInterCom.wasm
Normal file
BIN
web/public/codebase/jsPlugin/talkW/AudioInterCom.wasm
Normal file
Binary file not shown.
@@ -0,0 +1 @@
|
||||
"use strict";var Module={};var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";if(ENVIRONMENT_IS_NODE){var nodeWorkerThreads=require("worker_threads");var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",data=>onmessage({data:data}));var fs=require("fs");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:f=>(0,eval)(fs.readFileSync(f,"utf8")+"//# sourceURL="+f),postMessage:msg=>parentPort.postMessage(msg),performance:global.performance||{now:Date.now}})}var initializedJS=false;function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,text+"\n");return}console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=(info,receiveInstance)=>{var module=Module["wasmModule"];Module["wasmModule"]=null;var instance=new WebAssembly.Instance(module,info);return receiveInstance(instance)};self.onunhandledrejection=e=>{throw e.reason??e};function handleMessage(e){try{if(e.data.cmd==="load"){let messageQueue=[];self.onmessage=e=>messageQueue.push(e);self.startWorker=instance=>{Module=instance;postMessage({"cmd":"loaded"});for(let msg of messageQueue){handleMessage(msg)}self.onmessage=handleMessage};Module["wasmModule"]=e.data.wasmModule;for(const handler of e.data.handlers){Module[handler]=(...args)=>{postMessage({cmd:"callHandler",handler:handler,args:args})}}Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob=="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}JSAudioInterComModule(Module)}else if(e.data.cmd==="run"){Module["__emscripten_thread_init"](e.data.pthread_ptr,0,0,1);Module["__emscripten_thread_mailbox_await"](e.data.pthread_ptr);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInitTLS();if(!initializedJS){Module["__embind_initialize_bindings"]();initializedJS=true}try{Module["invokeEntryPoint"](e.data.start_routine,e.data.arg)}catch(ex){if(ex!="unwind"){throw ex}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="checkMailbox"){if(initializedJS){Module["checkMailbox"]()}}else if(e.data.cmd){err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){if(Module["__emscripten_thread_crashed"]){Module["__emscripten_thread_crashed"]()}throw ex}}self.onmessage=handleMessage;
|
||||
881
web/public/codebase/jsPlugin/timeBar.js
Normal file
881
web/public/codebase/jsPlugin/timeBar.js
Normal file
@@ -0,0 +1,881 @@
|
||||
/* eslint-disable no-cond-assign */
|
||||
var bindAsEventListener = function (object, fun) {
|
||||
var args = Array.prototype.slice.call(arguments).slice(2);
|
||||
return function (event) {
|
||||
return fun.apply(object, [event || window.event].concat(args));
|
||||
};
|
||||
};
|
||||
/*
|
||||
Function: bind
|
||||
Description: 绑定对象到函数
|
||||
Input: object 对象, fun 函数
|
||||
Output: 无
|
||||
return: 关联后的函数
|
||||
*************************************************/
|
||||
var bind = function (object, fun) {
|
||||
return function () {
|
||||
return fun.apply(object, arguments);
|
||||
};
|
||||
};
|
||||
/*
|
||||
Function: addEventHandler
|
||||
Description: 添加事件
|
||||
Input: oTarget 目标对象, sEventType 事件, fnHandler 函数
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
var addEventHandler = function (oTarget, sEventType, fnHandler) {
|
||||
oTarget["on" + sEventType] = fnHandler;
|
||||
};
|
||||
|
||||
var removeEventHandler = function (oTarget, sEventType) {
|
||||
oTarget["on" + sEventType] = null;
|
||||
};
|
||||
|
||||
/*
|
||||
Function: getObjLeft
|
||||
Description: 获取对象相对网页的左上角坐标
|
||||
Input: obj 对象
|
||||
Output: 无
|
||||
return: 坐标
|
||||
*************************************************/
|
||||
function getObjLeft(obj) {
|
||||
var x = obj.offsetLeft;
|
||||
while (obj = obj.offsetParent) {
|
||||
x += obj.offsetLeft;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
/*
|
||||
Function: getObjTop
|
||||
Description: 获取对象相对网页的左上角坐标
|
||||
Input: obj 对象
|
||||
Output: 无
|
||||
return: 坐标
|
||||
*************************************************/
|
||||
function getObjTop(obj) {
|
||||
var y = obj.offsetTop;
|
||||
while (obj = obj.offsetParent) {
|
||||
y += obj.offsetTop;
|
||||
}
|
||||
return y;
|
||||
}
|
||||
/*
|
||||
* Class ScaleInfo
|
||||
* @version v1.0
|
||||
* @function 工具类,时间刻度信息
|
||||
*************************************************/
|
||||
function ScaleInfo(x, y, iSeconds) {
|
||||
this.m_ix = x;
|
||||
this.m_iy = y;
|
||||
this.m_ixMin = 0;
|
||||
this.m_ixMax = 0;
|
||||
this.m_iHour = parseInt(iSeconds / 3600, 10);
|
||||
this.m_iMinute = parseInt(iSeconds % 3600 / 60, 10);
|
||||
this.m_iSecond = parseInt(iSeconds % 3600 % 60, 10);
|
||||
this.m_szTime = "";
|
||||
if (this.m_iHour < 10 && this.m_iMinute < 10) {
|
||||
this.m_szTime = "0" + this.m_iHour + ":0" + this.m_iMinute;
|
||||
} else if (this.m_iHour < 10 && this.m_iMinute >= 10) {
|
||||
this.m_szTime = "0" + this.m_iHour + ":" + this.m_iMinute;
|
||||
} else if (this.m_iHour >= 10 && this.m_iMinute >= 10) {
|
||||
this.m_szTime = "" + this.m_iHour + ":" + this.m_iMinute;
|
||||
} else {
|
||||
this.m_szTime = "" + this.m_iHour + ":0" + this.m_iMinute;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Function: setPos
|
||||
Description: 设置刻度的位置
|
||||
Input: x 横坐标, y 纵坐标
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
ScaleInfo.prototype.setPos = function (x, y) {
|
||||
// this.x = x;
|
||||
if (x < this.m_ixMin) {
|
||||
x = this.m_ixMax - (this.m_ixMin - x);
|
||||
} else if (x > this.m_ixMax) {
|
||||
x = this.m_ixMin + (x - this.m_ixMax);
|
||||
}
|
||||
this.m_ix = x;
|
||||
this.m_iy = y;
|
||||
};
|
||||
/*
|
||||
Function: setPosRange
|
||||
Description: 设置刻度显示的范围
|
||||
Input: ixMin 最小横坐标, ixMax 最大横坐标
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
ScaleInfo.prototype.setPosRange = function (ixMin, ixMax) {
|
||||
this.m_ixMin = ixMin;
|
||||
this.m_ixMax = ixMax;
|
||||
};
|
||||
/*
|
||||
Function: isInRange
|
||||
Description: 是否在范围内
|
||||
Input: ixMin 最小横坐标, ixMax 最大横坐标
|
||||
Output: 无
|
||||
return: bool
|
||||
*************************************************/
|
||||
ScaleInfo.prototype.isInRange = function (iMin, iMax) {
|
||||
if (this.m_ix >= iMin && this.m_ix <= iMax) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
/*
|
||||
Function: update
|
||||
Description: 更新刻度时间
|
||||
Input: iSeconds
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
ScaleInfo.prototype.update = function (iSeconds) {
|
||||
this.m_iHour = parseInt(iSeconds / 3600, 10);
|
||||
this.m_iMinute = parseInt(iSeconds % 3600 / 60, 10);
|
||||
this.m_iSecond = parseInt(iSeconds % 3600 % 60, 10);
|
||||
if (this.m_iHour < 10 && this.m_iMinute < 10) {
|
||||
this.m_szTime = "0" + this.m_iHour + ":0" + this.m_iMinute;
|
||||
} else if (this.m_iHour < 10 && this.m_iMinute >= 10) {
|
||||
this.m_szTime = "0" + this.m_iHour + ":" + this.m_iMinute;
|
||||
} else if (this.m_iHour >= 10 && this.m_iMinute >= 10) {
|
||||
this.m_szTime = "" + this.m_iHour + ":" + this.m_iMinute;
|
||||
} else {
|
||||
this.m_szTime = "" + this.m_iHour + ":0" + this.m_iMinute;
|
||||
}
|
||||
};
|
||||
/*
|
||||
* Class Time
|
||||
* @version v1.0
|
||||
* @function 工具类,时间相关信息
|
||||
*************************************************/
|
||||
function Time() {
|
||||
var tCurrentTime = new Date();
|
||||
this.m_iYear = tCurrentTime.getFullYear();
|
||||
this.m_iMonth = tCurrentTime.getMonth() + 1;
|
||||
this.m_iDay = tCurrentTime.getDate();
|
||||
this.m_iHour = tCurrentTime.getHours();
|
||||
this.m_iMinute = tCurrentTime.getMinutes();
|
||||
this.m_iSecond = tCurrentTime.getSeconds();
|
||||
this.m_iMilliseconds = tCurrentTime.getTime();//返回 1970 年 1 月 1 日至今的毫秒数
|
||||
}
|
||||
|
||||
/*
|
||||
Function: setTimeByMis
|
||||
Description: 设置时间
|
||||
Input: iMilliseconds: 1970 年 1 月 1 日至今的毫秒数
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
Time.prototype.setTimeByMis = function (iMilliseconds) {
|
||||
var tSetTime = new Date(iMilliseconds);
|
||||
this.m_iYear = tSetTime.getFullYear();
|
||||
this.m_iMonth = tSetTime.getMonth() + 1;
|
||||
this.m_iDay = tSetTime.getDate();
|
||||
this.m_iHour = tSetTime.getHours();
|
||||
this.m_iMinute = tSetTime.getMinutes();
|
||||
this.m_iSecond = tSetTime.getSeconds();
|
||||
this.m_iMilliseconds = iMilliseconds;
|
||||
};
|
||||
/*
|
||||
Function: getStringTime
|
||||
Description: 获取时间字符串
|
||||
Input: 无
|
||||
Output: 无
|
||||
return: string yyyy-MM-dd HH:mm:ss
|
||||
*************************************************/
|
||||
Time.prototype.getStringTime = function () {
|
||||
var szYear = "" + this.m_iYear;
|
||||
|
||||
var szMonth;
|
||||
if (this.m_iMonth < 10) {
|
||||
szMonth = "0" + this.m_iMonth;
|
||||
} else {
|
||||
szMonth = "" + this.m_iMonth;
|
||||
}
|
||||
|
||||
var szDay;
|
||||
if (this.m_iDay < 10) {
|
||||
szDay = "0" + this.m_iDay;
|
||||
} else {
|
||||
szDay = "" + this.m_iDay;
|
||||
}
|
||||
|
||||
var szHour;
|
||||
if (this.m_iHour < 10) {
|
||||
szHour = "0" + this.m_iHour;
|
||||
} else {
|
||||
szHour = "" + this.m_iHour;
|
||||
}
|
||||
|
||||
var szMinute;
|
||||
if (this.m_iMinute < 10) {
|
||||
szMinute = "0" + this.m_iMinute;
|
||||
} else {
|
||||
szMinute = "" + this.m_iMinute;
|
||||
}
|
||||
|
||||
var szSecond;
|
||||
if (this.m_iSecond < 10) {
|
||||
szSecond = "0" + this.m_iSecond;
|
||||
} else {
|
||||
szSecond = "" + this.m_iSecond;
|
||||
}
|
||||
var szCurrentTime = szYear + "-" + szMonth + "-" + szDay + " " + szHour + ":" + szMinute + ":" + szSecond;
|
||||
return szCurrentTime;
|
||||
};
|
||||
/*
|
||||
Function: parseTime
|
||||
Description: 通过时间字符串设置时间
|
||||
Input: szTime 时间 yyyy-MM-dd HH:mm:ss
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
Time.prototype.parseTime = function (szTime) {
|
||||
var aDate = szTime.split(' ')[0].split('-');
|
||||
var aTime = szTime.split(' ')[1].split(':');
|
||||
|
||||
this.m_iYear = parseInt(aDate[0], 10);
|
||||
this.m_iMonth = parseInt(aDate[1], 10);
|
||||
this.m_iDay = parseInt(aDate[2], 10);
|
||||
|
||||
this.m_iHour = parseInt(aTime[0], 10);
|
||||
this.m_iMinute = parseInt(aTime[1], 10);
|
||||
this.m_iSecond = parseInt(aTime[2], 10);
|
||||
|
||||
var tTime = new Date();
|
||||
tTime.setFullYear(this.m_iYear);
|
||||
tTime.setMonth(this.m_iMonth - 1, this.m_iDay);
|
||||
|
||||
tTime.setHours(this.m_iHour);
|
||||
tTime.setMinutes(this.m_iMinute);
|
||||
tTime.setSeconds(this.m_iSecond);
|
||||
|
||||
this.m_iMilliseconds = tTime.getTime();
|
||||
};
|
||||
/*
|
||||
* Class FileInfo
|
||||
* @version v1.0
|
||||
* @function 工具类,录像文件相关信息
|
||||
*************************************************/
|
||||
function FileInfo(iX, iY, iWidth, iHeight, iType, cColor, tStartTime, tStopTime) {
|
||||
this.m_iX = iX;
|
||||
this.m_ixMin = 0;
|
||||
this.m_ixMax = 0;
|
||||
this.m_iY = iY;
|
||||
this.m_iWidth = iWidth;
|
||||
this.m_iHeight = iHeight;
|
||||
this.m_cColor = cColor;
|
||||
this.m_iType = iType;
|
||||
this.m_tStartTime = tStartTime;
|
||||
this.m_tStopTime = tStopTime;
|
||||
}
|
||||
|
||||
/*
|
||||
Function: isInRange
|
||||
Description: 是否在范围之内
|
||||
Input: left 左起始点 right 右终点
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
FileInfo.prototype.isInRange = function (left, right) {
|
||||
if ((this.m_iX + this.m_iWidth) <= left || this.m_iX >= right) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
/*
|
||||
Function: setPos
|
||||
Description: 设置位置内
|
||||
Input: iX iY左起始点坐标 iWidth 宽度 iHeight高度
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
FileInfo.prototype.setPos = function (iX, iY, iWidth, iHeight) {
|
||||
this.m_iX = iX;
|
||||
this.m_iWidth = iWidth;
|
||||
this.m_iY = iY;
|
||||
this.m_iHeight = iHeight;
|
||||
};
|
||||
/*
|
||||
Function: setPosRange
|
||||
Description: 设置范围
|
||||
Input: ixMin, ixMax
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
FileInfo.prototype.setPosRange = function (ixMin, ixMax) {
|
||||
this.m_ixMin = ixMin;
|
||||
this.m_ixMax = ixMax;
|
||||
};
|
||||
/*
|
||||
Function: draw
|
||||
Description: 画文件信息
|
||||
Input: g 设备资源
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
FileInfo.prototype.draw = function (g) {
|
||||
if (this.isInRange(this.m_ixMin, this.m_ixMax)) {
|
||||
var colorOld = g.fillStyle;
|
||||
g.fillStyle = this.m_cColor;
|
||||
if ((this.m_iX >= this.m_ixMin) && (this.m_iX + this.m_iWidth) <= this.m_ixMax) {
|
||||
g.fillRect(this.m_iX, this.m_iY, this.m_iWidth, this.m_iHeight);
|
||||
} else if ((this.m_iX < this.m_ixMax) && ((this.m_iX + this.m_iWidth) > this.m_ixMax)) {
|
||||
g.fillRect(this.m_iX, this.m_iY, this.m_ixMax - this.m_iX, this.m_iHeight);
|
||||
} else {
|
||||
g.fillRect(this.m_ixMin, this.m_iY, (this.m_iX + this.m_iWidth) - this.m_ixMin, this.m_iHeight);
|
||||
}
|
||||
g.fillStyle = colorOld;
|
||||
}
|
||||
};
|
||||
/*
|
||||
* Class TimeBar
|
||||
* @version v1.0
|
||||
* @function 工具类,时间条
|
||||
*************************************************/
|
||||
function TimeBar(canvas, iWidth, iHeight, options) {
|
||||
canvas.width = iWidth || 300;
|
||||
canvas.height = iHeight || 50;
|
||||
|
||||
this.m_canvas = canvas;
|
||||
this.m_ctx = canvas.getContext("2d");
|
||||
|
||||
this.m_iMinFileWidth = 1; //文件的最小宽度
|
||||
|
||||
let backgroundColor = 'rgb(0, 0, 0)'; //时间条背景颜色
|
||||
let partLineColor = 'rgb(0,0,0)'; //分割线颜色
|
||||
let timeScaleColor = 'rgb(150, 250, 150)'; //时间条刻度颜色
|
||||
let middleLineColor = 'rgb(0, 250, 0)'; //中轴线颜色
|
||||
let middleLineTimeColor = 'rgb(0, 250, 0)'; //中轴时间颜色
|
||||
|
||||
if (options) {
|
||||
if (options.backgroundColor) {
|
||||
backgroundColor = options.backgroundColor;
|
||||
}
|
||||
if (options.partLineColor) {
|
||||
partLineColor = options.partLineColor;
|
||||
}
|
||||
if (options.timeScaleColor) {
|
||||
timeScaleColor = options.timeScaleColor;
|
||||
}
|
||||
if (options.middleLineColor) {
|
||||
middleLineColor = options.middleLineColor;
|
||||
}
|
||||
if (options.middleLineTimeColor) {
|
||||
middleLineTimeColor = options.middleLineTimeColor;
|
||||
}
|
||||
}
|
||||
|
||||
this.backgroundColor = backgroundColor; //时间条背景颜色
|
||||
this.partLineColor = partLineColor; //分割线颜色
|
||||
this.channelNameColor = 'rgb(150, 150, 150)'; //通道名称颜色
|
||||
this.timeScaleColor = timeScaleColor; //时间条刻度颜色
|
||||
this.middleLineColor = middleLineColor; //中轴线颜色
|
||||
this.middleLineTimeColor = middleLineTimeColor; //中轴时间颜色
|
||||
|
||||
this.defaultFileColor = 'rgb(0, 255, 0)'; //默认录像类型颜色
|
||||
this.cmdFileColor = 'rgb(21, 184, 155)'; //命令触发录像颜色
|
||||
this.scheFileColor = 'rgb(33, 150, 243)'; //录像计划颜色
|
||||
this.alarmFileColor = 'rgb(255, 104, 66)'; //警告录像颜色
|
||||
this.manualFileColor = 'rgb(247, 199, 5)'; //手动录像颜色
|
||||
this.anrFileColor = 'rgb(138, 146, 153)'; //回传录像颜色
|
||||
|
||||
this.m_fMidTimeFont = '14px Verdana'; //中线时间字体及大小
|
||||
this.m_fCurTimeFont = 'bold 12px Arial'; //鼠标当前时间字体及大小
|
||||
this.m_fScaleFont = 'bold 10px Arial'; //刻度字体及大小 sans-serif
|
||||
this.m_fChannelNameFont = '14px Verdana'; //通道名称字体
|
||||
|
||||
canvas.style.backgroundColor = this.backgroundColor;
|
||||
|
||||
this.m_szCurChannelName = ''; //当前通道名称
|
||||
this.m_fCellTime = parseFloat(2.0); //每个代表几个小时
|
||||
this.ScaleInfo = [];
|
||||
this.ScaleInfoNum = parseInt(24 / this.m_fCellTime, 10); //总的刻度数量
|
||||
this.ScaleInfoDisNum = 12; //显示的刻度数量
|
||||
|
||||
//初始化刻度
|
||||
for (var i = 0; i < this.ScaleInfoNum; i++) {
|
||||
this.ScaleInfo.push(new ScaleInfo(0, 0, parseInt(i * 3600 * this.m_fCellTime, 10)));
|
||||
}
|
||||
this.m_iMaxWndNum = 16; //最大窗口数
|
||||
this.m_iSelWnd = 0; //选中的窗口号
|
||||
|
||||
this.FileInfoSet = new Array(this.m_iMaxWndNum); //文件信息集合
|
||||
//初始化文件信息集合
|
||||
for (i = 0; i < this.m_iMaxWndNum; i++) {
|
||||
this.FileInfoSet[i] = [];
|
||||
}
|
||||
this.m_iHeight = parseInt(canvas.height, 10);
|
||||
this.m_iWidth = parseInt(canvas.width, 10);
|
||||
this.m_iFileListStartPos = 0; // 文件列表起始位置
|
||||
this.m_iBlankHeight = 4; // 中间及底边空白高度
|
||||
this.m_iTimeRectHeight = 30; //parseInt(this.m_iHeight * 4 / 7) 时间块的高度
|
||||
this.m_iFileRectHeight = this.m_iHeight - this.m_iTimeRectHeight - this.m_iBlankHeight; //文件块的高度
|
||||
this.m_iMiddleLinePos = parseInt((this.m_iFileListStartPos + this.m_iWidth) / 2, 10); //中轴线的位置
|
||||
this.m_iCellWidth = Math.floor((this.m_iWidth - this.m_iFileListStartPos) / this.ScaleInfoDisNum); //每个像素的秒数
|
||||
this.m_iCellMilliseconds = parseInt((3600 * this.m_fCellTime * 1000) / this.m_iCellWidth, 10); //每个像素的毫秒数
|
||||
|
||||
this.m_tCurrentMidTime = new Time(); //当前中轴线的时间
|
||||
this.m_ctx.font = this.m_fMidTimeFont;
|
||||
this.m_iTextWidth = this.m_ctx.measureText(this.m_tCurrentMidTime.getStringTime()).width;
|
||||
|
||||
this.m_tMouseCurTime = new Time(); //当前鼠标点的时间
|
||||
this.m_ctx.font = this.m_fCurTimeFont;
|
||||
this.m_iCurTextWidth = this.m_ctx.measureText(this.m_tMouseCurTime.getStringTime()).width;
|
||||
|
||||
this.m_iCanvasLeft = getObjLeft(this.m_canvas);
|
||||
this.m_iCanvasTop = getObjTop(this.m_canvas);
|
||||
|
||||
//初始化时间刻度信息
|
||||
for (i = 0; i < this.ScaleInfoNum; i++) {
|
||||
// 计算与中轴线的时间差(只计算时分秒)
|
||||
var seconds = (this.ScaleInfo[i].m_iHour - this.m_tCurrentMidTime.m_iHour) * 3600 + (this.ScaleInfo[i].m_iMinute - this.m_tCurrentMidTime.m_iMinute) * 60 + (this.ScaleInfo[i].m_iSecond - this.m_tCurrentMidTime.m_iSecond);
|
||||
var iScalePos = this.m_iMiddleLinePos + parseInt(parseFloat(seconds / (3600 * this.m_fCellTime)) * this.m_iCellWidth, 10);
|
||||
// 设置刻度位置范围
|
||||
this.ScaleInfo[i].setPosRange(this.m_iFileListStartPos, this.m_iFileListStartPos + parseInt(this.m_iCellWidth * this.ScaleInfoNum, 10));
|
||||
this.ScaleInfo[i].setPos(iScalePos, this.m_iTimeRectHeight);
|
||||
}
|
||||
|
||||
//注册消息响应
|
||||
this.m_ieventX = 0;
|
||||
this.m_iMousePosX = 0;
|
||||
|
||||
this.m_bMouseDown = false;
|
||||
this.m_bMouseOver = false;
|
||||
this.m_iMove = 0;
|
||||
this.m_iMiddleLineTime = 0;
|
||||
this.Start = function (oEvent) {
|
||||
this.m_iMove = 0;
|
||||
this.m_ieventX = oEvent.clientX;
|
||||
this.m_iMiddleLineTime = this.m_tCurrentMidTime.m_iMilliseconds;
|
||||
this.m_bMouseDown = true;
|
||||
|
||||
this.mouseDownCallbackFunc();
|
||||
addEventHandler(document, 'mousemove', bindAsEventListener(this, this.Move));
|
||||
addEventHandler(document, 'mouseup', bind(this, this.Stop));
|
||||
addEventHandler(parent.document, 'mouseup', bind(this, this.Stop)); //解决鼠标在父页面释放时不能响应的问题
|
||||
//焦点丢失
|
||||
addEventHandler(window, "blur", bindAsEventListener(this, bindAsEventListener(this, this.Stop)));
|
||||
//阻止默认动作
|
||||
oEvent.preventDefault();
|
||||
|
||||
removeEventHandler(canvas, 'mousemove', bindAsEventListener(this, this.onMouseMove));
|
||||
};
|
||||
this.mouseDownCallbackFunc = function () {
|
||||
//
|
||||
};
|
||||
this.mouseUpCallbackFunc = function () {
|
||||
//
|
||||
};
|
||||
this.mouseMoveCallbackFunc = function () {
|
||||
//
|
||||
};
|
||||
this.Stop = function () {
|
||||
this.m_bMouseDown = false;
|
||||
if (this.m_iMove === 0) {
|
||||
this.m_tCurrentMidTime.setTimeByMis(this.m_tMouseCurTime.m_iMilliseconds);
|
||||
}
|
||||
this.mouseUpCallbackFunc();
|
||||
removeEventHandler(document, 'mousemove', bindAsEventListener(this, this.Move));
|
||||
removeEventHandler(document, 'mouseup', bindAsEventListener(this, this.Stop));
|
||||
removeEventHandler(window, "blur", bindAsEventListener(this, this.Stop));
|
||||
|
||||
addEventHandler(canvas, 'mousemove', bindAsEventListener(this, this.onMouseMove));
|
||||
};
|
||||
this.onMouseMoveIn = true;
|
||||
this.Move = function (oEvent) {
|
||||
this.m_iMove = oEvent.clientX - this.m_ieventX;
|
||||
if (this.m_bMouseDown) {
|
||||
//清除选择
|
||||
window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
|
||||
this.m_tCurrentMidTime.setTimeByMis(this.m_iMiddleLineTime - this.m_iMove * this.m_iCellMilliseconds);
|
||||
this.repaint();
|
||||
|
||||
this.mouseMoveCallbackFunc();
|
||||
}
|
||||
};
|
||||
this.onMouseMove = function (oEvent) {
|
||||
this.m_iMousePosX = oEvent.clientX - this.m_iCanvasLeft;
|
||||
this.m_tMouseCurTime.setTimeByMis((this.m_iMousePosX - this.m_iMiddleLinePos) * this.m_iCellMilliseconds + this.m_tCurrentMidTime.m_iMilliseconds);
|
||||
this.repaint();
|
||||
var szCurMouseTime = this.m_tMouseCurTime.getStringTime();
|
||||
this.m_ctx.fillStyle = this.middleLineTimeColor;
|
||||
this.m_ctx.font = this.m_fCurTimeFont;
|
||||
this.m_ctx.fillText(szCurMouseTime.split(' ')[1], this.m_iMousePosX/*(this.m_iMousePosX - parseInt(this.m_iCurTextWidth / 2))*/, 20/*parseInt(this.m_iTimeRectHeight / 4)*/);
|
||||
};
|
||||
|
||||
this.onMouseOut = function (/*oEvent*/) {
|
||||
this.repaint();
|
||||
};
|
||||
addEventHandler(canvas, 'mousedown', bindAsEventListener(this, this.Start));
|
||||
|
||||
addEventHandler(canvas, 'mousemove', bindAsEventListener(this, this.onMouseMove));
|
||||
addEventHandler(canvas, 'mouseout', bindAsEventListener(this, this.onMouseOut));
|
||||
|
||||
this.repaint();
|
||||
}
|
||||
|
||||
/*
|
||||
Function: repaint
|
||||
Description: 重绘
|
||||
Input: 无
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
TimeBar.prototype.repaint = function () {
|
||||
// var szCurrentTime = this.m_tCurrentMidTime.getStringTime();
|
||||
this.updateScalePos();
|
||||
this.updateFileListPos();
|
||||
|
||||
this.m_ctx.clearRect(0, 0, this.m_iWidth, this.m_iHeight);
|
||||
//画通道名称分割线
|
||||
this.m_ctx.strokeStyle = this.partLineColor;
|
||||
this.m_ctx.lineWidth = 1;
|
||||
this.m_ctx.beginPath();
|
||||
this.m_ctx.moveTo(this.m_iFileListStartPos, this.m_iTimeRectHeight);
|
||||
this.m_ctx.lineTo(this.m_iFileListStartPos, this.m_iHeight);
|
||||
this.m_ctx.stroke();
|
||||
|
||||
//画文件两条横轴和纵轴
|
||||
this.m_ctx.lineWidth = this.m_iBlankHeight;
|
||||
this.m_ctx.beginPath();
|
||||
this.m_ctx.moveTo(0, this.m_iTimeRectHeight);
|
||||
this.m_ctx.lineTo(this.m_iWidth, this.m_iTimeRectHeight);
|
||||
this.m_ctx.stroke();
|
||||
|
||||
this.m_ctx.beginPath();
|
||||
this.m_ctx.moveTo(0, this.m_iHeight - this.m_iBlankHeight / 2);
|
||||
this.m_ctx.lineTo(this.m_iWidth, this.m_iHeight - this.m_iBlankHeight / 2);
|
||||
this.m_ctx.stroke();
|
||||
|
||||
//显示通道名称
|
||||
this.m_ctx.fillStyle = this.channelNameColor;
|
||||
this.m_ctx.font = this.m_fChannelNameFont;
|
||||
this.m_ctx.fillText(this.m_szCurChannelName, 0, this.m_iTimeRectHeight + this.m_iBlankHeight + parseInt(this.m_iFileRectHeight / 2, 10) + 5, 90);
|
||||
|
||||
this.m_ctx.strokeStyle = this.timeScaleColor;
|
||||
this.m_ctx.font = this.m_fScaleFont;
|
||||
this.m_ctx.lineWidth = 1;
|
||||
//画时间刻度
|
||||
var i;
|
||||
for (i = 0; i < this.ScaleInfoNum; i++) {
|
||||
if (this.ScaleInfo[i].isInRange(this.m_iFileListStartPos, this.m_iWidth)) {
|
||||
this.m_ctx.beginPath();
|
||||
this.m_ctx.moveTo(this.ScaleInfo[i].m_ix, 2/*this.m_iTimeRectHeight*/);
|
||||
this.m_ctx.lineTo(this.ScaleInfo[i].m_ix, 10/*this.m_iHeight*/);
|
||||
this.m_ctx.stroke();
|
||||
this.m_ctx.fillText(this.ScaleInfo[i].m_szTime, this.ScaleInfo[i].m_ix + 2/*this.ScaleInfo[i].m_ix - 15*/, 12/*this.m_iTimeRectHeight - 5*/);
|
||||
}
|
||||
}
|
||||
|
||||
//画文件信息区域
|
||||
for (i = 0; i < this.FileInfoSet[this.m_iSelWnd].length; i++) {
|
||||
this.FileInfoSet[this.m_iSelWnd][i].draw(this.m_ctx);
|
||||
}
|
||||
|
||||
//画中轴线
|
||||
this.m_ctx.strokeStyle = this.middleLineColor;
|
||||
this.m_ctx.lineWidth = 2;
|
||||
this.m_ctx.beginPath();
|
||||
this.m_ctx.moveTo(this.m_iMiddleLinePos, 0);
|
||||
this.m_ctx.lineTo(this.m_iMiddleLinePos, this.m_iHeight);
|
||||
this.m_ctx.stroke();
|
||||
};
|
||||
|
||||
/*
|
||||
Function: updateScalePos
|
||||
Description: 更新刻度
|
||||
Input: 无
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
TimeBar.prototype.updateScalePos = function () {
|
||||
if (this.ScaleInfo.length === 0) {
|
||||
return;
|
||||
}
|
||||
// 以00:00移动的距离为准
|
||||
var seconds = (this.ScaleInfo[0].m_iHour - this.m_tCurrentMidTime.m_iHour) * 3600 + (this.ScaleInfo[0].m_iMinute - this.m_tCurrentMidTime.m_iMinute) * 60 + (this.ScaleInfo[0].m_iSecond - this.m_tCurrentMidTime.m_iSecond);
|
||||
var iPos0 = this.m_iMiddleLinePos + parseInt(parseFloat(seconds / (3600 * this.m_fCellTime)) * this.m_iCellWidth, 10);
|
||||
if (iPos0 < this.ScaleInfo[0].m_ixMin) {
|
||||
iPos0 = this.ScaleInfo[0].m_ixMax - (this.ScaleInfo[0].m_ixMin - iPos0);
|
||||
} else if (iPos0 > this.ScaleInfo[0].m_ixMax) {
|
||||
iPos0 = this.ScaleInfo[0].m_ixMin + (iPos0 - this.ScaleInfo[0].m_ixMax);
|
||||
}
|
||||
var iMoved = iPos0 - this.ScaleInfo[0].m_ix;
|
||||
//没有移动直接返回
|
||||
if (iMoved === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 更新所有的刻度
|
||||
for (var i = 0; i < this.ScaleInfoNum; i++) {
|
||||
var iScalePos = this.ScaleInfo[i].m_ix + iMoved;
|
||||
// 设置刻度位置范围
|
||||
this.ScaleInfo[i].setPosRange(this.m_iFileListStartPos, this.m_iFileListStartPos + parseInt(this.m_iCellWidth * this.ScaleInfoNum, 10));
|
||||
this.ScaleInfo[i].setPos(iScalePos, this.m_iTimeRectHeight);
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
Function: updateFileListPos
|
||||
Description: 更新文件
|
||||
Input: 无
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
TimeBar.prototype.updateFileListPos = function () {
|
||||
var iFileLength = this.FileInfoSet[this.m_iSelWnd].length;
|
||||
if (iFileLength === 0) {
|
||||
return;
|
||||
}
|
||||
var tStartTime = this.FileInfoSet[this.m_iSelWnd][0].m_tStartTime;
|
||||
var seconds = parseInt((tStartTime.m_iMilliseconds - this.m_tCurrentMidTime.m_iMilliseconds) / 1000, 10);
|
||||
var iFile0Pos = this.m_iMiddleLinePos + parseInt(parseFloat(seconds / (3600 * this.m_fCellTime)) * this.m_iCellWidth, 10);
|
||||
var iMoved = iFile0Pos - this.FileInfoSet[this.m_iSelWnd][0].m_iX;
|
||||
//没有移动直接返回
|
||||
if (iMoved === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 更新所有
|
||||
for (var i = 0; i < iFileLength; i++) {
|
||||
var iX = this.FileInfoSet[this.m_iSelWnd][i].m_iX + iMoved;
|
||||
var iY = this.FileInfoSet[this.m_iSelWnd][i].m_iY;
|
||||
var iWidth = this.FileInfoSet[this.m_iSelWnd][i].m_iWidth;
|
||||
var iHeight = this.FileInfoSet[this.m_iSelWnd][i].m_iHeight;
|
||||
this.FileInfoSet[this.m_iSelWnd][i].setPos(iX, iY, iWidth, iHeight);
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
Function: resize
|
||||
Description: 重置大小
|
||||
Input: iWidth宽度, iHeight高度
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
TimeBar.prototype.resize = function (iWidth, iHeight) {
|
||||
this.m_canvas.height = iHeight;
|
||||
this.m_canvas.width = iWidth;
|
||||
this.m_iHeight = iHeight;
|
||||
this.m_iWidth = iWidth;
|
||||
this.m_iTimeRectHeight = parseInt(this.m_iHeight * 4 / 7, 10);
|
||||
this.m_iFileRectHeight = this.m_iHeight - this.m_iTimeRectHeight - this.m_iBlankHeight;
|
||||
this.m_iMiddleLinePos = parseInt((this.m_iFileListStartPos + this.m_iWidth) / 2, 10);
|
||||
this.m_iCellWidth = Math.floor((this.m_iWidth - this.m_iFileListStartPos) / this.ScaleInfoDisNum);
|
||||
this.m_iCellMilliseconds = parseInt((3600 * this.m_fCellTime * 1000) / this.m_iCellWidth, 10);
|
||||
|
||||
//初始化时间刻度信息
|
||||
var i;
|
||||
for (i = 0; i < this.ScaleInfoNum; i++) {
|
||||
// 计算与中轴线的时间差(只计算时分秒)
|
||||
var seconds = (this.ScaleInfo[i].m_iHour - this.m_tCurrentMidTime.m_iHour) * 3600 + (this.ScaleInfo[i].m_iMinute - this.m_tCurrentMidTime.m_iMinute) * 60 + (this.ScaleInfo[i].m_iSecond - this.m_tCurrentMidTime.m_iSecond);
|
||||
var iScalePos = this.m_iMiddleLinePos + parseInt(parseFloat(seconds / (3600 * this.m_fCellTime)) * this.m_iCellWidth, 10);
|
||||
// 设置刻度位置范围
|
||||
this.ScaleInfo[i].setPosRange(this.m_iFileListStartPos, this.m_iFileListStartPos + parseInt(this.m_iCellWidth * this.ScaleInfoNum, 10));
|
||||
this.ScaleInfo[i].setPos(iScalePos, this.m_iTimeRectHeight);
|
||||
}
|
||||
|
||||
//初始化文件列表信息
|
||||
for (i = 0; i < this.FileInfoSet[this.m_iSelWnd].length; i++) {
|
||||
var FileInfoSetSel = this.FileInfoSet[this.m_iSelWnd][i];
|
||||
var iXLeftSeconds = parseInt((FileInfoSetSel.m_tStartTime.m_iMilliseconds - this.m_tCurrentMidTime.m_iMilliseconds) / 1000, 10);
|
||||
var iFilePosLeft = this.m_iMiddleLinePos + parseInt(parseFloat(iXLeftSeconds / (3600 * this.m_fCellTime)) * this.m_iCellWidth, 10);
|
||||
|
||||
var iXRightSeconds = parseInt((FileInfoSetSel.m_tStopTime.m_iMilliseconds - this.m_tCurrentMidTime.m_iMilliseconds) / 1000, 10);
|
||||
|
||||
var iFilePosRight = this.m_iMiddleLinePos + parseInt(parseFloat(iXRightSeconds / (3600 * this.m_fCellTime)) * this.m_iCellWidth, 10);
|
||||
if ((iFilePosRight - iFilePosLeft) < this.m_iMinFileWidth) {
|
||||
iFilePosRight = iFilePosLeft + this.m_iMinFileWidth;
|
||||
}
|
||||
|
||||
FileInfoSetSel.setPos(iFilePosLeft, this.m_iTimeRectHeight + parseInt(this.m_iBlankHeight / 2, 10), iFilePosRight - iFilePosLeft, this.m_iFileRectHeight + 2);
|
||||
}
|
||||
|
||||
this.repaint();
|
||||
};
|
||||
|
||||
/*
|
||||
Function: setSpanType
|
||||
Description: 设置时间条的显示样式
|
||||
Input: 无
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
TimeBar.prototype.setSpanType = function (iSpanType) {
|
||||
switch (iSpanType) {
|
||||
case 6://每2小时一格
|
||||
this.ScaleInfoDisNum = 12;
|
||||
this.m_fCellTime = parseFloat(2.0);
|
||||
break;
|
||||
case 7://每小时一格
|
||||
this.ScaleInfoDisNum = 12;
|
||||
this.m_fCellTime = parseFloat(1.0);
|
||||
break;
|
||||
case 8://每半小时一格
|
||||
this.ScaleInfoDisNum = 12;
|
||||
this.m_fCellTime = parseFloat(0.5);
|
||||
break;
|
||||
case 9://每10分钟一格
|
||||
this.ScaleInfoDisNum = 12;
|
||||
this.m_fCellTime = parseFloat(1 / 6);
|
||||
break;
|
||||
case 10://每5分钟一格
|
||||
this.ScaleInfoDisNum = 12;
|
||||
this.m_fCellTime = parseFloat(1 / 12);
|
||||
break;
|
||||
case 11://每1分钟一格
|
||||
this.ScaleInfoDisNum = 12;
|
||||
this.m_fCellTime = parseFloat(1 / 60);
|
||||
break;
|
||||
default:
|
||||
this.ScaleInfoDisNum = 12;
|
||||
this.m_fCellTime = parseFloat(2.0);
|
||||
return;
|
||||
}
|
||||
this.ScaleInfoNum = parseInt(24 / this.m_fCellTime, 10);
|
||||
this.m_iCellWidth = Math.floor((this.m_iWidth - this.m_iFileListStartPos) / this.ScaleInfoDisNum);
|
||||
this.m_iCellMilliseconds = parseInt((3600 * this.m_fCellTime * 1000) / this.m_iCellWidth, 10);
|
||||
|
||||
//初始化刻度
|
||||
this.ScaleInfo.length = 0;
|
||||
for (var i = 0; i < this.ScaleInfoNum; i++) {
|
||||
this.ScaleInfo.push(new ScaleInfo(0, 0, parseInt(i * 3600 * this.m_fCellTime, 10)));
|
||||
}
|
||||
|
||||
//初始化时间刻度信息
|
||||
for (i = 0; i < this.ScaleInfoNum; i++) {
|
||||
// 计算与中轴线的时间差(只计算时分秒)
|
||||
var seconds = (this.ScaleInfo[i].m_iHour - this.m_tCurrentMidTime.m_iHour) * 3600 + (this.ScaleInfo[i].m_iMinute - this.m_tCurrentMidTime.m_iMinute) * 60 + (this.ScaleInfo[i].m_iSecond - this.m_tCurrentMidTime.m_iSecond);
|
||||
var iScalePos = this.m_iMiddleLinePos + parseInt(parseFloat(seconds / (3600 * this.m_fCellTime)) * this.m_iCellWidth, 10);
|
||||
// 设置刻度位置范围
|
||||
this.ScaleInfo[i].setPosRange(this.m_iFileListStartPos, this.m_iFileListStartPos + parseInt(this.m_iCellWidth * this.ScaleInfoNum, 10));
|
||||
this.ScaleInfo[i].setPos(iScalePos, this.m_iTimeRectHeight);
|
||||
}
|
||||
|
||||
//初始化文件列表信息
|
||||
for (i = 0; i < this.FileInfoSet[this.m_iSelWnd].length; i++) {
|
||||
var FileInfoSetSel = this.FileInfoSet[this.m_iSelWnd][i];
|
||||
var iXLeftSeconds = parseInt((FileInfoSetSel.m_tStartTime.m_iMilliseconds - this.m_tCurrentMidTime.m_iMilliseconds) / 1000, 10);
|
||||
var iFilePosLeft = this.m_iMiddleLinePos + parseInt(parseFloat(iXLeftSeconds / (3600 * this.m_fCellTime)) * this.m_iCellWidth, 10);
|
||||
|
||||
var iXRightSeconds = parseInt((FileInfoSetSel.m_tStopTime.m_iMilliseconds - this.m_tCurrentMidTime.m_iMilliseconds) / 1000, 10);
|
||||
|
||||
var iFilePosRight = this.m_iMiddleLinePos + parseInt(parseFloat(iXRightSeconds / (3600 * this.m_fCellTime)) * this.m_iCellWidth, 10);
|
||||
if ((iFilePosRight - iFilePosLeft) < this.m_iMinFileWidth) {
|
||||
iFilePosRight = iFilePosLeft + this.m_iMinFileWidth;
|
||||
}
|
||||
FileInfoSetSel.setPos(iFilePosLeft, this.m_iTimeRectHeight + parseInt(this.m_iBlankHeight / 2, 10), iFilePosRight - iFilePosLeft, this.m_iFileRectHeight + 2);
|
||||
}
|
||||
|
||||
this.repaint();
|
||||
};
|
||||
/*
|
||||
Function: addFile
|
||||
Description: 添加文件
|
||||
Input: StartTime 开始时间, StopTime 结束时间, iType 类型, iWndNum 默认当前窗口 添加到某个窗口
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
TimeBar.prototype.addFile = function (StartTime, StopTime, iType/*, iWndNum*/) {
|
||||
var tStartTime = new Time();
|
||||
var tStopTime = new Time();
|
||||
tStartTime.parseTime(StartTime);
|
||||
tStopTime.parseTime(StopTime);
|
||||
var fileColor;
|
||||
switch (iType) {
|
||||
case 1:
|
||||
fileColor = this.scheFileColor;
|
||||
break;
|
||||
case 2:
|
||||
fileColor = this.alarmFileColor;
|
||||
break;
|
||||
case 3:
|
||||
fileColor = this.cmdFileColor;
|
||||
break;
|
||||
case 4:
|
||||
fileColor = this.manualFileColor;
|
||||
break;
|
||||
case 5:
|
||||
fileColor = this.anrFileColor;
|
||||
break;
|
||||
default:
|
||||
fileColor = this.defaultFileColor;
|
||||
break;
|
||||
}
|
||||
var iXLeftSeconds = parseInt((tStartTime.m_iMilliseconds - this.m_tCurrentMidTime.m_iMilliseconds) / 1000, 10);
|
||||
var iFilePosLeft = this.m_iMiddleLinePos + parseInt(parseFloat(iXLeftSeconds / (3600 * this.m_fCellTime)) * this.m_iCellWidth, 10);
|
||||
|
||||
var iXRightSeconds = parseInt((tStopTime.m_iMilliseconds - this.m_tCurrentMidTime.m_iMilliseconds) / 1000, 10);
|
||||
|
||||
var iFilePosRight = this.m_iMiddleLinePos + parseInt(parseFloat(iXRightSeconds / (3600 * this.m_fCellTime)) * this.m_iCellWidth, 10);
|
||||
|
||||
var fileInfo = new FileInfo(iFilePosLeft, this.m_iTimeRectHeight + parseInt(this.m_iBlankHeight / 2, 10), iFilePosRight - iFilePosLeft, this.m_iFileRectHeight + 2, iType, fileColor, tStartTime, tStopTime);
|
||||
fileInfo.setPosRange(this.m_iFileListStartPos, this.m_iFileListStartPos + parseInt(this.m_iCellWidth * this.ScaleInfoNum, 10));
|
||||
if (arguments.length >= 4) {
|
||||
this.FileInfoSet[arguments[3]].push(fileInfo);
|
||||
} else {
|
||||
this.FileInfoSet[this.m_iSelWnd].push(fileInfo);
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
Function: clearWndFileList
|
||||
Description: 清空某个窗口的文件信息
|
||||
Input: iWndNum 窗口号 0-15 默认当前选中窗口
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
TimeBar.prototype.clearWndFileList = function ()/*iWndNum*/ {
|
||||
var iWndParam;
|
||||
if (arguments.length === 0) {
|
||||
iWndParam = this.m_iSelWnd;
|
||||
} else {
|
||||
iWndParam = arguments[0];
|
||||
}
|
||||
if (iWndParam < 0) {
|
||||
iWndParam = 0;
|
||||
}
|
||||
if (iWndParam >= 16) {
|
||||
iWndParam = 15;
|
||||
}
|
||||
this.FileInfoSet[iWndParam].length = 0;
|
||||
};
|
||||
|
||||
/*
|
||||
Function: setMidLineTime
|
||||
Description: 设置中轴线时间
|
||||
Input: szTime yyyy-MM-dd HH:mm:ss
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
TimeBar.prototype.setMidLineTime = function (szTime) {
|
||||
var tCurTime = new Time();
|
||||
tCurTime.parseTime(szTime);
|
||||
this.m_tCurrentMidTime.setTimeByMis(tCurTime.m_iMilliseconds);
|
||||
this.repaint();
|
||||
};
|
||||
|
||||
TimeBar.prototype.setMouseDownCallback = function (callbackFunc) {
|
||||
this.mouseDownCallbackFunc = callbackFunc;
|
||||
};
|
||||
/*
|
||||
Function: setMouseUpCallback
|
||||
Description: 设置鼠标弹起回调函数
|
||||
Input: func 回调函数 function(tStartTime, tStopTime)
|
||||
Output: 无
|
||||
return: 无
|
||||
*************************************************/
|
||||
TimeBar.prototype.setMouseUpCallback = function (callbackFunc) {
|
||||
this.mouseUpCallbackFunc = callbackFunc;
|
||||
};
|
||||
|
||||
TimeBar.prototype.setMouseMoveCallback = function (callbackFunc) {
|
||||
this.mouseMoveCallbackFunc = callbackFunc;
|
||||
};
|
||||
|
||||
6630
web/public/codebase/jsPlugin/transform/libSystemTransform.js
Normal file
6630
web/public/codebase/jsPlugin/transform/libSystemTransform.js
Normal file
File diff suppressed because it is too large
Load Diff
BIN
web/public/codebase/jsPlugin/transform/libSystemTransform.wasm
Normal file
BIN
web/public/codebase/jsPlugin/transform/libSystemTransform.wasm
Normal file
Binary file not shown.
240
web/public/codebase/jsPlugin/transform/systemTransform-worker.js
Normal file
240
web/public/codebase/jsPlugin/transform/systemTransform-worker.js
Normal file
@@ -0,0 +1,240 @@
|
||||
importScripts('libSystemTransform.js');
|
||||
const RECORDRTP = 0; //录制一份未经过转封装的码流原始数据,用于定位问题
|
||||
let dataType = 1;
|
||||
|
||||
// 字母字符串转byte数组
|
||||
function stringToBytes (str) {
|
||||
var ch;
|
||||
var st;
|
||||
var re = [];
|
||||
for (var i = 0; i < str.length; i++) {
|
||||
ch = str.charCodeAt(i); // get char
|
||||
st = []; // set up "stack"
|
||||
do {
|
||||
st.push(ch & 0xFF); // push byte to stack
|
||||
ch = ch >> 8; // shift value down by 1 byte
|
||||
}
|
||||
while (ch);
|
||||
// add stack contents to result
|
||||
// done because chars have "wrong" endianness
|
||||
re = re.concat(st.reverse());
|
||||
}
|
||||
// return an array of bytes
|
||||
return re;
|
||||
}
|
||||
|
||||
// 转封装库回调函数
|
||||
self.STCallBack = function (fileIndex, indexLen, data, dataLen) {
|
||||
//stFrameInfo的类型见DETAIL_FRAME_INFO
|
||||
let stFrameInfo = Module._GetDetialFrameInfo();
|
||||
let nIsMp4Index = stFrameInfo.nIsMp4Index;
|
||||
|
||||
//console.log("FrameType is " , stFrameInfo);
|
||||
//console.log("nIsMp4Index is " + nIsMp4Index);
|
||||
//debugger
|
||||
var pData = null;
|
||||
pData = new Uint8Array(dataLen);
|
||||
pData.set(Module.HEAPU8.subarray(data, data + dataLen));
|
||||
if (dataType === 1) {
|
||||
postMessage({ type: "outputData",
|
||||
buf: pData.buffer,
|
||||
dType: 1,
|
||||
frameInfo: stFrameInfo }, [pData.buffer]);
|
||||
dataType = 2;
|
||||
} else {
|
||||
if (nIsMp4Index) {
|
||||
postMessage({ type: "outputData",
|
||||
buf: pData.buffer,
|
||||
dType: 6,
|
||||
frameInfo: stFrameInfo }, [pData.buffer]); //6:索引类型
|
||||
} else {
|
||||
postMessage({ type: "outputData",
|
||||
buf: pData.buffer,
|
||||
dType: 2,
|
||||
frameInfo: stFrameInfo }, [pData.buffer]); //2:码流
|
||||
}
|
||||
}
|
||||
|
||||
//stFrameInfo的类型见DETAIL_FRAME_INFO
|
||||
//let stFrameInfo = Module._GetDetialFrameInfo();
|
||||
//let stFrameType = stFrameInfo.nFrameType;
|
||||
//let nFrameNum = stFrameInfo.nFrameNum;
|
||||
//let nTimeStamp = stFrameInfo.nTimeStamp;
|
||||
//let nIsMp4Index = stFrameInfo.nIsMp4Index;
|
||||
|
||||
//console.log("FrameType is " + stFrameType);
|
||||
//console.log("nIsMp4Index is " + nIsMp4Index);
|
||||
};
|
||||
|
||||
// self.Module = { memoryInitializerRequest: loadMemInitFile(), TOTAL_MEMORY: 128*1024*1024 };
|
||||
// importScripts('SystemTransform.js');
|
||||
|
||||
self.Module['onRuntimeInitialized'] = function () {
|
||||
postMessage({type: "loaded"});
|
||||
};
|
||||
onmessage = function (e) {
|
||||
var data = e.data;
|
||||
if ("create" === data.type) {
|
||||
if (RECORDRTP) {
|
||||
postMessage({ type: "created" });
|
||||
postMessage({ type: "outputData",
|
||||
buf: data.buf,
|
||||
dType: 1 }, [data.buf]);
|
||||
} else {
|
||||
var iHeadLen = data.len;
|
||||
var pHead = Module._malloc(iHeadLen);
|
||||
if (pHead === null) {
|
||||
console.log("inputdata malloc failed!!!");
|
||||
return -1;
|
||||
}
|
||||
var iTransType = data.packType;//目标格式
|
||||
var iRet = 0;
|
||||
var buf = new Uint8Array(data.buf);
|
||||
//PS流(只有ps支持探测),并且编码格式异常(正常是265和264,11位和10位 不可能全是0,全0 并且是ps就探测策略)的情况下,使用探测策略
|
||||
if (buf[9] === 0 && buf[8] === 2 && buf[11] === 0 && buf[10] === 0) {
|
||||
iRet = Module._CreatHandle(0, iTransType, iHeadLen); //用探测的策略
|
||||
} else {
|
||||
self.writeArrayToMemory(buf, pHead);
|
||||
iRet = Module._CreatHandle(pHead, iTransType, iHeadLen);
|
||||
//-2147483645代表的是参数错误,此种情况,大概率发生在头信息错误,例如大华设备的情况,此时用 无头探测的策略
|
||||
//其他情况 按海康标准处理流程,不要做任何特殊处理
|
||||
if (iRet == -2147483645) {
|
||||
iRet = Module._CreatHandle(0, iTransType, iHeadLen); //失败了,用探测的策略再试一次
|
||||
}
|
||||
}
|
||||
if (iRet != 0) {
|
||||
if (iRet == -2147483647) {
|
||||
postMessage({ type: "outputData",
|
||||
dType: 1501 }); //标记为格式不支持
|
||||
} else {
|
||||
postMessage({ type: "outputData",
|
||||
dType: 1501 }); //转封装创建失败,也同样提示码流格式不支持,如果后续要细化再区分
|
||||
}
|
||||
console.log("_CreatHandle failed!" + iRet);
|
||||
} else {
|
||||
if (data.options && typeof data.options.pKeyData !== "undefined" && data.options.pKeyData !== null) {
|
||||
if ((2 === iTransType && "" === data.options.pKeyData)) {
|
||||
//转ps的时候,如果密码是空是允许的,即使码流加密了,导出加密后的码流就行
|
||||
//此时不要设置密码否则反而会提示密码错误
|
||||
} else {
|
||||
var secretInfo = data.options;
|
||||
var keyLen = secretInfo.nKeyLen;
|
||||
var pKeyData = Module._malloc(keyLen);
|
||||
if (pKeyData === null) {
|
||||
console.log("setEncryptKey malloc failed!!!");
|
||||
return -1;
|
||||
}
|
||||
var nKeySize = secretInfo.pKeyData.length;
|
||||
var bufData = stringToBytes(secretInfo.pKeyData);
|
||||
|
||||
let inputData = new Uint8Array(bufData);
|
||||
Module.writeArrayToMemory(inputData, pKeyData);
|
||||
inputData = null;
|
||||
|
||||
iRet = Module._SysTransSetEncryptKey(secretInfo.nKeyType, pKeyData, keyLen, nKeySize);
|
||||
if (iRet != 0) {
|
||||
console.log("_SysTransSetEncryptKey failed!");
|
||||
}
|
||||
if (pKeyData != null) {
|
||||
Module._free(pKeyData);
|
||||
pKeyData = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
//带samplingParam参数,代表需要 用到 音频替换功能
|
||||
if (data.options && typeof data.options.samplingParam !== "undefined") {
|
||||
var oParam = data.options.samplingParam;
|
||||
var nCapacityType = 1; //写死1 代表 剔除音频
|
||||
var nType = 3; //写死3 代表 修改输出目标的海康头配置,内部包含视频参数、音频参数
|
||||
var nAudioEnable = 1; //音频参数修改使能开关,0=不启用,1=启用
|
||||
var nAudioFormat = oParam.iAudioType; //音频编码类型 对应关系参考海康媒体头规范,PCM 0x7001 G711_U 0x7110 G711_A 0x7111 AAC 0x2001
|
||||
var nAudioChannels = oParam.iChannel; //音频通道数直接设置为
|
||||
var nAudioBitsPerSample = oParam.iAudioBitWidth; //音频位样率
|
||||
var nAudioSamplesrate = oParam.iAudioSamplingRate; //音频采样率
|
||||
var nAudioBitrate = oParam.iAudioBitRate; //音频比特率
|
||||
iRet = Module._SysTransConfig(nCapacityType, nType, nAudioEnable, nAudioFormat,
|
||||
nAudioChannels, nAudioBitsPerSample, nAudioSamplesrate, nAudioBitrate);
|
||||
if (iRet != 0) {
|
||||
console.log("_SysTransConfig Failed:" + iRet);
|
||||
}
|
||||
} else {
|
||||
iRet = Module._SysTransConfig(128, 0, 0, 0, 0, 0, 0, 0); //nCapacityType = 0x00000080 代表开启私有信息回调 解决转mp4后,私有信息丢失问题
|
||||
if (iRet != 0) {
|
||||
console.log("_SysTransConfig Failed:" + iRet);
|
||||
}
|
||||
}
|
||||
iRet = Module._SysTransRegisterDataCallBack();
|
||||
if (iRet != 0) {
|
||||
console.log("_SysTransRegisterDataCallBack Failed:" + iRet);
|
||||
}
|
||||
|
||||
iRet = Module._SysTransStart(null, null);
|
||||
if (iRet != 0) {
|
||||
console.log("_SysTransStart Failed:" + iRet);
|
||||
}
|
||||
postMessage({type: "created"});
|
||||
}
|
||||
if (pHead != null) {
|
||||
Module._free(pHead);
|
||||
pHead = null;
|
||||
}
|
||||
}
|
||||
} else if ("inputData" === data.type) {
|
||||
if (RECORDRTP) {
|
||||
var aFileData = new Uint8Array(data.buf); // 拷贝一份
|
||||
var iBufferLen = aFileData.length;
|
||||
var szBufferLen = iBufferLen.toString(16);
|
||||
if (szBufferLen.length === 1) {
|
||||
szBufferLen = "000" + szBufferLen;
|
||||
} else if (szBufferLen.length === 2) {
|
||||
szBufferLen = "00" + szBufferLen;
|
||||
} else if (szBufferLen.length === 3) {
|
||||
szBufferLen = "0" + szBufferLen;
|
||||
}
|
||||
var aData = [0, 0, parseInt(szBufferLen.substring(0, 2), 16), parseInt(szBufferLen.substring(2, 4), 16)];
|
||||
for (var iIndex = 0, iDataLength = aFileData.length; iIndex < iDataLength; iIndex++) {
|
||||
aData[iIndex + 4] = aFileData[iIndex];
|
||||
}
|
||||
var dataUint8 = new Uint8Array(aData);
|
||||
postMessage({type: "outputData",
|
||||
buf: dataUint8.buffer,
|
||||
dType: 2});
|
||||
} else {
|
||||
let inputMode = 0; //代表输入原始数据
|
||||
if (data.samplingParam) {
|
||||
iRet = Module._SysTransInputAudioPara(5, data.samplingParam.iChannel, data.samplingParam.iAudioBitWidth,
|
||||
data.samplingParam.iAudioSamplingRate, data.samplingParam.iTimeStamp, data.samplingParam.iAudioBitRate); //参数含义和_SysTransConfig类似
|
||||
if (iRet != 0) {
|
||||
console.log("_SysTransInputAudioPara Failed:" + iRet);
|
||||
}
|
||||
inputMode = 2; //输入替换的音频
|
||||
}
|
||||
var pInputDataBuf = Module._malloc(data.len);
|
||||
var idataLen = data.len;
|
||||
self.writeArrayToMemory(new Uint8Array(data.buf), pInputDataBuf);
|
||||
// 输入数据,每次最多2m
|
||||
let pp = Module._SysTransInputData(inputMode, pInputDataBuf, idataLen);
|
||||
if (pp == -2147483627) {
|
||||
//-2147483627 对应十六进制的80000015
|
||||
postMessage({ type: "outputData",
|
||||
dType: 1500 }); //标记为密码错误
|
||||
} else if (pp == -2147483647) {
|
||||
postMessage({ type: "outputData",
|
||||
dType: 1501 }); //标记为格式不支持
|
||||
} else if (pp != 0) {
|
||||
console.log("InputData Failed:" + pp);
|
||||
}
|
||||
Module._free(pInputDataBuf);
|
||||
}
|
||||
} else if ("release" === data.type) {
|
||||
var iRet = Module._SysTransStop();
|
||||
if (iRet != 0) {
|
||||
console.log("_SysTransStop failed!");
|
||||
}
|
||||
Module._SysTransRelease();
|
||||
if (iRet != 0) {
|
||||
console.log("_SysTransRelease failed!");
|
||||
}
|
||||
close();
|
||||
}
|
||||
};
|
||||
1
web/public/codebase/webVideoCtrl.js
Normal file
1
web/public/codebase/webVideoCtrl.js
Normal file
File diff suppressed because one or more lines are too long
@@ -753,7 +753,7 @@ export const deviceOptions = [
|
||||
label: '厂家',
|
||||
value: '',
|
||||
key: 'factory',
|
||||
type: 'input'
|
||||
type: 'textarea'
|
||||
},
|
||||
{
|
||||
label: '厂家电话',
|
||||
|
||||
@@ -6,7 +6,17 @@
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
|
||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
||||
<link rel="stylesheet" href="http://at.alicdn.com/t/c/font_5010233_6lxuclaoex9.css" />
|
||||
|
||||
|
||||
<script type="text/JavaScript" src="codebase/jsPlugin/jquery.min.js"></script>
|
||||
<script type="text/JavaScript" src="codebase/encryption/AES.js"></script>
|
||||
<script type="text/JavaScript" src="codebase/encryption/cryptico.min.js"></script>
|
||||
<script type="text/JavaScript" src="codebase/encryption/crypto-3.1.2.min.js"></script>
|
||||
<script type="text/JavaScript" src="codebase/webVideoCtrl.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 4945642 */
|
||||
src: url('iconfont.woff2?t=1756516508134') format('woff2'),
|
||||
url('iconfont.woff?t=1756516508134') format('woff'),
|
||||
url('iconfont.ttf?t=1756516508134') format('truetype'),
|
||||
url('iconfont.svg?t=1756516508134#iconfont') format('svg');
|
||||
font-family: "iconfont"; /* Project id 5010233 */
|
||||
src: url('iconfont.woff2?t=1757574994185') format('woff2'),
|
||||
url('iconfont.woff?t=1757574994185') format('woff'),
|
||||
url('iconfont.ttf?t=1757574994185') format('truetype');
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
@@ -14,455 +13,151 @@
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-full:before {
|
||||
content: "\e651";
|
||||
.icon-chunengguankong:before {
|
||||
content: "\e60c";
|
||||
}
|
||||
|
||||
.icon-exit:before {
|
||||
content: "\e652";
|
||||
.icon-bianyaqi1:before {
|
||||
content: "\e60b";
|
||||
}
|
||||
|
||||
.icon-a-qiyong:before {
|
||||
content: "\e64e";
|
||||
.icon-tuichu:before {
|
||||
content: "\e7ed";
|
||||
}
|
||||
|
||||
.icon-a-jinyong:before {
|
||||
content: "\e64f";
|
||||
.icon-bianyaqi:before {
|
||||
content: "\e62f";
|
||||
}
|
||||
|
||||
.icon-tuihuishenqing:before {
|
||||
content: "\e64d";
|
||||
.icon-jizhuangxiang:before {
|
||||
content: "\e60a";
|
||||
}
|
||||
|
||||
.icon-mti-loudianjiance:before {
|
||||
content: "\e64c";
|
||||
.icon-nengyuanguanli:before {
|
||||
content: "\e67d";
|
||||
}
|
||||
|
||||
.icon-guanbi:before {
|
||||
content: "\e64b";
|
||||
}
|
||||
|
||||
.icon-a-fenzu1411:before {
|
||||
content: "\e649";
|
||||
}
|
||||
|
||||
.icon-a-fenzu1409:before {
|
||||
content: "\e64a";
|
||||
}
|
||||
|
||||
.icon-xianlu:before {
|
||||
content: "\e647";
|
||||
}
|
||||
|
||||
.icon-jizhongqi:before {
|
||||
content: "\e648";
|
||||
}
|
||||
|
||||
.icon-a-lujing41:before {
|
||||
content: "\e646";
|
||||
}
|
||||
|
||||
.icon-a-lujing4:before {
|
||||
.icon-quexianguanli:before {
|
||||
content: "\e645";
|
||||
}
|
||||
|
||||
.icon-Electrocardiogram:before {
|
||||
content: "\e644";
|
||||
.icon-L-chunengdianchicu:before {
|
||||
content: "\e698";
|
||||
}
|
||||
|
||||
.icon-hezha:before {
|
||||
content: "\e642";
|
||||
.icon-jizhongqi:before {
|
||||
content: "\e607";
|
||||
}
|
||||
|
||||
.icon-bisuo:before {
|
||||
content: "\e643";
|
||||
.icon-chongdianqiang:before {
|
||||
content: "\e650";
|
||||
}
|
||||
|
||||
.icon-lixian:before {
|
||||
content: "\e63b";
|
||||
.icon-guangfuban:before {
|
||||
content: "\e609";
|
||||
}
|
||||
|
||||
.icon-dengpao:before {
|
||||
content: "\e63c";
|
||||
.icon-zhuangjirongliang:before {
|
||||
content: "\e683";
|
||||
}
|
||||
|
||||
.icon-daunlu:before {
|
||||
content: "\e63e";
|
||||
.icon-charging-pile-line:before {
|
||||
content: "\e83c";
|
||||
}
|
||||
|
||||
.icon-loudianjiance:before {
|
||||
content: "\e63f";
|
||||
.icon-dianbiao:before {
|
||||
content: "\ec4d";
|
||||
}
|
||||
|
||||
.icon-guozai:before {
|
||||
content: "\e641";
|
||||
.icon-shuijinchuanganqiicon:before {
|
||||
content: "\e605";
|
||||
}
|
||||
|
||||
.icon-a-fenzu92:before {
|
||||
content: "\e63a";
|
||||
.icon-menjin:before {
|
||||
content: "\e637";
|
||||
}
|
||||
|
||||
.icon-yonghu2:before {
|
||||
content: "\e68d";
|
||||
.icon-fengsujiance:before {
|
||||
content: "\e628";
|
||||
}
|
||||
|
||||
.icon-guzhang:before {
|
||||
content: "\e632";
|
||||
.icon-xiaofang:before {
|
||||
content: "\e60e";
|
||||
}
|
||||
|
||||
.icon-leijishouyi:before {
|
||||
content: "\e631";
|
||||
.icon-guangzhaojianceshebei:before {
|
||||
content: "\e608";
|
||||
}
|
||||
|
||||
.icon-fadianliang:before {
|
||||
content: "\e63d";
|
||||
.icon-shipinjiankong:before {
|
||||
content: "\e638";
|
||||
}
|
||||
|
||||
.icon-fengji:before {
|
||||
content: "\e661";
|
||||
.icon-yanganjiance:before {
|
||||
content: "\e6a8";
|
||||
}
|
||||
|
||||
.icon-guangfu:before {
|
||||
content: "\e633";
|
||||
.icon-peidiangui:before {
|
||||
content: "\e7bf";
|
||||
}
|
||||
|
||||
.icon-jiantanpaifang:before {
|
||||
content: "\e67d";
|
||||
.icon-transformer:before {
|
||||
content: "\e6ae";
|
||||
}
|
||||
|
||||
.icon-zhaomingdeng:before {
|
||||
content: "\e993";
|
||||
}
|
||||
|
||||
.icon-wenshidujiance:before {
|
||||
content: "\e6c8";
|
||||
}
|
||||
|
||||
.icon-add:before {
|
||||
content: "\e604";
|
||||
}
|
||||
|
||||
.icon-shidu:before {
|
||||
content: "\e60d";
|
||||
}
|
||||
|
||||
.icon-wenduji:before {
|
||||
content: "\e6de";
|
||||
}
|
||||
|
||||
.icon-kongdiaogongcheng:before {
|
||||
content: "\e62e";
|
||||
}
|
||||
|
||||
.icon-lengji:before {
|
||||
content: "\e639";
|
||||
}
|
||||
|
||||
.icon-guanbi:before {
|
||||
content: "\e606";
|
||||
}
|
||||
|
||||
.icon-a-fenzu3:before {
|
||||
content: "\e602";
|
||||
}
|
||||
|
||||
.icon-nibianqi:before {
|
||||
content: "\e603";
|
||||
}
|
||||
|
||||
.icon-battery-charge-line:before {
|
||||
content: "\e601";
|
||||
}
|
||||
|
||||
.icon-a-fenzu13:before {
|
||||
content: "\e600";
|
||||
}
|
||||
|
||||
.icon-hebing:before {
|
||||
content: "\e630";
|
||||
}
|
||||
|
||||
.icon-a-fenzu2:before {
|
||||
content: "\e62e";
|
||||
}
|
||||
|
||||
.icon-jiantou:before {
|
||||
content: "\e62d";
|
||||
}
|
||||
|
||||
.icon-a-fenzu549:before {
|
||||
content: "\e62c";
|
||||
}
|
||||
|
||||
.icon-guanbi1:before {
|
||||
content: "\e62a";
|
||||
}
|
||||
|
||||
.icon-baohuzhuangzhi:before {
|
||||
content: "\e704";
|
||||
}
|
||||
|
||||
.icon-peidianfang:before {
|
||||
content: "\e6ae";
|
||||
}
|
||||
|
||||
.icon-map-mark0:before {
|
||||
content: "\e6ba";
|
||||
}
|
||||
|
||||
.icon-caokongguanli:before {
|
||||
content: "\e62b";
|
||||
}
|
||||
|
||||
.icon-a-CyberMonitoring:before {
|
||||
content: "\e640";
|
||||
}
|
||||
|
||||
.icon-a-GrowthChart:before {
|
||||
content: "\e650";
|
||||
}
|
||||
|
||||
.icon-a-SalesGrowth:before {
|
||||
content: "\e668";
|
||||
}
|
||||
|
||||
.icon-a-TrendChat:before {
|
||||
content: "\e673";
|
||||
}
|
||||
|
||||
.icon-a-CloudComputer:before {
|
||||
content: "\e683";
|
||||
}
|
||||
|
||||
.icon-a-CloudInfrastructure:before {
|
||||
content: "\e687";
|
||||
}
|
||||
|
||||
.icon-a-CloudManagement:before {
|
||||
content: "\e689";
|
||||
}
|
||||
|
||||
.icon-a-CloudSecurity:before {
|
||||
content: "\e68e";
|
||||
}
|
||||
|
||||
.icon-Dataserver:before {
|
||||
content: "\e693";
|
||||
}
|
||||
|
||||
.icon-a-VolumeEqualizer:before {
|
||||
content: "\e6c0";
|
||||
}
|
||||
|
||||
.icon-a-ResourceManagement1:before {
|
||||
content: "\e808";
|
||||
}
|
||||
|
||||
.icon-a-GraphUp:before {
|
||||
content: "\e859";
|
||||
}
|
||||
|
||||
.icon-a-FileCabinet:before {
|
||||
content: "\e97d";
|
||||
}
|
||||
|
||||
.icon-a-SystemSetting:before {
|
||||
content: "\ee41";
|
||||
}
|
||||
|
||||
.icon-map-mark1:before {
|
||||
content: "\ee42";
|
||||
}
|
||||
|
||||
.icon-map-mark2-copy:before {
|
||||
content: "\ee43";
|
||||
}
|
||||
|
||||
.icon-shouye:before {
|
||||
content: "\e625";
|
||||
}
|
||||
|
||||
.icon-dingwei:before {
|
||||
content: "\e8c4";
|
||||
}
|
||||
|
||||
.icon-guanbi2:before {
|
||||
content: "\e62f";
|
||||
}
|
||||
|
||||
.icon-chulizhuangtai:before {
|
||||
content: "\e684";
|
||||
}
|
||||
|
||||
.icon-a-fenzu302:before {
|
||||
content: "\e629";
|
||||
}
|
||||
|
||||
.icon-a-fenzu1163:before {
|
||||
content: "\e605";
|
||||
}
|
||||
|
||||
.icon-tuichu:before {
|
||||
content: "\e627";
|
||||
}
|
||||
|
||||
.icon-yonghu-yuan:before {
|
||||
content: "\e628";
|
||||
}
|
||||
|
||||
.icon-mima:before {
|
||||
content: "\e8b2";
|
||||
}
|
||||
|
||||
.icon-tuichu3:before {
|
||||
content: "\e624";
|
||||
}
|
||||
|
||||
.icon-yueliang:before {
|
||||
content: "\e656";
|
||||
}
|
||||
|
||||
.icon-tongzhi:before {
|
||||
content: "\e674";
|
||||
}
|
||||
|
||||
.icon-tongzhi1:before {
|
||||
content: "\e9cd";
|
||||
}
|
||||
|
||||
.icon-tongzhi2:before {
|
||||
content: "\101d4";
|
||||
}
|
||||
|
||||
.icon-xingzhuangjiehe:before {
|
||||
content: "\e623";
|
||||
}
|
||||
|
||||
.icon-xitongguanli:before {
|
||||
content: "\e672";
|
||||
}
|
||||
|
||||
.icon-pingtaiguanli:before {
|
||||
content: "\e619";
|
||||
}
|
||||
|
||||
.icon-shidu:before {
|
||||
content: "\e635";
|
||||
}
|
||||
|
||||
.icon-dingdan-quanbudingdan:before {
|
||||
content: "\e626";
|
||||
}
|
||||
|
||||
.icon-wendu:before {
|
||||
content: "\e80f";
|
||||
}
|
||||
|
||||
.icon-fengtian-guangzhao:before {
|
||||
content: "\e636";
|
||||
}
|
||||
|
||||
.icon-fengsu:before {
|
||||
content: "\ea32";
|
||||
}
|
||||
|
||||
.icon-wulianzhongxin_normal:before {
|
||||
content: "\e620";
|
||||
}
|
||||
|
||||
.icon-icon-1:before {
|
||||
content: "\e621";
|
||||
}
|
||||
|
||||
.icon-fengexian:before {
|
||||
content: "\e634";
|
||||
}
|
||||
|
||||
.icon-quxiao:before {
|
||||
content: "\e637";
|
||||
}
|
||||
|
||||
.icon-a-xingzhuangjiehe1x:before {
|
||||
content: "\e638";
|
||||
}
|
||||
|
||||
.icon-a-xingzhuangjiehe1x1:before {
|
||||
content: "\e639";
|
||||
}
|
||||
|
||||
.icon-xingzhuang1:before {
|
||||
content: "\e622";
|
||||
}
|
||||
|
||||
.icon-xingzhuang:before {
|
||||
content: "\e604";
|
||||
}
|
||||
|
||||
.icon-a-fenzu1865:before {
|
||||
content: "\e61f";
|
||||
}
|
||||
|
||||
.icon-confirm:before {
|
||||
content: "\e61a";
|
||||
}
|
||||
|
||||
.icon-a-fenzu412:before {
|
||||
content: "\e61b";
|
||||
}
|
||||
|
||||
.icon-shuaxin:before {
|
||||
content: "\e61c";
|
||||
}
|
||||
|
||||
.icon-download:before {
|
||||
content: "\e61d";
|
||||
}
|
||||
|
||||
.icon-upload:before {
|
||||
.icon-quanpingmu:before {
|
||||
content: "\e61e";
|
||||
}
|
||||
|
||||
.icon-add:before {
|
||||
content: "\e616";
|
||||
}
|
||||
|
||||
.icon-chongzhi:before {
|
||||
content: "\e617";
|
||||
}
|
||||
|
||||
.icon-setProtectControl:before {
|
||||
content: "\e618";
|
||||
}
|
||||
|
||||
.icon-export:before {
|
||||
content: "\e613";
|
||||
}
|
||||
|
||||
.icon-import:before {
|
||||
content: "\e614";
|
||||
}
|
||||
|
||||
.icon-del:before {
|
||||
content: "\e615";
|
||||
}
|
||||
|
||||
.icon-setProtectValue:before {
|
||||
content: "\e60e";
|
||||
}
|
||||
|
||||
.icon-setLightMode:before {
|
||||
content: "\e60f";
|
||||
}
|
||||
|
||||
.icon-setTimeMode:before {
|
||||
content: "\e610";
|
||||
}
|
||||
|
||||
.icon-switchMode:before {
|
||||
content: "\e611";
|
||||
}
|
||||
|
||||
.icon-setTime:before {
|
||||
content: "\e612";
|
||||
}
|
||||
|
||||
.icon-sousu:before {
|
||||
content: "\e60c";
|
||||
}
|
||||
|
||||
.icon-a-fenzu2241:before {
|
||||
content: "\e60d";
|
||||
}
|
||||
|
||||
.icon-openOrClose:before {
|
||||
content: "\e60b";
|
||||
}
|
||||
|
||||
.icon-zhaoce:before {
|
||||
content: "\e60a";
|
||||
}
|
||||
|
||||
.icon-send:before {
|
||||
content: "\e609";
|
||||
}
|
||||
|
||||
.icon-a-fenzu5:before {
|
||||
content: "\e608";
|
||||
}
|
||||
|
||||
.icon-shezhi:before {
|
||||
content: "\e607";
|
||||
}
|
||||
|
||||
.icon-touxiang:before {
|
||||
content: "\e606";
|
||||
}
|
||||
|
||||
.icon-jiaoyizhanghuguanli:before {
|
||||
content: "\e602";
|
||||
}
|
||||
|
||||
.icon-yingxiaoxuanzhong:before {
|
||||
content: "\e603";
|
||||
}
|
||||
|
||||
.icon-a-lujing1:before {
|
||||
content: "\e600";
|
||||
}
|
||||
|
||||
.icon-a-lujing11:before {
|
||||
content: "\e601";
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,212 +1,254 @@
|
||||
{
|
||||
"id": "4945642",
|
||||
"name": "海达普平台3.0",
|
||||
"id": "5010233",
|
||||
"name": "光储充",
|
||||
"font_family": "iconfont",
|
||||
"css_prefix_text": "icon-",
|
||||
"description": "",
|
||||
"glyphs": [
|
||||
{
|
||||
"icon_id": "44946071",
|
||||
"name": "full",
|
||||
"font_class": "full",
|
||||
"unicode": "e651",
|
||||
"unicode_decimal": 58961
|
||||
"icon_id": "34089819",
|
||||
"name": "BMS",
|
||||
"font_class": "chunengguankong",
|
||||
"unicode": "e60c",
|
||||
"unicode_decimal": 58892
|
||||
},
|
||||
{
|
||||
"icon_id": "44946066",
|
||||
"name": "exit",
|
||||
"font_class": "exit",
|
||||
"unicode": "e652",
|
||||
"unicode_decimal": 58962
|
||||
"icon_id": "25725466",
|
||||
"name": "变压器",
|
||||
"font_class": "bianyaqi1",
|
||||
"unicode": "e60b",
|
||||
"unicode_decimal": 58891
|
||||
},
|
||||
{
|
||||
"icon_id": "44797354",
|
||||
"name": "qiyong",
|
||||
"font_class": "a-qiyong",
|
||||
"unicode": "e64e",
|
||||
"unicode_decimal": 58958
|
||||
"icon_id": "16921565",
|
||||
"name": "退出",
|
||||
"font_class": "tuichu",
|
||||
"unicode": "e7ed",
|
||||
"unicode_decimal": 59373
|
||||
},
|
||||
{
|
||||
"icon_id": "44797352",
|
||||
"name": "jinyong",
|
||||
"font_class": "a-jinyong",
|
||||
"unicode": "e64f",
|
||||
"unicode_decimal": 58959
|
||||
"icon_id": "6953156",
|
||||
"name": "PCU",
|
||||
"font_class": "bianyaqi",
|
||||
"unicode": "e62f",
|
||||
"unicode_decimal": 58927
|
||||
},
|
||||
{
|
||||
"icon_id": "41945643",
|
||||
"name": "退回申请",
|
||||
"font_class": "tuihuishenqing",
|
||||
"unicode": "e64d",
|
||||
"unicode_decimal": 58957
|
||||
"icon_id": "14515201",
|
||||
"name": "预制舱",
|
||||
"font_class": "jizhuangxiang",
|
||||
"unicode": "e60a",
|
||||
"unicode_decimal": 58890
|
||||
},
|
||||
{
|
||||
"icon_id": "44643473",
|
||||
"name": "mti-漏电监测",
|
||||
"font_class": "mti-loudianjiance",
|
||||
"unicode": "e64c",
|
||||
"unicode_decimal": 58956
|
||||
"icon_id": "18853254",
|
||||
"name": "PCS",
|
||||
"font_class": "nengyuanguanli",
|
||||
"unicode": "e67d",
|
||||
"unicode_decimal": 59005
|
||||
},
|
||||
{
|
||||
"icon_id": "44642653",
|
||||
"name": "关闭",
|
||||
"font_class": "guanbi",
|
||||
"unicode": "e64b",
|
||||
"unicode_decimal": 58955
|
||||
},
|
||||
{
|
||||
"icon_id": "44628330",
|
||||
"name": "启用",
|
||||
"font_class": "a-fenzu1411",
|
||||
"unicode": "e649",
|
||||
"unicode_decimal": 58953
|
||||
},
|
||||
{
|
||||
"icon_id": "44628328",
|
||||
"name": "禁用",
|
||||
"font_class": "a-fenzu1409",
|
||||
"unicode": "e64a",
|
||||
"unicode_decimal": 58954
|
||||
},
|
||||
{
|
||||
"icon_id": "44626923",
|
||||
"name": "线路",
|
||||
"font_class": "xianlu",
|
||||
"unicode": "e647",
|
||||
"unicode_decimal": 58951
|
||||
},
|
||||
{
|
||||
"icon_id": "44626921",
|
||||
"name": "集中器",
|
||||
"font_class": "jizhongqi",
|
||||
"unicode": "e648",
|
||||
"unicode_decimal": 58952
|
||||
},
|
||||
{
|
||||
"icon_id": "44626922",
|
||||
"name": "路径 4 (1)",
|
||||
"font_class": "a-lujing41",
|
||||
"unicode": "e646",
|
||||
"unicode_decimal": 58950
|
||||
},
|
||||
{
|
||||
"icon_id": "44626457",
|
||||
"name": "路径 4",
|
||||
"font_class": "a-lujing4",
|
||||
"icon_id": "22187612",
|
||||
"name": "EMS",
|
||||
"font_class": "quexianguanli",
|
||||
"unicode": "e645",
|
||||
"unicode_decimal": 58949
|
||||
},
|
||||
{
|
||||
"icon_id": "40668428",
|
||||
"name": "Electrocardiogram",
|
||||
"font_class": "Electrocardiogram",
|
||||
"unicode": "e644",
|
||||
"unicode_decimal": 58948
|
||||
"icon_id": "30628754",
|
||||
"name": "BCU",
|
||||
"font_class": "L-chunengdianchicu",
|
||||
"unicode": "e698",
|
||||
"unicode_decimal": 59032
|
||||
},
|
||||
{
|
||||
"icon_id": "44621269",
|
||||
"name": "分组 10",
|
||||
"font_class": "hezha",
|
||||
"unicode": "e642",
|
||||
"unicode_decimal": 58946
|
||||
"icon_id": "8634414",
|
||||
"name": "集中器",
|
||||
"font_class": "jizhongqi",
|
||||
"unicode": "e607",
|
||||
"unicode_decimal": 58887
|
||||
},
|
||||
{
|
||||
"icon_id": "44621265",
|
||||
"name": "路径 1 (1)",
|
||||
"font_class": "bisuo",
|
||||
"unicode": "e643",
|
||||
"unicode_decimal": 58947
|
||||
"icon_id": "10074608",
|
||||
"name": "充电枪",
|
||||
"font_class": "chongdianqiang",
|
||||
"unicode": "e650",
|
||||
"unicode_decimal": 58960
|
||||
},
|
||||
{
|
||||
"icon_id": "44621293",
|
||||
"name": "离线",
|
||||
"font_class": "lixian",
|
||||
"unicode": "e63b",
|
||||
"unicode_decimal": 58939
|
||||
"icon_id": "11464298",
|
||||
"name": "光伏板",
|
||||
"font_class": "guangfuban",
|
||||
"unicode": "e609",
|
||||
"unicode_decimal": 58889
|
||||
},
|
||||
{
|
||||
"icon_id": "44621290",
|
||||
"name": "49",
|
||||
"font_class": "dengpao",
|
||||
"unicode": "e63c",
|
||||
"unicode_decimal": 58940
|
||||
"icon_id": "23266155",
|
||||
"name": "装机容量",
|
||||
"font_class": "zhuangjirongliang",
|
||||
"unicode": "e683",
|
||||
"unicode_decimal": 59011
|
||||
},
|
||||
{
|
||||
"icon_id": "44621289",
|
||||
"name": "路径 6",
|
||||
"font_class": "daunlu",
|
||||
"unicode": "e63e",
|
||||
"unicode_decimal": 58942
|
||||
"icon_id": "42232081",
|
||||
"name": "charging-pile-line",
|
||||
"font_class": "charging-pile-line",
|
||||
"unicode": "e83c",
|
||||
"unicode_decimal": 59452
|
||||
},
|
||||
{
|
||||
"icon_id": "44621287",
|
||||
"name": "mti-漏电监测",
|
||||
"font_class": "loudianjiance",
|
||||
"unicode": "e63f",
|
||||
"unicode_decimal": 58943
|
||||
"icon_id": "5961298",
|
||||
"name": "电表",
|
||||
"font_class": "dianbiao",
|
||||
"unicode": "ec4d",
|
||||
"unicode_decimal": 60493
|
||||
},
|
||||
{
|
||||
"icon_id": "44621285",
|
||||
"name": "路径 1",
|
||||
"font_class": "guozai",
|
||||
"unicode": "e641",
|
||||
"unicode_decimal": 58945
|
||||
"icon_id": "11096116",
|
||||
"name": "flooding",
|
||||
"font_class": "shuijinchuanganqiicon",
|
||||
"unicode": "e605",
|
||||
"unicode_decimal": 58885
|
||||
},
|
||||
{
|
||||
"icon_id": "44613655",
|
||||
"name": "分组 92",
|
||||
"font_class": "a-fenzu92",
|
||||
"unicode": "e63a",
|
||||
"unicode_decimal": 58938
|
||||
"icon_id": "11183352",
|
||||
"name": "门禁",
|
||||
"font_class": "menjin",
|
||||
"unicode": "e637",
|
||||
"unicode_decimal": 58935
|
||||
},
|
||||
{
|
||||
"icon_id": "8998607",
|
||||
"name": "用户",
|
||||
"font_class": "yonghu2",
|
||||
"unicode": "e68d",
|
||||
"unicode_decimal": 59021
|
||||
"icon_id": "11343949",
|
||||
"name": "风速监测",
|
||||
"font_class": "fengsujiance",
|
||||
"unicode": "e628",
|
||||
"unicode_decimal": 58920
|
||||
},
|
||||
{
|
||||
"icon_id": "17398117",
|
||||
"name": "故障",
|
||||
"font_class": "guzhang",
|
||||
"unicode": "e632",
|
||||
"unicode_decimal": 58930
|
||||
"icon_id": "11859279",
|
||||
"name": "消防",
|
||||
"font_class": "xiaofang",
|
||||
"unicode": "e60e",
|
||||
"unicode_decimal": 58894
|
||||
},
|
||||
{
|
||||
"icon_id": "683410",
|
||||
"name": "累计收益",
|
||||
"font_class": "leijishouyi",
|
||||
"unicode": "e631",
|
||||
"unicode_decimal": 58929
|
||||
"icon_id": "11894140",
|
||||
"name": "光照监测设备",
|
||||
"font_class": "guangzhaojianceshebei",
|
||||
"unicode": "e608",
|
||||
"unicode_decimal": 58888
|
||||
},
|
||||
{
|
||||
"icon_id": "6943378",
|
||||
"name": "发电量",
|
||||
"font_class": "fadianliang",
|
||||
"unicode": "e63d",
|
||||
"unicode_decimal": 58941
|
||||
"icon_id": "17654833",
|
||||
"name": "视频监控",
|
||||
"font_class": "shipinjiankong",
|
||||
"unicode": "e638",
|
||||
"unicode_decimal": 58936
|
||||
},
|
||||
{
|
||||
"icon_id": "31328216",
|
||||
"name": "风机",
|
||||
"font_class": "fengji",
|
||||
"unicode": "e661",
|
||||
"unicode_decimal": 58977
|
||||
"icon_id": "18636600",
|
||||
"name": "烟感监测",
|
||||
"font_class": "yanganjiance",
|
||||
"unicode": "e6a8",
|
||||
"unicode_decimal": 59048
|
||||
},
|
||||
{
|
||||
"icon_id": "37843318",
|
||||
"name": "光伏-copy",
|
||||
"font_class": "guangfu",
|
||||
"unicode": "e633",
|
||||
"unicode_decimal": 58931
|
||||
"icon_id": "18799877",
|
||||
"name": "配电柜",
|
||||
"font_class": "peidiangui",
|
||||
"unicode": "e7bf",
|
||||
"unicode_decimal": 59327
|
||||
},
|
||||
{
|
||||
"icon_id": "39630640",
|
||||
"name": "减碳排放",
|
||||
"font_class": "jiantanpaifang",
|
||||
"unicode": "e67d",
|
||||
"unicode_decimal": 59005
|
||||
"icon_id": "25891413",
|
||||
"name": "变压器",
|
||||
"font_class": "transformer",
|
||||
"unicode": "e6ae",
|
||||
"unicode_decimal": 59054
|
||||
},
|
||||
{
|
||||
"icon_id": "34248516",
|
||||
"name": "照明灯",
|
||||
"font_class": "zhaomingdeng",
|
||||
"unicode": "e993",
|
||||
"unicode_decimal": 59795
|
||||
},
|
||||
{
|
||||
"icon_id": "41574592",
|
||||
"name": "温湿度监测",
|
||||
"font_class": "wenshidujiance",
|
||||
"unicode": "e6c8",
|
||||
"unicode_decimal": 59080
|
||||
},
|
||||
{
|
||||
"icon_id": "9027941",
|
||||
"name": "add",
|
||||
"font_class": "add",
|
||||
"unicode": "e604",
|
||||
"unicode_decimal": 58884
|
||||
},
|
||||
{
|
||||
"icon_id": "6677873",
|
||||
"name": "湿度",
|
||||
"font_class": "shidu",
|
||||
"unicode": "e60d",
|
||||
"unicode_decimal": 58893
|
||||
},
|
||||
{
|
||||
"icon_id": "16562592",
|
||||
"name": "温度计",
|
||||
"font_class": "wenduji",
|
||||
"unicode": "e6de",
|
||||
"unicode_decimal": 59102
|
||||
},
|
||||
{
|
||||
"icon_id": "1132463",
|
||||
"name": "空调工程",
|
||||
"font_class": "kongdiaogongcheng",
|
||||
"unicode": "e62e",
|
||||
"unicode_decimal": 58926
|
||||
},
|
||||
{
|
||||
"icon_id": "8852945",
|
||||
"name": "冷机",
|
||||
"font_class": "lengji",
|
||||
"unicode": "e639",
|
||||
"unicode_decimal": 58937
|
||||
},
|
||||
{
|
||||
"icon_id": "5800409",
|
||||
"name": "关闭",
|
||||
"font_class": "guanbi",
|
||||
"unicode": "e606",
|
||||
"unicode_decimal": 58886
|
||||
},
|
||||
{
|
||||
"icon_id": "45407305",
|
||||
"name": "分组 3",
|
||||
"font_class": "a-fenzu3",
|
||||
"unicode": "e602",
|
||||
"unicode_decimal": 58882
|
||||
},
|
||||
{
|
||||
"icon_id": "45407301",
|
||||
"name": "逆变器",
|
||||
"font_class": "nibianqi",
|
||||
"unicode": "e603",
|
||||
"unicode_decimal": 58883
|
||||
},
|
||||
{
|
||||
"icon_id": "45407312",
|
||||
"name": "battery-charge-line",
|
||||
"font_class": "battery-charge-line",
|
||||
"unicode": "e601",
|
||||
"unicode_decimal": 58881
|
||||
},
|
||||
{
|
||||
"icon_id": "45401862",
|
||||
"name": "分组 13",
|
||||
"font_class": "a-fenzu13",
|
||||
"unicode": "e600",
|
||||
"unicode_decimal": 58880
|
||||
},
|
||||
{
|
||||
"icon_id": "44416323",
|
||||
@@ -216,585 +258,11 @@
|
||||
"unicode_decimal": 58928
|
||||
},
|
||||
{
|
||||
"icon_id": "44603155",
|
||||
"name": "分组 2",
|
||||
"font_class": "a-fenzu2",
|
||||
"unicode": "e62e",
|
||||
"unicode_decimal": 58926
|
||||
},
|
||||
{
|
||||
"icon_id": "19877417",
|
||||
"name": "箭头",
|
||||
"font_class": "jiantou",
|
||||
"unicode": "e62d",
|
||||
"unicode_decimal": 58925
|
||||
},
|
||||
{
|
||||
"icon_id": "44581189",
|
||||
"name": "分组 549",
|
||||
"font_class": "a-fenzu549",
|
||||
"unicode": "e62c",
|
||||
"unicode_decimal": 58924
|
||||
},
|
||||
{
|
||||
"icon_id": "4880431",
|
||||
"name": "关闭",
|
||||
"font_class": "guanbi1",
|
||||
"unicode": "e62a",
|
||||
"unicode_decimal": 58922
|
||||
},
|
||||
{
|
||||
"icon_id": "27326599",
|
||||
"name": "保护装置",
|
||||
"font_class": "baohuzhuangzhi",
|
||||
"unicode": "e704",
|
||||
"unicode_decimal": 59140
|
||||
},
|
||||
{
|
||||
"icon_id": "32257173",
|
||||
"name": "配电房",
|
||||
"font_class": "peidianfang",
|
||||
"unicode": "e6ae",
|
||||
"unicode_decimal": 59054
|
||||
},
|
||||
{
|
||||
"icon_id": "35105134",
|
||||
"name": "同心圆",
|
||||
"font_class": "map-mark0",
|
||||
"unicode": "e6ba",
|
||||
"unicode_decimal": 59066
|
||||
},
|
||||
{
|
||||
"icon_id": "40458894",
|
||||
"name": "操控管理",
|
||||
"font_class": "caokongguanli",
|
||||
"unicode": "e62b",
|
||||
"unicode_decimal": 58923
|
||||
},
|
||||
{
|
||||
"icon_id": "40668708",
|
||||
"name": "Cyber Monitoring",
|
||||
"font_class": "a-CyberMonitoring",
|
||||
"unicode": "e640",
|
||||
"unicode_decimal": 58944
|
||||
},
|
||||
{
|
||||
"icon_id": "40668774",
|
||||
"name": "Growth Chart",
|
||||
"font_class": "a-GrowthChart",
|
||||
"unicode": "e650",
|
||||
"unicode_decimal": 58960
|
||||
},
|
||||
{
|
||||
"icon_id": "40668863",
|
||||
"name": "Sales Growth",
|
||||
"font_class": "a-SalesGrowth",
|
||||
"unicode": "e668",
|
||||
"unicode_decimal": 58984
|
||||
},
|
||||
{
|
||||
"icon_id": "40668908",
|
||||
"name": "Trend Chat",
|
||||
"font_class": "a-TrendChat",
|
||||
"unicode": "e673",
|
||||
"unicode_decimal": 58995
|
||||
},
|
||||
{
|
||||
"icon_id": "40668959",
|
||||
"name": "Cloud Computer",
|
||||
"font_class": "a-CloudComputer",
|
||||
"unicode": "e683",
|
||||
"unicode_decimal": 59011
|
||||
},
|
||||
{
|
||||
"icon_id": "40668971",
|
||||
"name": "Cloud Infrastructure",
|
||||
"font_class": "a-CloudInfrastructure",
|
||||
"unicode": "e687",
|
||||
"unicode_decimal": 59015
|
||||
},
|
||||
{
|
||||
"icon_id": "40668978",
|
||||
"name": "Cloud Management",
|
||||
"font_class": "a-CloudManagement",
|
||||
"unicode": "e689",
|
||||
"unicode_decimal": 59017
|
||||
},
|
||||
{
|
||||
"icon_id": "40668994",
|
||||
"name": "Cloud Security",
|
||||
"font_class": "a-CloudSecurity",
|
||||
"unicode": "e68e",
|
||||
"unicode_decimal": 59022
|
||||
},
|
||||
{
|
||||
"icon_id": "40669013",
|
||||
"name": "Dataserver",
|
||||
"font_class": "Dataserver",
|
||||
"unicode": "e693",
|
||||
"unicode_decimal": 59027
|
||||
},
|
||||
{
|
||||
"icon_id": "40669125",
|
||||
"name": "Volume Equalizer",
|
||||
"font_class": "a-VolumeEqualizer",
|
||||
"unicode": "e6c0",
|
||||
"unicode_decimal": 59072
|
||||
},
|
||||
{
|
||||
"icon_id": "40669723",
|
||||
"name": "Resource Management",
|
||||
"font_class": "a-ResourceManagement1",
|
||||
"unicode": "e808",
|
||||
"unicode_decimal": 59400
|
||||
},
|
||||
{
|
||||
"icon_id": "40669819",
|
||||
"name": "Graph Up",
|
||||
"font_class": "a-GraphUp",
|
||||
"unicode": "e859",
|
||||
"unicode_decimal": 59481
|
||||
},
|
||||
{
|
||||
"icon_id": "40670170",
|
||||
"name": "File Cabinet",
|
||||
"font_class": "a-FileCabinet",
|
||||
"unicode": "e97d",
|
||||
"unicode_decimal": 59773
|
||||
},
|
||||
{
|
||||
"icon_id": "40671533",
|
||||
"name": "System Setting",
|
||||
"font_class": "a-SystemSetting",
|
||||
"unicode": "ee41",
|
||||
"unicode_decimal": 60993
|
||||
},
|
||||
{
|
||||
"icon_id": "41578337",
|
||||
"name": "同心圆-copy",
|
||||
"font_class": "map-mark1",
|
||||
"unicode": "ee42",
|
||||
"unicode_decimal": 60994
|
||||
},
|
||||
{
|
||||
"icon_id": "41578361",
|
||||
"name": "同心圆-copy-copy",
|
||||
"font_class": "map-mark2-copy",
|
||||
"unicode": "ee43",
|
||||
"unicode_decimal": 60995
|
||||
},
|
||||
{
|
||||
"icon_id": "1228",
|
||||
"name": "首页",
|
||||
"font_class": "shouye",
|
||||
"unicode": "e625",
|
||||
"unicode_decimal": 58917
|
||||
},
|
||||
{
|
||||
"icon_id": "11372763",
|
||||
"name": "定位",
|
||||
"font_class": "dingwei",
|
||||
"unicode": "e8c4",
|
||||
"unicode_decimal": 59588
|
||||
},
|
||||
{
|
||||
"icon_id": "21164164",
|
||||
"name": "关闭",
|
||||
"font_class": "guanbi2",
|
||||
"unicode": "e62f",
|
||||
"unicode_decimal": 58927
|
||||
},
|
||||
{
|
||||
"icon_id": "35113133",
|
||||
"name": "处理状态",
|
||||
"font_class": "chulizhuangtai",
|
||||
"unicode": "e684",
|
||||
"unicode_decimal": 59012
|
||||
},
|
||||
{
|
||||
"icon_id": "44573704",
|
||||
"name": "分组 302",
|
||||
"font_class": "a-fenzu302",
|
||||
"unicode": "e629",
|
||||
"unicode_decimal": 58921
|
||||
},
|
||||
{
|
||||
"icon_id": "44573686",
|
||||
"name": "分组 1163",
|
||||
"font_class": "a-fenzu1163",
|
||||
"unicode": "e605",
|
||||
"unicode_decimal": 58885
|
||||
},
|
||||
{
|
||||
"icon_id": "44573683",
|
||||
"name": "分组 449",
|
||||
"font_class": "tuichu",
|
||||
"unicode": "e627",
|
||||
"unicode_decimal": 58919
|
||||
},
|
||||
{
|
||||
"icon_id": "44573677",
|
||||
"name": "分组 1565",
|
||||
"font_class": "yonghu-yuan",
|
||||
"unicode": "e628",
|
||||
"unicode_decimal": 58920
|
||||
},
|
||||
{
|
||||
"icon_id": "11372676",
|
||||
"name": "密码",
|
||||
"font_class": "mima",
|
||||
"unicode": "e8b2",
|
||||
"unicode_decimal": 59570
|
||||
},
|
||||
{
|
||||
"icon_id": "28622327",
|
||||
"name": "退出",
|
||||
"font_class": "tuichu3",
|
||||
"unicode": "e624",
|
||||
"unicode_decimal": 58916
|
||||
},
|
||||
{
|
||||
"icon_id": "35972990",
|
||||
"name": "icon_夜间-月亮",
|
||||
"font_class": "yueliang",
|
||||
"unicode": "e656",
|
||||
"unicode_decimal": 58966
|
||||
},
|
||||
{
|
||||
"icon_id": "16388270",
|
||||
"name": "通知",
|
||||
"font_class": "tongzhi",
|
||||
"unicode": "e674",
|
||||
"unicode_decimal": 58996
|
||||
},
|
||||
{
|
||||
"icon_id": "32538041",
|
||||
"name": "通知",
|
||||
"font_class": "tongzhi1",
|
||||
"unicode": "e9cd",
|
||||
"unicode_decimal": 59853
|
||||
},
|
||||
{
|
||||
"icon_id": "42794618",
|
||||
"name": "通知",
|
||||
"font_class": "tongzhi2",
|
||||
"unicode": "101d4",
|
||||
"unicode_decimal": 66004
|
||||
},
|
||||
{
|
||||
"icon_id": "44572036",
|
||||
"name": "形状结合",
|
||||
"font_class": "xingzhuangjiehe",
|
||||
"unicode": "e623",
|
||||
"unicode_decimal": 58915
|
||||
},
|
||||
{
|
||||
"icon_id": "4138428",
|
||||
"name": "系统管理",
|
||||
"font_class": "xitongguanli",
|
||||
"unicode": "e672",
|
||||
"unicode_decimal": 58994
|
||||
},
|
||||
{
|
||||
"icon_id": "5093337",
|
||||
"name": "平台管理",
|
||||
"font_class": "pingtaiguanli",
|
||||
"unicode": "e619",
|
||||
"unicode_decimal": 58905
|
||||
},
|
||||
{
|
||||
"icon_id": "6677873",
|
||||
"name": "湿度",
|
||||
"font_class": "shidu",
|
||||
"unicode": "e635",
|
||||
"unicode_decimal": 58933
|
||||
},
|
||||
{
|
||||
"icon_id": "17541547",
|
||||
"name": "订单-全部订单",
|
||||
"font_class": "dingdan-quanbudingdan",
|
||||
"unicode": "e626",
|
||||
"unicode_decimal": 58918
|
||||
},
|
||||
{
|
||||
"icon_id": "17605421",
|
||||
"name": "温度",
|
||||
"font_class": "wendu",
|
||||
"unicode": "e80f",
|
||||
"unicode_decimal": 59407
|
||||
},
|
||||
{
|
||||
"icon_id": "21135941",
|
||||
"name": "光照",
|
||||
"font_class": "fengtian-guangzhao",
|
||||
"unicode": "e636",
|
||||
"unicode_decimal": 58934
|
||||
},
|
||||
{
|
||||
"icon_id": "25716499",
|
||||
"name": "风速",
|
||||
"font_class": "fengsu",
|
||||
"unicode": "ea32",
|
||||
"unicode_decimal": 59954
|
||||
},
|
||||
{
|
||||
"icon_id": "35264434",
|
||||
"name": "物联中心_normal",
|
||||
"font_class": "wulianzhongxin_normal",
|
||||
"unicode": "e620",
|
||||
"unicode_decimal": 58912
|
||||
},
|
||||
{
|
||||
"icon_id": "39347276",
|
||||
"name": "icon-home",
|
||||
"font_class": "icon-1",
|
||||
"unicode": "e621",
|
||||
"unicode_decimal": 58913
|
||||
},
|
||||
{
|
||||
"icon_id": "41233755",
|
||||
"name": "分割线",
|
||||
"font_class": "fengexian",
|
||||
"unicode": "e634",
|
||||
"unicode_decimal": 58932
|
||||
},
|
||||
{
|
||||
"icon_id": "44546776",
|
||||
"name": "取消-抽屉",
|
||||
"font_class": "quxiao",
|
||||
"unicode": "e637",
|
||||
"unicode_decimal": 58935
|
||||
},
|
||||
{
|
||||
"icon_id": "44565750",
|
||||
"name": "user_login",
|
||||
"font_class": "a-xingzhuangjiehe1x",
|
||||
"unicode": "e638",
|
||||
"unicode_decimal": 58936
|
||||
},
|
||||
{
|
||||
"icon_id": "44565801",
|
||||
"name": "passwd_login",
|
||||
"font_class": "a-xingzhuangjiehe1x1",
|
||||
"unicode": "e639",
|
||||
"unicode_decimal": 58937
|
||||
},
|
||||
{
|
||||
"icon_id": "44572019",
|
||||
"name": "形状",
|
||||
"font_class": "xingzhuang1",
|
||||
"unicode": "e622",
|
||||
"unicode_decimal": 58914
|
||||
},
|
||||
{
|
||||
"icon_id": "44572020",
|
||||
"name": "形状",
|
||||
"font_class": "xingzhuang",
|
||||
"unicode": "e604",
|
||||
"unicode_decimal": 58884
|
||||
},
|
||||
{
|
||||
"icon_id": "44571957",
|
||||
"name": "分组 1865",
|
||||
"font_class": "a-fenzu1865",
|
||||
"unicode": "e61f",
|
||||
"unicode_decimal": 58911
|
||||
},
|
||||
{
|
||||
"icon_id": "44571956",
|
||||
"name": "分组 929",
|
||||
"font_class": "confirm",
|
||||
"unicode": "e61a",
|
||||
"unicode_decimal": 58906
|
||||
},
|
||||
{
|
||||
"icon_id": "44571953",
|
||||
"name": "分组 412",
|
||||
"font_class": "a-fenzu412",
|
||||
"unicode": "e61b",
|
||||
"unicode_decimal": 58907
|
||||
},
|
||||
{
|
||||
"icon_id": "44571951",
|
||||
"name": "分组 1753",
|
||||
"font_class": "shuaxin",
|
||||
"unicode": "e61c",
|
||||
"unicode_decimal": 58908
|
||||
},
|
||||
{
|
||||
"icon_id": "44571950",
|
||||
"name": "分组 2121",
|
||||
"font_class": "download",
|
||||
"unicode": "e61d",
|
||||
"unicode_decimal": 58909
|
||||
},
|
||||
{
|
||||
"icon_id": "44571949",
|
||||
"name": "分组 204",
|
||||
"font_class": "upload",
|
||||
"icon_id": "29049773",
|
||||
"name": "全屏幕",
|
||||
"font_class": "quanpingmu",
|
||||
"unicode": "e61e",
|
||||
"unicode_decimal": 58910
|
||||
},
|
||||
{
|
||||
"icon_id": "44571900",
|
||||
"name": "分组 463",
|
||||
"font_class": "add",
|
||||
"unicode": "e616",
|
||||
"unicode_decimal": 58902
|
||||
},
|
||||
{
|
||||
"icon_id": "44571899",
|
||||
"name": "分组 423",
|
||||
"font_class": "chongzhi",
|
||||
"unicode": "e617",
|
||||
"unicode_decimal": 58903
|
||||
},
|
||||
{
|
||||
"icon_id": "44571892",
|
||||
"name": "分组 1977",
|
||||
"font_class": "setProtectControl",
|
||||
"unicode": "e618",
|
||||
"unicode_decimal": 58904
|
||||
},
|
||||
{
|
||||
"icon_id": "44571905",
|
||||
"name": "分组 610",
|
||||
"font_class": "export",
|
||||
"unicode": "e613",
|
||||
"unicode_decimal": 58899
|
||||
},
|
||||
{
|
||||
"icon_id": "44571903",
|
||||
"name": "分组 614",
|
||||
"font_class": "import",
|
||||
"unicode": "e614",
|
||||
"unicode_decimal": 58900
|
||||
},
|
||||
{
|
||||
"icon_id": "44571902",
|
||||
"name": "分组 249",
|
||||
"font_class": "del",
|
||||
"unicode": "e615",
|
||||
"unicode_decimal": 58901
|
||||
},
|
||||
{
|
||||
"icon_id": "44571893",
|
||||
"name": "分组 1237",
|
||||
"font_class": "setProtectValue",
|
||||
"unicode": "e60e",
|
||||
"unicode_decimal": 58894
|
||||
},
|
||||
{
|
||||
"icon_id": "44571891",
|
||||
"name": "分组 2237",
|
||||
"font_class": "setLightMode",
|
||||
"unicode": "e60f",
|
||||
"unicode_decimal": 58895
|
||||
},
|
||||
{
|
||||
"icon_id": "44571888",
|
||||
"name": "分组 2085",
|
||||
"font_class": "setTimeMode",
|
||||
"unicode": "e610",
|
||||
"unicode_decimal": 58896
|
||||
},
|
||||
{
|
||||
"icon_id": "44571885",
|
||||
"name": "分组 1739",
|
||||
"font_class": "switchMode",
|
||||
"unicode": "e611",
|
||||
"unicode_decimal": 58897
|
||||
},
|
||||
{
|
||||
"icon_id": "44571884",
|
||||
"name": "分组 1375",
|
||||
"font_class": "setTime",
|
||||
"unicode": "e612",
|
||||
"unicode_decimal": 58898
|
||||
},
|
||||
{
|
||||
"icon_id": "44571897",
|
||||
"name": "分组 403",
|
||||
"font_class": "sousu",
|
||||
"unicode": "e60c",
|
||||
"unicode_decimal": 58892
|
||||
},
|
||||
{
|
||||
"icon_id": "44571896",
|
||||
"name": "分组 2241",
|
||||
"font_class": "a-fenzu2241",
|
||||
"unicode": "e60d",
|
||||
"unicode_decimal": 58893
|
||||
},
|
||||
{
|
||||
"icon_id": "44567819",
|
||||
"name": "分组 1067",
|
||||
"font_class": "openOrClose",
|
||||
"unicode": "e60b",
|
||||
"unicode_decimal": 58891
|
||||
},
|
||||
{
|
||||
"icon_id": "44567629",
|
||||
"name": "分组 1928",
|
||||
"font_class": "zhaoce",
|
||||
"unicode": "e60a",
|
||||
"unicode_decimal": 58890
|
||||
},
|
||||
{
|
||||
"icon_id": "44567660",
|
||||
"name": "分组 342",
|
||||
"font_class": "send",
|
||||
"unicode": "e609",
|
||||
"unicode_decimal": 58889
|
||||
},
|
||||
{
|
||||
"icon_id": "44567617",
|
||||
"name": "分组 5",
|
||||
"font_class": "a-fenzu5",
|
||||
"unicode": "e608",
|
||||
"unicode_decimal": 58888
|
||||
},
|
||||
{
|
||||
"icon_id": "44567394",
|
||||
"name": "设置",
|
||||
"font_class": "shezhi",
|
||||
"unicode": "e607",
|
||||
"unicode_decimal": 58887
|
||||
},
|
||||
{
|
||||
"icon_id": "44567418",
|
||||
"name": "分组 1565",
|
||||
"font_class": "touxiang",
|
||||
"unicode": "e606",
|
||||
"unicode_decimal": 58886
|
||||
},
|
||||
{
|
||||
"icon_id": "44567099",
|
||||
"name": "交易账户",
|
||||
"font_class": "jiaoyizhanghuguanli",
|
||||
"unicode": "e602",
|
||||
"unicode_decimal": 58882
|
||||
},
|
||||
{
|
||||
"icon_id": "44567095",
|
||||
"name": "营销选中",
|
||||
"font_class": "yingxiaoxuanzhong",
|
||||
"unicode": "e603",
|
||||
"unicode_decimal": 58883
|
||||
},
|
||||
{
|
||||
"icon_id": "44567155",
|
||||
"name": "可视化",
|
||||
"font_class": "a-lujing1",
|
||||
"unicode": "e600",
|
||||
"unicode_decimal": 58880
|
||||
},
|
||||
{
|
||||
"icon_id": "44567153",
|
||||
"name": "用户",
|
||||
"font_class": "a-lujing11",
|
||||
"unicode": "e601",
|
||||
"unicode_decimal": 58881
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -17,7 +17,7 @@
|
||||
selectedRowKeys: data.selectedRowKeys,
|
||||
onChange: onSelectChange
|
||||
}
|
||||
: false
|
||||
: {}
|
||||
"
|
||||
:expanded-row-keys="data.newTableOpt.expand ? data.expandedKeys : null"
|
||||
size="middle"
|
||||
|
||||
@@ -420,7 +420,7 @@ const data = reactive({
|
||||
],
|
||||
|
||||
treeCheckValue: null,
|
||||
SHOW_PARENT: TreeSelect.SHOW_PARENT,
|
||||
// SHOW_PARENT: TreeSelect.SHOW_PARENT,
|
||||
|
||||
loading: false,
|
||||
imageUrl: ''
|
||||
|
||||
@@ -49,15 +49,16 @@
|
||||
<a-modal
|
||||
v-model:open="modalOpen"
|
||||
@ok="handleOk"
|
||||
width="90%"
|
||||
width="60%"
|
||||
class="modal-device"
|
||||
:get-container="() => $refs.device"
|
||||
>
|
||||
<div v-if="modalComponent == 1">
|
||||
<div>
|
||||
<div v-if="modalComponent == 1" class="modal-content">
|
||||
<div class="item">
|
||||
<div class="title">
|
||||
<div>电流电压</div>
|
||||
<img src="@/assets/images/titleLine.png" alt="" />
|
||||
电流电压
|
||||
<!-- <div>电流电压</div>
|
||||
<img src="@/assets/images/titleLine.png" alt="" /> -->
|
||||
</div>
|
||||
<div class="echarts">
|
||||
<predictEcharts
|
||||
@@ -67,11 +68,8 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="title">
|
||||
<div>功率</div>
|
||||
<img src="@/assets/images/titleLine.png" alt="" />
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="title">功率</div>
|
||||
<div class="echarts">
|
||||
<predictEcharts
|
||||
:chart-options="chartOptions[1]"
|
||||
@@ -246,6 +244,8 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
this.getDeviceList()
|
||||
|
||||
|
||||
},
|
||||
methods: {
|
||||
handlePagesizeChange(pageOption) {
|
||||
@@ -286,8 +286,16 @@ export default {
|
||||
})
|
||||
this.chartData.ydata = res.data
|
||||
this.chartData.xdata = this.generateTimePoints()
|
||||
this.$nextTick(() => {
|
||||
if (this.$refs.chartRef1) {
|
||||
this.$refs.chartRef1.initCharts()
|
||||
}
|
||||
if (this.$refs.chartRef2) {
|
||||
this.$refs.chartRef2.initCharts()
|
||||
}
|
||||
})
|
||||
// this.$refs.chartRef1.initCharts()
|
||||
// this.$refs.chartRef2.initCharts()
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
@@ -327,13 +335,12 @@ export default {
|
||||
async openModal(item, val) {
|
||||
console.log(item, '=============')
|
||||
this.modalComponent = val
|
||||
this.modalOpen = true
|
||||
if (val == 1) {
|
||||
await this.getDevicCharts(item)
|
||||
} else {
|
||||
await this.getDeviceBCUDetail(item)
|
||||
}
|
||||
|
||||
this.modalOpen = true
|
||||
},
|
||||
handleOk() {
|
||||
this.modalOpen = false
|
||||
@@ -347,17 +354,19 @@ export default {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin-left: 20px;
|
||||
display: grid;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
grid-gap: 20px;
|
||||
overflow-y: auto;
|
||||
grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
|
||||
align-content: flex-start;
|
||||
// grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
|
||||
.device-item {
|
||||
border-radius: 15px;
|
||||
background: $bg2-color;
|
||||
padding: 15px;
|
||||
min-width: 340px;
|
||||
max-width: 430px;
|
||||
max-height: 230px;
|
||||
height: 260px;
|
||||
flex: 1;
|
||||
.item-header {
|
||||
display: flex;
|
||||
@@ -460,6 +469,25 @@ export default {
|
||||
.environment {
|
||||
width: 200px;
|
||||
}
|
||||
.modal-device {
|
||||
color: #fff;
|
||||
.modal-content {
|
||||
height: 700px;
|
||||
.item {
|
||||
// height: 300px;
|
||||
.title {
|
||||
color: #fff;
|
||||
width: 230px;
|
||||
border-bottom: 5px solid transparent;
|
||||
border-image: url('@/assets/boxBottom.png') 0 0 100% 0 stretch;
|
||||
}
|
||||
|
||||
.echarts {
|
||||
height: 300px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.ant-modal-body) {
|
||||
:deep(.ant-table-wrapper .ant-table-row-expand-icon) {
|
||||
@@ -471,7 +499,19 @@ export default {
|
||||
background-color: #f0f8ff !important;
|
||||
}
|
||||
}
|
||||
// .a-modal :deep(.ant-table-thead > tr > th) {
|
||||
// background-color: #f0f8ff !important;
|
||||
// }
|
||||
:deep(.ant-table-cell) {
|
||||
&::before {
|
||||
width: 0 !important;
|
||||
}
|
||||
}
|
||||
:deep(.ant-table-thead > tr > td) {
|
||||
border-bottom: none !important;
|
||||
border-top: none !important;
|
||||
}
|
||||
:deep(.ant-table-wrapper .ant-table-tbody > tr > td) {
|
||||
border-top: none !important;
|
||||
}
|
||||
:deep(.ant-table-wrapper .ant-table-thead > tr > th) {
|
||||
border-bottom: none !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
167
web/src/components/monitor/haikang.vue
Normal file
167
web/src/components/monitor/haikang.vue
Normal file
@@ -0,0 +1,167 @@
|
||||
<template>
|
||||
<div class="title" >
|
||||
<span>{{ item.name }}</span>
|
||||
<img
|
||||
src="@/assets/images/fillScreen.png"
|
||||
alt=""
|
||||
width="23px"
|
||||
style="margin-left: 10px; cursor: pointer"
|
||||
/>
|
||||
</div>
|
||||
<div :id="'divPlugin_' + index" class="plugin"></div>
|
||||
<!-- <a-button @click="clickLogin">开始登录</a-button>
|
||||
<a-button @click="clickStartRealPlay">开始预览</a-button> -->
|
||||
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
props:{
|
||||
index: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
item: {
|
||||
type: Object,
|
||||
default: () => {}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
g_iWndIndex: 0,
|
||||
szDeviceIdentify: '',
|
||||
deviceport: '',
|
||||
channels: [],
|
||||
ip: '',
|
||||
port: '',
|
||||
username: '',
|
||||
password: '',
|
||||
iRtspPort: ''
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// this.init()
|
||||
},
|
||||
methods: {
|
||||
// 初始化
|
||||
init() {
|
||||
let that = this;
|
||||
|
||||
// 初始化插件参数及插入插件
|
||||
this.$nextTick(() => {
|
||||
window.WebVideoCtrl.I_InitPlugin('100%', '100%', {
|
||||
bWndFull: true, // 但窗口双击全屏
|
||||
iPackageType: 2, // 封装格式 无插件只能是2
|
||||
iWndowType: 1, // 分屏类型 1*1 2*2 ....
|
||||
bNoPlugin: true, // 开启无插件模式
|
||||
cbInitPluginComplete: function () {
|
||||
console.log("初始化成功!");
|
||||
window.WebVideoCtrl.I_InsertOBJECTPlugin('divPlugin_' + that.index);
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
},
|
||||
// 登录
|
||||
clickLogin() {
|
||||
if (!this.ip || !this.port) {
|
||||
return
|
||||
}
|
||||
this.szDeviceIdentify = this.ip+"_"+this.port
|
||||
WebVideoCtrl.I_Login(this.ip, 1, this.port, this.username, this.password,
|
||||
{
|
||||
success: function(xmlDoc) {
|
||||
this.getChannelInfo() // 获取模拟通道
|
||||
this.getDevicePort() // 获取端口 (影响不大)
|
||||
}
|
||||
})
|
||||
},
|
||||
// 获取模拟媒体通道
|
||||
getChannelInfo() {
|
||||
let self = this
|
||||
if (!this.szDeviceIdentify) {
|
||||
return
|
||||
}
|
||||
WebVideoCtrl.I_GetAnalogChannelInfo(self.szDeviceIdentify, {
|
||||
async: false,
|
||||
success: function (xmlDoc) {
|
||||
let oChannels = $(xmlDoc).find("VideoInputChannel");
|
||||
console.log('获取模拟通道成功', oChannels)
|
||||
$.each(oChannels, function (i) {
|
||||
let id = $(this).find("id").eq(0).text(),
|
||||
name = $(this).find("name").eq(0).text();
|
||||
if (!name) {
|
||||
name = "Camera " + (i < 9 ? "0" + (i + 1) : (i + 1));
|
||||
}
|
||||
self.channels.push({
|
||||
id: id,
|
||||
name: name
|
||||
})
|
||||
});
|
||||
},
|
||||
error: function (status, xmlDoc) {
|
||||
console.log('获取模拟通道失败', status, xmlDoc)
|
||||
}
|
||||
});
|
||||
},
|
||||
// 获取端口 不会对预览效果造成影响
|
||||
getDevicePort() {
|
||||
if (!this.szDeviceIdentify) {
|
||||
return
|
||||
}
|
||||
let oPort = WebVideoCtrl.I_GetDevicePort(this.szDeviceIdentify);
|
||||
console.log('获取通道端口号', oPort)
|
||||
if (oPort != null) {
|
||||
this.deviceport = oPort.iDevicePort;
|
||||
this.iRtspPort= oPort.iRtspPort;
|
||||
}
|
||||
},
|
||||
// 开始预览
|
||||
clickStartRealPlay() {
|
||||
let self = this
|
||||
let oWndInfo = WebVideoCtrl.I_GetWindowStatus(self.g_iWndIndex),
|
||||
iChannelID = self.channels[0].id
|
||||
if (!this.szDeviceIdentify) {
|
||||
return;
|
||||
}
|
||||
let startRealPlay = function () {
|
||||
WebVideoCtrl.I_StartRealPlay(self.szDeviceIdentify, {
|
||||
iRtspPort: parseInt(self.deviceport, 10), // RTSP端口必须是int
|
||||
iStreamType: 1, // 码流类型:1-主码流 必须int
|
||||
iChannelID: parseInt(iChannelID, 10), // 播放通道 必须int
|
||||
bZeroChannel: false, // 是否播放零通道 默认false
|
||||
success: function () {
|
||||
console.log("预览成功")
|
||||
},
|
||||
error: function (status, xmlDoc) {
|
||||
console.log("预览失败", status, xmlDoc)
|
||||
}
|
||||
});
|
||||
};
|
||||
if (oWndInfo != null) {// 已经在播放了,先停止
|
||||
WebVideoCtrl.I_Stop({
|
||||
success: function () {
|
||||
startRealPlay();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
startRealPlay();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.plugin{
|
||||
width:100%;
|
||||
height:calc(100% - 40px)
|
||||
}
|
||||
.title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 24px;
|
||||
font-weight: 700;
|
||||
margin-bottom: 10px;
|
||||
color: #fff;
|
||||
height: 30px;
|
||||
}
|
||||
</style>
|
||||
@@ -1,24 +1,14 @@
|
||||
<template>
|
||||
<div class="videos">
|
||||
<div class="video-item" v-for="item in videoList" :key="item">
|
||||
<div class="title">
|
||||
<span>{{ item.name }}</span>
|
||||
<img
|
||||
src="@/assets/images/fillScreen.png"
|
||||
alt=""
|
||||
width="23px"
|
||||
style="margin-left: 10px; cursor: pointer"
|
||||
/>
|
||||
</div>
|
||||
<div class="video">
|
||||
<video
|
||||
src="https://media.w3.org/2010/05/sintel/trailer_hd.mp4"
|
||||
controls="controls"
|
||||
width="100%"
|
||||
height="100%"
|
||||
></video>
|
||||
</div>
|
||||
<div class="videosPage" id="videosPage">
|
||||
<div
|
||||
class="content"
|
||||
:class="videosPageWidth < 900 ? 'con-w2' : 'con-w1'"
|
||||
v-for="(item, index) in videoList"
|
||||
:key="item"
|
||||
>
|
||||
<haikang :index="index" :item="item" class="video"></haikang>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="environment">
|
||||
<div class="tab-header">
|
||||
@@ -35,8 +25,7 @@
|
||||
:columns="columns[activeTab]"
|
||||
:table-data="tableDatas[activeTab]"
|
||||
ref="comTable"
|
||||
:table-option="{page:false}"
|
||||
|
||||
:table-option="{ page: false }"
|
||||
>
|
||||
</ComTable>
|
||||
</div>
|
||||
@@ -45,9 +34,10 @@
|
||||
|
||||
<script>
|
||||
import { postReq, getReq } from '@/request/api'
|
||||
import haikang from './haikang.vue'
|
||||
export default {
|
||||
name: '',
|
||||
components: {},
|
||||
components: { haikang },
|
||||
props: {
|
||||
stationId: {
|
||||
type: String,
|
||||
@@ -154,11 +144,26 @@ export default {
|
||||
select: false,
|
||||
page: false
|
||||
},
|
||||
videoList: []
|
||||
//
|
||||
videoList: [],
|
||||
g_iWndIndex: 0,
|
||||
szDeviceIdentify: '',
|
||||
deviceport: '',
|
||||
channels: [],
|
||||
ip: '',
|
||||
port: '',
|
||||
username: '',
|
||||
password: '',
|
||||
iRtspPort: '',
|
||||
videosPageWidth: ''
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
console.log(this.systemType)
|
||||
this.$nextTick(() => {
|
||||
const div = document.getElementById('videosPage')
|
||||
const width = div.offsetWidth
|
||||
this.videosPageWidth = width
|
||||
})
|
||||
|
||||
this.getEnvironment()
|
||||
this.getDeviceList()
|
||||
@@ -168,9 +173,8 @@ export default {
|
||||
try {
|
||||
const res = await getReq('/queryEnvironment', { station_id: this.stationId })
|
||||
this.tableDatas = res.data
|
||||
|
||||
} catch (error) {
|
||||
this.tableDatas={}
|
||||
this.tableDatas = {}
|
||||
console.log(error)
|
||||
}
|
||||
},
|
||||
@@ -183,6 +187,7 @@ export default {
|
||||
})
|
||||
|
||||
this.videoList = res.data.concat(res.data)
|
||||
this.videoList = this.videoList.concat(this.videoList)
|
||||
} catch (error) {
|
||||
this.videoList = []
|
||||
|
||||
@@ -194,30 +199,27 @@ export default {
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.videos {
|
||||
.videosPage {
|
||||
width: calc(100% - 470px);
|
||||
height: 100%;
|
||||
margin-left: 20px;
|
||||
display: grid;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
grid-gap: 20px;
|
||||
overflow-y: auto;
|
||||
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||||
.video-item {
|
||||
align-content: flex-start;
|
||||
justify-content: flex-start;
|
||||
.content {
|
||||
border-radius: 15px;
|
||||
background: $bg2-color;
|
||||
padding: 15px;
|
||||
max-height: 290px;
|
||||
max-width: 400px;
|
||||
.title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 24px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
height: 280px;
|
||||
}
|
||||
.video {
|
||||
margin-top: 10px;
|
||||
.con-w1 {
|
||||
width: calc((100% - 40px) / 3);
|
||||
}
|
||||
.con-w2 {
|
||||
width: calc((100% - 20px) / 2);
|
||||
}
|
||||
}
|
||||
.environment {
|
||||
|
||||
@@ -81,7 +81,7 @@ export default {
|
||||
show: true,
|
||||
xAxisIndex: 0, // 控制第一个X轴
|
||||
start: 0, // 初始显示范围起点(百分比)
|
||||
end: 20, // 初始显示范围终点(百分比)
|
||||
end: 100, // 初始显示范围终点(百分比)
|
||||
height: 20, // 滑动条高度
|
||||
bottom: 10 // 距离底部距离
|
||||
},
|
||||
@@ -89,7 +89,7 @@ export default {
|
||||
type: 'inside', // 内置型(鼠标滚轮/拖拽交互)
|
||||
xAxisIndex: 0,
|
||||
start: 0,
|
||||
end: 20
|
||||
end: 100
|
||||
}
|
||||
],
|
||||
xAxis: {
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
<!-- eslint-disable camelcase -->
|
||||
<template>
|
||||
<div class="policyForm">
|
||||
<div class="policyForm" ref="policyForm">
|
||||
<div class="title">
|
||||
<div>基础信息</div>
|
||||
<img src="@/assets/images/titleLine.png" alt="" />
|
||||
</div>
|
||||
<a-form
|
||||
:model="formData"
|
||||
layout="inline"
|
||||
label-align="left"
|
||||
:label-col="{ style: { width: '85px' } }"
|
||||
:rules="rules"
|
||||
@@ -30,7 +29,7 @@
|
||||
</a-select>
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item label="低谷电价" class="col4" required>
|
||||
<a-form-item label="低谷电价" class="col2" required>
|
||||
<a-input-number
|
||||
:precision="2"
|
||||
v-model:value="formData.price[0]"
|
||||
@@ -39,7 +38,7 @@
|
||||
/>
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item label="平段电价" class="col4" required>
|
||||
<a-form-item label="平段电价" class="col2" required>
|
||||
<a-input-number
|
||||
:precision="2"
|
||||
v-model:value="formData.price[1]"
|
||||
@@ -48,7 +47,7 @@
|
||||
/>
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item label="高峰电价" class="col4" required>
|
||||
<a-form-item label="高峰电价" class="col2" required>
|
||||
<a-input-number
|
||||
:precision="2"
|
||||
v-model:value="formData.price[2]"
|
||||
@@ -57,7 +56,7 @@
|
||||
/>
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item label="尖峰电价" class="col4" required>
|
||||
<a-form-item label="尖峰电价" class="col2" required>
|
||||
<a-input-number
|
||||
:precision="2"
|
||||
v-model:value="formData.price[3]"
|
||||
@@ -179,7 +178,7 @@
|
||||
</a-form-item>
|
||||
</div>
|
||||
|
||||
<a-form-item label="策略描述" class="col2">
|
||||
<a-form-item label="策略描述" class="col1">
|
||||
<a-textarea v-model:value="formData.describe" :disabled="formStatus == 'read'" />
|
||||
</a-form-item>
|
||||
<a-form-item label="是否启用" class="col2">
|
||||
@@ -193,7 +192,8 @@
|
||||
</a-form-item>
|
||||
</a-form>
|
||||
</div>
|
||||
<a-modal v-model:open="periodModal" @ok="handlePeriodModalOk">
|
||||
<a-modal
|
||||
v-model:open="periodModal" @ok="handlePeriodModalOk" :get-container="()=>$refs.policyForm">
|
||||
<a-form
|
||||
ref="periodRef"
|
||||
:model="periodForm"
|
||||
@@ -240,6 +240,7 @@ export default {
|
||||
default: 'add'
|
||||
}
|
||||
},
|
||||
emits:['closeModal'],
|
||||
data() {
|
||||
return {
|
||||
data: [],
|
||||
@@ -308,8 +309,8 @@ export default {
|
||||
handler(newVal) {
|
||||
if (this.formStatus == 'add') {
|
||||
this.formData = {
|
||||
type: '5',
|
||||
name: '测试',
|
||||
type: '',
|
||||
name: '',
|
||||
price: [0, 0, 0, 0],
|
||||
period1: [],
|
||||
period5: [
|
||||
@@ -321,14 +322,7 @@ export default {
|
||||
chargeType: null,
|
||||
dischargeType: null
|
||||
}
|
||||
// {
|
||||
// charge_time: [],
|
||||
// discharge_time: [],
|
||||
// charge_power: '',
|
||||
// discharge_power: '',
|
||||
// chargeType: 1,
|
||||
// dischargeType:1
|
||||
// }
|
||||
|
||||
],
|
||||
is_open: false,
|
||||
chargePolicy: 1
|
||||
@@ -474,6 +468,7 @@ export default {
|
||||
console.log(this.formData)
|
||||
},
|
||||
handleAdd() {
|
||||
if(this.formStatus=='read') return
|
||||
this.periodModal = true
|
||||
this.periodForm = {}
|
||||
},
|
||||
@@ -481,7 +476,6 @@ export default {
|
||||
this.$refs.periodRef
|
||||
.validateFields()
|
||||
.then((res) => {
|
||||
console.log(this.formData.period1,'=============')
|
||||
const target = this.formData.period1.find((item) => item.month == this.periodForm.month)
|
||||
|
||||
if (target) {
|
||||
@@ -574,15 +568,18 @@ export default {
|
||||
img {
|
||||
width: 232px;
|
||||
height: 6px;
|
||||
margin-top: 10px;
|
||||
// margin-top: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.ant-form {
|
||||
display: flex;
|
||||
flex-wrap:wrap ;
|
||||
|
||||
.charge {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 10px;
|
||||
// display: grid;
|
||||
// grid-template-columns: 1fr 1fr;
|
||||
// gap: 10px;
|
||||
.box {
|
||||
border: 1px solid $table-border;
|
||||
padding-left: 10px;
|
||||
@@ -590,6 +587,7 @@ export default {
|
||||
padding-bottom: 10px;
|
||||
border-radius: 10px;
|
||||
color: #fff;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -615,7 +613,7 @@ export default {
|
||||
.ant-select,
|
||||
.ant-input-affix-wrapper,
|
||||
.ant-input-number {
|
||||
width: 150px;
|
||||
width: 200px;
|
||||
}
|
||||
textarea {
|
||||
.ant-input {
|
||||
@@ -627,6 +625,7 @@ export default {
|
||||
}
|
||||
.col4 {
|
||||
width: 25%;
|
||||
min-width: 270px;
|
||||
}
|
||||
.col1 {
|
||||
width: 100%;
|
||||
@@ -645,5 +644,10 @@ export default {
|
||||
:deep(.ant-table-wrapper .ant-table-cell){
|
||||
background:none!important;
|
||||
}
|
||||
:deep(.ant-table-cell){
|
||||
&::before{
|
||||
width: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -5,7 +5,9 @@ import router from './router'
|
||||
import store from './store'
|
||||
|
||||
import '@/style/index.scss'
|
||||
|
||||
// import 'ant-design-vue/dist/reset.css'
|
||||
import 'ant-design-vue/dist/reset.css'
|
||||
import '@/assets/iconfont/iconfont.css'
|
||||
import * as echarts from 'echarts/core'
|
||||
import { BarChart, LineChart } from 'echarts/charts'
|
||||
import {
|
||||
@@ -17,26 +19,14 @@ import {
|
||||
TransformComponent,
|
||||
DataZoomComponent
|
||||
} from 'echarts/components'
|
||||
|
||||
// 标签自动布局、全局过渡动画等特性
|
||||
import { LabelLayout, UniversalTransition } from 'echarts/features'
|
||||
// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
|
||||
import { CanvasRenderer } from 'echarts/renderers'
|
||||
import { setWidth } from '@/utils/column'
|
||||
import { getBtns } from '@/utils/btnList'
|
||||
import {
|
||||
message,
|
||||
Modal,
|
||||
Button,
|
||||
Table,
|
||||
Tag,
|
||||
Select,
|
||||
DatePicker,
|
||||
Input,
|
||||
Pagination,
|
||||
ConfigProvider,
|
||||
notification,
|
||||
TreeSelect
|
||||
} from 'ant-design-vue'
|
||||
import { message, Modal } from 'ant-design-vue'
|
||||
import VueTianditu from 'vue-tianditu'
|
||||
import SearchBox from '@/components/SearchBox.vue'
|
||||
import ComTable from '@/components/ComTable.vue'
|
||||
@@ -73,16 +63,5 @@ app.config.globalProperties.$message = message
|
||||
app.config.globalProperties.$Modal = Modal
|
||||
|
||||
app.use(store).use(router)
|
||||
app
|
||||
.use(Button)
|
||||
.use(Modal)
|
||||
.use(Table)
|
||||
.use(Tag)
|
||||
.use(Select)
|
||||
.use(DatePicker)
|
||||
.use(Input)
|
||||
.use(Pagination)
|
||||
.use(ConfigProvider)
|
||||
.use(notification)
|
||||
.use(TreeSelect)
|
||||
|
||||
app.use(VueTianditu).mount('#app')
|
||||
|
||||
@@ -16,7 +16,10 @@ $table-bg: #072e4a;
|
||||
$page-border: #cad2dd;
|
||||
//级联器样式,下拉选择器样式输入框等。。。
|
||||
.ant-switch {
|
||||
background: #00fffb;
|
||||
background: #b1c4c4;
|
||||
}
|
||||
.ant-switch.ant-switch-checked{
|
||||
background: #00fffb
|
||||
}
|
||||
|
||||
.ant-switch .ant-switch-handle::before {
|
||||
@@ -52,9 +55,13 @@ $page-border: #cad2dd;
|
||||
.ant-picker-separator {
|
||||
color: #fff !important;
|
||||
}
|
||||
.ant-picker-input::placeholder {
|
||||
.ant-picker-input input::placeholder {
|
||||
color: #ffffff3b !important;
|
||||
}
|
||||
.ant-picker-suffix{
|
||||
color: #ffffff !important;
|
||||
|
||||
}
|
||||
}
|
||||
.ant-input-affix-wrapper {
|
||||
.ant-input {
|
||||
@@ -90,7 +97,8 @@ $page-border: #cad2dd;
|
||||
|
||||
&:disabled {
|
||||
border: none;
|
||||
color: #fff;
|
||||
// color: #fff;
|
||||
background: $btn-confirm;
|
||||
}
|
||||
}
|
||||
.btn-del {
|
||||
|
||||
@@ -16,123 +16,123 @@ export const policyTypes = [
|
||||
|
||||
export const deviceTypeList = [
|
||||
{
|
||||
value: 1,
|
||||
value: '1',
|
||||
label: '变压器',
|
||||
iconfont: 'icon-transformer'
|
||||
},
|
||||
{
|
||||
value: 2,
|
||||
value: '2',
|
||||
label: '配电柜',
|
||||
iconfont: 'icon-dianpingcai'
|
||||
},
|
||||
{
|
||||
value: 3,
|
||||
value: '3',
|
||||
label: '电表',
|
||||
iconfont: 'icon-dianbiao'
|
||||
},
|
||||
{
|
||||
value: 4,
|
||||
value: '4',
|
||||
label: '门禁',
|
||||
iconfont: 'icon-menjin'
|
||||
},
|
||||
{
|
||||
value: 5,
|
||||
value: '5',
|
||||
label: '空调',
|
||||
iconfont: 'icon-kongdiaogongcheng'
|
||||
},
|
||||
{
|
||||
value: 6,
|
||||
value: '6',
|
||||
label: '照明',
|
||||
iconfont: 'icon-zhaomingdeng'
|
||||
},
|
||||
{
|
||||
value: 7,
|
||||
value: '7',
|
||||
label: '消防',
|
||||
iconfont: 'icon-xiaofang'
|
||||
},
|
||||
{
|
||||
value: 8,
|
||||
value: '8',
|
||||
label: '光照监测设备',
|
||||
iconfont: 'icon-guangzhaojianceshebei'
|
||||
},
|
||||
{
|
||||
value: 9,
|
||||
value: '9',
|
||||
label: '风速监测设备',
|
||||
iconfont: 'icon-fengsujiance'
|
||||
},
|
||||
{
|
||||
value: 10,
|
||||
value: '10',
|
||||
label: '温湿度监测设备',
|
||||
iconfont: 'icon-wenshidujiance'
|
||||
},
|
||||
{
|
||||
value: 11,
|
||||
value: '11',
|
||||
label: '烟感监测设备',
|
||||
iconfont: 'icon-yanganjiance'
|
||||
},
|
||||
{
|
||||
value: 12,
|
||||
value: '12',
|
||||
label: '水浸传感器',
|
||||
iconfont: 'icon-shuijinchuanganqiicon'
|
||||
},
|
||||
{
|
||||
value: 13,
|
||||
value: '13',
|
||||
label: '视频监控',
|
||||
iconfont: 'icon-shipinjiankong'
|
||||
},
|
||||
{
|
||||
value: 100,
|
||||
value: '100',
|
||||
label: '储能预制舱',
|
||||
iconfont: 'icon-jizhuangxiang'
|
||||
},
|
||||
{
|
||||
value: 101,
|
||||
value: '101',
|
||||
label: 'EMS',
|
||||
iconfont: 'icon-quexianguanli'
|
||||
},
|
||||
{
|
||||
value: 102,
|
||||
value: '102',
|
||||
label: 'PCS',
|
||||
iconfont: 'icon-nengyuanguanli'
|
||||
},
|
||||
{
|
||||
value: 103,
|
||||
value: '103',
|
||||
label: 'PCU',
|
||||
iconfont: 'icon-bianyaqi'
|
||||
},
|
||||
{
|
||||
value: 104,
|
||||
value: '104',
|
||||
label: 'BMS',
|
||||
iconfont: 'icon-BMSchunengdianchi'
|
||||
iconfont: 'icon-chunengguankong'
|
||||
},
|
||||
{
|
||||
value: 105,
|
||||
value: '105',
|
||||
label: 'BCU',
|
||||
iconfont: 'icon-L-chunengdianchicu'
|
||||
},
|
||||
{
|
||||
value: 106,
|
||||
value: '106',
|
||||
label: '充电桩',
|
||||
iconfont: 'icon-charging-pile-line'
|
||||
},
|
||||
{
|
||||
value: 107,
|
||||
value: '107',
|
||||
label: '充电枪',
|
||||
iconfont: 'icon-chongdianqiang'
|
||||
},
|
||||
{
|
||||
value: 108,
|
||||
value: '108',
|
||||
label: '集中器',
|
||||
iconfont: 'icon-jizhongqi'
|
||||
},
|
||||
{
|
||||
value: 109,
|
||||
value: '109',
|
||||
label: '光伏板',
|
||||
iconfont: 'icon-guangfuban'
|
||||
},
|
||||
{
|
||||
value: 110,
|
||||
label: '风力发电机光感',
|
||||
value: '110',
|
||||
label: '风力发电机',
|
||||
iconfont: 'icon-zhuangjirongliang'
|
||||
}
|
||||
]
|
||||
|
||||
@@ -82,6 +82,8 @@ export default {
|
||||
this.$message.success('登录成功')
|
||||
localStorage.setItem('token', res.token)
|
||||
localStorage.setItem('permission',JSON.stringify( res.permission) )
|
||||
localStorage.setItem('account',JSON.stringify( res.account) )
|
||||
|
||||
this.$router.push('/')
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,18 @@
|
||||
<template>
|
||||
<div class="main">
|
||||
<div class="header"></div>
|
||||
<div class="header">
|
||||
<span class="time">
|
||||
<span class="text" style="margin-right: 15px"> {{ dateVal }} </span>
|
||||
<span class="text" style="width: 80px;">{{ currentTime }}</span>
|
||||
<span class="text">{{ weekVal }}</span>
|
||||
</span>
|
||||
|
||||
<span class="title text"> 能源站监控与运行管理系统 </span>
|
||||
<span class="user">
|
||||
<span style="margin-right: 15px"> {{ user }}</span>
|
||||
<span class="iconfont icon-tuichu" @click="logout"></span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="page">
|
||||
<div class="subMenu" v-if="subMenu.length > 0">
|
||||
@@ -35,7 +47,9 @@
|
||||
|
||||
<script>
|
||||
// @ is an alias to /src
|
||||
|
||||
import moment from 'moment'
|
||||
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
|
||||
import { createVNode } from 'vue'
|
||||
export default {
|
||||
name: 'MainView',
|
||||
components: {},
|
||||
@@ -104,14 +118,19 @@ export default {
|
||||
]
|
||||
}
|
||||
],
|
||||
subMenu: []
|
||||
subMenu: [],
|
||||
currentTime: '',
|
||||
timer: null,
|
||||
dateVal: moment().locale('zh-cn').format('ll') + ' ',
|
||||
weekVal: moment().locale('zh-cn').format('dddd'),
|
||||
user:localStorage.getItem('account').replace(/^"|"$/g, '')
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
$route: {
|
||||
handler(n) {
|
||||
console.log(n,"nnnnnnnnnnnnnn")
|
||||
this.subMenu =n.matched[1].children || []
|
||||
console.log(n, 'nnnnnnnnnnnnnn')
|
||||
this.subMenu = n.matched[1].children || []
|
||||
},
|
||||
immediate: true
|
||||
}
|
||||
@@ -119,8 +138,35 @@ export default {
|
||||
|
||||
mounted() {
|
||||
this.initRoute()
|
||||
this.getDateTime()
|
||||
this.timer = setInterval(() => {
|
||||
this.getDateTime()
|
||||
}, 1000)
|
||||
},
|
||||
unmounted() {
|
||||
clearInterval(this.timer)
|
||||
},
|
||||
methods: {
|
||||
logout(){
|
||||
const that=this
|
||||
this.$Modal.confirm({
|
||||
title: '你确认退出系统吗?',
|
||||
icon: createVNode(ExclamationCircleOutlined),
|
||||
|
||||
async onOk() {
|
||||
localStorage.clear()
|
||||
that.$router.push('/login')
|
||||
},
|
||||
onCancel() {
|
||||
},
|
||||
class: 'test'
|
||||
})
|
||||
|
||||
},
|
||||
//getDateTime
|
||||
getDateTime() {
|
||||
this.currentTime = moment().locale('zh-cn').format('LTS')
|
||||
},
|
||||
// 过滤函数:根据权限数据过滤路由并附加权限信息
|
||||
filterRoutes(routes, permissions) {
|
||||
return routes.filter((route) => {
|
||||
@@ -130,7 +176,7 @@ export default {
|
||||
|
||||
// 如果有权限项,附加到路由对象
|
||||
if (routePermissions.length > 0) {
|
||||
route.permissions = routePermissions;
|
||||
route.permissions = routePermissions
|
||||
hasViewPermission = true
|
||||
}
|
||||
|
||||
@@ -155,7 +201,7 @@ export default {
|
||||
// this.menuList,
|
||||
// JSON.parse(localStorage.getItem('permission'))
|
||||
// )
|
||||
console.log( this.$route.matched, 'filteredRoutes')
|
||||
console.log(this.$route.matched, 'filteredRoutes')
|
||||
this.subMenu = this.$route.matched[1].children || []
|
||||
// this.menuList= JSON.parse(localStorage.getItem('permission'))
|
||||
// this.subMenu =filteredRoutes[0].children||[]
|
||||
@@ -172,7 +218,7 @@ export default {
|
||||
subMenuClick(subMenu) {
|
||||
console.log(subMenu, subMenu.path)
|
||||
this.subCurrentKey = subMenu.path
|
||||
this.$router.push('/system'+subMenu.path)
|
||||
this.$router.push('/system' + subMenu.path)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -188,6 +234,44 @@ export default {
|
||||
.header {
|
||||
width: 100%;
|
||||
height: 70px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 0 20px;
|
||||
.text {
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
rgb(255, 255, 255) 0%,
|
||||
rgb(227, 254, 255) 33.17%,
|
||||
rgb(35 190 195) 100%
|
||||
);
|
||||
|
||||
-webkit-background-clip: text; /* 兼容 WebKit 浏览器 */
|
||||
background-clip: text;
|
||||
color: transparent; /* 必须设置为透明 */
|
||||
display: inline-block; /* 确保背景裁剪生效 */
|
||||
line-height: 80px;
|
||||
font-size: 18px;
|
||||
}
|
||||
.title{
|
||||
font-size: 40px;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
margin-top: 10px;
|
||||
|
||||
}
|
||||
.user{
|
||||
font-weight: 700;
|
||||
font-size: 18px;
|
||||
.icon-tuichu{
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
}
|
||||
.time{
|
||||
font-weight: 700;
|
||||
}
|
||||
}
|
||||
.subMenu {
|
||||
display: flex;
|
||||
@@ -222,7 +306,7 @@ export default {
|
||||
height: 100%;
|
||||
}
|
||||
.subcontent {
|
||||
height: calc(100% - 46px);
|
||||
height: calc(100% - 56px);
|
||||
}
|
||||
.menu {
|
||||
position: absolute;
|
||||
@@ -242,6 +326,7 @@ export default {
|
||||
color: #fff;
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
border: 1px solid #ffffff00;
|
||||
cursor: pointer;
|
||||
margin: 0 35px;
|
||||
}
|
||||
|
||||
@@ -210,7 +210,8 @@ export default {
|
||||
@import url(@/style/color.scss);
|
||||
.monitor {
|
||||
// width: 100%;
|
||||
height: calc(100% - 40px);
|
||||
// height: calc(100% - 40px);
|
||||
height: 100%;
|
||||
padding: 20px;
|
||||
background: $bg1-color;
|
||||
border-radius: 15px;
|
||||
@@ -243,14 +244,13 @@ export default {
|
||||
display: grid;
|
||||
border-radius: 12px;
|
||||
background: $bg2-color;
|
||||
padding-top: 10px;
|
||||
padding-top: 15px;
|
||||
grid-template-rows: repeat(auto-fit, minmax(140px, 4fr));
|
||||
.station-item {
|
||||
flex: 1;
|
||||
width: 100px;
|
||||
margin: 0 10px 10px 10px;
|
||||
margin: 0 15px 15px 15px;
|
||||
border-radius: 12px;
|
||||
min-width: 160px;
|
||||
width: 180px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
color: #fff;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="alarmLog">
|
||||
<searchBox :btn-option-list="btnOptionList" @operateForm="operateForm"></searchBox>
|
||||
<!-- <searchBox :btn-option-list="btnOptionList" @operateForm="operateForm"></searchBox> -->
|
||||
|
||||
<div class="content-table">
|
||||
<ComTable
|
||||
@@ -15,8 +15,8 @@
|
||||
</template>
|
||||
<template #status="record">
|
||||
<span
|
||||
><a-tag :color="record.status ? 'red' : 'green'">{{
|
||||
record.status ? '异常' : '正常'
|
||||
><a-tag :color="record.status==0 ? 'red' : 'green'">{{
|
||||
record.status==0 ? '异常' : '正常'
|
||||
}}</a-tag></span
|
||||
>
|
||||
</template>
|
||||
@@ -193,10 +193,10 @@ export default {
|
||||
<style lang="scss" scoped>
|
||||
.alarmLog {
|
||||
height: 100%;
|
||||
padding: 20px;
|
||||
|
||||
.content-table {
|
||||
height: calc(100% - 90px);
|
||||
padding: 10px;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
<span>{{ getType(record.type) }}</span>
|
||||
</template>
|
||||
<template #isEnable="record">
|
||||
<span><a-tag :color="record.is_open ? 'green' : 'red'">{{
|
||||
record.is_open ? '启用' : '禁用'
|
||||
<span><a-tag :color="record.is_open==1 ? 'green' : 'red'">{{
|
||||
record.is_open==1 ? '启用' : '禁用'
|
||||
}}</a-tag></span>
|
||||
</template>
|
||||
|
||||
@@ -203,7 +203,7 @@ export default {
|
||||
if (i.key === 'id') {
|
||||
e.ruleForm.id = row.id
|
||||
} else if (i.key === 'is_open') {
|
||||
e.ruleForm.is_open = Boolean(row.is_open)
|
||||
e.ruleForm.is_open = Boolean(Number(row.is_open))
|
||||
} else {
|
||||
e.ruleForm[i.key] = row[i.key] || ''
|
||||
}
|
||||
@@ -232,10 +232,12 @@ export default {
|
||||
<style lang="scss" scoped>
|
||||
.device {
|
||||
height: 100%;
|
||||
padding: 0 10px;
|
||||
|
||||
.content-table {
|
||||
width: 100%;
|
||||
height: calc(100% - 90px);
|
||||
padding: 10px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="syslog">
|
||||
<searchBox :btn-option-list="btnOptionList" @operateForm="operateForm"></searchBox>
|
||||
<!-- <searchBox :btn-option-list="btnOptionList" @operateForm="operateForm"></searchBox> -->
|
||||
|
||||
<div class="content-table">
|
||||
<ComTable
|
||||
@@ -12,8 +12,8 @@
|
||||
>
|
||||
<template #status="record">
|
||||
<span>
|
||||
<a-tag :color="record.status ? 'red' : 'green'">{{
|
||||
record.status ? '异常' : '正常'
|
||||
<a-tag :color="record.status==0 ? 'red' : 'green'">{{
|
||||
record.status==0 ? '异常' : '正常'
|
||||
}}</a-tag>
|
||||
</span>
|
||||
</template>
|
||||
@@ -176,10 +176,10 @@ export default {
|
||||
<style lang="scss" scoped>
|
||||
.syslog {
|
||||
height: 100%;
|
||||
padding: 20px;
|
||||
|
||||
.content-table {
|
||||
height: calc(100% - 90px);
|
||||
padding: 10px;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<div>{{ getPolicyType(record.type) }}</div>
|
||||
</template>
|
||||
<template #isOpen="record">
|
||||
<a-tag :color="record.is_open == 1 ? '#2db7f5' : '#f50'">{{
|
||||
<a-tag :color="record.is_open == 1 ? 'green' : 'red'">{{
|
||||
record.is_open == 1 ? '启用' : '禁用'
|
||||
}}</a-tag>
|
||||
</template>
|
||||
@@ -28,8 +28,8 @@
|
||||
<div>
|
||||
<a-modal
|
||||
v-model:open="formModal"
|
||||
width="70%"
|
||||
style="top: 20px"
|
||||
width="900px"
|
||||
style="top: 20px;"
|
||||
:footer="null"
|
||||
:get-container="() => $refs.policy"
|
||||
>
|
||||
@@ -48,6 +48,7 @@ export default {
|
||||
name: '',
|
||||
components: { policyForm },
|
||||
props: {},
|
||||
|
||||
data() {
|
||||
return {
|
||||
formModal: false,
|
||||
@@ -58,21 +59,18 @@ export default {
|
||||
title: '策略ID',
|
||||
dataIndex: 'policy_id',
|
||||
key: 'policyId',
|
||||
width: 120,
|
||||
ellipsis: true
|
||||
},
|
||||
{
|
||||
title: '策略名称',
|
||||
dataIndex: 'name',
|
||||
key: 'name',
|
||||
width: 120,
|
||||
ellipsis: true
|
||||
},
|
||||
{
|
||||
title: '策略类型',
|
||||
dataIndex: 'type', //策略类型:1:削峰套利;2:需求响应;3:自发自用
|
||||
key: 'type',
|
||||
width: 120,
|
||||
ellipsis: true,
|
||||
scopedSlots: { customRender: 'type' }
|
||||
},
|
||||
@@ -80,7 +78,6 @@ export default {
|
||||
title: '策略描述',
|
||||
dataIndex: 'describe',
|
||||
key: 'describe',
|
||||
width: 120,
|
||||
ellipsis: true
|
||||
},
|
||||
{
|
||||
@@ -94,7 +91,6 @@ export default {
|
||||
title: '是否启用',
|
||||
dataIndex: 'is_open',
|
||||
key: 'isOpen',
|
||||
width: 120,
|
||||
ellipsis: true,
|
||||
scopedSlots: { customRender: 'isOpen' }
|
||||
},
|
||||
@@ -103,8 +99,8 @@ export default {
|
||||
title: '操作',
|
||||
dataIndex: 'action',
|
||||
key: 'action',
|
||||
width: 150,
|
||||
ellipsis: true,
|
||||
fixed:'right',
|
||||
scopedSlots: { customRender: 'action' }
|
||||
}
|
||||
],
|
||||
@@ -130,16 +126,18 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
async getTableList() {
|
||||
this.$refs.comTable.loading = true
|
||||
try {
|
||||
this.$refs.comTable.loading = false
|
||||
const res = await getReq('/queryPolicyList', {
|
||||
page: this.pageOption.page,
|
||||
page_size: this.pageOption.pageSize
|
||||
})
|
||||
console.log(res)
|
||||
this.tableData = res.data
|
||||
this.pageOption.count = res.count
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
this.$refs.comTable.loading = false
|
||||
}
|
||||
},
|
||||
getPolicyType(type) {
|
||||
@@ -236,10 +234,11 @@ export default {
|
||||
.policy {
|
||||
// width: 100%;
|
||||
height: 100%;
|
||||
padding: 0 15px;
|
||||
padding: 0 10px;
|
||||
.content-table {
|
||||
width: 100%;
|
||||
height: calc(100% - 90px);
|
||||
padding: 0 10px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -44,6 +44,7 @@ import { columnList, userOptions } from '../../../public/config/columnList'
|
||||
import { getReq, postReq } from '@/request/api.js'
|
||||
import EditCom from '@/components/EditCom.vue'
|
||||
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
|
||||
import { Modal } from 'ant-design-vue'
|
||||
import { createVNode } from 'vue'
|
||||
export default {
|
||||
name: '',
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
const { defineConfig } = require('@vue/cli-service')
|
||||
const path = require('path')
|
||||
const Components = require('unplugin-vue-components/webpack')
|
||||
const { AntDesignVueResolver } = require('unplugin-vue-components/resolvers')
|
||||
module.exports = defineConfig({
|
||||
transpileDependencies: true,
|
||||
publicPath: '/',
|
||||
@@ -30,7 +32,11 @@ module.exports = defineConfig({
|
||||
},
|
||||
less: {
|
||||
lessOptions: {
|
||||
javascriptEnabled: true // 兼容 Less 3.0+ 的 JavaScript 表达式
|
||||
modifyVars: {
|
||||
//这是配置css主题色
|
||||
'primary-color': '#143d7d'
|
||||
},
|
||||
javascriptEnabled: true
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -45,7 +51,15 @@ module.exports = defineConfig({
|
||||
|
||||
// 扩展 webpack 配置
|
||||
plugins: [
|
||||
// 添加插件
|
||||
Components({
|
||||
resolvers: [
|
||||
AntDesignVueResolver({
|
||||
resolveIcons: true, // 自动按需加载图标,
|
||||
importStyle: false //不单独导入样式,对样式进行全局引入
|
||||
})
|
||||
],
|
||||
dts: true // 生成类型声明
|
||||
})
|
||||
],
|
||||
resolve: {
|
||||
alias: {
|
||||
|
||||
Reference in New Issue
Block a user