Commit 725aa859 by lixinming

no message

parents
.idea
/out
/node_modules
/test
/public
/logs
/video
*.logs
*.zip
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "启动程序",
"program": "${workspaceFolder}/src/main.ts",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}
]
}
\ No newline at end of file
img/1.jpg

160 KB

img/2.jpg

74.5 KB

img/3.jpg

154 KB

img/4.jpg

82.1 KB

img/5.jpeg

7.96 KB

This source diff could not be displayed because it is too large. You can view the blob instead.
#
# Wavefront material file
# Converted by Meshlab Group
#
newmtl material_0
Ka 0.200000 0.200000 0.200000
Kd 1.000000 1.000000 1.000000
Ks 1.000000 1.000000 1.000000
Tr 0.000000
illum 2
Ns 0.000000
map_Kd model.jpg
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
server_tokens off;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:30001;
proxy_redirect http:// $scheme://;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
{
"name": "screen",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@alicloud/dybaseapi": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/@alicloud/dybaseapi/download/@alicloud/dybaseapi-1.0.0.tgz",
"integrity": "sha1-VS7dCZD5Db1p1AI3zf7/w2bQofU=",
"requires": {
"@alicloud/pop-core": "^1.3.3"
}
},
"@alicloud/dysmsapi-2017-05-25": {
"version": "1.0.1",
"resolved": "https://registry.npm.taobao.org/@alicloud/dysmsapi-2017-05-25/download/@alicloud/dysmsapi-2017-05-25-1.0.1.tgz",
"integrity": "sha1-qKtpTb4QXrnWfL0eNzV/ag+Eh9U=",
"requires": {
"@alicloud/pop-core": "^1.5.1"
}
},
"@alicloud/mns": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/@alicloud/mns/download/@alicloud/mns-1.0.0.tgz",
"integrity": "sha1-AzqBmJmNXtk9onw72f8LnusJDpY=",
"requires": {
"debug": "^2.6.3",
"httpx": "^2.1.1",
"kitx": "^1.2.0",
"xml2js": "^0.4.17"
}
},
"@alicloud/pop-core": {
"version": "1.7.10",
"resolved": "https://registry.npm.taobao.org/@alicloud/pop-core/download/@alicloud/pop-core-1.7.10.tgz?cache=0&sync_timestamp=1603357203292&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40alicloud%2Fpop-core%2Fdownload%2F%40alicloud%2Fpop-core-1.7.10.tgz",
"integrity": "sha1-0OIhA227DM3kU90Jsc+r2DQbemk=",
"requires": {
"debug": "^3.1.0",
"httpx": "^2.1.2",
"json-bigint": "^1.0.0",
"kitx": "^1.2.1",
"xml2js": "^0.4.17"
},
"dependencies": {
"debug": {
"version": "3.2.7",
"resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.7.tgz?cache=0&sync_timestamp=1607566580543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.2.7.tgz",
"integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=",
"requires": {
"ms": "^2.1.1"
}
},
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.3.tgz?cache=0&sync_timestamp=1607433905701&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.3.tgz",
"integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI="
}
}
},
"@alicloud/sms-sdk": {
"version": "1.1.6",
"resolved": "https://registry.npm.taobao.org/@alicloud/sms-sdk/download/@alicloud/sms-sdk-1.1.6.tgz",
"integrity": "sha1-dwHq4eCDLINo1nebQtWDaPlEy/A=",
"requires": {
"@alicloud/dybaseapi": "^1.0.0",
"@alicloud/dysmsapi-2017-05-25": "^1.0.1",
"@alicloud/mns": "^1.0.0-beta6",
"babel-runtime": "^6.26.0"
}
},
"@babel/runtime": {
"version": "7.13.10",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz",
"integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==",
"requires": {
"regenerator-runtime": "^0.13.4"
},
"dependencies": {
"regenerator-runtime": {
"version": "0.13.7",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
"integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
}
}
},
"@mongodb-js/saslprep": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz",
"integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==",
"optional": true,
"requires": {
"sparse-bitfield": "^3.0.3"
}
},
"@types/debug": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
"integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
"requires": {
"@types/ms": "*"
}
},
"@types/ms": {
"version": "0.7.34",
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
"integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
},
"@types/node": {
"version": "10.17.55",
"resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-10.17.55.tgz?cache=0&sync_timestamp=1615834822695&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-10.17.55.tgz",
"integrity": "sha1-oUfygu3sZ5uJTUaU7bWr61lf7L0="
},
"@types/validator": {
"version": "13.11.7",
"resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.7.tgz",
"integrity": "sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q=="
},
"@types/webidl-conversions": {
"version": "7.0.1",
"resolved": "https://registry.npmmirror.com/@types/webidl-conversions/-/webidl-conversions-7.0.1.tgz",
"integrity": "sha512-8hKOnOan+Uu+NgMaCouhg3cT9x5fFZ92Jwf+uDLXLu/MFRbXxlWwGeQY7KVHkeSft6RvY+tdxklUBuyY9eIEKg=="
},
"@types/whatwg-url": {
"version": "8.2.2",
"resolved": "https://registry.npmmirror.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
"integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
"requires": {
"@types/node": "*",
"@types/webidl-conversions": "*"
}
},
"accepts": {
"version": "1.3.7",
"resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz",
"integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=",
"requires": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
}
},
"adler-32": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
"integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"requires": {
"debug": "4"
},
"dependencies": {
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.6.tgz",
"integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=",
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz",
"integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=",
"requires": {
"safer-buffer": "~2.1.0"
}
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"async-limiter": {
"version": "1.0.1",
"resolved": "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz",
"integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"aws4": {
"version": "1.11.0",
"resolved": "https://registry.npm.taobao.org/aws4/download/aws4-1.11.0.tgz?cache=0&sync_timestamp=1604101311814&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faws4%2Fdownload%2Faws4-1.11.0.tgz",
"integrity": "sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk="
},
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"requires": {
"tweetnacl": "^0.14.3"
}
},
"bignumber.js": {
"version": "9.0.1",
"resolved": "https://registry.npm.taobao.org/bignumber.js/download/bignumber.js-9.0.1.tgz",
"integrity": "sha1-jXuhJMiCv9jkMmDGdHVRjQaJ5OU="
},
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"requires": {
"bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
"qs": "6.7.0",
"raw-body": "2.4.0",
"type-is": "~1.6.17"
},
"dependencies": {
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
}
}
},
"bson": {
"version": "6.1.0",
"resolved": "https://registry.npmmirror.com/bson/-/bson-6.1.0.tgz",
"integrity": "sha512-yiQ3KxvpVoRpx1oD1uPz4Jit9tAVTJgjdmjDKtUErkOoL9VNoF8Dd58qtAOL5E40exx2jvAT9sqdRSK/r+SHlA=="
},
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
},
"bytes": {
"version": "3.0.0",
"resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz",
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
},
"call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"requires": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
}
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"cfb": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz",
"integrity": "sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ==",
"requires": {
"adler-32": "~1.2.0",
"crc-32": "~1.2.0",
"printj": "~1.1.2"
}
},
"charenc": {
"version": "0.0.2",
"resolved": "https://registry.npm.taobao.org/charenc/download/charenc-0.0.2.tgz",
"integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
},
"codepage": {
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz",
"integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=",
"requires": {
"commander": "~2.14.1",
"exit-on-epipe": "~1.0.1"
},
"dependencies": {
"commander": {
"version": "2.14.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
"integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
}
}
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz",
"integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"commander": {
"version": "2.17.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
},
"compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz",
"integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
"requires": {
"mime-db": ">= 1.43.0 < 2"
}
},
"compression": {
"version": "1.7.4",
"resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz",
"integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
"requires": {
"accepts": "~1.3.5",
"bytes": "3.0.0",
"compressible": "~2.0.16",
"debug": "2.6.9",
"on-headers": "~1.0.2",
"safe-buffer": "5.1.2",
"vary": "~1.1.2"
}
},
"content-disposition": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
"requires": {
"safe-buffer": "5.1.2"
}
},
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
},
"cookie": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"core-js": {
"version": "2.6.12",
"resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.12.tgz?cache=0&sync_timestamp=1614537347747&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-2.6.12.tgz",
"integrity": "sha1-2TM9+nsGXjR8xWgiGdb2kIWcwuw="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"crc-32": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
"integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"crypt": {
"version": "0.0.2",
"resolved": "https://registry.npm.taobao.org/crypt/download/crypt-0.0.2.tgz",
"integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
},
"crypto-js": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
"integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
},
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz?cache=0&sync_timestamp=1601073333186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdashdash%2Fdownload%2Fdashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"date-format": {
"version": "4.0.13",
"resolved": "http://localhost:4873/date-format/-/date-format-4.0.13.tgz",
"integrity": "sha512-bnYCwf8Emc3pTD8pXnre+wfnjGtfi5ncMDKy7+cWZXbmRAsdWkOQHrfC1yz/KiwP5thDp2kCHWYWKBX4HP1hoQ=="
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1607566580543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
"integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
"requires": {
"ms": "2.0.0"
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
},
"destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"dottie": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
"integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA=="
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
},
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
"exit-on-epipe": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
"integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
},
"express": {
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
"requires": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
"body-parser": "1.19.0",
"content-disposition": "0.5.3",
"content-type": "~1.0.4",
"cookie": "0.4.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "~1.1.2",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "~1.1.2",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.5",
"qs": "6.7.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.1.2",
"send": "0.17.1",
"serve-static": "1.14.1",
"setprototypeof": "1.1.1",
"statuses": "~1.5.0",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"dependencies": {
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
}
}
},
"express-async-handler": {
"version": "1.1.4",
"resolved": "https://registry.npm.taobao.org/express-async-handler/download/express-async-handler-1.1.4.tgz",
"integrity": "sha1-IlqEkI32OzWunflLbw8a8GEmZCY="
},
"express-history-api-fallback": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz",
"integrity": "sha1-OirSf3vryQ/FM9EQ18bYMJe80Fc="
},
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz",
"integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo="
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz",
"integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU="
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM="
},
"fflate": {
"version": "0.3.11",
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.3.11.tgz",
"integrity": "sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A=="
},
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"statuses": "~1.5.0",
"unpipe": "~1.0.0"
}
},
"flatted": {
"version": "3.2.6",
"resolved": "http://localhost:4873/flatted/-/flatted-3.2.6.tgz",
"integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ=="
},
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
},
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz",
"integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
},
"formidable": {
"version": "1.2.2",
"resolved": "https://registry.npm.taobao.org/formidable/download/formidable-1.2.2.tgz",
"integrity": "sha1-v2muopcpgmdfAIZTQrmCmG9rjdk="
},
"forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
},
"frac": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
},
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
"fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
},
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"generate-function": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
"integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
"requires": {
"is-property": "^1.0.2"
}
},
"get-intrinsic": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
"integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.3"
}
},
"get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"graceful-fs": {
"version": "4.2.10",
"resolved": "http://localhost:4873/graceful-fs/-/graceful-fs-4.2.10.tgz",
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
},
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
},
"har-validator": {
"version": "5.1.5",
"resolved": "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.5.tgz",
"integrity": "sha1-HwgDufjLIMD6E4It8ezds2veHv0=",
"requires": {
"ajv": "^6.12.3",
"har-schema": "^2.0.0"
}
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"requires": {
"function-bind": "^1.1.1"
}
},
"has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
},
"http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
}
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz?cache=0&sync_timestamp=1600868613104&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-signature%2Fdownload%2Fhttp-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"https-proxy-agent": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"requires": {
"agent-base": "6",
"debug": "4"
},
"dependencies": {
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"httpx": {
"version": "2.2.7",
"resolved": "https://registry.npm.taobao.org/httpx/download/httpx-2.2.7.tgz",
"integrity": "sha1-HjQZgUbjLKMwWmbBEglVnhy+ugk=",
"requires": {
"@types/node": "^14",
"debug": "^4.1.1"
},
"dependencies": {
"@types/node": {
"version": "14.14.35",
"resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-14.14.35.tgz?cache=0&sync_timestamp=1615834822695&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-14.14.35.tgz",
"integrity": "sha1-QslTpOKxirkx9yR35wEhcvT/oxM="
},
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npm.taobao.org/debug/download/debug-4.3.1.tgz?cache=0&sync_timestamp=1607566580543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.3.1.tgz",
"integrity": "sha1-8NIpxQXgxtjEmsVT0bE9wYP2su4=",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1607433905701&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz",
"integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk="
}
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"inflection": {
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",
"integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw=="
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"ip": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ip/-/ip-2.0.0.tgz",
"integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
},
"ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
},
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz?cache=0&sync_timestamp=1604429388528&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz",
"integrity": "sha1-76ouqdqg16suoTqXsritUf776L4="
},
"is-property": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
"integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
},
"is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
},
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"json-bigint": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/json-bigint/download/json-bigint-1.0.0.tgz",
"integrity": "sha1-rlR4I6wMrYOYZn+M2e9HMPWwH/E=",
"requires": {
"bignumber.js": "^9.0.0"
}
},
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz?cache=0&sync_timestamp=1609553708276&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema%2Fdownload%2Fjson-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz?cache=0&sync_timestamp=1608000211395&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.4.1.tgz",
"integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA="
},
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
"jsonfile": {
"version": "4.0.0",
"resolved": "http://localhost:4873/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"requires": {
"graceful-fs": "^4.1.6"
}
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"verror": "1.10.0"
}
},
"kareem": {
"version": "2.5.1",
"resolved": "https://registry.npmmirror.com/kareem/-/kareem-2.5.1.tgz",
"integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA=="
},
"kitx": {
"version": "1.3.0",
"resolved": "https://registry.npm.taobao.org/kitx/download/kitx-1.3.0.tgz",
"integrity": "sha1-qz7nxZjSsdYp/VVWj4aMREDCAOo="
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"log4js": {
"version": "6.6.1",
"resolved": "http://localhost:4873/log4js/-/log4js-6.6.1.tgz",
"integrity": "sha512-J8VYFH2UQq/xucdNu71io4Fo+purYYudyErgBbswWKO0MC6QVOERRomt5su/z6d3RJSmLyTGmXl3Q/XjKCf+/A==",
"requires": {
"date-format": "^4.0.13",
"debug": "^4.3.4",
"flatted": "^3.2.6",
"rfdc": "^1.3.0",
"streamroller": "^3.1.2"
},
"dependencies": {
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"long": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
"integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
},
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz",
"integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=",
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"md5": {
"version": "2.3.0",
"resolved": "https://registry.npm.taobao.org/md5/download/md5-2.3.0.tgz?cache=0&sync_timestamp=1596362680344&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmd5%2Fdownload%2Fmd5-2.3.0.tgz",
"integrity": "sha1-w9qaaq46MLRreww0m4exENw72k8=",
"requires": {
"charenc": "0.0.2",
"crypt": "0.0.2",
"is-buffer": "~1.1.6"
}
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
"memory-pager": {
"version": "1.5.0",
"resolved": "https://registry.npmmirror.com/memory-pager/-/memory-pager-1.5.0.tgz",
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
"optional": true
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
},
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.46.0",
"resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.46.0.tgz?cache=0&sync_timestamp=1613194744108&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.46.0.tgz",
"integrity": "sha1-Ymd0in95lZTePLyM3pHe80lmHO4="
},
"mime-types": {
"version": "2.1.29",
"resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.29.tgz?cache=0&sync_timestamp=1613608491741&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.29.tgz",
"integrity": "sha1-HUq3faZLkfX3JInfKSNlY3VLsbI=",
"requires": {
"mime-db": "1.46.0"
}
},
"moment": {
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
},
"moment-timezone": {
"version": "0.5.43",
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz",
"integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==",
"requires": {
"moment": "^2.29.4"
},
"dependencies": {
"moment": {
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
}
}
},
"mongodb": {
"version": "5.9.0",
"resolved": "https://registry.npmmirror.com/mongodb/-/mongodb-5.9.0.tgz",
"integrity": "sha512-g+GCMHN1CoRUA+wb1Agv0TI4YTSiWr42B5ulkiAfLLHitGK1R+PkSAf3Lr5rPZwi/3F04LiaZEW0Kxro9Fi2TA==",
"requires": {
"@mongodb-js/saslprep": "^1.1.0",
"bson": "^5.5.0",
"mongodb-connection-string-url": "^2.6.0",
"socks": "^2.7.1"
},
"dependencies": {
"bson": {
"version": "5.5.0",
"resolved": "https://registry.npmmirror.com/bson/-/bson-5.5.0.tgz",
"integrity": "sha512-B+QB4YmDx9RStKv8LLSl/aVIEV3nYJc3cJNNTK2Cd1TL+7P+cNpw9mAPeCgc5K+j01Dv6sxUzcITXDx7ZU3F0w=="
}
}
},
"mongodb-connection-string-url": {
"version": "2.6.0",
"resolved": "https://registry.npmmirror.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
"integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
"requires": {
"@types/whatwg-url": "^8.2.1",
"whatwg-url": "^11.0.0"
},
"dependencies": {
"tr46": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz",
"integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
"requires": {
"punycode": "^2.1.1"
}
},
"webidl-conversions": {
"version": "7.0.0",
"resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
"integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
},
"whatwg-url": {
"version": "11.0.0",
"resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz",
"integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
"requires": {
"tr46": "^3.0.0",
"webidl-conversions": "^7.0.0"
}
}
}
},
"mongoose": {
"version": "7.6.0",
"resolved": "https://registry.npmmirror.com/mongoose/-/mongoose-7.6.0.tgz",
"integrity": "sha512-ztQ12rm0BQN5i7LB6xhWX4l9a9w2aa3jEwa/mM2vAutYJRyAwOzcusvKJBULMzFHyUDBOVW15grisexypgMIWA==",
"requires": {
"bson": "^5.4.0",
"kareem": "2.5.1",
"mongodb": "5.9.0",
"mpath": "0.9.0",
"mquery": "5.0.0",
"ms": "2.1.3",
"sift": "16.0.1"
},
"dependencies": {
"bson": {
"version": "5.5.0",
"resolved": "https://registry.npmmirror.com/bson/-/bson-5.5.0.tgz",
"integrity": "sha512-B+QB4YmDx9RStKv8LLSl/aVIEV3nYJc3cJNNTK2Cd1TL+7P+cNpw9mAPeCgc5K+j01Dv6sxUzcITXDx7ZU3F0w=="
},
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
}
}
},
"mpath": {
"version": "0.9.0",
"resolved": "https://registry.npmmirror.com/mpath/-/mpath-0.9.0.tgz",
"integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew=="
},
"mquery": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/mquery/-/mquery-5.0.0.tgz",
"integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
"requires": {
"debug": "4.x"
},
"dependencies": {
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433905701&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"mysql": {
"version": "2.18.1",
"resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
"integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
"requires": {
"bignumber.js": "9.0.0",
"readable-stream": "2.3.7",
"safe-buffer": "5.1.2",
"sqlstring": "2.3.1"
},
"dependencies": {
"bignumber.js": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
"integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="
}
}
},
"mysql2": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.0.tgz",
"integrity": "sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==",
"requires": {
"denque": "^2.1.0",
"generate-function": "^2.3.1",
"iconv-lite": "^0.6.3",
"long": "^5.2.1",
"lru-cache": "^8.0.0",
"named-placeholders": "^1.1.3",
"seq-queue": "^0.0.5",
"sqlstring": "^2.3.2"
},
"dependencies": {
"denque": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
"integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="
},
"iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
}
},
"lru-cache": {
"version": "8.0.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz",
"integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA=="
},
"sqlstring": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
"integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="
}
}
},
"named-placeholders": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
"integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
"requires": {
"lru-cache": "^7.14.1"
},
"dependencies": {
"lru-cache": {
"version": "7.18.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
"integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="
}
}
},
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz",
"integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs="
},
"node-fetch": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
"integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
"requires": {
"whatwg-url": "^5.0.0"
}
},
"node-xlsx": {
"version": "0.16.1",
"resolved": "https://registry.npmjs.org/node-xlsx/-/node-xlsx-0.16.1.tgz",
"integrity": "sha512-mwEZKItGXKO+jp5Pz9+wDCXxqhJITGd6m81A8WmalBpGAzREiR5cIJ0xrSF0BxzU6Mh2mC0fA2X0/3GqNU6dIw==",
"requires": {
"@babel/runtime": "^7.12.5",
"buffer-from": "^1.1.1",
"xlsx": "^0.16.9"
}
},
"nodemailer": {
"version": "6.5.0",
"resolved": "https://registry.npm.taobao.org/nodemailer/download/nodemailer-6.5.0.tgz?cache=0&sync_timestamp=1614329161993&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnodemailer%2Fdownload%2Fnodemailer-6.5.0.tgz",
"integrity": "sha1-0Swo2NSHeJGOJfGZnZeRAjGxddk="
},
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz",
"integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU="
},
"object-inspect": {
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
"integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"requires": {
"ee-first": "1.1.1"
}
},
"on-headers": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
},
"opentype.js": {
"version": "0.7.3",
"resolved": "https://registry.npm.taobao.org/opentype.js/download/opentype.js-0.7.3.tgz",
"integrity": "sha1-QPuM4Yv9YOdESO/f5EKDQJg5eqs=",
"requires": {
"tiny-inflate": "^1.0.2"
}
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
},
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"pg-connection-string": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz",
"integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA=="
},
"printj": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/printj/-/printj-1.1.2.tgz",
"integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
},
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz",
"integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I="
},
"proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"requires": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
}
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
},
"psl": {
"version": "1.8.0",
"resolved": "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz",
"integrity": "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ="
},
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
"integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
},
"qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"requires": {
"side-channel": "^1.0.4"
}
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
"raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"requires": {
"bytes": "3.1.0",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"dependencies": {
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
}
}
},
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz",
"integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz",
"integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk="
},
"request": {
"version": "2.88.2",
"resolved": "https://registry.npm.taobao.org/request/download/request-2.88.2.tgz",
"integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=",
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
"har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"dependencies": {
"qs": {
"version": "6.5.3",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz",
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
}
}
},
"retry-as-promised": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz",
"integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA=="
},
"rfdc": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz",
"integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
"integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz",
"integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
},
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"requires": {
"lru-cache": "^6.0.0"
},
"dependencies": {
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"requires": {
"yallist": "^4.0.0"
}
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
}
}
},
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
"requires": {
"debug": "2.6.9",
"depd": "~1.1.2",
"destroy": "~1.0.4",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "~1.7.2",
"mime": "1.6.0",
"ms": "2.1.1",
"on-finished": "~2.3.0",
"range-parser": "~1.2.1",
"statuses": "~1.5.0"
},
"dependencies": {
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
}
}
},
"seq-queue": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
"integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
},
"sequelize": {
"version": "6.35.1",
"resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.1.tgz",
"integrity": "sha512-UlP5k33nJsN11wCDLaWZXw9bB8w4ESKc5QmG6D04qMimwBwKVNeqRJiaaBlEJdtg8cRK+OJh95dliP+uEi+g9Q==",
"requires": {
"@types/debug": "^4.1.8",
"@types/validator": "^13.7.17",
"debug": "^4.3.4",
"dottie": "^2.0.6",
"inflection": "^1.13.4",
"lodash": "^4.17.21",
"moment": "^2.29.4",
"moment-timezone": "^0.5.43",
"pg-connection-string": "^2.6.1",
"retry-as-promised": "^7.0.4",
"semver": "^7.5.4",
"sequelize-pool": "^7.1.0",
"toposort-class": "^1.0.1",
"uuid": "^8.3.2",
"validator": "^13.9.0",
"wkx": "^0.5.0"
},
"dependencies": {
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"requires": {
"ms": "2.1.2"
}
},
"moment": {
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
}
}
},
"sequelize-pool": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
"integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg=="
},
"serve-static": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.17.1"
}
},
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
},
"side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"requires": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
}
},
"sift": {
"version": "16.0.1",
"resolved": "https://registry.npmmirror.com/sift/-/sift-16.0.1.tgz",
"integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
},
"smart-buffer": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz",
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
},
"socks": {
"version": "2.7.1",
"resolved": "https://registry.npmmirror.com/socks/-/socks-2.7.1.tgz",
"integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
"requires": {
"ip": "^2.0.0",
"smart-buffer": "^4.2.0"
}
},
"sparse-bitfield": {
"version": "3.0.3",
"resolved": "https://registry.npmmirror.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
"integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
"optional": true,
"requires": {
"memory-pager": "^1.0.2"
}
},
"sqlstring": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
"integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A="
},
"ssf": {
"version": "0.11.2",
"resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
"integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
"requires": {
"frac": "~1.1.2"
}
},
"sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz",
"integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=",
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
}
},
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
"streamroller": {
"version": "3.1.2",
"resolved": "http://localhost:4873/streamroller/-/streamroller-3.1.2.tgz",
"integrity": "sha512-wZswqzbgGGsXYIrBYhOE0yP+nQ6XRk7xDcYwuQAGTYXdyAUmvgVFE0YU1g5pvQT0m7GBaQfYcSnlHbapuK0H0A==",
"requires": {
"date-format": "^4.0.13",
"debug": "^4.3.4",
"fs-extra": "^8.1.0"
},
"dependencies": {
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz",
"integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
"requires": {
"safe-buffer": "~5.1.0"
}
},
"svg-captcha": {
"version": "1.4.0",
"resolved": "https://registry.npm.taobao.org/svg-captcha/download/svg-captcha-1.4.0.tgz",
"integrity": "sha1-MurTxkY5NsIYuzvJ7QT+pO7/5JI=",
"requires": {
"opentype.js": "^0.7.3"
}
},
"tencentcloud-sdk-nodejs": {
"version": "4.0.562",
"resolved": "https://registry.npmjs.org/tencentcloud-sdk-nodejs/-/tencentcloud-sdk-nodejs-4.0.562.tgz",
"integrity": "sha512-v519qlSr39bWeQiulCYZx6Doz3rs2R5gyKenj3LEDdo/SIlfZHdPEOEwqxcc5Fu9WSL4BRX74H2w8o/BN+1xyg==",
"requires": {
"form-data": "^3.0.0",
"get-stream": "^6.0.0",
"https-proxy-agent": "^5.0.0",
"is-stream": "^2.0.0",
"node-fetch": "^2.2.0",
"tslib": "1.13.0"
},
"dependencies": {
"form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz",
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
}
}
},
"tiny-inflate": {
"version": "1.0.3",
"resolved": "https://registry.npm.taobao.org/tiny-inflate/download/tiny-inflate-1.0.3.tgz",
"integrity": "sha1-EicVSUkToYBRZqr3yTRnkz7qJsQ="
},
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"toposort-class": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
"integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg=="
},
"tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz",
"integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=",
"requires": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
}
},
"tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"tslib": {
"version": "1.13.0",
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.13.0.tgz",
"integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
},
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"requires": {
"safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
},
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"requires": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
}
},
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
},
"uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz?cache=0&sync_timestamp=1610237586670&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.1.tgz",
"integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=",
"requires": {
"punycode": "^2.1.0"
}
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1607460052228&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz",
"integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4="
},
"validator": {
"version": "13.11.0",
"resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz",
"integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ=="
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
"whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"requires": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
}
},
"wkx": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",
"integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
"requires": {
"@types/node": "*"
}
},
"wmf": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
"integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
},
"word": {
"version": "0.3.0",
"resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
"integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
},
"ws": {
"version": "5.2.2",
"resolved": "https://registry.npm.taobao.org/ws/download/ws-5.2.2.tgz?cache=0&sync_timestamp=1615063662500&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-5.2.2.tgz",
"integrity": "sha1-3/7xSGa46NyRM1glFNG++vlumA8=",
"requires": {
"async-limiter": "~1.0.0"
}
},
"xlsx": {
"version": "0.16.9",
"resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.16.9.tgz",
"integrity": "sha512-gxi1I3EasYvgCX1vN9pGyq920Ron4NO8PNfhuoA3Hpq6Y8f0ECXiy4OLrK4QZBnj1jx3QD+8Fq5YZ/3mPZ5iXw==",
"requires": {
"adler-32": "~1.2.0",
"cfb": "^1.1.4",
"codepage": "~1.14.0",
"commander": "~2.17.1",
"crc-32": "~1.2.0",
"exit-on-epipe": "~1.0.1",
"fflate": "^0.3.8",
"ssf": "~0.11.2",
"wmf": "~1.0.1",
"word": "~0.3.0"
}
},
"xml2js": {
"version": "0.4.23",
"resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.4.23.tgz",
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
"requires": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
}
},
"xmlbuilder": {
"version": "11.0.1",
"resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
}
}
}
{
"name": "screen",
"version": "1.0.0",
"description": "",
"main": "main.ts",
"dependencies": {
"@alicloud/sms-sdk": "^1.1.6",
"@types/node": "^10.12.18",
"bson": "^6.1.0",
"compression": "^1.7.4",
"crypto-js": "^4.2.0",
"express": "^4.17.1",
"express-async-handler": "^1.1.4",
"express-history-api-fallback": "^2.2.1",
"formidable": "^1.2.1",
"log4js": "^6.6.1",
"lru-cache": "^4.1.5",
"md5": "^2.2.1",
"moment": "^2.29.4",
"mongoose": "^7.6.0",
"mysql": "^2.18.1",
"mysql2": "^3.6.0",
"node-xlsx": "^0.16.1",
"nodemailer": "^6.1.1",
"qs": "^6.11.0",
"request": "^2.88.0",
"sequelize": "^6.35.1",
"svg-captcha": "^1.3.12",
"tencentcloud-sdk-nodejs": "^4.0.562",
"ws": "^5.2.2",
"xml2js": "^0.4.23"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "cjj",
"license": "ISC",
"bin": "./out/main.js",
"pkg": {
"scripts": "out/**/*.js",
"assets": [
"public/**/*",
"res/**/*",
"images/**/*",
"video/**/*"
],
"outputPath": "dist"
}
}
<config>
<port>30001</port>
<sign>xxx90909082fsdahfjosadjfpoiwausjorip2hjklrhn1ioud0u124rx0qwejfokasjfolksaujfoas</sign>
<appKey>1384855435661541376</appKey>
<appSecret>lRPbWFMckxc5tth6ZQnJtsBwCYIH0CXjcf0rvFgSOD8=</appSecret>
</config>
import { DATAQUEUEENUM } from "../config/enum";
import { APIENUM } from "../config/interficeEnum";
import { getQueueData, getReqApiData } from "../data/queueData";
export async function getStudentStatsGradeLeft(gradeId:string) {
let xiuYeKeChengYuXueYeChengJi = {
xueXiZongShiChang:'0分',
zongChengJiPingFen:'',
geBanJiALv:[
{key:"1班", value:0},
{key:"2班", value:0},
{key:"3班", value:0},
{key:"4班", value:0},
{key:"5班", value:0},
]
};
let pinDeFaZhan = {
sheHuiShiJianQingKuang:getQueueData(DATAQUEUEENUM.学生年级_年级社会实践活动类型统计, gradeId) || [],
deYuHuoDong:{
yanBaoJianCao:'0分',
laoDongGang:'0分',
chiYouShi:'0分',
shouJiGuanLi:'0分'
},
chart:[
{key:"参观展览", value:0},
{key:"美术馆", value:0},
{key:"绘画比赛", value:0},
{key:"画展", value:0}
],
huoDongJiLu:[
// "活动名称xxxxx",
// "活动名称xxxxx",
// "活动名称xxxxx",
// "活动名称xxxxx"
]
};
let shenXinJianKang = {
shenTiJianKang:`${getQueueData(DATAQUEUEENUM.学生年级_视力不良率, gradeId) || 0}%`,
heGeLv:`${getQueueData(DATAQUEUEENUM.学生年级_体质监测合格率, gradeId) || 0}%`,
zhongDaBingZheng:`${getQueueData(DATAQUEUEENUM.学生年级_过敏人数, gradeId) || 0}人`,
tiZhiJianCeHeGeLv:[
{key:"身高", value:0},
{key:"体重", value:0},
{key:"肺活量", value:0},
{key:"血常规", value:0}
]
};
return {xiuYeKeChengYuXueYeChengJi, pinDeFaZhan, shenXinJianKang};
}
export async function getStudentStatsGradeRight(gradeId:string) {
let keJiSuYang = {
imageList:[
"http://192.168.0.105:30001/img1.png",
"http://192.168.0.105:30001/img2.png",
"http://192.168.0.105:30001/img3.png",
"http://192.168.0.105:30001/img4.png"
],
tableList:[]
};
let renWenSuYang = {
count:null,
duration:null,
report:null,
typeList:[
// {key:"类型1", value:0},
// {key:"类型2", value:10},
// {key:"类型3", value:10}
],
etiquette:[
{key:"尊敬师长",value:10},
{key:"仪表整洁",value:1},
{key:"讲文明",value:2},
{key:"讲文明",value:2},
{key:"讲文明",value:2},
{key:"讲文明",value:2}
]
};
let yiShuSuYang = {
musicalInstrument:null,
perform:null,
speech:null,
tableList:[]
}
let tiYuSuYang = {
sportsHobbies:null,
competition:null,
awards:null,
tableList:[]
};
let reqActivityData:any = await getReqApiData(APIENUM.获取学生活动列表, {pageNo:1, pageSize:10, gradeId });
if (reqActivityData.list && Array.isArray(reqActivityData.list.list) && reqActivityData.list.list.length > 0) {
reqActivityData.list.list.forEach(info => {
let {activityTime, activityName, activityType} = info;
let addItem = {
time:activityTime||'',
title:activityName||'',
type:activityType
};
switch(activityType) {
case "课题研究":
case "参观实践":keJiSuYang.tableList.push(addItem); break;
// case "多彩阅读":
// case "读书报告":
// case "社区服务":
case "演讲记录":
yiShuSuYang.speech += 1;
break;
case "乐器演奏":
yiShuSuYang.musicalInstrument += 1;
yiShuSuYang.tableList.push(addItem);
break;
case "学段公演":
yiShuSuYang.perform += 1;
yiShuSuYang.tableList.push(addItem);
break;
case "运动记录":
tiYuSuYang.sportsHobbies += 1;
tiYuSuYang.tableList.push(addItem);
break;
}
});
}
let reqAwardsData:any = await getReqApiData(APIENUM.获取学生获奖列表, {pageNo:1, pageSize:10, gradeId });
if (reqAwardsData.list && Array.isArray(reqAwardsData.list.list) && reqAwardsData.list.list.length > 0) {
reqAwardsData.list.list.forEach(info => {
let {awardType} = info;
if (awardType == "健康") tiYuSuYang.awards += 1;
});
}
let result = {
keJiSuYang, renWenSuYang, yiShuSuYang, tiYuSuYang
};
return result;
}
export async function getStudentStatsGradeCenter(gradeId:string) {
let xueShengZongShu = getQueueData(DATAQUEUEENUM.学生年级_年级人数, gradeId) || 0;
let jiuGeYiAVGQueueList = getQueueData(DATAQUEUEENUM.九个一年级平均, gradeId) || [];
let jiuGeYiAVGList = [];
jiuGeYiAVGQueueList.forEach(info => {
jiuGeYiAVGList.push({
key:info.key,
value:Math.round(info.value * 10000)/100
});
});
let jiuGeYi = {
max:[
{key:"完成一个课题研究", value:100},
{key:"阅读一本经典书籍", value:100},
{key:"举办一场读书报告", value:100},
{key:"进行一次公开演讲", value:100},
{key:"掌握一门乐器演变", value:100},
{key:"拥有一项运动爱好", value:100},
{key:"参加一次社区服务", value:100},
{key:"参加一次公开表演", value:100},
{key:"参观一个科技场馆", value:100}
],
avg:jiuGeYiAVGList
};
let geBanWanChengQingKuangList = getQueueData(DATAQUEUEENUM.学生年级_九个一班级平均情况, gradeId) || [];
let geBanWanChengQingKuangLvCount = 0;
geBanWanChengQingKuangList.forEach(info => {
let {value} = info;
geBanWanChengQingKuangLvCount += value;
});
let geBanWanChengQingKuangLv = geBanWanChengQingKuangList.length ? Math.round(geBanWanChengQingKuangLvCount/geBanWanChengQingKuangList.length) : 0
let geBanWanChengQingKuang = {
quanNianJiPingJunLv:`${geBanWanChengQingKuangLv}%`,
chart:geBanWanChengQingKuangList
};
let yuJing = {
list:getQueueData(DATAQUEUEENUM.九个一预警),
chart:[
// {key:"薄弱科目1", value:10},
// {key:"薄弱科目2", value:20},
// {key:"薄弱科目3", value:30},
// {key:"薄弱科目4", value:40},
],
dongTai:[
"测试动态数据1",
"测试动态数据2"
],
jieJueFangFa:[
// "解决方法1********************",
// "解决方法2********************",
// "解决方法3********************"
]
};
return {xueShengZongShu, jiuGeYi, geBanWanChengQingKuang, yuJing};
}
export async function getStudentStatsSchoolLeft() {
let xueShengyuJing = getQueueData(DATAQUEUEENUM.九个一预警);
let renWuWanChengTongJi = [
{key:"一项未完成", value:0},
{key:"二到三项未完成", value:0},
{key:"三项以上未完成", value:0},
{key:"全部完成", value:0},
];
let renWuTongJi = [
// "任务名称1************",
// "任务名称2************",
// "任务名称3************",
// "任务名称4************"
];
let weiWanChengYuanYin = [//百分比
// {key:"原因1", value:40},
// {key:"原因2", value:40},
// {key:"原因3", value:40},
// {key:"原因4", value:40}
];
let jieJueBanFa = [
// "解决办法1************",
// "解决办法2************",
// "解决办法3************",
// "解决办法4************"
];
let youXiuXueSheng = getQueueData(DATAQUEUEENUM.优秀学生);
let chaoQianWanChengRenWuTongJi = [//百分比
{key:"正常速度", value:0},
{key:"超前完成", value:0},
{key:"未完成", value:0}
];
let chaoQianWanChengRenWuQuShi = [
{key:"1月", value:0},
{key:"2月", value:0},
{key:"3月", value:0},
{key:"4月", value:0}
];
let youXiuXueXiFangFa = [
// "学习方法******************",
// "学习方法******************",
// "学习方法******************"
];
let result = {
xueShengyuJing, renWuWanChengTongJi, renWuTongJi, weiWanChengYuanYin,
jieJueBanFa, youXiuXueSheng, chaoQianWanChengRenWuTongJi, chaoQianWanChengRenWuQuShi, youXiuXueXiFangFa
};
return result;
}
export async function getStudentStatsSchoolCenter() {
let memberCountData = getQueueData(DATAQUEUEENUM.学生年级_年级人数);
let zongXueShengShu = 0;
for (let key in memberCountData) {
zongXueShengShu += memberCountData[key];
}
let wanChengLv = getQueueData(DATAQUEUEENUM.九个一学校平均完成率);
let title = "2023年 第一学期";
let jiuGeYi = {
max:[
{key:"完成一个课题研究", value:100},
{key:"阅读一本经典书籍", value:100},
{key:"举办一场读书报告", value:100},
{key:"进行一次公开演讲", value:100},
{key:"掌握一门乐器演变", value:100},
{key:"拥有一项运动爱好", value:100},
{key:"参加一次社区服务", value:100},
{key:"参加一次公开表演", value:100},
{key:"参观一个科技场馆", value:100}
],
avg:getQueueData(DATAQUEUEENUM.九个一学校平均)
};
let geNianJiWanChengLv = [
{
month:'本学期',
list:getQueueData(DATAQUEUEENUM.九个一年级平均完成情况)
}
];
return {title, zongXueShengShu, wanChengLv, jiuGeYi, geNianJiWanChengLv};
}
export async function getStudentStatsSchoolRight() {
let reqActivityData:any = await getReqApiData(APIENUM.获取学生活动列表, {pageNo:1, pageSize:50 });
let canGuanTongJi = [];
let huoDongTongJi = [];
let yanChuTongJi = [];
if (reqActivityData.list && Array.isArray(reqActivityData.list.list) && reqActivityData.list.list.length > 0) {
reqActivityData.list.list.forEach(info => {
let {activityTime, activityName, activityType} = info;
huoDongTongJi.push({
time:activityTime||'',
name:activityName||'',
addrest:"",
type:activityType
});
if (activityType == "参观实践") {
canGuanTongJi.push({
time:activityTime||'',
title:activityName||'',
head:''
});
}
if (["演讲记录", "乐器演奏", "学段公演"].indexOf(activityType) > -1 ) {
yanChuTongJi.push({
time:activityTime||'',
type:activityType || '',
name:activityName||'',
});
}
});
};
let huoJiangTongJi = [];
let reqAwardsData:any = await getReqApiData(APIENUM.获取学生获奖列表, {pageNo:1, pageSize:50 });
if (reqAwardsData.list && Array.isArray(reqAwardsData.list.list) && reqAwardsData.list.list.length > 0) {
reqAwardsData.list.list.forEach(info => {
let {awardTime, awardName, studentName} = info;
huoJiangTongJi.push({
time:awardTime||'',
name:awardName||'',
prizeWinner:studentName
});
});
};
return {canGuanTongJi, huoDongTongJi, huoJiangTongJi, yanChuTongJi};
}
\ No newline at end of file
/**
* 学生画像
*/
import { DATAQUEUEENUM, GRADEENUM } from "../config/enum";
import { APIENUM } from "../config/interficeEnum";
import { getQueueData, getReqApiData, postReqApiData } from "../data/queueData";
import { changeEnumValue } from "../util/piecemeal";
/**
* 获取年级下的班级列表
* @param grade
*/
export function getClassListByGrade(grade:number) {
let data = getQueueData(DATAQUEUEENUM.班级列表);
let queueList = data[grade] || [];
let dataList = [];
queueList.forEach(info => {
let {gradeClass, className} = info;
dataList.push({key:className, value:gradeClass});
});
dataList.sort((a, b) => {return a.gradeClass- b.gradeClass});
return {dataList};
}
/**
* 获取学生列表
* @param grade 年级id
* @param classNum 班级 协定id 1就是1班
* @param name 名称 模糊查询
* @returns
*/
export async function selectStudentList( grade:number, classNum:number, name:string ) {
let reqBody:any = {};
if (grade) reqBody.gradeId = grade;
if (classNum) reqBody.classNum = classNum;
if (name) reqBody.studentName = name;
let reqData:any = await getReqApiData(APIENUM.获取学生列表, reqBody);
let dataList = [];
if (reqData.page && Array.isArray(reqData.page)) {
let {page} = reqData;
page.forEach(info => {
let {studentId, studentName, className, gradeId, studentSort} = info;
dataList.push({
studentName,
gradeName:changeEnumValue(GRADEENUM, parseInt(gradeId)),
className,
studentSort,
studentId
});
});
}
return { dataList };
}
/**
* 学生个人页-左
* @param studentId 学生id
* @returns
*/
export async function studentStatsLeft(studentId:string) {
let reqBaseData:any = await getReqApiData(APIENUM.获取学生列表, {studentId});
let classId = '';
if (Array.isArray(reqBaseData.page) && reqBaseData.page.length > 0) {
let item = reqBaseData.page[0];
classId = item.classId || '';
}
/**日常行为规范 */
let riChangXingWeiGuiFan = [
{key:"眼保健操", value:null},
{key:"劳动岗", value:null},
{key:"吃游食", value:null},
{key:"手机管理", value:null}
];
let schoolId = 'd8546196609a1edb90320315e22b66';
let reqBody = {
platformCode:"999999",
personId:'3f9ec0aac6c411edb04a0203151c9658',
schoolId:'d8546196609a1edb90320315e22b66',
classId:'1bbcb610b1b611ed92110203156bceda',
startDate:"",
endDate: ""
}
// let reqDimensionData = await postReqApiData(APIENUM.学生日常行为规范, reqBody);
// console.log();
/**修业分数 */
let xiuYeKeCheng = {
score:null,
ranking:null,
comparedRanking:0,
}
let geKeChengJi = {
radar:{
thisTime:[
// {key:"语文", value:5},
// {key:"数学", value:10},
// {key:"英语", value:9},
// {key:"体育", value:6},
// {key:"美术", value:10},
// {key:"品德", value:10}
],
lastTime:[
// {key:"语文", value:2},
// {key:"数学", value:10},
// {key:"英语", value:1},
// {key:"体育", value:10},
// {key:"美术", value:8},
// {key:"品德", value:5}
],
avg:[
// {key:"语文", value:4},
// {key:"数学", value:3},
// {key:"英语", value:10},
// {key:"体育", value:5},
// {key:"美术", value:10},
// {key:"品德", value:1}
],
totalScore:[
// {key:"语文", value:10},
// {key:"数学", value:10},
// {key:"英语", value:10},
// {key:"体育", value:10},
// {key:"美术", value:10},
// {key:"品德", value:10}
]
},
base:{
kuoZhan:null,
tanSuoXing:null,
xueXiXiGuan:null,
jiBiJi:null,
zongHe:"",
fenXiang:[
// {key:"分项1", value:10},
// {key:"分项2", value:10}
]
}
};
/**身心健康 */
let shenXinJianKang = {
peculiarity:"",//"海鲜过敏",
HPI:"",//"无",
BMI:0,
BMIChart:[]
};
let reqBIMData:any = await getReqApiData(APIENUM.学生BMI趋势, {studentId});
if(Array.isArray(reqBIMData.list) && reqBIMData.list.length > 0) {
reqBIMData.list.forEach(info => {
let {name, value} = info;
shenXinJianKang.BMIChart.push({key:name, value});
});
}
let reqAllergyData:any = await getReqApiData(APIENUM.学生过敏情况, {studentId});
if(Array.isArray(reqAllergyData.list) && reqAllergyData.list.length > 0) {
let item = reqAllergyData.list[0];
shenXinJianKang.peculiarity = item.allergy || '';
};
let reqAtopyData:any = await getReqApiData(APIENUM.获取学生特异体质, {studentId});
if(Array.isArray(reqAtopyData.list) && reqAtopyData.list.length > 0) {
let item = reqAtopyData.list[0];
shenXinJianKang.HPI = item.atopy || '';
};
let reqTzjkData:any = await getReqApiData(APIENUM.获取学生体质健康, {studentId});
if (Array.isArray(reqTzjkData.list) && reqTzjkData.list.length > 0) {
let item = reqTzjkData.list[0];
shenXinJianKang.BMI = item.bmi || 0;
}
/**美育活动 */
let meiYuHuoDong = { pie:[], activeLog:[] };
let reqActivityData:any = await getReqApiData(APIENUM.获取学生活动列表, {pageNo:1, pageSize:100, studentId});
if (reqActivityData.list && Array.isArray(reqActivityData.list.list) && reqActivityData.list.list.length > 0 ) {
let item = reqActivityData.list.list;
let activityDistinctMap = {};
item.forEach((info,index) => {
let {activityType, activityName} = info;
if (!activityDistinctMap[activityType]) activityDistinctMap[activityType]= 0;
activityDistinctMap[activityType] += 1;
if (index <= 20) {
meiYuHuoDong.activeLog.push(activityName);
}
});
for (let key in activityDistinctMap) {
meiYuHuoDong.pie.push({key, value:activityDistinctMap[key]});
}
}
/**劳动教育 */
let laoDongJiaoYu = [];
let reqActivityCountData:any = await getReqApiData(APIENUM.获取学生各类活动统计, {studentId});
if(Array.isArray(reqActivityCountData.list) && reqActivityCountData.list.length > 0) {
let itemMax = 0;
reqActivityCountData.list.forEach(info => {itemMax = Math.max(itemMax, info.value)})
reqActivityCountData.list.forEach(info => {
let {name, value} = info;
laoDongJiaoYu.push({key:name, value, max:itemMax});
});
};
let result = {riChangXingWeiGuiFan, xiuYeKeCheng, geKeChengJi, shenXinJianKang, meiYuHuoDong, laoDongJiaoYu };
return result;
}
/**
* 学生个人页-中
* @param studentId 学生id
* @returns
*/
export async function studentStatsCenter(studentId:string) {
let reqBaseData:any = await getReqApiData(APIENUM.获取学生列表, {studentId});
let reqModelData:any = await getReqApiData(APIENUM.获取学生模型, {studentId, type:1});
let gradeId = '1';
let studentSort = '';
if (Array.isArray(reqBaseData.page) && reqBaseData.page.length > 0) {
let item = reqBaseData.page[0];
gradeId = item.gradeId || '1';
studentSort = item.studentSort || '';
}
let reqHobbyData:any = await getReqApiData(APIENUM.获取学生个人特长, {studentId});
let reqTzjkData:any = await getReqApiData(APIENUM.获取学生体质健康, {studentId});
let bmi = 0;
let bmiLevel = "";
let base = {
name:"",
className:"",
studentId:"",
height:"",
weight:"",
politicalOutlook:"",
dateOfBirth:"",
modelUrls:{
// jpg:reqModelData.url ? reqModelData.url+'/model.jpg':'',
// mtl:reqModelData.url ? reqModelData.url+'/model.obj.mtl':'',
// obj:reqModelData.url ? reqModelData.url+'/model.obj':''
jpg:'http://192.168.0.105:30001/model/model.jpg',
mtl:'http://192.168.0.105:30001/model/model.obj.mtl',
obj:'http://192.168.0.105:30001/model/model.obj'
}
};
if (Array.isArray(reqTzjkData.list) && reqTzjkData.list.length > 0) {
let item = reqTzjkData.list[0];
base.name = item.studentName || '';
base.className = `${item.gradeName || ''}${item.className || ''}`;
base.studentId = studentSort;//这里要换成学号
base.dateOfBirth = item.birthdayName;
base.weight = item.weight ? item.weight+'Kg' : '';
base.height = item.height || '';
bmi = item.bmi;
bmiLevel = item.bmiLevel;
}
if (reqHobbyData.list && Array.isArray(reqHobbyData.list.list) && reqHobbyData.list.list.length > 0) {
let item = reqHobbyData.list.list[0];
base.politicalOutlook = item.isLeague == "是" ? "团员" : "";
}
let reqJiuGeYiData:any = await getReqApiData(APIENUM.获取学生个人九个一工程, {studentId});
let jiuGeYiSelf = [];
if (reqJiuGeYiData.list) {
let item = reqJiuGeYiData.list;
let jiuGeYiConfig = [
{name:"完成一个课题研究", key:'project'},
{name:"阅读一本经典书籍", key:'readClassicBook'},
{name:"举办一场读书报告", key:'readingReport'},
{name:"进行一次公开演讲", key:'speak'},
{name:"掌握一门乐器演奏", key:'instrumental'},
{name:"拥有一项运动爱好", key:'sportsHobby'},
{name:"参加一次社区服务", key:'communityServices'},
{name:"参加一次公开表演", key:'performance'},
{name:"参观一个科技场馆", key:'visitTechnology'}
];
jiuGeYiConfig.forEach(info => {
let {name, key} = info;
let value = item[key] || 0;
value = value > 1 ? 1 : value
jiuGeYiSelf.push({key:name, value:parseFloat(value)});
});
}
let jiuGeYiAvgData = getQueueData(DATAQUEUEENUM.九个一年级平均);
let jiuGeYiGongChengKaiZhanJinDu = {
grade:changeEnumValue(GRADEENUM, parseInt(gradeId)),
self:jiuGeYiSelf,
avg:jiuGeYiAvgData[gradeId],
totalScore:[
{key:"完成一个课题研究", value:1},
{key:"阅读一本经典书籍", value:1},
{key:"举办一场读书报告", value:1},
{key:"进行一次公开演讲", value:1},
{key:"掌握一门乐器演变", value:1},
{key:"拥有一项运动爱好", value:1},
{key:"参加一次社区服务", value:1},
{key:"参加一次公开表演", value:1},
{key:"参观一个科技场馆", value:1}
]
};
let yuJing = {
zongHeXueXiChengJiDengDi:'A',
boRuoKeMu:"",
tiZhong:bmiLevel,
BMI:bmi,
xingweiguifan:0
};
let dongTai = {
huoDong:[ ],
canguan:[]
};
let reqAwardData:any = await getReqApiData(APIENUM.获取学生获奖列表, {studentId, pageNo:1, pageSize:10});
if (reqAwardData.list && Array.isArray(reqAwardData.list.list) && reqAwardData.list.list.length > 0) {
reqAwardData.list.list.forEach(info => {
let {awardTime, awardLevel, awardName} = info;
dongTai.canguan.push({
time:awardTime||'',
title:awardLevel||'',
name:awardName
});
});
}
let reqActivityData:any = await getReqApiData(APIENUM.获取学生活动列表, {studentId, pageNo:1, pageSize:10});
if (reqActivityData.list && Array.isArray(reqActivityData.list.list) && reqActivityData.list.list.length > 0) {
reqActivityData.list.list.forEach(info => {
let {activityTime, activityType, activityName} = info;
dongTai.canguan.push({
time:activityTime||'',
title:activityType||'',
name:activityName
});
});
}
let result = {
base, jiuGeYiGongChengKaiZhanJinDu, yuJing, dongTai
};
return result;
}
/**
* 学生个人页-右
* @param studentId 学生id
* @returns
*/
export async function studentStatsRight(studentId:string) {
/**科技素养 */
let keJiSuYang = {
imageList:[
"http://192.168.0.105:30001/img1.png",
"http://192.168.0.105:30001/img2.png",
"http://192.168.0.105:30001/img3.png",
"http://192.168.0.105:30001/img4.png"
],
tableList:[]
};
/**人文素养 */
let renWenSuYang = {
count:null,
duration:null,
report:null,
typeList:[
// {key:"类型1", value:10}
],
etiquette:[
// "尊敬师长"
]
};
/**艺术素养 */
let yiShuSuYang = {
musicalInstrument:0,
perform:0,
speech:0,
tableList:[]
}
let jiangKangSuYang = {
sportsHobbies:0,
competition:0,
awards:0,
tableList:[]
};
let reqActivityData:any = await getReqApiData(APIENUM.获取学生活动列表, {pageNo:1, pageSize:10, studentId});
if (reqActivityData.list && Array.isArray(reqActivityData.list.list) && reqActivityData.list.list.length > 0) {
reqActivityData.list.list.forEach(info => {
let {activityTime, activityName, activityType} = info;
let addItem = {
time:activityTime||'',
title:activityName||'',
type:activityType
};
switch(activityType) {
case "课题研究":
case "参观实践":keJiSuYang.tableList.push(addItem); break;
// case "多彩阅读":
// case "读书报告":
// case "社区服务":
case "演讲记录":
yiShuSuYang.speech += 1;
break;
case "乐器演奏":
yiShuSuYang.musicalInstrument += 1;
yiShuSuYang.tableList.push(addItem);
break;
case "学段公演":
yiShuSuYang.perform += 1;
yiShuSuYang.tableList.push(addItem);
break;
case "运动记录":
jiangKangSuYang.sportsHobbies += 1;
jiangKangSuYang.tableList.push(addItem);
break;
}
});
}
let reqAwardsData:any = await getReqApiData(APIENUM.获取学生获奖列表, {pageNo:1, pageSize:10, studentId});
if (reqAwardsData.list && Array.isArray(reqAwardsData.list.list) && reqAwardsData.list.list.length > 0) {
reqAwardsData.list.list.forEach(info => {
let {awardType} = info;
if (awardType == "健康") jiangKangSuYang.awards += 1;
});
}
let result = {
keJiSuYang, renWenSuYang, yiShuSuYang, jiangKangSuYang
};
return result;
}
\ No newline at end of file
import { DATAQUEUEENUM } from "../config/enum";
import { getQueueData } from "../data/queueData";
/**
* 教师对内的
*/
export async function getTeacherInternal() {
let jiaoShiZiYuan = {
jiaoShiShu:132,
jiaoShiZiYuanDaBiaoLv:"0%",
nanNvbiLi:{
nan:0,
nv:0
},
xueLiFenBu:getQueueData(DATAQUEUEENUM.教师对内_教师资源_学历分布) || [],
jiaoLingFenBu:getQueueData(DATAQUEUEENUM.教师对内_教师资源_教龄分布) || [],
nianLinFenBu:getQueueData(DATAQUEUEENUM.教师对内_教师资源_年龄分布) || []
};
let jiaoShiZhengZhiMianMao = getQueueData(DATAQUEUEENUM.教师对内_教师资源_政治面貌分布) || [];
let zhaoPinRenCaiLiuDong = {
huPinGong:0,
barChart:[
{key:"2017", value:0},
{key:"2018", value:0},
{key:"2019", value:0},
{key:"2020", value:0}
]
};
let jiaoShiZhuanYeJianShe = {
zhiChengFenBu:getQueueData(DATAQUEUEENUM.教师对内_教师资源_职称分布) || [],
jiaoYanZuDaJian:[
{key:"语文", value:37},
{key:"数学", value:25},
{key:"英语", value:21},
{key:"理综", value:14},
{key:"文综", value:9}
],
shiZiJieGou:[
{key:"语文", value:0},
{key:"数学", value:0},
{key:"英语", value:0},
{key:"体育", value:0},
{key:"综合", value:0}
]
};
let jiaoShiHuoJiang = [
{key:"国家级", value:0},
{key:"市级", value:0},
{key:"区级", value:0},
{key:"镇级", value:0},
{key:"校级", value:0}
];
let tePinTuanDui = [
{name:"汪洋", imgUrl:""},
{name:"陆佩香", imgUrl:""},
{name:"吴建新", imgUrl:""},
{name:"谢琳", imgUrl:""},
{name:"沈惠华", imgUrl:""}
];
let zhuanJiaTuanDui = [
// {name:"张三", imgUrl:"xxxxx"},
// {name:"张三", imgUrl:"xxxxx"},
// {name:"张三", imgUrl:"xxxxx"},
// {name:"张三", imgUrl:"xxxxx"},
// {name:"张三", imgUrl:"xxxxx"}
];
let xueKeDaoShiTuanDui = {
gaoJiJiaoShi:'0%',
suoBoZhanBi:'100%',
list:[
{key:"物理导师", value:3},
{key:"化学导师", value:2},
{key:"生物导师", value:2},
{key:"计算机导师", value:3},
{key:"电子工程导师", value:1}
]
};
let jiaoShiXueFenHuoQu = {
xueFen360:"0%",
xueFen540:"0%",
list:[
{key:"市级课程", value:0},
{key:"区级课程", value:0},
{key:"校级课程", value:0}
]
};
let jinXiuXueXi = {
keChengLeiXing:[
// {key:"图例1", value:0},
// {key:"图例2", value:0},
// {key:"图例3", value:0}
]
};
let jinXiuWanCheng = [
// {key:"老师1", value:0},
// {key:"老师2", value:0},
// {key:"老师3", value:0}
];
let jiaoShiGongZuoLiangFenXi = {
benZhou:'0课时',
wanChengDu:'0%',
chart:[
{key:"5.17", value:0},
{key:"5.18", value:0},
{key:"5.19", value:0},
{key:"5.20", value:0},
{key:"5.21", value:0},
{key:"5.22", value:0}
]
};
let jiaoXueZhiLiangPingJi = {
jiaoXueZhiLiangPingJi:'',
chart:[
{key:"5.18", value:0},
{key:"5.19", value:0},
{key:"5.20", value:0},
{key:"5.21", value:0},
{key:"5.22", value:0}
]
};
let jiXiaoKaoHe = {
chuQinLv:'0%',
jiaBanShu:0,
jiaoXueKaoHePingJia:{
jiaZhangPingJia:"优",
xueShengPingJia:"优"
},
jiXiaoKaoHe:'0%',
jiaoXueKaoHe:'0%'
};
let jiaoYuPeiYu = {
peiXunHuoDongZongShu:0,
canYuDu:'0%',
deJiangLv:'0%',
geLeiPeiXun:[
{key:"校本研修", value:0},
{key:"校外培训", value:0},
{key:"见习教师规范培训", value:0},
{key:"共享课程", value:0}
]
};
let jiaoShiFaZhanGuiHua = {
muBiaoTianBaoLv:'0%',
muBiaoDaChengLv:'0%',
jiaoShiFaZhanMuBiaoQuShi:[
{key:"5.19", value:0},
{key:"5.20", value:0},
{key:"5.21", value:0},
{key:"5.22", value:0}
],
faZhanFangXiang:[
{key:"班主任", value:10},
{key:"仪表整洁", value:10},
{key:"仪表整洁1", value:8},
{key:"仪表整洁2", value:4},
{key:"仪表整洁3", value:3}
]
};
let jiaoYuKeYan = {
fuGaiLv:'0%',
list:[
{key:"立项", shi:0, qu:0, xiao:0},
{key:"结题", shi:0, qu:0, xiao:0},
{key:"鉴定", shi:0, qu:0, xiao:0},
{key:"论文", shi:0, qu:0, xiao:0},
{key:"案例", shi:0, qu:0, xiao:0}
],
geXueKeZhanBi:[
// {key:"学科1", value:0},
// {key:"学科2", value:10},
// {key:"学科3", value:10},
// {key:"学科4", value:10}
]
};
let jiaoYanHuoJiang = {
guoJiaJi:0,
shiJi:0,
quJi:0,
xiaoJi:0,
list:[
{key:"课题成果",value:0},
{key:"获奖教研",value:0},
{key:"课题成果",value:0},
{key:"课题成果",value:0}
]
}
let result = {
jiaoShiZiYuan, jiaoShiZhengZhiMianMao, zhaoPinRenCaiLiuDong, jiaoShiZhuanYeJianShe,
jiaoShiHuoJiang, tePinTuanDui, zhuanJiaTuanDui, xueKeDaoShiTuanDui, jiaoShiXueFenHuoQu,
jinXiuXueXi, jinXiuWanCheng, jiaoShiGongZuoLiangFenXi, jiaoXueZhiLiangPingJi, jiXiaoKaoHe,
jiaoYuPeiYu, jiaoShiFaZhanGuiHua, jiaoYuKeYan, jiaoYanHuoJiang
};
return result;
}
/**
* 教师对外
*/
export async function getTeacherExternal() {
let biaoTi = [
{key:"高级教师", value:0},
{key:"一级教师", value:0},
{key:"学科导师", value:11},
{key:"特聘专家", value:16}
]
let jiaoShiZiYuan = {
jiaoShiShu:0,
jiaoShiZiYuanDaBiaoLv:"0%",
nanNvbiLi:{
nan:0,
nv:0
},
xueLiFenBu:getQueueData(DATAQUEUEENUM.教师对内_教师资源_学历分布) || [],
jiaoLingFenBu:getQueueData(DATAQUEUEENUM.教师对内_教师资源_教龄分布) || [],
nianLinFenBu:getQueueData(DATAQUEUEENUM.教师对内_教师资源_年龄分布) || []
};
let jiaoShiZhengZhiMianMao = getQueueData(DATAQUEUEENUM.教师对内_教师资源_政治面貌分布) || [];
let zhaoPinRenCaiLiuDong = {
huPinGong:0,
barChart:[
// {key:"2017", value:10},
// {key:"2018", value:10},
// {key:"2019", value:10},
// {key:"2020", value:10}
]
};
let jiaoShiZhuanYeJianShe = {
zhiChengFenBu:getQueueData(DATAQUEUEENUM.教师对内_教师资源_职称分布) || [],
jiaoYanZuDaJian:[
{key:"语文", value:37},
{key:"数学", value:25},
{key:"英语", value:21},
{key:"理综", value:14},
{key:"文综", value:9}
],
shiZiJieGou:[
{key:"语文", value:0},
{key:"数学", value:0},
{key:"英语", value:0},
{key:"体育", value:0},
{key:"综合", value:0}
]
};
let tePinTuanDui = [
{name:"汪洋", imgUrl:""},
{name:"陆佩香", imgUrl:""},
{name:"吴建新", imgUrl:""},
{name:"谢琳", imgUrl:""},
{name:"沈惠华", imgUrl:""}
];
let zhuanJiaTuanDui = [
// {name:"张三", imgUrl:"xxxxx"},
// {name:"张三", imgUrl:"xxxxx"},
// {name:"张三", imgUrl:"xxxxx"},
// {name:"张三", imgUrl:"xxxxx"},
// {name:"张三", imgUrl:"xxxxx"}
];
let xueKeDaoShiTuanDui = {
gaoJiJiaoShi:'0%',
suoBoZhanBi:'100%',
list:[
{key:"物理导师", value:3},
{key:"化学导师", value:2},
{key:"生物导师", value:2},
{key:"计算机导师", value:3},
{key:"电子工程导师", value:1}
]
};
let chuangXinXueXi = {
reMenJinXiuZhuanYe:{
canYuChuangJianJiaoShi:0,
keChengLeiXingZongShu:0,
list:[
// {key:"专业名称1", value:10},
// {key:"专业名称2", value:10},
// {key:"专业名称3", value:10},
// {key:"专业名称4", value:10},
// {key:"专业名称5", value:10}
]
},
teSeKeChengChuangJian:{
canYuChuangJianZongShu:0,
keChengLeiXingZongShu:0,
list:[
// {name:"课程名称", fuZeJiaoShi:"张三", time:'4.12', canYuRenShu:10, canYuLv:"89%"},
// {name:"课程名称2", fuZeJiaoShi:"张三", time:'4.12', canYuRenShu:10, canYuLv:"89%"},
// {name:"课程名称3", fuZeJiaoShi:"张三", time:'4.12', canYuRenShu:10, canYuLv:"89%"},
// {name:"课程名称4", fuZeJiaoShi:"张三", time:'4.12', canYuRenShu:10, canYuLv:"89%"}
]
}
};
let kuaXueKeJiaoXue = {
canYuJiaoShiShu:0,
select:[],
liNianHeGeLv:[
{key:"语文", value:0},
{key:"数学", value:0},
{key:"英语", value:0},
{key:"体育", value:0},
{key:"美术", value:0},
{key:"品德", value:0}
],
pingJun:[
{key:"语文", value:0},
{key:"数学", value:0},
{key:"英语", value:0},
{key:"体育", value:0},
{key:"美术", value:0},
{key:"品德", value:0}
],
max:[
{key:"语文", value:0},
{key:"数学", value:0},
{key:"英语", value:0},
{key:"体育", value:0},
{key:"美术", value:0},
{key:"品德", value:0}
],
}
let jiaoYuPeiYu = {
peiXunHuoDongZongShu:0,
canYuDu:'0%',
deJiangLv:'0%',
geLeiPeiXun:[
{key:"校本研修", value:0},
{key:"校外培训", value:0},
{key:"见习教师规范培训", value:0},
{key:"共享课程", value:0}
]
};
let jiaoShiFaZhanGuiHua = {
muBiaoTianBaoLv:'0%',
muBiaoDaChengLv:'0%',
jiaoShiFaZhanMuBiaoQuShi:[
{key:"5.19", value:0},
{key:"5.20", value:0},
{key:"5.21", value:0},
{key:"5.22", value:0}
],
faZhanFangXiang:[
{key:"班主任", value:10},
{key:"班主任", value:8},
{key:"班主任", value:12},
{key:"班主任", value:1},
{key:"仪表整洁", value:10}
]
};
let jiaoYuKeYan = {
fuGaiLv:'0%',
list:[
{key:"立项", shi:0, qu:0, xiao:0},
{key:"结题", shi:0, qu:0, xiao:0},
{key:"鉴定", shi:0, qu:0, xiao:0},
{key:"论文", shi:0, qu:0, xiao:0},
{key:"案例", shi:0, qu:0, xiao:0}
],
geXueKeZhanBi:[
// {key:"学科1", value:10},
// {key:"学科2", value:10},
// {key:"学科3", value:10},
// {key:"学科4", value:10}
]
};
let jiaoYanHuoJiang = {
guoJiaJi:0,
shiJi:0,
quJi:0,
xiaoJi:0,
list:[
{key:"课题成果",value:0},
{key:"获奖教研",value:0},
{key:"课题成果",value:0},
{key:"课题成果",value:0}
]
}
let result = {
biaoTi,
jiaoShiZiYuan, jiaoShiZhengZhiMianMao, zhaoPinRenCaiLiuDong, jiaoShiZhuanYeJianShe,chuangXinXueXi,
tePinTuanDui, zhuanJiaTuanDui, xueKeDaoShiTuanDui, kuaXueKeJiaoXue,
jiaoYuPeiYu, jiaoShiFaZhanGuiHua, jiaoYuKeYan, jiaoYanHuoJiang
};
return result;
}
\ No newline at end of file
import moment = require("moment");
import { APIENUM } from "../config/interficeEnum";
import { getQueueData, getReqApiData } from "../data/queueData";
import { DATAQUEUEENUM, GRADEENUM } from "../config/enum";
import { changeEnumValue } from "../util/piecemeal";
export async function getTeacherInfo(teacherId:string) {
let base = {
name:"张三",
sex:"女",
title:"副教授",
age:"38岁",
discipline:"语文",
mainPeriod:"",
imgUrl:""
};
let introduction = "";
let reqTeacherSubjectData:any = await getReqApiData(APIENUM.获取教师列表, {teacherId});
if (Array.isArray(reqTeacherSubjectData.list) && reqTeacherSubjectData.list.length > 0) {
let {subjectNames } = reqTeacherSubjectData.list[0];
base.discipline = subjectNames;
}
let reqTeacherInfoData:any = await getReqApiData(APIENUM.教师基本信息, { teacherId});
if (Array.isArray(reqTeacherInfoData.list) && reqTeacherInfoData.list.length > 0) {
let {name, sexName, title, birthDate, remark } = reqTeacherInfoData.list[0];
base.name = name;
base.sex = sexName;
base.title = title;
introduction = remark || '';
if (birthDate) {
let birtList = birthDate.split("-");
if (birtList.length == 3) {
base.age = `${parseInt( moment(birtList).fromNow(true) )}岁`;
}
}
}
// let test:any = await getReqApiData(APIENUM.获取本校培训信息, { app_key:"", type:1});
return {base, introduction};
}
export async function getTeacherList(inGrade:number, discipline:string, sex:number, teacherName:string) {
let selectParam:any = {};
if (teacherName) selectParam.teacherName = teacherName;
if (sex==0 || sex == 1) selectParam.sex = sex;
if (inGrade) selectParam.grade = inGrade;
if (discipline) selectParam.subjectName = discipline;
let dataList = [];
let reqTeacherInfoData:any = await getReqApiData(APIENUM.获取教师列表, selectParam);
if (reqTeacherInfoData.list && Array.isArray(reqTeacherInfoData.list) && reqTeacherInfoData.list.length > 0) {
reqTeacherInfoData.list.forEach(info => {
let {teacherName, grade, genderName, teacherUserId, subjectNames } = info;
dataList.push({
teacherName:teacherName,
grade:changeEnumValue(GRADEENUM, parseInt(grade)),
sex:genderName,
discipline:subjectNames,
teacherId:teacherUserId
});
})
}
return {dataList};
}
\ No newline at end of file
import { DATAQUEUEENUM } from "../config/enum";
import { getQueueData } from "../data/queueData";
export async function getWholeInternal() {
let xueLiFenBu = getQueueData(DATAQUEUEENUM.教师对内_教师资源_学历分布) || [];
let jiaoLingFenBu = getQueueData(DATAQUEUEENUM.教师对内_教师资源_教龄分布) || [];
let nianLinFenBu = getQueueData(DATAQUEUEENUM.教师对内_教师资源_年龄分布) || [];
let zhiChengFenBu = getQueueData(DATAQUEUEENUM.教师对内_教师资源_职称分布) || [];
return {xueLiFenBu, jiaoLingFenBu, nianLinFenBu, zhiChengFenBu};
}
\ No newline at end of file
export enum DATAQUEUEENUM {
班级列表 =1,
年级列表,
九个一年级平均,
九个一学校平均,
九个一学校平均完成率,
九个一年级平均完成情况,
学生年级_九个一班级平均情况,
学生年级_年级社会实践活动类型统计,
学生年级_体质监测合格率,
学生年级_视力不良率,
学生年级_年级人数,
学生年级_过敏人数,
教师对内_教师资源_学历分布,
教师对内_教师资源_年龄分布,
教师对内_教师资源_教龄分布,
教师对内_教师资源_政治面貌分布,
教师对内_教师资源_职称分布,
九个一预警,
优秀学生
}
export enum GRADEENUM {
一年级 = 1,
二年级,
三年级,
四年级,
五年级,
六年级,
七年级,
八年级,
九年级,
高一,
高二,
高三
}
\ No newline at end of file
export enum ERRORENUM {
不存在表 = 1,
身份验证失败,
非法登录,
TOKEN获取失败,
TOKEN更新失败,
参数错误
}
/**
* 只用做code码定义
*/
export enum ERRORCODEENUM {
身份验证失败 = 401,
非法登录 = 402,
身份验证过期 = 403
}
let bizErrorMsgMap = {};
for (let key in ERRORENUM) {
bizErrorMsgMap[ERRORENUM[key]] = key;
}
export function getBizMsg(param) {
return bizErrorMsgMap[param];
}
\ No newline at end of file
export enum APIENUM {
获取班级列表信息 = 'queryClassList',
获取学生列表 = 'getStudentList',
获取学生个人特长 = 'getStuPersonality',
获取学生成绩信息 = 'getStuScore',
获取学生体质健康 = 'getTzjkOne',
获取学生获奖列表 = 'getStuAwards',
获取学生活动列表 = 'getStuActivity',
学生BMI趋势 = 'getBmiLine',
学生过敏情况 ='getAllergy',
获取年级平均九个一工程 = 'getCountStuTenComplete',
获取学生个人九个一工程 = 'getCountStuTenComplete',
修业课程_获取学生综合成绩 = 'getStuScore',
学生日常行为规范 = 'studentDimensionRadar',
获取学生综合成绩 = 'getStuScore',
获取学生综素质 = 'getStuQuality',
获取学生学习方法= 'getStuMethodStudy',
教师基本信息 = 'getTeacherInfoList',
获取学生特异体质 = 'getAtopy',
获取学生视力 = 'getVision',
获取学生各类活动统计 = 'getCountStuActivity',
获取教师列表 ='getGradeSubTeacherList',
获取本校培训信息 = 'api/train/schools',
获取教师统计 = 'getTeacherStatistics',
获取年级体质检测 = 'getCountTzjk',
获取年级视力不良率 = 'getGradeVisionDefect',
获取各年级学生数量 = 'getYearStuGradeCountEvent',
学生成绩预警 = 'getStuStudyScoreWarning',
学生体质预警 = 'getStuBMIWarning',
九个一预警 = 'queryEarlyWarning',
获取学生模型='queryStuModel'
}
\ No newline at end of file
const Sequelize = require('sequelize');
export const TablesConfig = [
{
tableNameCn:'用户表',
tableName:'users',
schema:{
userId: {
type:Sequelize.INTEGER(20), //表示属性的数据类型
allowNull:false, //表示当前列是否允许为空, false表示该列不能为空
primaryKey:true, //表示主键
unique:true //表示该列的值必须唯一
},
name: {type:Sequelize.STRING(255), allowNull:false}, //名称
loginId: {type:Sequelize.STRING(255), allowNull:false}, //账号
pwd: {type:Sequelize.STRING(255), allowNull:false}, //密码
roleId: {type:Sequelize.INTEGER(20), allowNull:false}, //角色id
exchangeTime: {type:Sequelize.INTEGER(20), allowNull:false}, //调休剩余
annualLeave: {type:Sequelize.INTEGER(20), allowNull:false}, //年假剩余
departmentId: {type:Sequelize.INTEGER(20), allowNull:false}, //部门id
token: {type:Sequelize.STRING(255)},
tokenDate: {type:Sequelize.DATE},
ed: {type:Sequelize.DATE}//入职时间
},
association: [
{type: "hasMany", check: "overtime", foreignKey:"userId"},//外键
{type: "hasMany", check: "askforleave", foreignKey:"userId"},//外键
{type: "hasMany", check: "workinglog", foreignKey:"userId"},//外键
]
},
{
tableNameCn:'角色表',
tableName:'role',
schema:{
roleId:{
type:Sequelize.INTEGER(20), //表示属性的数据类型
allowNull:false, //表示当前列是否允许为空, false表示该列不能为空
primaryKey:true, //表示主键
unique:true //表示该列的值必须唯一
},
roleName:{type:Sequelize.STRING(255), allowNull:false}, //登录账号
},
association: [
{type: "hasMany", check: "users", foreignKey:"roleId"},//外键
]
},
{
tableNameCn:'项目表',
tableName:'project',
schema:{
projectId:{
type:Sequelize.STRING(255), //表示属性的数据类型
allowNull:false, //表示当前列是否允许为空, false表示该列不能为空
primaryKey:true, //表示主键
unique:true //表示该列的值必须唯一
},
name:{type:Sequelize.STRING(255)}, //项目名称
contractId:{type:Sequelize.STRING(255)}, //合同编号
controller:{type:Sequelize.STRING(255)}, //项目经理
createTime:{type:Sequelize.DATE}, //创建时间
},
association: [
{type: "hasMany", check: "overtime", foreignKey:"projectId"},//外键
{type: "hasMany", check: "workinglog", foreignKey:"projectId"},//外键
]
},
{
tableNameCn:'部门表',
tableName:'department',
schema:{
departmentId:{
type:Sequelize.INTEGER(20), //表示属性的数据类型
allowNull:false, //表示当前列是否允许为空, false表示该列不能为空
primaryKey:true, //表示主键
unique:true //表示该列的值必须唯一
},
name:{type:Sequelize.STRING(255), allowNull:false}, //部门名称
},
association: [
{type: "hasMany", check: "users", foreignKey:"departmentId"},//外键
]
},
{
tableNameCn:'加班',
tableName:'overtime',
schema:{
id:{
type:Sequelize.STRING(244), //表示属性的数据类型
allowNull:false, //表示当前列是否允许为空, false表示该列不能为空
primaryKey:true, //表示主键
unique:true //表示该列的值必须唯一
},
projectId:{type:Sequelize.STRING(255)}, //
userId:{type:Sequelize.INTEGER(20)}, //
dateKey:{type:Sequelize.DATE}, //
time:{type:Sequelize.INTEGER(20), allowNull:false}, //
state:{type:Sequelize.INTEGER(20), allowNull:false}, //
approver:{type:Sequelize.INTEGER(20), allowNull:false}, //
workLog:{type:Sequelize.STRING(255), allowNull:true},
notPassing:{type:Sequelize.STRING(255), allowNull:true}//不通过理由
},
association: []
},
{
tableNameCn:'请假',
tableName:'askforleave',
schema:{
id:{
type:Sequelize.STRING(255), //表示属性的数据类型
allowNull:false, //表示当前列是否允许为空, false表示该列不能为空
primaryKey:true, //表示主键
unique:true //表示该列的值必须唯一
},
des:{type:Sequelize.STRING(255)}, //描述
startTime:{type:Sequelize.DATE}, //
endTime:{type:Sequelize.DATE}, //
userId:{type:Sequelize.INTEGER(20)}, //
approver:{type:Sequelize.INTEGER(20), allowNull:false}, //
time:{type:Sequelize.INTEGER(20), allowNull:false}, //
type:{type:Sequelize.INTEGER(20), allowNull:false}, //
day:{type:Sequelize.INTEGER(20), allowNull:false}, //
state:{type:Sequelize.INTEGER(20), allowNull:false}, //
notPassing:{type:Sequelize.STRING(255), allowNull:true},//不通过理由
dateKey:{type:Sequelize.DATE} //
},
association: [
]
},
{
tableNameCn:'工时表',
tableName:'workinglog',
schema:{
id:{
type:Sequelize.STRING(255), //表示属性的数据类型
allowNull:false, //表示当前列是否允许为空, false表示该列不能为空
primaryKey:true, //表示主键
unique:true //表示该列的值必须唯一
},
projectId:{type:Sequelize.STRING(255)}, //
userId:{type:Sequelize.INTEGER(20)}, //
time:{type:Sequelize.INTEGER(20), allowNull:false}, //
dateKey:{type:Sequelize.DATE}, //
isOutside:{type:Sequelize.INTEGER(20)}, //
workLog:{type:Sequelize.STRING(255)}, //描述
},
association: [
]
}
];
\ No newline at end of file
const path = require('path');
import * as fs from "fs";
import { BizError } from "../util/bizError";
import { analysisXml } from "../util/myXML";
import { ServerConfig } from "../config/systemClass";
export let systemConfig = new ServerConfig;
const ConfigName = "serverConfig.xml";
export async function initConfig() {
try {
let buff = fs.readFileSync(path.join(__dirname.substring(0,__dirname.indexOf("out")), ConfigName));
let configStr = buff.toString();
let configInfo:any = await analysisXml(configStr);
if (!configInfo || !configInfo.config) throw new BizError('xml中无配置');
else {
let {port, sign, appKey, appSecret } = configInfo.config;
systemConfig.port = parseInt(port[0]);
systemConfig.sign = sign[0];
systemConfig.appKey = appKey[0];
systemConfig.appSecret = appSecret[0];
}
console.log("config init success");
} catch(err) {
console.log('ERROR => 服务器配置解析错误 请检查根目录下 serverConfig.xml 文件是否正确');
console.log(err);
throw new BizError("服务器配置解析错误 请检查根目录下 serverConfig.xml 文件是否正确");
}
}
function analysisMongoConnectStr(path, port, dataBase, w, timeOutMs) {
return `mongodb://${path}:${port}/${dataBase}?w=${w}&wtimeoutMS=${timeOutMs}`
}
/**
* 系统配置类
*
*/
export class ServerConfig {
/**系统配置 */
port:number;
sign:string;
appSecret:string;
appKey:string;
}
\ No newline at end of file
import { selectStudentList, studentStatsCenter, studentStatsLeft, studentStatsRight } from "../biz/studentInfo";
import { getTeacherInfo } from "../biz/teacherInfo";
import { getToken, initStudentQueueData, initTeacherQueueData } from "./queueData";
export async function initData() {
//先初始化token
await getToken();
await initStudentQueueData();
await initTeacherQueueData();
//测试
// await selectStudentList(1, 1, '');
// await studentStatsRight('738c2ef8425b11ee98a202031519086a');
// await getTeacherInfo('0be2c9fab1bb11edb278020315b00957');
}
/**
* 缓存数据
*/
import { DATAQUEUEENUM, GRADEENUM } from "../config/enum";
import { ERRORENUM } from "../config/errorEnum";
import { APIENUM } from "../config/interficeEnum";
import { initConfig, systemConfig } from "../config/serverConfig";
import { BizError } from "../util/bizError";
import { changeEnumValue } from "../util/piecemeal";
import { get, post, postForm } from "../util/request";
const CryptoJS = require('crypto-js');
const Crypto = require('crypto');
let queueData = {};
let token = "d9ce92cfa571447c9837a09bd65e1035";
export function getQueueData(enumValue:number, sub?) {
if (sub) {
return queueData[enumValue][sub];
}
return queueData[enumValue];
}
export async function initStudentQueueData() {
let orgId = "d8546196609a11edb903020315e22b66";
let result = await postReqApiData(APIENUM.获取班级列表信息, {orgId, start:0, end:100});
let { classList } = result;
/**班级列表 */
let classData = {};
classList.forEach(info => {
let {grade, gradeClass, className, classId} = info;
if (!classData[grade]) classData[grade] = [];
classData[grade].push({
gradeClass,
className,
classId
});
});
queueData[DATAQUEUEENUM.班级列表] = classData;
/**年级平均 */
let jiuGeYiAvgData = {};//九个一年级平均 结构{"年级":{九个一} }
let jiuGeYiAvgSchoolData = {};//九个一学校完成情况 结构{{九个一} }
let jiuGeYiBanJiAVGData = {};//学生年级_九个一班级平均情况 结构{"年级":[{key:"班级1", value:10}]}
let jiuGeYiNianJiAVGData = [];//九个一年级平均完成情况 结构[{key:"年级", value:10}]
let nianJiHuoDongStatsData = {};//年级活动统计
let tzjcStatsData = {};//体质监测
let shiLiBuLiangLvData = {};//视力不良率
let nianJiRenShuData = {};//年级人数
let guoMinRenShuData = {};//过敏人数
for (let i = 1; i <=12; i++) {
/**九个一 */
let result:any = await getReqApiData(APIENUM.获取年级平均九个一工程, {gradeId:i});
if (result.list) {
let {list} = result;
let nianJiAVGItemNum = 0;
let nianJiAVGItemCount = 0;
let config = [
{name:"完成一个课题研究", key:'project'},
{name:"阅读一本经典书籍", key:'readClassicBook'},
{name:"举办一场读书报告", key:'readingReport'},
{name:"进行一次公开演讲", key:'speak'},
{name:"掌握一门乐器演奏", key:'instrumental'},
{name:"拥有一项运动爱好", key:'sportsHobby'},
{name:"参加一次社区服务", key:'communityServices'},
{name:"参加一次公开表演", key:'performance'},
{name:"参观一个科技场馆", key:'visitTechnology'}
];
let jiuGeYiAvgItemList = [];
config.forEach(info => {
let {name, key} = info;
let value = list[key] || 0;
jiuGeYiAvgItemList.push({key:name, value:parseFloat(value)});
nianJiAVGItemNum += parseFloat(value) ;
nianJiAVGItemCount += 1;
});
jiuGeYiAvgData[i] = jiuGeYiAvgItemList;
jiuGeYiNianJiAVGData.push({
key:changeEnumValue(GRADEENUM, i),
value:nianJiAVGItemCount? Math.round((nianJiAVGItemNum/nianJiAVGItemCount)*10000)/100 : 0
});
}
/**品德发展与公民素养 */
let reqPinDeData:any = await getReqApiData(APIENUM.获取学生活动列表, {pageNo:1, pageSize:1000, gradeId:i, type:"参观实践,社区服务,学段公演,演讲记录"} );
if (reqPinDeData.list && reqPinDeData.list.list && Array.isArray(reqPinDeData.list.list)) {
let itemList = reqPinDeData.list.list;
let itemStatsMap = {
"参观实践":{key:"参观实践", value:0},
"社区服务":{key:"社区服务", value:0},
"学段公演":{key:"学段公演", value:0},
"演讲记录":{key:"演讲记录", value:0}
};
itemList.forEach(info => {
let {activityType} = info;
if (itemStatsMap[activityType]) itemStatsMap[activityType].value += 1;
});
let itemStatsList = Object.values(itemStatsMap);
nianJiHuoDongStatsData[i] = itemStatsList;
}
/**体质监测 */
let reqTZJCData:any = await getReqApiData(APIENUM.获取年级体质检测, {gradeId:i});
if (reqTZJCData.list && Array.isArray(reqTZJCData.list) ) {
let tzjcSuccessCount = 0;
let tzjcCount = 0;
reqTZJCData.list.forEach(info => {
let {name, value} = info;
tzjcCount += value;
if (name == "及格") tzjcSuccessCount += value;
});
if (tzjcCount) {
let rate = Math.round(tzjcSuccessCount/tzjcCount*100);
tzjcStatsData[i] = rate >100 ? 100 : rate;
} else tzjcStatsData[i] = 0;
}
shiLiBuLiangLvData[i] = 0;
nianJiRenShuData[i] = 0;
guoMinRenShuData[i] = 0;
/**各班级九个一完成情况 */
let jiuGeYiBanJiAVGList = [];
for (let j = 0; j < classData[i].length; j++) {
let classItem = classData[i][j];
let jiuGeYiClassItem:any = await getReqApiData(APIENUM.获取年级平均九个一工程, {gradeId:i, classNum:classItem.gradeClass});
if (jiuGeYiClassItem.list ) {
let itemCount = 0;
let itemNum = 0;
for (let key in jiuGeYiClassItem.list) {
itemNum += parseFloat(jiuGeYiClassItem.list[key]);
itemCount += 1;
}
jiuGeYiBanJiAVGList.push({
key:`${classItem.gradeClass}班`,
value:itemCount? Math.round((itemNum/itemCount)*10000)/100 : 0
});
}
}
jiuGeYiBanJiAVGData[i] = jiuGeYiBanJiAVGList;
// /**学生成绩预警 */
// let reqXueShengChengJiYuJingData:any = await getReqApiData(APIENUM.学生体质预警, {gradeId:i});
}
/**视力不良率 */
let reqShiLiData:any = await getReqApiData(APIENUM.获取年级视力不良率, {});
if (reqShiLiData.list && Array.isArray(reqShiLiData.list) ) {
reqShiLiData.list.forEach(info => {
let {value, name} = info;//这里的name后续要换成年级的id
let gradeId = GRADEENUM[name];
if (shiLiBuLiangLvData[gradeId] != undefined) shiLiBuLiangLvData[gradeId] = value;
});
}
/**年级人数 */
let reqNianJiRenShuData:any = await getReqApiData(APIENUM.获取各年级学生数量, {});
if (reqNianJiRenShuData.list && Array.isArray(reqNianJiRenShuData.list.studentNum) ) {
reqNianJiRenShuData.list.studentNum.forEach(info => {
let {value, name} = info;
if (nianJiRenShuData[name] != undefined) nianJiRenShuData[name] = value;
});
}
/**过敏人数 */
let reqXueShengGuoMin:any = await getReqApiData(APIENUM.学生过敏情况, {studentId:""});
if (reqXueShengGuoMin.list && Array.isArray(reqXueShengGuoMin.list) ) {
reqXueShengGuoMin.list.forEach(info => {
let {gradeName} = info;//这里的name后续要换成年级的id
let gradeId = GRADEENUM[gradeName];
if (gradeId && guoMinRenShuData[gradeId] != undefined) guoMinRenShuData[gradeId] += 1;
});
}
queueData[DATAQUEUEENUM.九个一年级平均] = jiuGeYiAvgData;
queueData[DATAQUEUEENUM.学生年级_年级社会实践活动类型统计] = nianJiHuoDongStatsData;
queueData[DATAQUEUEENUM.学生年级_九个一班级平均情况] = jiuGeYiBanJiAVGData;
queueData[DATAQUEUEENUM.学生年级_体质监测合格率] = tzjcStatsData;
queueData[DATAQUEUEENUM.学生年级_视力不良率] = shiLiBuLiangLvData ;
queueData[DATAQUEUEENUM.学生年级_年级人数] = nianJiRenShuData;
queueData[DATAQUEUEENUM.学生年级_过敏人数] = guoMinRenShuData;
let jiuGeYiXueXIao:any = await getReqApiData(APIENUM.获取年级平均九个一工程, {gradeId:''});
let xueXiaoJiuGeAvg = 0;
let jiuGeYiXueXiaoAvgList = [];
if (jiuGeYiXueXIao.list ) {
let itemCount = 0;
let itemNum = 0;
for (let key in jiuGeYiXueXIao.list) {
itemNum += parseFloat(jiuGeYiXueXIao.list[key]);
itemCount += 1;
}
xueXiaoJiuGeAvg = itemCount? Math.round((itemNum/itemCount)*10000)/100 : 0;
let config = [
{name:"完成一个课题研究", key:'project'},
{name:"阅读一本经典书籍", key:'readClassicBook'},
{name:"举办一场读书报告", key:'readingReport'},
{name:"进行一次公开演讲", key:'speak'},
{name:"掌握一门乐器演奏", key:'instrumental'},
{name:"拥有一项运动爱好", key:'sportsHobby'},
{name:"参加一次社区服务", key:'communityServices'},
{name:"参加一次公开表演", key:'performance'},
{name:"参观一个科技场馆", key:'visitTechnology'}
];
config.forEach(info => {
let {name, key} = info;
let value = jiuGeYiXueXIao.list[key] || 0;
jiuGeYiXueXiaoAvgList.push({key:name, value:parseFloat(value)*100});
});
}
queueData[DATAQUEUEENUM.九个一学校平均] = jiuGeYiXueXiaoAvgList ;
queueData[DATAQUEUEENUM.九个一学校平均完成率] = xueXiaoJiuGeAvg;
queueData[DATAQUEUEENUM.九个一年级平均完成情况] = jiuGeYiNianJiAVGData;
let reqJiuGeYiYuJinData:any = await getReqApiData(APIENUM.九个一预警, {type:2});
let jiuGeYiYuJinData = [];
let testList = ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpeg']
if (reqJiuGeYiYuJinData.list && Array.isArray(reqJiuGeYiYuJinData.list)) {
for (let i = 0; i < reqJiuGeYiYuJinData.list.length; i++) {
if (i > 5) break;
let {total, studentId, studentName} = reqJiuGeYiYuJinData.list[i];
let reqModelData:any = await getReqApiData(APIENUM.获取学生模型, {studentId, type:2});
jiuGeYiYuJinData.push({key:studentName, value:null, imgUrl:`http://192.168.0.105:30001/${testList[i]}` || ''});
}
}
let reqYouXiuXueShengData:any = await getReqApiData(APIENUM.九个一预警, {type:1});
let youXiuXueSHengData = [];
if (reqYouXiuXueShengData.list && Array.isArray(reqYouXiuXueShengData.list)) {
for (let i = 0; i < reqYouXiuXueShengData.list.length; i++) {
if (i > 5) break;
let {total, studentName, studentId} = reqYouXiuXueShengData.list[i];
let reqModelData:any = await getReqApiData(APIENUM.获取学生模型, {studentId, type:2});
youXiuXueSHengData.push({key:studentName, value:null, imgUrl:reqModelData.url || ''});
}
}
queueData[DATAQUEUEENUM.九个一预警] = jiuGeYiYuJinData;
queueData[DATAQUEUEENUM.优秀学生] = youXiuXueSHengData;
}
export async function initTeacherQueueData() {
/**教师统计 */
let configList = [
{ enumValue:DATAQUEUEENUM.教师对内_教师资源_学历分布, type:'education' },
{ enumValue:DATAQUEUEENUM.教师对内_教师资源_年龄分布, type:'age' },
{ enumValue:DATAQUEUEENUM.教师对内_教师资源_教龄分布, type:'teachAge' },
{ enumValue:DATAQUEUEENUM.教师对内_教师资源_政治面貌分布, type:'political' },
{ enumValue:DATAQUEUEENUM.教师对内_教师资源_职称分布, type:'title' }
]
for (let i = 0; i < configList.length; i++) {
let { enumValue, type } = configList[i];
let reqData:any = await getReqApiData(APIENUM.获取教师统计, {type});
if (reqData.list && Array.isArray(reqData.list) && reqData.list.length > 0) {
let queueItemList = [];
reqData.list.forEach(info => {
let {type, name, count} = info;
let key = type || name;
if(DATAQUEUEENUM.教师对内_教师资源_年龄分布) {
key = key.replace("教龄",'');
}
queueItemList.push({key:key || '', value:count || 0});
});
queueData[enumValue] = queueItemList;
}
}
}
export async function getReqApiData(url:string, body:object) {
const AppKey = systemConfig.appKey;
body["client_id"] = AppKey;
let ms = new Date().valueOf();
const SignatureStr = `${AppKey}&GET&1&${ms}`;
const Hash = CryptoJS.HmacSHA256(SignatureStr, CryptoJS.enc.Base64.parse(systemConfig.appSecret));
const Base64Str = CryptoJS.enc.Base64.stringify(Hash);
let headers = {
"TY-Stage":"1",
"TY-AppKey":AppKey,
"TY-Timestamp":ms,
"TY-Signature":Base64Str
};
let query = Object.assign(body, {client_id:AppKey});
let res = await get(`https://api-gateway.sasu.shanghaitech.edu.cn/${url}`, query, headers );
return res;
}
export async function postReqApiData(url:string, body:object) {
let ms = new Date().valueOf();
const AppKey = systemConfig.appKey;
const SignatureStr = `${AppKey}&POST&1&${ms}`;
const Hash = CryptoJS.HmacSHA256(SignatureStr, CryptoJS.enc.Base64.parse(systemConfig.appSecret));
const Base64Str = CryptoJS.enc.Base64.stringify(Hash);
let headers = {
"TY-Stage":"1",
"TY-AppKey":AppKey,
"TY-Timestamp":ms,
"TY-Signature":Base64Str
};
let query = { accessToken:token };
let res:any = await postForm(`https://api-gateway.sasu.shanghaitech.edu.cn/${url}?accessToken=${token}`, query, body, headers );
if (res.retCode != "000000") {
/**更新token */
await getToken();
res = await postForm(`https://api-gateway.sasu.shanghaitech.edu.cn/${url}?accessToken=${token}`, query, body, headers );
}
return res;
}
function hmacSHA1(data, key) {
let mac = Crypto.createHmac('sha1', Buffer.from(key, 'UTF-8'));
mac.update(Buffer.from(data, 'UTF-8'));
return mac.digest('hex');
}
export async function getToken() {
let timeStamp = new Date().valueOf();
let appId = 'A6BDC0568BAD9FF4CA933BFDE492EF21';//老的 F3D05D1E729B366ABDEFBD5380815DA7
let appKey = 'bb4a72b5398b4726b7444de589e42a2c';//老的 376f898f9ba7432f90c640d5485c194c
let data = `${appId}${appKey}${timeStamp}`;
const AppKey = systemConfig.appKey;
const SignatureStr = `${AppKey}&GET&1&${timeStamp}`;
const Hash = CryptoJS.HmacSHA256(SignatureStr, CryptoJS.enc.Base64.parse(systemConfig.appSecret));
const Base64Str = CryptoJS.enc.Base64.stringify(Hash);
let headers = {
"TY-Stage":"1",
"TY-AppKey":AppKey,
"TY-Timestamp":timeStamp,
"TY-Signature":Base64Str
};
let reqBody = {
appId,
timeStamp,
keyInfo:hmacSHA1(data, appKey),
platformCode:"999999"
}
let res:any = await post(`https://api-gateway.sasu.shanghaitech.edu.cn/getAccessToken`, {}, reqBody, headers );
if (res.retCode == '000000') {
let {accessToken} = res.tokenInfo;
console.log("token 更新=>", accessToken);
if (accessToken) token = accessToken;
else throw new BizError(ERRORENUM.TOKEN获取失败);
} else {
throw new BizError(ERRORENUM.TOKEN更新失败);
}
}
\ No newline at end of file
import { initConfig, systemConfig} from "./config/serverConfig";
import { initData } from "./data/dataInit";
import { httpServer } from "./net/http_server";
async function lanuch() {
/**初始化配置解析 */
await initConfig();
// await smsTask();
await initData();
/**创建http服务 */
httpServer.createServer(systemConfig.port);
console.log('This indicates that the server is started successfully.');
}
lanuch();
\ No newline at end of file
import { bizlive } from "tencentcloud-sdk-nodejs";
import { ERRORCODEENUM } from "../config/errorEnum";
/**
* 中间件 错误返回
* @param err
* @param req
* @param res
* @param next
*/
export function httpErrorHandler(err, req, res, next) {
console.log("in httpErrorHandler");
console.log(err);
//todo 自定义错误编码
if (err) {
if ( ERRORCODEENUM[err.message] ) {
res.success({success:false, msg:err.message, code:ERRORCODEENUM[err.message]});
next();
}
else {
res.success({success:false, msg:err.message, code:500});
next();
}
}
}
\ No newline at end of file
// import { TABLENAMEENUM } from "../config/enum";
import { ERRORENUM } from "../config/errorEnum";
import { BizError } from "../util/bizError";
/**
* 中间件 校验token
* @param req
* @param res
* @param next
* @returns
*/
export async function checkFuHuaQiToken(req, res, next) {
next();
}
export function watch(req, res, next) {
res.success = success.bind({res:res, req:req});
return next();
}
/**
* 中间件正确返回方法
* @param data
*/
function success(data) {
let resultPack;
if (data ) {
if ( data.success === undefined || data.success === true ) {
resultPack = {data, success:true, code:200};
}
else {
resultPack = data;
}
}else {
resultPack = {code:500, success:false, msg:'result is null'};
}
this.res.send(resultPack);
}
import express = require('express');
import bodyParser = require('body-parser');
import routers = require('../routers/router');
import compression = require('compression');
import { watch } from '../middleware/watch';
import { httpErrorHandler } from '../middleware/httpErrorHandler';
import * as path from "path";
import * as fallback from 'express-history-api-fallback';
export class httpServer {
static createServer(port:number) {
var httpServer = express();
httpServer.all('*', (req, res, next) => {
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type,request-origin,userid,token');
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header('Access-Control-Allow-Credentials', true);
res.header("X-Powered-By", ' 3.2.1');
next();
});
httpServer.use(express.static("./img") );
const root = path.join(__dirname, "../../public");
httpServer.use(express.static(root));
httpServer.use(fallback('index.html', { root }));
httpServer.use(compression());
httpServer.use(watch);
httpServer.use(bodyParser.json({limit:"5000kb"}));
routers.setRouter(httpServer);
httpServer.use(httpErrorHandler);
httpServer.listen(port);
console.log('server listen on port:'+port);
}
}
\ No newline at end of file
/**
* 总路由入口
*/
import * as studentRouter from './student';
import * as teacherRouter from './teacher';
import * as wholeRouter from './whole';
export function setRouter(httpServer) {
studentRouter.setRouter(httpServer);
teacherRouter.setRouter(httpServer);
wholeRouter.setRouter(httpServer);
}
import * as asyncHandler from 'express-async-handler'
import { eccReqParamater } from '../tools/eccParam';
import { studentStatsRight, studentStatsLeft, studentStatsCenter, getClassListByGrade, selectStudentList } from '../biz/studentInfo';
import { GRADEENUM } from '../config/enum';
import { getStudentStatsGradeCenter, getStudentStatsGradeLeft, getStudentStatsGradeRight, getStudentStatsSchoolCenter, getStudentStatsSchoolLeft, getStudentStatsSchoolRight } from '../biz/student';
export function setRouter(httpServer) {
httpServer.post('/data/student/select/gradelist', asyncHandler(gradeList));
httpServer.post('/data/student/select/classlist', asyncHandler(classList));
httpServer.post('/data/student/select/studentlist', asyncHandler(studentList));
httpServer.post('/data/student/portrait/left', asyncHandler(studentLeft));
httpServer.post('/data/student/portrait/center', asyncHandler(studentCenter));
httpServer.post('/data/student/portrait/right', asyncHandler(studentRight));
httpServer.post('/data/student/stats/school/left', asyncHandler(studentStatsSchoolLeft));
httpServer.post('/data/student/stats/school/center', asyncHandler(studentStatsSchoolCenter));
httpServer.post('/data/student/stats/school/right', asyncHandler(studentStatsSchoolRight));
/**年级 */
httpServer.post('/data/student/stats/grade/left', asyncHandler(studentStatsGradeLeft));
httpServer.post('/data/student/stats/grade/center', asyncHandler(studentStatsGradeCenter));
httpServer.post('/data/student/stats/grade/right', asyncHandler(studentStatsGradeRight));
}
/**搜索页 */
async function gradeList(req, res) {
let dataList = [];
for (let key in GRADEENUM) {
let anyKey:any = key;
if (isNaN(anyKey)) {
let keyStr = key;
dataList.push({key:keyStr, value:GRADEENUM[key]});
}
}
res.success({dataList});
}
async function classList(req, res) {
let reqConf = {grade: 'Number' };
let { grade } = eccReqParamater(reqConf, req.body);
let result = getClassListByGrade(grade);
res.success(result);
}
async function studentList(req, res) {
let reqConf = {grade: 'Number', classNum:'Number', name:'String' };
let { grade, classNum, name } = eccReqParamater(reqConf, req.body, ["name", "grade", "classNum"]);
let result = await selectStudentList(grade, classNum, name );
res.success(result);
}
/**个人页 */
async function studentLeft(req, res) {
let reqConf = {studentId: 'String' };
let { studentId } = eccReqParamater(reqConf, req.body, []);
let result = await studentStatsLeft(studentId);
res.success(result);
}
async function studentCenter(req, res) {
let reqConf = {studentId: 'String' };
let { studentId } = eccReqParamater(reqConf, req.body, []);
let result = await studentStatsCenter(studentId);
res.success(result);
}
async function studentRight(req, res) {
let reqConf = {studentId: 'String' };
let { studentId } = eccReqParamater(reqConf, req.body, []);
let result = await studentStatsRight(studentId);
res.success(result);
}
/**学校页 */
async function studentStatsSchoolLeft(req, res) {
let result = await getStudentStatsSchoolLeft();
res.success(result);
}
async function studentStatsSchoolRight(req, res) {
let result = await getStudentStatsSchoolRight();
res.success(result);
}
async function studentStatsSchoolCenter(req, res) {
let result = await getStudentStatsSchoolCenter();
res.success(result);
}
/**年级页 */
async function studentStatsGradeLeft(req, res) {
let reqConf = {gradeId: 'String' };
let { gradeId } = eccReqParamater(reqConf, req.body, []);
let result = await getStudentStatsGradeLeft(gradeId);
res.success(result);
}
async function studentStatsGradeRight(req, res) {
let reqConf = {gradeId: 'String' };
let { gradeId } = eccReqParamater(reqConf, req.body, []);
let result = await getStudentStatsGradeRight(gradeId);
res.success(result);
}
async function studentStatsGradeCenter(req, res) {
let reqConf = {gradeId: 'String' };
let { gradeId } = eccReqParamater(reqConf, req.body, []);
let result = await getStudentStatsGradeCenter(gradeId);
res.success(result);
}
import * as asyncHandler from 'express-async-handler';
import { eccReqParamater } from '../tools/eccParam';
import { getTeacherExternal, getTeacherInternal } from '../biz/teacher';
import { getTeacherInfo, getTeacherList } from '../biz/teacherInfo';
import { GRADEENUM } from '../config/enum';
export function setRouter(httpServer) {
httpServer.post('/data/teacher/select/gradelist', asyncHandler(gradeList));
httpServer.post('/data/teacher/select/disciplinelist', asyncHandler(disciplineList));
httpServer.post('/data/teacher/select/sexlist', asyncHandler(sexList));
httpServer.post('/data/teacher/select/teacherlist', asyncHandler(teacherList));
httpServer.post('/data/teacher/select/teacherinfo', asyncHandler(teacherInfo));
httpServer.post('/data/teacher/stats/internal', asyncHandler(teacherInternal));
httpServer.post('/data/teacher/stats/external', asyncHandler(teacherExternal));
}
/**教师查询页 */
async function gradeList(req, res) {
let dataList = [];
for (let key in GRADEENUM) {
let anyKey:any = key;
if (isNaN(anyKey)) {
let keyStr = key;
dataList.push({key:keyStr, value:GRADEENUM[key]});
}
}
res.success({dataList});
}
async function disciplineList(req, res) {
let dataList = [];
let disciplineTitleList = ["语文", "数学", "英语"];
disciplineTitleList.forEach((str, index) => {
dataList.push({key:str, value:`${index+1}`});
});
res.success({dataList});
}
async function sexList(req, res) {
let dataList = [];
let sexTitleList = [ "女", "男"];
sexTitleList.forEach((str, index) => {
dataList.push({key:str, value:index});
});
res.success({dataList});
}
async function teacherList(req, res) {
let reqConf = {grade: 'Number', discipline:'String', sex:'Number', teacherName:'String' };
let { grade, discipline, sex, teacherName } = eccReqParamater(reqConf, req.body, ["grade", "discipline", "sex", "teacherName"]);
let result = await getTeacherList(grade, discipline, sex, teacherName);
res.success(result);
}
/**教师个人 */
async function teacherInfo(req, res) {
let reqConf = {teacherId:'String' };
let { teacherId } = eccReqParamater(reqConf, req.body);
let result = await getTeacherInfo(teacherId);
res.success(result);
}
async function teacherInternal(req, res) {
let result = await getTeacherInternal();
res.success(result);
}
async function teacherExternal(req, res) {
let result = await getTeacherExternal();
res.success(result);
}
import { getWholeInternal } from "../biz/whole";
import * as asyncHandler from 'express-async-handler';
export function setRouter(httpServer) {
httpServer.post('/data/whole/internal', asyncHandler(gradeList));
}
/**教师查询页 */
async function gradeList(req, res) {
let result = await getWholeInternal();
res.success(result);
}
\ No newline at end of file
import { ERRORENUM } from "../config/errorEnum";
import { BizError } from "../util/bizError";
/**
* 根据conf配置校验请求参数
* @param conf 配置
* @param param 表单
* @param skipKeys []不必填的字段
*/
export function eccReqParamater(conf:object, param, skipKeys?) {
skipKeys = skipKeys || [];
let skipMap = {};
skipKeys.forEach(keyName => {
skipMap[keyName] = 1;
});
/**校验多余字段 */
for (let key in param) {
if (!conf[key]) throw new BizError(ERRORENUM.参数错误, `多余${key}字段`);
}
/**校验必填和缺失字段 */
for (let key in conf) {
let confType = conf[key];
let value = param[key];
let valueType = typeof value;
if ( value == null || value == undefined ) {
if (!skipMap[key]) throw new BizError(ERRORENUM.参数错误, `缺失${key}字段`);
} else {
let isError = false;
let errorStr = "";
switch(confType) {
case 'Number':
if ( confType.toLowerCase() != valueType ) isError = true;
else {
if ((""+param[key]).indexOf('.') > -1) {
param[key] = parseInt(`${param[key] *100}`)/100;
}
}
break;
case 'String':
case 'Boolean':
case 'Object':
if ( confType.toLowerCase() != valueType ) isError = true;
break;
case '[Number]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'number' ) {
isError = true;
errorStr = `${key}应是number型数组其中下标${i}${typeof item}`;
}
}
break;
case '[Object]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'object' ) {
isError = true;
errorStr = `${key}应是object型数组其中下标${i}${typeof item}`;
}
}
break;
case '[String]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'string' ) {
isError = true;
errorStr = `${key}应是String型数组其中下标${i}${typeof item}`;
}
}
break;
}
errorStr = isError && errorStr == "" ? `${key}应该是${confType}型 而不是${valueType}`: errorStr;
if (isError) throw new BizError(ERRORENUM.参数错误, errorStr);
}
}
return param;
}
\ No newline at end of file
const xlsx = require('node-xlsx');
const path = require('path');
/**
* onceSheetBecomeOfblockData 将excel文件的指定sheet解析成数据块数据
* @param fileName 文件名称
* @param sheetName 表名称
* @returns [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
export function onceSheetBecomeOfblockData(fileName, sheetName) {
let {sheetMap} = getExcel( path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", fileName ));
// return sheetMap;
let thisBlockData = getBlockData(sheetMap[sheetName]);
return thisBlockData;
}
/**
* excelBecomeOfBlockData 将excel所有的sheet解析成数据块
* @param fileName 文件名称
* @returns {"sheetName1":[ {blockData:数据块(二维数组), blockTitle:"数据标题"}], ...}
*/
export function excelBecomeOfBlockData(fileName) {
let {sheetMap} = getExcel( path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", fileName ));
let result = {};
for (let sheetName in sheetMap) {
result[sheetName] = getBlockData(sheetMap[sheetName]);
}
return result;
}
/**
* planaryArrayBecomeOfBlockData 将符合excel规则的sheet二维数组转为 数据块
* @param dataList excel解出来的数据
* @returns thisBlockData 返回数据块集合 格式:blockList = [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
export function planaryArrayBecomeOfBlockData(planaryArray) {
return getBlockData(planaryArray);;
}
/**
* getBlockData 数据分块
* @param dataList 解析出来的excel二维数组
* @returns 返回数据块集合 格式:blockList = [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
function getBlockData(dataList) {
let blockList = [];
for (let i = 0; i < 999; i++) {
let {blockData, blockTitle, notItem, delDataList} = checkBlock(dataList);
if (notItem) break;
dataList = delDataList;
if (blockTitle) blockList.push({blockData, blockTitle});
}
return blockList;
}
function getListFristNotNullItemIndex(list) { //获取起始坐标
if (!list.length) return null;
for (let i = 0; i < list.length; i++) {
if (list[i]) return i;
}
}
function getListFirstNullItemIndex(startX, list) { //获取第一个为空的坐标
if (!list.length) return null;
let checkItem = false;
let firstItemIndex = 0;
for (let i = startX; i <= list.length; i++) {
let item = list[i];
if (!checkItem && item) checkItem = true;
if (checkItem && !item) {
firstItemIndex = i;
break;
}
}
return firstItemIndex;
}
function listRegionIsNull(list, startX, endX) { //指定区间内数据是否未空
let isNull = true;
if ( !list.length ) return isNull;
for (let i = startX; i < endX; i++) {
let item = list[i];
if (item) {
isNull = false;
break;
}
}
return isNull;
}
function thisListNotItem(list) {
for (let i = 0; i < list.length; i++) {
if (list[i]) return false;
}
return true
}
function checkBlock(dataList) {
//纵向有效起始点
let startY = 0;
let startX = 0;
let isNotBlockTitle = false; //没有块标题
let isLook = false;
let endX = 0;//x轴最长结束下标 【包括下标】
let blockTitle = ''; //标题块名称
let notItem = true;
for (let i = 0; i < dataList.length; i++) {
let childList = dataList[i] || [];
if (!thisListNotItem(childList)) {
if ( !isLook ) {
let thisRoowStartX = getListFristNotNullItemIndex(childList);
let thisRoowLastItem = childList[thisRoowStartX + 1];
let LastList = dataList[i+1] || [];
// let lastRoowStartX = getListFristNotNullItemIndex(LastList);
let lastRoowHaveItem = LastList[thisRoowStartX];
if ( thisRoowLastItem || (LastList.length && lastRoowHaveItem) ) {
if (lastRoowHaveItem && thisRoowLastItem ) {
isNotBlockTitle = true; //不存在标题块
blockTitle = `${thisRoowStartX}_${i}`;
startY = i;
startX = thisRoowStartX;
}
else {
blockTitle = dataList[i][thisRoowStartX];
dataList[i][thisRoowStartX] = null;
if ( thisRoowLastItem ) { // 同行存在元素 标题在y轴上
startY = i;
startX = thisRoowStartX + 1;
} else { // 同行存在元素 标题在x轴上
startY = i + 1;
startX = thisRoowStartX;
}
}
isLook = true;
} else { //只有标题 无内容
console.log(dataList[i][thisRoowStartX]);
dataList[i][thisRoowStartX] = null;
}
} else {
//测量最大连续长度
let firstNullX = getListFirstNullItemIndex(startX, childList);
if (firstNullX) endX = Math.max(endX, firstNullX-1);
break;
}
notItem = false;
}
}
let endY = 0;//y轴连续下标 【包括下标】
let yInfoStart = false;
let yInfoEnd = false;
for (let y = startY; y < dataList.length; y++) {
//纵向找连续性
let thisRoow = dataList[y];
let regionIsNull = listRegionIsNull(thisRoow, startX, endX);
if (!regionIsNull) {
endY = y;
if (!yInfoStart) yInfoStart = true;
}
if (yInfoStart && regionIsNull) yInfoEnd = true;
if (yInfoEnd) break;
}
let blockData = [];
for (let y = startY; y <= endY; y++) {
let onceList = [];
for (let x = startX; x <= endX; x++) {
onceList.push(dataList[y][x]);
dataList[y][x] = null;
}
blockData.push(onceList);
}
return {blockData, blockTitle, delDataList:dataList,notItem};
}
//获取单个excel文件的数据
function getExcel(filePath) {
const workSheetsFromFile = xlsx.parse(filePath);
let sheetMap = {};
let sheetList = [];
for (let i = 0; i < workSheetsFromFile.length; i++) {
let sheetInfo = workSheetsFromFile[i];
sheetMap[sheetInfo.name] = sheetInfo.data;
sheetList.push(sheetInfo);
}
return {sheetMap, sheetList}
}
\ No newline at end of file
/**
* 异常类
* 需要和log4js共同使用
*/
import { getBizMsg } from "../config/errorEnum";
import { logError } from "./log";
export class BizError extends Error {
constructor(...msgs) {
let reqErrorMsg = '';
let logErrorMsg = '';
for (let i = 0; i <msgs.length; i++) {
if (!i) {
let msg = getBizMsg(msgs[i]);
reqErrorMsg = msg;
logErrorMsg = msg;
} else {
logErrorMsg += ` | ${msgs[i]} `;
}
}
logError(logErrorMsg);
super(reqErrorMsg);
}
}
/**
* 日志类
* 包括错误日志 普通日志
* 日志存放在根目录的logs内
*/
let log4js = require('log4js');
let path = require('path');
//log路径
export const systemLogPath = {
errorLogFile:"error",
errorLogDir:"error",
handleLogFile:"handle",
handleLogDir:"handle"
}
//日志根目录
// let baseLogPath = path.resolve(__dirname.substring(0, __dirname.indexOf("out")), 'logs');
let baseLogPath = path.resolve('./', 'logs');
let errFile = path.resolve(baseLogPath, systemLogPath.errorLogDir, systemLogPath.errorLogFile);
let handFile =path.resolve(baseLogPath, systemLogPath.handleLogDir, systemLogPath.handleLogFile);
let config = {
appenders:
{
"rule-console": {"type": "console"},
"errorLogger": {
"type": "dateFile", // 日志类型
"filename": errFile, // 输出文件名
"pattern": "yyyy-MM-dd.log", // 后缀
"alwaysIncludePattern": true, // 上面两个参数是否合并
"encoding": "utf-8", // 编码格式
"maxLogSize": 1000, // 最大存储内容
"numBackups": 3, // 当文件内容超过文件存储空间时,备份文件的数量
"path": `/${systemLogPath.errorLogDir}`
},
"handleLogger": {
"type": "dateFile",
"filename": handFile,
"pattern": "yyyy-MM-dd.log",
"alwaysIncludePattern": true,
"encoding": "utf-8",
"maxLogSize": 1000,
"numBackups": 3,
"path": `/${systemLogPath.handleLogDir}`
}
},
categories: {
"default": {"appenders": ["rule-console"], "level": "all"}, //这个配置一定要有
"errorLogger": {"appenders": ["errorLogger"], "level": "error"},
"handleLogger": {"appenders": ["handleLogger"], "level": "all"}
},
"baseLogPath": path.resolve(baseLogPath, systemLogPath.handleLogDir, systemLogPath.handleLogFile)
};
log4js.configure(config); //加载配置文件
//调用预先定义的日志名称
let errorLogger = log4js.getLogger("errorLogger");
let handleLogger = log4js.getLogger("handleLogger");
let consoleLogger = log4js.getLogger("rule-console");
//错误日志
export function logError(...errStrs) {
let str = "";
errStrs.forEach(item => {
str += item + " | ";
});
errorLogger.error(`errorInfo => ${str}`);
}
//普通日志
export function logHandle(msgStr:string) {
handleLogger.info(`logInfo => ${msgStr}`);
}
//输出日志
export function logConsole(logStr:string) {
consoleLogger.info(`logInfo => ${logStr}`);
}
import moment = require("moment");
/**
* 生成工时填报的dateKey
* @returns
*/
export function generateDateKey(time?) {
if (time) {
return moment(time).format("YYYY-MM-DD")+ ' 18:00:00';
}
return moment().format("YYYY-MM-DD")+ ' 18:00:00'
}
/**
* 生成请假的id
* @param userId
* @returns
*/
export function generateAskForLeaveId(userId:number) {
return `al${userId}${new Date().valueOf()}${Math.ceil(Math.random() *100)}`
}
/**
* 解析xml
*/
var xml2js = require("xml2js");
/**
*
* @param str 需要解析的xml文本
* @returns 解析好的对象
*/
export function analysisXml(str) {
return new Promise( (resolve, reject) => {
xml2js.parseString(str, (err, result) => {
if (err) return reject(err);
return resolve(result);
});
});
}
\ No newline at end of file
/**
* 零碎的通用工具
*/
import moment = require("moment");
/**
* 匹配新旧对象变化
* 将newObj 与 oldObj 比对,将newObj中发生变化的key返回
* 使用前需要校验对象中的内容
* @param newObj 新对象
* @param oldObj 旧对象
* @returns [key] 发生变化的key
*/
export function checkChange(newObj, oldObj) {
let changeKeyList = [];
for (let newKey in newObj) {
if (`${newObj[newKey]}` != `${oldObj[newKey]}`) changeKeyList.push(newKey);
}
return changeKeyList;
}
/**
* 根据conf截取data中的数据
* @param conf
* @param data
* @returns
*/
export function extractData(conf, data, isAdmin) {
let result = {};
for (let key in conf) {
let confInfo = conf[key];
if (confInfo.changeDate) {
if (isAdmin) result[key] = data[key] ? moment(data[key]).format("YYYY-MM-DD") : '-';
else result[key] = data[key] || 0;
} else if (confInfo.isAdd && isAdmin) {
let addStr = "";
data[key].forEach(str => {
addStr += str;
});
result[key] = addStr;
}
else {
result[key] = data[key];
if (typeof result[key] == 'string' && !result[key]) result[key] = '';
}
}
return result;
}
/**
* 校验数据对象是否有空
* @param data
* @param sensitive 敏感校验 true时 0 和 ""会校验失败 false时 校验成功
* @returns true/false true = 有空值 false=无空值
*/
export function checkDataHaveNull(data:object, sensitive:boolean) {
if (Array.isArray(data)) return data.length == 0;
if (Object.keys(data).length == 0) return true;
let success = false;
for (let key in data) {
if (data[key] == null || data[key] == undefined) success = true;
if (sensitive) {
if (data[key] === 0 || data[key] === "" ) success = true;
}
}
return success;
}
/**
* 将枚举值转换成对应的枚举名(key)
* @param enumConf 目标枚举
* @param value 目标值
* @returns string 返回字符串 如果传入多个枚举值,就拼接字符串
*/
export function changeEnumValue(enumConf, value:any) {
if (!value) return '';
if (isNaN(value)) return '';
if ( typeof value == 'number' ) {
let str = enumConf[value];
return str
}
let str = "";
value.forEach((item, index) => {
let subStr = enumConf[item];
str += subStr;
if (index == value.length-1) str+="";
else str += ","
});
return str;
}
\ No newline at end of file
/**
* 请求工具
*/
import * as request from 'request';
import { BizError } from './bizError';
/**
* 请求接口(get)
* @param url 路由
* @param query 请求参数
* @param headers 请求头
* @returns
*/
export function get(url:string, query?, headers?) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
return new Promise((resolve, reject)=>{
let paramater:any = { url, json:true };
if (query) paramater.qs = query;
if (headers) paramater.headers = headers;
request.get(paramater, function (err, r, body) {
if (err) return reject(err);
if (r && r.statusCode != 200) return reject(new Error('httpError:'+r.statusCode));
resolve(body);
});
})
}
export function post(url, query, reqBody, headers) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
let header = {"content-type": "application/json"};
return new Promise((resolve, reject)=>{
request({
url: url,
method: "POST",
json: true,
headers: Object.assign(header, headers),
body: reqBody,
query:{}
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
resolve(body);
}
else {
// reject(error)
}
});
})
}
export function postForm(url, query, body, headers) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
let header = {"content-type": "application/json"};
return new Promise((resolve, reject)=>{
request({
url: url,
method: "POST",
json: true,
headers: Object.assign(header, headers),
body
}, function(error, response, res) {
if (!error) {
resolve(res);
}
else {
reject(error)
}
});
})
}
{
"compilerOptions": {
"module": "commonjs",
"target": "es2017",
"sourceMap": true,
"rootDir":"./src",
"outDir":"./out"
},
"exclude": [
"node_modules"
]
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment