├── servers ├── event │ ├── version.js │ ├── config │ │ ├── secret.json │ │ ├── db.js │ │ ├── db_local.js │ │ ├── node_clickhouse.js │ │ ├── province.js │ │ ├── monitorKeys.js │ │ └── AccountConfig.js │ ├── schema │ │ ├── schemaLogList copy.js │ │ ├── schemaLogList.js │ │ ├── config.js │ │ └── team.js │ ├── restart.sh │ ├── createTable.sh │ ├── public │ │ └── stylesheets │ │ │ └── style.css │ ├── lib │ │ └── insertCode.js │ ├── router │ │ └── routes │ │ │ ├── timerStatistic.js │ │ │ ├── sysInfo.js │ │ │ ├── commonUpLog.js │ │ │ ├── common.js │ │ │ ├── weHandleData.js │ │ │ ├── buryPointAlarmMessage.js │ │ │ ├── buryPointUserBehaviorRelation.js │ │ │ ├── buryPointTask.js │ │ │ ├── buryPointCircleSelect.js │ │ │ ├── buryPointVisualTracking.js │ │ │ ├── buryPointAlarm.js │ │ │ ├── buryPointSdkRelease.js │ │ │ ├── buryPointTest.js │ │ │ ├── buryPointTemplate.js │ │ │ ├── buryPointWarehouse.js │ │ │ ├── buryPointField.js │ │ │ └── index.js │ ├── middlreware │ │ ├── ignorePathRes.js │ │ └── sqlCheck.js │ ├── config_db_local.js │ ├── package.json │ ├── util │ │ ├── status-code.js │ │ └── extension.js │ ├── node_clickhouse │ │ └── consts.js │ ├── table_config.js │ ├── controllers │ │ └── fail.js │ └── app.js ├── monitor │ ├── version.js │ ├── config │ │ ├── secret.json │ │ ├── db.js │ │ ├── db_local.js │ │ ├── node_clickhouse.js │ │ ├── province.js │ │ ├── errorList.js │ │ └── monitorKeys.js │ ├── public │ │ └── stylesheets │ │ │ └── style.css │ ├── router │ │ ├── routes │ │ │ ├── fail.js │ │ │ ├── extendBehaviorInfo.js │ │ │ ├── customerPvLeave.js │ │ │ ├── config.js │ │ │ ├── alarmRule.js │ │ │ ├── walkingfunny.js │ │ │ ├── message.js │ │ │ ├── httpErrorHandleList.js │ │ │ ├── resourceLoadInfo.js │ │ │ ├── jsErrorHandleList.js │ │ │ ├── commonTable.js │ │ │ ├── ignoreError.js │ │ │ ├── customerStayTime.js │ │ │ ├── alarm.js │ │ │ ├── httpErrorInfo.js │ │ │ ├── pageLoadInfo.js │ │ │ └── index.js │ │ └── routesFail.js │ ├── lib │ │ └── insertCode.js │ ├── config_db_local.js │ ├── schema │ │ ├── infoSchemaList.js │ │ ├── schemaLogList.js │ │ ├── screenShotInfo.js │ │ ├── resourceLoadInfo.js │ │ ├── config.js │ │ ├── ignoreError.js │ │ ├── infoCountByDay.js │ │ ├── behaviorInfo.js │ │ ├── team.js │ │ ├── deviceInfoCountByDay.js │ │ ├── customerPvLeave.js │ │ ├── httpErrorHandleList.js │ │ └── jsErrorHandleList.js │ ├── middlreware │ │ ├── ignorePathRes.js │ │ └── sqlCheck.js │ ├── package.json │ ├── util │ │ ├── timer.js │ │ ├── status-code.js │ │ └── extension.js │ ├── node_clickhouse │ │ └── consts.js │ └── controllers │ │ └── fail.js ├── logger │ ├── README.md │ ├── config │ │ ├── secret.json │ │ ├── node_clickhouse.js │ │ ├── slave.js │ │ ├── province.js │ │ ├── db.js │ │ ├── log_server.js │ │ ├── AccountConfig.js │ │ ├── monitorKeys.js │ │ ├── log_config.js │ │ └── local_db.js │ ├── schema │ │ ├── schemaLogList.js │ │ └── config.js │ ├── middlreware │ │ ├── ignorePath.js │ │ ├── ignorePathRes.js │ │ └── sqlCheck.js │ ├── .gitignore │ ├── router │ │ ├── routes │ │ │ ├── logData.js │ │ │ ├── logInfos.js │ │ │ ├── common.js │ │ │ ├── config.js │ │ │ ├── traceData.js │ │ │ ├── index.js │ │ │ └── logProject.js │ │ └── timer.js │ ├── lib │ │ └── insertCode.js │ ├── util │ │ ├── timer.js │ │ ├── status-code.js │ │ └── extension.js │ └── node_clickhouse │ │ └── consts.js └── center │ ├── config │ ├── secret.json │ ├── db_clickhouse.js │ ├── node_clickhouse.js │ ├── province.js │ ├── db_local.js │ ├── db.js │ ├── monitorKeys.js │ └── local_db.js │ ├── public │ └── stylesheets │ │ └── style.css │ ├── middlreware │ ├── ignorePath.js │ ├── wfParam.js │ ├── ignorePathRes.js │ └── sqlCheck.js │ ├── router │ ├── routes │ │ ├── order.js │ │ ├── menuPermissions.js │ │ ├── company.js │ │ ├── userToken.js │ │ ├── alarmList.js │ │ ├── sso.js │ │ ├── flowDataInfoByHour.js │ │ ├── alarmOverview.js │ │ ├── orderInfo.js │ │ ├── applicationConfig.js │ │ ├── noticeTemplate.js │ │ ├── alarmRule.js │ │ ├── flowDataInfoByDay.js │ │ ├── product.js │ │ └── index.js │ └── index.js │ ├── package.json │ ├── config_db_local.js │ ├── schema │ ├── infoSchemaListByYear.js │ ├── infoSchemaListByDay.js │ ├── config.js │ ├── userToken.js │ ├── applicationConfig.js │ ├── menuPermissions.js │ ├── alarmItem.js │ ├── team.js │ ├── noticeTemplate.js │ ├── noticeSetting.js │ └── message.js │ ├── util │ ├── status-code.js │ └── extension.js │ └── node_clickhouse │ └── consts.js ├── .dockerignore ├── config ├── secret.json └── log_config.js ├── .babelrc ├── views ├── images │ ├── logos │ │ ├── logo.png │ │ ├── logo2.png │ │ └── favicon.ico │ └── zm_logos │ │ └── favicon.ico └── resource │ ├── wf_center │ ├── 0.e0948c93.chunk.js │ ├── src │ │ ├── assets │ │ │ └── img │ │ │ │ ├── logo │ │ │ │ ├── logo.png │ │ │ │ ├── apm_logo.png │ │ │ │ └── oneApm_logo.png │ │ │ │ ├── main │ │ │ │ ├── bg1.png │ │ │ │ ├── bg2.png │ │ │ │ ├── gold.png │ │ │ │ ├── vip.png │ │ │ │ ├── circle-bg.png │ │ │ │ └── circle-event-bg.png │ │ │ │ ├── buyModal │ │ │ │ ├── webBg.png │ │ │ │ ├── zh_bank.png │ │ │ │ ├── headerImg.png │ │ │ │ ├── headerImg1.png │ │ │ │ ├── right-btn.png │ │ │ │ ├── wx_success.png │ │ │ │ ├── bg-personal.png │ │ │ │ ├── dialog-header1.png │ │ │ │ └── dialog-header2.png │ │ │ │ ├── login │ │ │ │ └── login-bg.png │ │ │ │ ├── teamlist │ │ │ │ ├── empty.png │ │ │ │ └── team-empty.png │ │ │ │ ├── header │ │ │ │ ├── product_free.png │ │ │ │ └── product_pay.png │ │ │ │ └── common │ │ │ │ └── login_background.png │ │ ├── modules │ │ │ └── overview │ │ │ │ └── images │ │ │ │ └── shape.png │ │ └── components │ │ │ └── header │ │ │ └── images │ │ │ └── tab-item-active-bg.png │ └── index.html │ ├── wf_event │ ├── src │ │ ├── assets │ │ │ └── img │ │ │ │ ├── task │ │ │ │ └── no-task.png │ │ │ │ ├── dataView │ │ │ │ ├── hotPer.png │ │ │ │ ├── animation.png │ │ │ │ ├── hotValue.png │ │ │ │ └── warning.png │ │ │ │ └── customer │ │ │ │ ├── connect_header_bg.webp │ │ │ │ └── customer_header_bg.webp │ │ └── modules │ │ │ └── dataView │ │ │ └── image │ │ │ ├── no-card.png │ │ │ ├── earth-chart.png │ │ │ ├── heat-chart.png │ │ │ ├── words-chart.png │ │ │ ├── number-chart.png │ │ │ └── path-analysis.png │ ├── manifest.json │ └── index.html │ ├── wf_logger │ ├── src │ │ └── assets │ │ │ └── img │ │ │ ├── logo │ │ │ ├── apm_logo.png │ │ │ ├── oneApm_logo.png │ │ │ └── apm_logo_dark.png │ │ │ └── customer │ │ │ ├── connect_header_bg.webp │ │ │ └── customer_header_bg.webp │ ├── manifest.json │ └── index.html │ └── wf_monitor │ ├── src │ ├── assets │ │ └── img │ │ │ ├── behaviors │ │ │ ├── bad.png │ │ │ ├── good.png │ │ │ ├── great.png │ │ │ └── searching.png │ │ │ ├── common │ │ │ ├── bushu1.png │ │ │ ├── bushu2.jpg │ │ │ ├── bushu3.png │ │ │ ├── bushu4.png │ │ │ ├── bushu5.png │ │ │ ├── taro_init.png │ │ │ ├── alipay_init.png │ │ │ ├── taro_bushu.png │ │ │ └── alipay_bushu.png │ │ │ ├── logo │ │ │ ├── apm_logo.png │ │ │ ├── oneApm_logo.png │ │ │ └── apm_logo_dark.png │ │ │ ├── home │ │ │ └── animation.png │ │ │ ├── customer │ │ │ ├── connect_bg.webp │ │ │ ├── customer_bg.webp │ │ │ ├── connect_header_bg.webp │ │ │ └── customer_header_bg.webp │ │ │ └── javascriptErrorDetail │ │ │ ├── pc.png │ │ │ ├── iphone.png │ │ │ ├── url-bg.jpg │ │ │ ├── browser.png │ │ │ ├── windows.png │ │ │ └── url-bg-active.jpg │ └── modules │ │ ├── overview │ │ └── image │ │ │ ├── loading.png │ │ │ └── loading-slow.png │ │ ├── home │ │ └── components │ │ │ └── project │ │ │ └── images │ │ │ ├── alarm-bg.png │ │ │ ├── card-bg.png │ │ │ ├── pref-red.png │ │ │ ├── card-zm-bg.png │ │ │ ├── health-red.png │ │ │ ├── pref-green.png │ │ │ ├── health-green.png │ │ │ ├── health-yellow.png │ │ │ └── pref-yellow.png │ │ ├── apiPerf │ │ └── components │ │ │ └── performanceChart │ │ │ └── loading-slow.png │ │ └── pagePerf │ │ └── components │ │ └── performanceChart │ │ └── loading-slow.png │ ├── 1.3ede17ad.chunk.js │ └── index.html ├── Dockerfile ├── .gitignore ├── utils ├── timer.js ├── status-code.js ├── rewriteConsole.js └── extension.js ├── DES_DOCKER.md ├── middlreware ├── cacheData │ ├── handleCache.js │ └── index.js ├── logger.js ├── sqlCheck.js └── ignorePathRes.js └── webfunny_init └── sso.init.js /servers/event/version.js: -------------------------------------------------------------------------------- 1 | module.exports = "0.2.1" -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | node_modules 3 | npm-debug.log -------------------------------------------------------------------------------- /servers/monitor/version.js: -------------------------------------------------------------------------------- 1 | module.exports = "0.1.94" -------------------------------------------------------------------------------- /config/secret.json: -------------------------------------------------------------------------------- 1 | { 2 | "sign": "webfunny-access" 3 | } 4 | -------------------------------------------------------------------------------- /servers/logger/README.md: -------------------------------------------------------------------------------- 1 | # webfunny_log_server 2 | 这是webfunny日志系统的服务端 3 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env"], 3 | "compact": false 4 | } -------------------------------------------------------------------------------- /servers/center/config/secret.json: -------------------------------------------------------------------------------- 1 | { 2 | "sign": "webfunny-access" 3 | } 4 | -------------------------------------------------------------------------------- /servers/event/config/secret.json: -------------------------------------------------------------------------------- 1 | { 2 | "sign": "webfunny-access" 3 | } 4 | -------------------------------------------------------------------------------- /servers/logger/config/secret.json: -------------------------------------------------------------------------------- 1 | { 2 | "sign": "webfunny-access" 3 | } 4 | -------------------------------------------------------------------------------- /servers/monitor/config/secret.json: -------------------------------------------------------------------------------- 1 | { 2 | "sign": "webfunny-access" 3 | } 4 | -------------------------------------------------------------------------------- /servers/event/schema/schemaLogList copy.js: -------------------------------------------------------------------------------- 1 | module.exports = [ 2 | "../schema/customerPV", 3 | ] -------------------------------------------------------------------------------- /servers/event/restart.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "开始执行创建命令" 3 | npm run prd_restart 4 | echo "数据库表创建完成" -------------------------------------------------------------------------------- /servers/event/createTable.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "开始执行创建命令" 3 | npm run table_config 4 | echo "数据库表创建完成" -------------------------------------------------------------------------------- /views/images/logos/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/images/logos/logo.png -------------------------------------------------------------------------------- /views/images/logos/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/images/logos/logo2.png -------------------------------------------------------------------------------- /servers/logger/schema/schemaLogList.js: -------------------------------------------------------------------------------- 1 | module.exports = [ 2 | "../schema/traceData", 3 | "../schema/logData", 4 | ] -------------------------------------------------------------------------------- /views/images/logos/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/images/logos/favicon.ico -------------------------------------------------------------------------------- /views/images/zm_logos/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/images/zm_logos/favicon.ico -------------------------------------------------------------------------------- /views/resource/wf_center/0.e0948c93.chunk.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[0],{295:function(n,w,o){o.r(w)}}]); -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/logo/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/logo/logo.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/main/bg1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/main/bg1.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/main/bg2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/main/bg2.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/main/gold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/main/gold.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/main/vip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/main/vip.png -------------------------------------------------------------------------------- /views/resource/wf_event/src/assets/img/task/no-task.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/assets/img/task/no-task.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/buyModal/webBg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/buyModal/webBg.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/login/login-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/login/login-bg.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/logo/apm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/logo/apm_logo.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/main/circle-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/main/circle-bg.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/teamlist/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/teamlist/empty.png -------------------------------------------------------------------------------- /views/resource/wf_event/src/assets/img/dataView/hotPer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/assets/img/dataView/hotPer.png -------------------------------------------------------------------------------- /views/resource/wf_logger/src/assets/img/logo/apm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_logger/src/assets/img/logo/apm_logo.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/behaviors/bad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/behaviors/bad.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/common/bushu1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/common/bushu1.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/common/bushu2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/common/bushu2.jpg -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/common/bushu3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/common/bushu3.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/common/bushu4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/common/bushu4.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/common/bushu5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/common/bushu5.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/logo/apm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/logo/apm_logo.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/buyModal/zh_bank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/buyModal/zh_bank.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/logo/oneApm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/logo/oneApm_logo.png -------------------------------------------------------------------------------- /views/resource/wf_event/src/assets/img/dataView/animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/assets/img/dataView/animation.png -------------------------------------------------------------------------------- /views/resource/wf_event/src/assets/img/dataView/hotValue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/assets/img/dataView/hotValue.png -------------------------------------------------------------------------------- /views/resource/wf_event/src/assets/img/dataView/warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/assets/img/dataView/warning.png -------------------------------------------------------------------------------- /views/resource/wf_logger/src/assets/img/logo/oneApm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_logger/src/assets/img/logo/oneApm_logo.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/behaviors/good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/behaviors/good.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/behaviors/great.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/behaviors/great.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/common/taro_init.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/common/taro_init.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/home/animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/home/animation.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/logo/oneApm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/logo/oneApm_logo.png -------------------------------------------------------------------------------- /servers/center/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /servers/event/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /servers/monitor/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/buyModal/headerImg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/buyModal/headerImg.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/buyModal/headerImg1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/buyModal/headerImg1.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/buyModal/right-btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/buyModal/right-btn.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/buyModal/wx_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/buyModal/wx_success.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/header/product_free.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/header/product_free.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/header/product_pay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/header/product_pay.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/teamlist/team-empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/teamlist/team-empty.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/modules/overview/images/shape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/modules/overview/images/shape.png -------------------------------------------------------------------------------- /views/resource/wf_event/src/modules/dataView/image/no-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/modules/dataView/image/no-card.png -------------------------------------------------------------------------------- /views/resource/wf_logger/src/assets/img/logo/apm_logo_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_logger/src/assets/img/logo/apm_logo_dark.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/common/alipay_init.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/common/alipay_init.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/common/taro_bushu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/common/taro_bushu.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/logo/apm_logo_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/logo/apm_logo_dark.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/buyModal/bg-personal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/buyModal/bg-personal.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/main/circle-event-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/main/circle-event-bg.png -------------------------------------------------------------------------------- /views/resource/wf_event/src/modules/dataView/image/earth-chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/modules/dataView/image/earth-chart.png -------------------------------------------------------------------------------- /views/resource/wf_event/src/modules/dataView/image/heat-chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/modules/dataView/image/heat-chart.png -------------------------------------------------------------------------------- /views/resource/wf_event/src/modules/dataView/image/words-chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/modules/dataView/image/words-chart.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/behaviors/searching.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/behaviors/searching.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/common/alipay_bushu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/common/alipay_bushu.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/customer/connect_bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/customer/connect_bg.webp -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/customer/customer_bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/customer/customer_bg.webp -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/overview/image/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/overview/image/loading.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/buyModal/dialog-header1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/buyModal/dialog-header1.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/buyModal/dialog-header2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/buyModal/dialog-header2.png -------------------------------------------------------------------------------- /views/resource/wf_center/src/assets/img/common/login_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/assets/img/common/login_background.png -------------------------------------------------------------------------------- /views/resource/wf_event/src/modules/dataView/image/number-chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/modules/dataView/image/number-chart.png -------------------------------------------------------------------------------- /views/resource/wf_event/src/modules/dataView/image/path-analysis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/modules/dataView/image/path-analysis.png -------------------------------------------------------------------------------- /views/resource/wf_event/src/assets/img/customer/connect_header_bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/assets/img/customer/connect_header_bg.webp -------------------------------------------------------------------------------- /views/resource/wf_event/src/assets/img/customer/customer_header_bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_event/src/assets/img/customer/customer_header_bg.webp -------------------------------------------------------------------------------- /views/resource/wf_logger/src/assets/img/customer/connect_header_bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_logger/src/assets/img/customer/connect_header_bg.webp -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/javascriptErrorDetail/pc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/javascriptErrorDetail/pc.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/overview/image/loading-slow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/overview/image/loading-slow.png -------------------------------------------------------------------------------- /servers/logger/middlreware/ignorePath.js: -------------------------------------------------------------------------------- 1 | module.exports = ["/getSysInfo", "/getValidateCode", "/refreshValidateCode", "/login", "/register", "/registerForAdmin", "/sendRegisterEmail", "/resetPwd", "/upBp"] -------------------------------------------------------------------------------- /views/resource/wf_logger/src/assets/img/customer/customer_header_bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_logger/src/assets/img/customer/customer_header_bg.webp -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/customer/connect_header_bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/customer/connect_header_bg.webp -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/customer/customer_header_bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/customer/customer_header_bg.webp -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/javascriptErrorDetail/iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/javascriptErrorDetail/iphone.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/javascriptErrorDetail/url-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/javascriptErrorDetail/url-bg.jpg -------------------------------------------------------------------------------- /views/resource/wf_center/src/components/header/images/tab-item-active-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_center/src/components/header/images/tab-item-active-bg.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/javascriptErrorDetail/browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/javascriptErrorDetail/browser.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/javascriptErrorDetail/windows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/javascriptErrorDetail/windows.png -------------------------------------------------------------------------------- /servers/center/middlreware/ignorePath.js: -------------------------------------------------------------------------------- 1 | module.exports = ["/hasSuperAdminAccount", "/getValidateCode", "/refreshValidateCode", "/login", "/register", "/registerForAdmin", "/sendRegisterEmail", "/resetPwd", "/upBp"] -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/assets/img/javascriptErrorDetail/url-bg-active.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/assets/img/javascriptErrorDetail/url-bg-active.jpg -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/home/components/project/images/alarm-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/home/components/project/images/alarm-bg.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/home/components/project/images/card-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/home/components/project/images/card-bg.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/home/components/project/images/pref-red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/home/components/project/images/pref-red.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/home/components/project/images/card-zm-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/home/components/project/images/card-zm-bg.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/home/components/project/images/health-red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/home/components/project/images/health-red.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/home/components/project/images/pref-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/home/components/project/images/pref-green.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/home/components/project/images/health-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/home/components/project/images/health-green.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/home/components/project/images/health-yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/home/components/project/images/health-yellow.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/home/components/project/images/pref-yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/home/components/project/images/pref-yellow.png -------------------------------------------------------------------------------- /servers/logger/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | npm-debug.* 3 | package-lock.json 4 | node_modules 5 | dist 6 | *.swp 7 | *.swo 8 | .idea/ 9 | .vscode/ 10 | logs/ 11 | api_wiki/ 12 | varsion.js 13 | schema_temp/ 14 | lib/upload* 15 | .eslintrc -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/apiPerf/components/performanceChart/loading-slow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/apiPerf/components/performanceChart/loading-slow.png -------------------------------------------------------------------------------- /views/resource/wf_monitor/src/modules/pagePerf/components/performanceChart/loading-slow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/webfunny_monitor/main/views/resource/wf_monitor/src/modules/pagePerf/components/performanceChart/loading-slow.png -------------------------------------------------------------------------------- /servers/logger/router/routes/logData.js: -------------------------------------------------------------------------------- 1 | const { LogDataController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | // 上报日志信息 5 | // router.post('/upLogInfos', LogInfosController.upLogInfos); 6 | } 7 | -------------------------------------------------------------------------------- /servers/monitor/router/routes/fail.js: -------------------------------------------------------------------------------- 1 | const { FailController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | // 更新激活码 5 | router.post('/createPurchaseCode', FailController.createPurchaseCode); 6 | } 7 | -------------------------------------------------------------------------------- /servers/monitor/router/routes/extendBehaviorInfo.js: -------------------------------------------------------------------------------- 1 | const { ExtendBehaviorInfoController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | // 拓展行为日志 5 | router.post('/extendBehavior', ExtendBehaviorInfoController.create); 6 | } 7 | -------------------------------------------------------------------------------- /servers/event/lib/insertCode.js: -------------------------------------------------------------------------------- 1 | (function(f){var e=f.sessionStorage;if(e){e.CUSTOMER_WEB_MONITOR_ID="jeffery_webmonitor";var d=document.createElement("script");d.async=1;d.src="monitorJsPath";var g=document.getElementsByTagName("script")[0];g.parentNode.insertBefore(d,g)}})(window); -------------------------------------------------------------------------------- /servers/logger/lib/insertCode.js: -------------------------------------------------------------------------------- 1 | (function(f){var e=f.sessionStorage;if(e){e.CUSTOMER_WEB_MONITOR_ID="jeffery_webmonitor";var d=document.createElement("script");d.async=1;d.src="monitorJsPath";var g=document.getElementsByTagName("script")[0];g.parentNode.insertBefore(d,g)}})(window); -------------------------------------------------------------------------------- /servers/monitor/lib/insertCode.js: -------------------------------------------------------------------------------- 1 | (function(f){var e=f.sessionStorage;if(e){e.CUSTOMER_WEB_MONITOR_ID="jeffery_webmonitor";var d=document.createElement("script");d.async=1;d.src="monitorJsPath";var g=document.getElementsByTagName("script")[0];g.parentNode.insertBefore(d,g)}})(window); -------------------------------------------------------------------------------- /views/resource/wf_monitor/1.3ede17ad.chunk.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[1],{2742:function(n,o,e){},2743:function(n,o,e){var s=e(16),e=e(2742),i={insert:"head",singleton:!1};s(e="string"==typeof(e=e.__esModule?e.default:e)?[[n.i,e,""]]:e,i);n.exports=e.locals||{}}}]); -------------------------------------------------------------------------------- /servers/monitor/router/routes/customerPvLeave.js: -------------------------------------------------------------------------------- 1 | const { CustomerPvLeaveController } = require("../../controllers/controllers.js") 2 | module.exports = (router) => { 3 | // 获取24小时内每小的跳出率 4 | router.post('/getCusLeavePercentByHour', CustomerPvLeaveController.getCusLeavePercentByHour); 5 | } 6 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:14.16.1-slim 2 | RUN npm install pm2 -g 3 | COPY . /app 4 | WORKDIR /app 5 | RUN npm install 6 | RUN npm run bootstrap 7 | RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 8 | RUN echo 'Asia/Shanghai' >/etc/timezone 9 | EXPOSE 9010 10 | EXPOSE 9011 11 | CMD npm run prd -------------------------------------------------------------------------------- /servers/center/router/routes/order.js: -------------------------------------------------------------------------------- 1 | // const OrderController = require('../../controllers/order') 2 | const { OrderController } = require("../../controllers/controllers.js") 3 | 4 | module.exports = (router) => { 5 | // 更新公司信息 6 | router.post('/getOrderList', OrderController.getOrderList); 7 | } 8 | -------------------------------------------------------------------------------- /servers/monitor/router/routes/config.js: -------------------------------------------------------------------------------- 1 | const { ConfigController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | router.post('/config', ConfigController.create); 5 | // 把有效token存入内存中 6 | router.post('/storeTokenToMemory', ConfigController.storeTokenToMemory); 7 | } -------------------------------------------------------------------------------- /servers/event/router/routes/timerStatistic.js: -------------------------------------------------------------------------------- 1 | const { TimerStatisticController } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | router.get('/test/calcu', TimerStatisticController.calculateDataPreDay); 5 | router.get('/test/statistic', TimerStatisticController.test); 6 | } 7 | -------------------------------------------------------------------------------- /servers/logger/router/routes/logInfos.js: -------------------------------------------------------------------------------- 1 | // const LogInfosController = require('../../controllers/logInfos') 2 | const { LogInfosController } = require("../../controllers/controllers.js") 3 | 4 | module.exports = (router) => { 5 | // 上报日志信息 6 | // router.post('/upLogInfos', LogInfosController.upLogInfos); 7 | } 8 | -------------------------------------------------------------------------------- /servers/center/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "./config/webfunny_center.js --BUILD_ENV local", 7 | "prd": "pm2 start config/webfunny_center.js && pm2 log webfunny_center" 8 | }, 9 | "dependencies": { 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /servers/logger/router/routes/common.js: -------------------------------------------------------------------------------- 1 | // const Common = require('../../controllers/common') 2 | const { Common } = require("../../controllers/controllers.js") 3 | 4 | module.exports = (router) => { 5 | // 上报日志信息 6 | router.post('/upLogs', Common.upLogs); 7 | 8 | // 上报错误日志信息 9 | router.post('/upTraceLogs', Common.upTraceLogs); 10 | } 11 | -------------------------------------------------------------------------------- /servers/logger/router/routes/config.js: -------------------------------------------------------------------------------- 1 | // const ConfigController = require('../../controllers/config') 2 | const { ConfigController } = require("../../controllers/controllers.js") 3 | 4 | module.exports = (router) => { 5 | router.post('/config', ConfigController.create); 6 | // 把有效token存入内存中 7 | router.post('/storeTokenToMemory', ConfigController.storeTokenToMemory); 8 | } -------------------------------------------------------------------------------- /servers/monitor/router/routes/alarmRule.js: -------------------------------------------------------------------------------- 1 | const { AlarmRuleController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | router.post('/createNewAlarmRule', AlarmRuleController.createNewAlarmRule); 5 | router.post('/getAllAlarmRule', AlarmRuleController.getAllAlarmRule); 6 | router.post('/deleteAlarmRule', AlarmRuleController.deleteAlarmRule); 7 | } 8 | -------------------------------------------------------------------------------- /servers/center/router/routes/menuPermissions.js: -------------------------------------------------------------------------------- 1 | const { MenuPermissionsController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | // 更新菜单权限 5 | router.post('/updateMenuPermission', MenuPermissionsController.updateMenuPermission); 6 | // 根据项目id获取菜单权限 7 | router.post('/getMenuPermissionsByProject', MenuPermissionsController.getMenuPermissionsByProject); 8 | } 9 | -------------------------------------------------------------------------------- /servers/event/router/routes/sysInfo.js: -------------------------------------------------------------------------------- 1 | const { SysInfoController } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | router.get('/sysInfo', SysInfoController.getSysInfo); 5 | router.get('/eventBaseInfo', SysInfoController.getSysInfo); 6 | router.get('/baseInfo', SysInfoController.getBaseInfo); 7 | router.get('/saas/projectInfo', SysInfoController.getProjectInfo); 8 | } 9 | -------------------------------------------------------------------------------- /servers/center/router/routes/company.js: -------------------------------------------------------------------------------- 1 | const { CompanyController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | // 更新公司信息 5 | router.post('/updateCompany', CompanyController.updateCompany); 6 | // 获取公司信息 7 | router.post('/getCompanyInfo', CompanyController.getCompanyInfo); 8 | // 获取公司列表 9 | router.post('/getCompanyList', CompanyController.getCompanyList); 10 | } 11 | -------------------------------------------------------------------------------- /servers/monitor/router/routes/walkingfunny.js: -------------------------------------------------------------------------------- 1 | const { ProjectController, CustomerPVController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | /** */ 5 | // 获取项目各项数据,项目数量,健康分等等 6 | router.post('/walkingfunny/getProjectBaseCountInfo', ProjectController.getProjectBaseCountInfo); 7 | router.post('/walkingfunny/getProjectCountInfoInRealTime', CustomerPVController.getProjectCountInfoInRealTime); 8 | } 9 | -------------------------------------------------------------------------------- /servers/event/router/routes/commonUpLog.js: -------------------------------------------------------------------------------- 1 | const { CommonUpLog } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | router.post('/initCf', CommonUpLog.initFunnelConfig); 5 | router.post('/upEvent', CommonUpLog.upEvent); 6 | router.post('/upEvents', CommonUpLog.upEvents); 7 | router.post('/upMyEvents', CommonUpLog.upMyEvents); 8 | router.post('/queryClientUsers', CommonUpLog.queryClientUsers); 9 | } 10 | -------------------------------------------------------------------------------- /servers/event/middlreware/ignorePathRes.js: -------------------------------------------------------------------------------- 1 | module.exports = ["/webfunny_a98ebb38b8588dcd81bb316d6dba26b7","/webfunny_e0037b51f4db2e4dead2debb88277e99","/webfunny_d56b699830e77ba53855679cb1d252da","/webfunny_796747e71f479b3d5fb9da41b8869fe7","/webfunny_a7a773f7da320241a7ec1ca401486d44","/webfunny_623f6adc78b16f773a3f344a048141d6","/webfunny_5835306c873ebe5f5420b5d5ceb332d2","/webfunny_9de4a97425678c5b1288aa70c1669a64","/webfunny_00417bcb83b8e64fef38f6f6bbb3adac",] -------------------------------------------------------------------------------- /servers/event/config/db.js: -------------------------------------------------------------------------------- 1 | const { accountInfo } = require('./AccountConfig'); 2 | 3 | const {write, read} = accountInfo.mysqlConfig; 4 | 5 | const { createClient } = require('@clickhouse/client'); 6 | 7 | const client = createClient({ 8 | host: `http://${write.ip}:${write.port}`, 9 | username: write.userName, 10 | password: write.password, 11 | database: write.dataBaseName 12 | }) 13 | 14 | 15 | 16 | module.exports = { 17 | client, 18 | } 19 | -------------------------------------------------------------------------------- /servers/logger/config/node_clickhouse.js: -------------------------------------------------------------------------------- 1 | const { client } = require('../config/db') 2 | const path = require("path") 3 | const WebfunnyNodeClickhouse = require("webfunny-node-clickhouse") 4 | const showSql = false 5 | class NodeClickhouse extends WebfunnyNodeClickhouse { 6 | constructor(schemaPath = "") { 7 | super({ schemaPath: schemaPath ? path.resolve(__dirname, schemaPath) : "", client, showSql }) 8 | } 9 | } 10 | 11 | module.exports = NodeClickhouse -------------------------------------------------------------------------------- /servers/monitor/config/db.js: -------------------------------------------------------------------------------- 1 | const { accountInfo } = require('./AccountConfig'); 2 | 3 | const {write, read} = accountInfo.mysqlConfig; 4 | 5 | const { createClient } = require('@clickhouse/client'); 6 | 7 | const client = createClient({ 8 | host: `http://${write.ip}:${write.port}`, 9 | username: write.userName, 10 | password: write.password, 11 | database: write.dataBaseName 12 | }) 13 | 14 | 15 | 16 | module.exports = { 17 | client, 18 | } 19 | -------------------------------------------------------------------------------- /servers/center/config/db_clickhouse.js: -------------------------------------------------------------------------------- 1 | 2 | const { accountInfo } = require('./AccountConfig'); 3 | 4 | const {write, read} = accountInfo.loggerConfig; 5 | 6 | const { createClient } = require('@clickhouse/client'); 7 | 8 | const client = createClient({ 9 | host: `http://${write.ip}:${write.port}`, 10 | username: write.userName, 11 | password: write.password, 12 | database: write.dataBaseName 13 | }) 14 | 15 | module.exports = { 16 | client 17 | } 18 | -------------------------------------------------------------------------------- /servers/center/router/routes/userToken.js: -------------------------------------------------------------------------------- 1 | // const UserTokenController = require('../../controllers/UserToken') 2 | const { UserTokenController } = require("../../controllers/controllers.js") 3 | 4 | module.exports = (router) => { 5 | // 验证token 6 | router.post('/checkToken', UserTokenController.checkToken); 7 | // 检查登录信息是否存在(服务器间通信,废弃) 8 | router.post('/getUserTokenFromNetworkByToken', UserTokenController.getUserTokenFromNetworkByToken); 9 | } 10 | -------------------------------------------------------------------------------- /servers/event/config/db_local.js: -------------------------------------------------------------------------------- 1 | const { accountInfo } = require('./AccountConfig'); 2 | 3 | const {write, read} = accountInfo.mysqlConfig; 4 | 5 | const { createClient } = require('@clickhouse/client'); 6 | 7 | const client = createClient({ 8 | host: `http://${write.ip}:${write.port}`, 9 | username: write.userName, 10 | password: write.password, 11 | database: write.dataBaseName 12 | }) 13 | 14 | 15 | 16 | module.exports = { 17 | client, 18 | } 19 | -------------------------------------------------------------------------------- /servers/monitor/config/db_local.js: -------------------------------------------------------------------------------- 1 | const { accountInfo } = require('./AccountConfig'); 2 | 3 | const {write, read} = accountInfo.mysqlConfig; 4 | 5 | const { createClient } = require('@clickhouse/client'); 6 | 7 | const client = createClient({ 8 | host: `http://${write.ip}:${write.port}`, 9 | username: write.userName, 10 | password: write.password, 11 | database: write.dataBaseName 12 | }) 13 | 14 | 15 | 16 | module.exports = { 17 | client, 18 | } 19 | -------------------------------------------------------------------------------- /servers/center/router/routes/alarmList.js: -------------------------------------------------------------------------------- 1 | const { AlarmListController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | router.get('/alarm/alarmList', AlarmListController.getAlarmList) 5 | router.post('/alarm/getAlarmTriggerByAlarmId', AlarmListController.getAlarmTriggerByAlarmId) 6 | router.get('/alarm/getAlarmDetailById', AlarmListController.getAlarmDetailById) 7 | router.post('/alarm/getAlarmHistory', AlarmListController.getAlarmHistory) 8 | } 9 | -------------------------------------------------------------------------------- /servers/center/router/routes/sso.js: -------------------------------------------------------------------------------- 1 | // const ApplicationConfigController = require('../../controllers/applicationConfig') 2 | const { ApplicationConfigController } = require("../../controllers/controllers.js") 3 | 4 | module.exports = (router) => { 5 | // 获取飞书的 6 | router.get("/getSignatureForFeiShu", ApplicationConfigController.getSignatureForFeiShu) 7 | // 飞书获取用于信息 8 | router.get("/getAccessTokenByCodeForFeiShu", ApplicationConfigController.getAccessTokenByCodeForFeiShu) 9 | } 10 | -------------------------------------------------------------------------------- /servers/monitor/router/routes/message.js: -------------------------------------------------------------------------------- 1 | const { MessageController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | // 新增消息 5 | router.post('/createMessage', MessageController.createNewMessage); 6 | // 获取消息 7 | router.post('/getMessageByType', MessageController.getMessageByType); 8 | // 阅读消息 9 | router.post('/readMessage', MessageController.readMessage); 10 | // 阅读全部 11 | router.post('/readAll', MessageController.readAll) 12 | } 13 | -------------------------------------------------------------------------------- /views/resource/wf_logger/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "app.css": "./app.44fbfb70d8db1cda8fc0.css", 3 | "app.js": "app.708f79a5.js", 4 | "index.html": "index.html", 5 | "src/assets/img/customer/index.scss": "src/assets/img/customer/customer_header_bg.webp", 6 | "src/assets/img/logo/apm_logo.png": "src/assets/img/logo/apm_logo.png", 7 | "src/assets/img/logo/apm_logo_dark.png": "src/assets/img/logo/apm_logo_dark.png", 8 | "src/assets/img/logo/oneApm_logo.png": "src/assets/img/logo/oneApm_logo.png" 9 | } -------------------------------------------------------------------------------- /servers/center/config_db_local.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | 3 | fs.writeFile( __dirname + '/config/db.js', "", (err) => { 4 | if (err) throw err; 5 | console.log("数据库配置文件清理完成!"); 6 | fs.readFile(__dirname + '/config/db_local.js', function(err, data){ 7 | let newString = data.toString(); 8 | fs.writeFile(__dirname + '/config/db.js', newString, (err) => { 9 | if (err) throw err; 10 | console.log("数据库配置重写完成!"); 11 | }); 12 | }) 13 | }); 14 | -------------------------------------------------------------------------------- /servers/center/router/routes/flowDataInfoByHour.js: -------------------------------------------------------------------------------- 1 | // const FlowDataInfoByHourController = require('../../controllers/flowDataInfoByHour') 2 | const { FlowDataInfoByHourController } = require("../../controllers/controllers.js") 3 | 4 | module.exports = (router) => { 5 | // 存储流量信息 6 | router.post('/createFlowData', FlowDataInfoByHourController.createFlowDataInfoByHour); 7 | // 获取流量列表数据 8 | router.get('/getHourFlowTrendData', FlowDataInfoByHourController.getHourFlowTrendData); 9 | } 10 | -------------------------------------------------------------------------------- /servers/event/config_db_local.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | 3 | fs.writeFile(__dirname + '/config/db.js', "", (err) => { 4 | if (err) throw err; 5 | console.log("数据库配置文件清理完成!"); 6 | fs.readFile(__dirname + '/config/db_local.js', function(err, data){ 7 | let newString = data.toString(); 8 | fs.writeFile(__dirname + '/config/db.js', newString, (err) => { 9 | if (err) throw err; 10 | console.log("数据库配置重写完成!"); 11 | }); 12 | }) 13 | }); 14 | -------------------------------------------------------------------------------- /servers/logger/router/routes/traceData.js: -------------------------------------------------------------------------------- 1 | const { TraceDataController } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | router.post('/getLogCountByDay', TraceDataController.getLogCountByDay); 5 | router.post('/getLogListGroupByMsg', TraceDataController.getLogListGroupByMsg); 6 | router.post('/getLogDataList', TraceDataController.getTraceDataList); 7 | // 查询日志详情 8 | router.post('/getLogDataBySearch', TraceDataController.getTraceDataBySearch); 9 | } 10 | -------------------------------------------------------------------------------- /servers/monitor/config_db_local.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | 3 | fs.writeFile(__dirname + '/config/db.js', "", (err) => { 4 | if (err) throw err; 5 | console.log("数据库配置文件清理完成!"); 6 | fs.readFile(__dirname + '/config/db_local.js', function(err, data){ 7 | let newString = data.toString(); 8 | fs.writeFile(__dirname + '/config/db.js', newString, (err) => { 9 | if (err) throw err; 10 | console.log("数据库配置重写完成!"); 11 | }); 12 | }) 13 | }); 14 | -------------------------------------------------------------------------------- /servers/monitor/schema/infoSchemaList.js: -------------------------------------------------------------------------------- 1 | const { DataTypes } = require("../node_clickhouse/consts"); 2 | 3 | const PageLoadInfoByMinuteSchema = require('./pageLoadInfoByMinute') 4 | const PageLoadInfoByMinuteConfig = PageLoadInfoByMinuteSchema(DataTypes) 5 | 6 | const schemaList = [ 7 | { 8 | name: "PageLoadInfoByMinute", 9 | fields: PageLoadInfoByMinuteConfig.fields, 10 | index: PageLoadInfoByMinuteConfig.fieldIndex 11 | }, 12 | ] 13 | 14 | module.exports = schemaList -------------------------------------------------------------------------------- /servers/logger/router/routes/index.js: -------------------------------------------------------------------------------- 1 | const commonRouter = require('./common') 2 | const configRouter = require('./config') 3 | const logDataRouter = require('./logData') 4 | const traceDataRouter = require('./traceData') 5 | const projectRouter = require('./logProject') 6 | 7 | const createRouter = (router) => { 8 | commonRouter(router) 9 | configRouter(router) 10 | traceDataRouter(router) 11 | logDataRouter(router) 12 | projectRouter(router) 13 | } 14 | 15 | module.exports = { 16 | createRouter 17 | } -------------------------------------------------------------------------------- /servers/center/schema/infoSchemaListByYear.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 按年建表 3 | */ 4 | const { DataTypes } = require("sequelize"); 5 | 6 | const FlowDataInfoByDaySchema = require('./flowDataInfoByDay') 7 | const FlowDataInfoByDayConfig = FlowDataInfoByDaySchema(DataTypes) 8 | 9 | const schemaList = [ 10 | { 11 | name: "FlowDataInfoByDay", 12 | fields: FlowDataInfoByDayConfig.fields, 13 | index: FlowDataInfoByDayConfig.fieldIndex 14 | }, 15 | ] 16 | //exports// 17 | module.exports = schemaList 18 | //exports// -------------------------------------------------------------------------------- /servers/center/router/routes/alarmOverview.js: -------------------------------------------------------------------------------- 1 | const { AlarmOverviewController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | router.post('/alarm/alarmOverview', AlarmOverviewController.getOverviewTrend) 5 | router.get('/alarm/getAlarmLatestTop10', AlarmOverviewController.getAlarmLatestTop10) 6 | router.get('/alarm/getAlarmApplicationTop10', AlarmOverviewController.getAlarmApplicationTop10) 7 | router.get('/alarm/getAlarmCountOverview', AlarmOverviewController.getAlarmCountOverview) 8 | } 9 | -------------------------------------------------------------------------------- /servers/logger/middlreware/ignorePathRes.js: -------------------------------------------------------------------------------- 1 | module.exports = [ 2 | "/getSysInfo", "/getValidateCode", "/refreshValidateCode", "/login", "/register", 3 | "/registerForAdmin", "/sendRegisterEmail", "/resetPwd", "/upBp", "/uploadMapFile", 4 | "/checkSsoToken", "/loginForApi", "/registerForApi", "/createNewTeamForApi", "/createNewProjectForApi", 5 | "/projectSimpleListByWebmonitorIds", "/addViewers", "/forbiddenProject", "/deleteProject", "/monitorBaseInfo", 6 | "/storeTokenToMemory", "getJavascriptErrorStackCodeForSource" 7 | ] -------------------------------------------------------------------------------- /servers/monitor/middlreware/ignorePathRes.js: -------------------------------------------------------------------------------- 1 | module.exports = [ 2 | "/getSysInfo", "/getValidateCode", "/refreshValidateCode", "/login", "/register", 3 | "/registerForAdmin", "/sendRegisterEmail", "/resetPwd", "/upBp", "/uploadMapFile", 4 | "/checkSsoToken", "/loginForApi", "/registerForApi", "/createNewTeamForApi", "/createNewProjectForApi", 5 | "/projectSimpleListByWebmonitorIds", "/addViewers", "/forbiddenProject", "/deleteProject", 6 | "/monitorBaseInfo", "/storeTokenToMemory", "getJavascriptErrorStackCodeForSource" 7 | ] -------------------------------------------------------------------------------- /servers/center/schema/infoSchemaListByDay.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 按天建表 3 | */ 4 | const { DataTypes } = require("sequelize"); 5 | 6 | const FlowDataInfoByHourSchema = require('./flowDataInfoByHour') 7 | const FlowDataInfoByHourConfig = FlowDataInfoByHourSchema(DataTypes) 8 | 9 | 10 | const schemaList = [ 11 | { 12 | name: "FlowDataInfoByHour", 13 | fields: FlowDataInfoByHourConfig.fields, 14 | index: FlowDataInfoByHourConfig.fieldIndex 15 | }, 16 | ] 17 | //exports// 18 | module.exports = schemaList 19 | //exports// -------------------------------------------------------------------------------- /servers/event/config/node_clickhouse.js: -------------------------------------------------------------------------------- 1 | const { client } = require('../config/db') 2 | const path = require("path") 3 | const WebfunnyNodeClickhouse = require("webfunny-node-clickhouse") 4 | const { accountInfo } = require('./AccountConfig') 5 | const showSql = accountInfo.printSql && accountInfo.printSql.event 6 | class NodeClickhouse extends WebfunnyNodeClickhouse { 7 | constructor(schemaPath = "") { 8 | super({ schemaPath: schemaPath ? path.resolve(__dirname, schemaPath) : "", client, showSql }) 9 | } 10 | } 11 | 12 | module.exports = NodeClickhouse -------------------------------------------------------------------------------- /servers/center/middlreware/wfParam.js: -------------------------------------------------------------------------------- 1 | const Utils = require('../util/utils') 2 | /** 3 | * 判断token是否可用 4 | */ 5 | module.exports = function () { 6 | return async function (ctx, next) { 7 | let wfParam = {} 8 | const { method, url, body } = ctx.request 9 | if (method.toLowerCase() === "get") { 10 | wfParam = Utils.parseQs(url) 11 | } else { 12 | wfParam = typeof body === "string" ? JSON.parse(body) : body 13 | } 14 | ctx.wfParam = wfParam 15 | await next() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /servers/monitor/config/node_clickhouse.js: -------------------------------------------------------------------------------- 1 | const { client } = require('../config/db') 2 | const path = require("path") 3 | const WebfunnyNodeClickhouse = require("webfunny-node-clickhouse") 4 | const { accountInfo } = require('./AccountConfig') 5 | const showSql = accountInfo.printSql && accountInfo.printSql.monitor 6 | class NodeClickhouse extends WebfunnyNodeClickhouse { 7 | constructor(schemaPath = "") { 8 | super({ schemaPath: schemaPath ? path.resolve(__dirname, schemaPath) : "", client, showSql }) 9 | } 10 | } 11 | 12 | module.exports = NodeClickhouse -------------------------------------------------------------------------------- /servers/center/config/node_clickhouse.js: -------------------------------------------------------------------------------- 1 | const { client } = require('../config/db_clickhouse') 2 | const path = require("path") 3 | const WebfunnyNodeClickhouse = require("webfunny-node-clickhouse") 4 | const { accountInfo } = require('./AccountConfig') 5 | const showSql = accountInfo.printSql && accountInfo.printSql.center 6 | class NodeClickhouse extends WebfunnyNodeClickhouse { 7 | constructor(schemaPath = "") { 8 | super({ schemaPath: schemaPath ? path.resolve(__dirname, schemaPath) : "", client, showSql }) 9 | } 10 | } 11 | 12 | module.exports = NodeClickhouse -------------------------------------------------------------------------------- /servers/monitor/router/routes/httpErrorHandleList.js: -------------------------------------------------------------------------------- 1 | const { HttpErrorHandleListController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | // 创建API接口错误处理信息 5 | router.post('/createHttpErrorHandleList', HttpErrorHandleListController.create); 6 | // 解决api接口错误 7 | router.post('/resolveHttpErrorInHandleList', HttpErrorHandleListController.resolveHttpErrorInHandleList); 8 | // 根据simpleHttpUrl判断解决状态 9 | router.post('/getSolveStatusBySimpleHttpUrl', HttpErrorHandleListController.getSolveStatusBySimpleHttpUrl); 10 | } 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | npm-debug.log 3 | node_modules 4 | dist 5 | *.swp 6 | *.swo 7 | .vscode/ 8 | log 9 | .DS_Store 10 | npm-debug.* 11 | node_modules 12 | dist 13 | *.swp 14 | *.swo 15 | .idea/ 16 | .vscode/ 17 | .history/ 18 | .VSCodeCounter/ 19 | config_variable 20 | logs/ 21 | bin/* 22 | interceptor 23 | config/db.js 24 | temp.min.js.map 25 | views/wf_center 26 | views/wf_monitor 27 | views/wf_event 28 | views/wf_logger 29 | views/wf_source_map 30 | schema_temp/ 31 | alarm/ 32 | sso/ 33 | util_cus/ 34 | .eslintrc 35 | lib/*.map 36 | H5SdkReleaseScript*.js 37 | webfunny.config -------------------------------------------------------------------------------- /servers/monitor/router/routes/resourceLoadInfo.js: -------------------------------------------------------------------------------- 1 | const { ResourceLoadInfoController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * 静态资源加载状态接口 6 | */ 7 | // 获取静态资源错误分类 8 | router.get('/getResourceErrorCountByDay', ResourceLoadInfoController.getResourceErrorCountByDay); 9 | router.post('/getResourceLoadInfoListByDay', ResourceLoadInfoController.getResourceLoadInfoListByDay); 10 | // 获取最近24小时内,静态资源加载错误发生数量 11 | router.get('/getResourceErrorCountByHour', ResourceLoadInfoController.getResourceErrorCountByHour); 12 | } 13 | -------------------------------------------------------------------------------- /servers/center/router/routes/orderInfo.js: -------------------------------------------------------------------------------- 1 | // const OrderInfoController = require('../../controllers/orderInfo') 2 | const { OrderInfoController } = require("../../controllers/controllers.js") 3 | 4 | module.exports = (router) => { 5 | // 创建订单 6 | router.post('/createOrder', OrderInfoController.createOrder); 7 | // 查询订单 8 | router.post('/getOrderList', OrderInfoController.getOrderInfoList); 9 | // 检查相同订单 10 | router.post('/checkSameOrder', OrderInfoController.checkSameOrder); 11 | // 申请发票 12 | router.post('/applyInvoice', OrderInfoController.applyInvoice); 13 | } 14 | -------------------------------------------------------------------------------- /servers/center/router/routes/applicationConfig.js: -------------------------------------------------------------------------------- 1 | const { ApplicationConfigController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | // 通用配置接口 5 | router.post("/applicationConfig", ApplicationConfigController.create) 6 | router.post("/updateSysConfigInfo", ApplicationConfigController.updateSysConfigInfo) 7 | router.post("/getSysConfigInfo", ApplicationConfigController.getSysConfigInfo) 8 | router.post('/monitorBaseInfo', ApplicationConfigController.monitorBaseInfo); 9 | router.post('/eventBaseInfo', ApplicationConfigController.eventBaseInfo); 10 | } 11 | -------------------------------------------------------------------------------- /servers/monitor/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webfunny_monitor", 3 | "version": "3.1.15", 4 | "description": "这是webfunny的安装包", 5 | "main": "app.js", 6 | "scripts": { 7 | }, 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/a597873885/webfunny_monitor" 11 | }, 12 | "author": "jeffery", 13 | "license": "ISC", 14 | "bugs": { 15 | "url": "https://github.com/a597873885/webfunny_monitor/issues" 16 | }, 17 | "homepage": "https://github.com/a597873885/webfunny_monitor#readme", 18 | "dependencies": { 19 | }, 20 | "devDependencies": { 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /servers/event/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webfunny_event", 3 | "version": "1.3.33", 4 | "description": "这是webfunny_event的安装包", 5 | "main": "app.js", 6 | "scripts": { 7 | }, 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/a597873885/webfunny_monitor" 11 | }, 12 | "author": "jeffery", 13 | "license": "ISC", 14 | "bugs": { 15 | "url": "https://github.com/a597873885/webfunny_monitor/issues" 16 | }, 17 | "homepage": "https://github.com/a597873885/webfunny_monitor#readme", 18 | "dependencies": { 19 | }, 20 | "devDependencies": { 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /servers/center/middlreware/ignorePathRes.js: -------------------------------------------------------------------------------- 1 | module.exports = [ 2 | "/hasSuperAdminAccount", "/getValidateCode", "/refreshValidateCode", "/login", "/register", 3 | "/registerForAdmin", "/sendRegisterEmail", "/resetPwd", "/upBp", "/uploadMapFile", 4 | "/checkSsoToken", "/getUserTokenFromNetworkByToken", "/getSysConfigInfo", 5 | "/loginForApi", "/registerForApi", "/createNewTeamForApi", "/createNewProjectForApi", 6 | "/getTeams", "/getTeamListWithoutToken", "/getTeamDetail", "/updateTeam", "/createFlowData", 7 | "/getUserInfo", "/getSignatureForFeiShu", "/getAccessTokenByCodeForFeiShu", "/getCompanyList" 8 | ] -------------------------------------------------------------------------------- /servers/event/router/routes/common.js: -------------------------------------------------------------------------------- 1 | const { Common } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | // 获取日志服务所有相关信息 5 | router.get('/getSysInfo', Common.getSysInfo); 6 | // 获服务并发日志量 7 | router.post('/getConcurrencyByMinuteInHour', Common.getConcurrencyByMinuteInHour); 8 | // 获取某一天所有项目的日志总量 9 | router.post('/getLogCountInfoByDay', Common.getLogCountInfoByDay); 10 | /** 11 | * Docker 心跳检测 12 | */ 13 | router.get('/health', Common.dockerHealth); 14 | /** 15 | * echarts相关的静态数据 16 | */ 17 | router.get('/getEchartStatic', Common.getEchartStatic); 18 | } 19 | -------------------------------------------------------------------------------- /servers/event/router/routes/weHandleData.js: -------------------------------------------------------------------------------- 1 | const { WeHandleDataController } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * 初始化数据 6 | */ 7 | router.get('/initWeFieldData', WeHandleDataController.initWeFieldData); 8 | router.get('/initWePointData', WeHandleDataController.initWePointData); 9 | router.get('/initWeTemplateData', WeHandleDataController.initWeTemplateData); 10 | /**升级2.0版本 */ 11 | router.get('/upgradeVersion', WeHandleDataController.upgradeVersion_2_0); 12 | router.get('/createDemoTemplateData', WeHandleDataController.createDemoTemplateData); 13 | } 14 | -------------------------------------------------------------------------------- /servers/logger/config/slave.js: -------------------------------------------------------------------------------- 1 | var app = require('../app'); 2 | var { accountInfo } = require("../config/AccountConfig") 3 | 4 | global.serverType = "slave" 5 | 6 | var port = normalizePort(process.env.PORT || accountInfo.localServerPort); 7 | app.listen(port); 8 | 9 | function normalizePort(val) { 10 | var port = parseInt(val, 10); 11 | 12 | if (isNaN(port)) { 13 | // named pipe 14 | return val; 15 | } 16 | 17 | if (port >= 0) { 18 | // port number 19 | return port; 20 | } 21 | 22 | return false; 23 | } 24 | -------------------------------------------------------------------------------- /servers/logger/router/routes/logProject.js: -------------------------------------------------------------------------------- 1 | const { LogProjectController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * 应用接口 6 | */ 7 | // 创建新的监控项目 8 | router.post('/logProject/createNewProject', LogProjectController.createNewProject); 9 | // 创建新的监控项目API 10 | router.post('/logProject/createNewProjectForApi', LogProjectController.createNewProjectForApi); 11 | // 设置日志保存时间 12 | router.post('/logProject/resetSaveDays', LogProjectController.resetSaveDays); 13 | // 获取项目列表 14 | router.post('/logProject/getProjectList', LogProjectController.getProjectList); 15 | } 16 | -------------------------------------------------------------------------------- /servers/event/router/routes/buryPointAlarmMessage.js: -------------------------------------------------------------------------------- 1 | const { BuryPointAlarmMessageController } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | // 报警记录 5 | router.post('/buryPointAlarmMessage/create', BuryPointAlarmMessageController.create); 6 | router.post('/buryPointAlarmMessage/list', BuryPointAlarmMessageController.list); 7 | router.get('/buryPointAlarmMessage/detail', BuryPointAlarmMessageController.detail); 8 | router.post('/buryPointAlarmMessage/delete', BuryPointAlarmMessageController.delete); 9 | 10 | router.post('/buryPointAlarmMessage/test', BuryPointAlarmMessageController.testSendNotice); 11 | } 12 | -------------------------------------------------------------------------------- /servers/monitor/router/routes/jsErrorHandleList.js: -------------------------------------------------------------------------------- 1 | const { JsErrorHandleListController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * JS错误处理接口 6 | */ 7 | // 创建JS错误处理信息 8 | router.post('/createJsErrorHandleList', JsErrorHandleListController.create); 9 | // 解决JS错误 10 | router.post('/resolveJsErrorInHandleList', JsErrorHandleListController.resolveJsErrorInHandleList); 11 | // 根据errorMessage判断解决状态 12 | router.post('/getSolveStatusByErrorMsg', JsErrorHandleListController.getSolveStatusByErrorMsg); 13 | // 处理概览 14 | router.post('/getSolveChartByErrorMsg', JsErrorHandleListController.getSolveChartByErrorMsg); 15 | } 16 | -------------------------------------------------------------------------------- /servers/center/config/province.js: -------------------------------------------------------------------------------- 1 | const provinces = { 2 | "AH": "安徽", 3 | "BJ": "北京", 4 | "CQ": "重庆", 5 | "FJ": "福建", 6 | "GD": "广东", 7 | "GS": "甘肃", 8 | "GX": "广西", 9 | "GZ": "广州", 10 | "HA": "河南", 11 | "HE": "河北", 12 | "HB": "湖北", 13 | "HI": "海南", 14 | "HL": "黑龙江", 15 | "HN": "湖南", 16 | "JL": "吉林", 17 | "JS": "江苏", 18 | "JX": "江西", 19 | "LN": "辽宁", 20 | "NM": "内蒙", 21 | "NX": "宁夏", 22 | "SC": "四川", 23 | "SD": "山东", 24 | "SH": "上海", 25 | "SN": "陕西", 26 | "SX": "山西", 27 | "TJ": "天津", 28 | "XJ": "新疆", 29 | "XZ": "西藏", 30 | "YN": "云南", 31 | "ZJ": "浙江" 32 | } 33 | module.exports = provinces -------------------------------------------------------------------------------- /servers/event/config/province.js: -------------------------------------------------------------------------------- 1 | const provinces = { 2 | "AH": "安徽", 3 | "BJ": "北京", 4 | "CQ": "重庆", 5 | "FJ": "福建", 6 | "GD": "广东", 7 | "GS": "甘肃", 8 | "GX": "广西", 9 | "GZ": "广州", 10 | "HA": "河南", 11 | "HE": "河北", 12 | "HB": "湖北", 13 | "HI": "海南", 14 | "HL": "黑龙江", 15 | "HN": "湖南", 16 | "JL": "吉林", 17 | "JS": "江苏", 18 | "JX": "江西", 19 | "LN": "辽宁", 20 | "NM": "内蒙", 21 | "NX": "宁夏", 22 | "SC": "四川", 23 | "SD": "山东", 24 | "SH": "上海", 25 | "SN": "陕西", 26 | "SX": "山西", 27 | "TJ": "天津", 28 | "XJ": "新疆", 29 | "XZ": "西藏", 30 | "YN": "云南", 31 | "ZJ": "浙江" 32 | } 33 | module.exports = provinces -------------------------------------------------------------------------------- /servers/logger/config/province.js: -------------------------------------------------------------------------------- 1 | const provinces = { 2 | "AH": "安徽", 3 | "BJ": "北京", 4 | "CQ": "重庆", 5 | "FJ": "福建", 6 | "GD": "广东", 7 | "GS": "甘肃", 8 | "GX": "广西", 9 | "GZ": "广州", 10 | "HA": "河南", 11 | "HE": "河北", 12 | "HB": "湖北", 13 | "HI": "海南", 14 | "HL": "黑龙江", 15 | "HN": "湖南", 16 | "JL": "吉林", 17 | "JS": "江苏", 18 | "JX": "江西", 19 | "LN": "辽宁", 20 | "NM": "内蒙", 21 | "NX": "宁夏", 22 | "SC": "四川", 23 | "SD": "山东", 24 | "SH": "上海", 25 | "SN": "陕西", 26 | "SX": "山西", 27 | "TJ": "天津", 28 | "XJ": "新疆", 29 | "XZ": "西藏", 30 | "YN": "云南", 31 | "ZJ": "浙江" 32 | } 33 | module.exports = provinces -------------------------------------------------------------------------------- /servers/monitor/config/province.js: -------------------------------------------------------------------------------- 1 | const provinces = { 2 | "AH": "安徽", 3 | "BJ": "北京", 4 | "CQ": "重庆", 5 | "FJ": "福建", 6 | "GD": "广东", 7 | "GS": "甘肃", 8 | "GX": "广西", 9 | "GZ": "广州", 10 | "HA": "河南", 11 | "HE": "河北", 12 | "HB": "湖北", 13 | "HI": "海南", 14 | "HL": "黑龙江", 15 | "HN": "湖南", 16 | "JL": "吉林", 17 | "JS": "江苏", 18 | "JX": "江西", 19 | "LN": "辽宁", 20 | "NM": "内蒙", 21 | "NX": "宁夏", 22 | "SC": "四川", 23 | "SD": "山东", 24 | "SH": "上海", 25 | "SN": "陕西", 26 | "SX": "山西", 27 | "TJ": "天津", 28 | "XJ": "新疆", 29 | "XZ": "西藏", 30 | "YN": "云南", 31 | "ZJ": "浙江" 32 | } 33 | module.exports = provinces -------------------------------------------------------------------------------- /utils/timer.js: -------------------------------------------------------------------------------- 1 | /** 定时器逻辑 */ 2 | const log = require("../config/log"); 3 | module.exports = (callback) => { 4 | const startTime = new Date().getTime(); 5 | let count = 0; 6 | const fixed = async () => { 7 | count ++; 8 | const tempDate = new Date() 9 | const tempTime = new Date().getTime() 10 | const wrongTime = startTime + count * 1000 11 | var offset = tempTime - wrongTime; 12 | var nextTime = 1000 - offset; 13 | if (nextTime < 0) nextTime = 0; 14 | try { 15 | callback(tempDate) 16 | } catch(e) { 17 | log.printError("定时器执行报错:", e) 18 | } 19 | setTimeout(fixed, nextTime); 20 | } 21 | setTimeout(fixed, 1000); 22 | } -------------------------------------------------------------------------------- /servers/event/router/routes/buryPointUserBehaviorRelation.js: -------------------------------------------------------------------------------- 1 | const BuryPointUserBehaviorRelationController = require('../../controllers/controllers') 2 | 3 | 4 | module.exports = (router) => { 5 | // 来源点位管理 6 | router.post('/buryPointUserBehaviorRelation/getPointRelationList', BuryPointUserBehaviorRelationController.BuryPointUserBehaviorRelationController.getPointRelationList); 7 | router.post('/buryPointUserBehaviorRelation/getSourceFieldValueList', BuryPointUserBehaviorRelationController.BuryPointUserBehaviorRelationController.getSourceFieldValueList); 8 | router.post('/buryPointUserBehaviorRelation/test', BuryPointUserBehaviorRelationController.BuryPointUserBehaviorRelationController.test); 9 | } 10 | -------------------------------------------------------------------------------- /servers/monitor/util/timer.js: -------------------------------------------------------------------------------- 1 | /** 定时器逻辑 */ 2 | const log = require("../config/log"); 3 | module.exports = (callback) => { 4 | const startTime = new Date().getTime(); 5 | let count = 0; 6 | const fixed = async () => { 7 | count ++; 8 | const tempDate = new Date() 9 | const tempTime = new Date().getTime() 10 | const wrongTime = startTime + count * 1000 11 | var offset = tempTime - wrongTime; 12 | var nextTime = 1000 - offset; 13 | if (nextTime < 0) nextTime = 0; 14 | try { 15 | callback(tempDate) 16 | } catch(e) { 17 | log.printError("定时器执行报错:", e) 18 | } 19 | setTimeout(fixed, nextTime); 20 | } 21 | setTimeout(fixed, 1000); 22 | } -------------------------------------------------------------------------------- /DES_DOCKER.md: -------------------------------------------------------------------------------- 1 | ### 请先完成正常部署 2 | 3 | 完成[正常部署](https://github.com/a597873885/webfunny_monitor/blob/master/DES.md)后,才能够生成正确的镜像文件。 4 | 5 | ### Docker部署方式 6 | 7 | 0.完成正常部署后,就可以将整个系统作为镜像文件进行打包。 8 | 9 | 1.项目内我增加了dockerfile, 生成image文件,执行命令$: docker image build -t webfunny_monitor --platform linux/amd64 . 10 | 11 | 2.生成容器,执行命令$: docker container run -p 8010:8010 -p 8011:8011 -it webfunny_monitor 12 | 13 | 监控系统会使用两个端口号:8010、8011,所以需要映射出来; 14 | 15 | 3.你可以自己将镜像文件发布到云上,然后再使用。 16 | 17 | 4.心跳检测地址: 域名 + /server/health 18 | 19 | 注意:容器配置要给项目根目录下 createTable.sh,restart.sh 脚本文件执行权限哦。 chmod 755 restart.sh,chmod 755 createTable.sh 20 | 21 | 22 | 其他操作,请参考[docker入门 阮一峰](http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html)。 23 | -------------------------------------------------------------------------------- /servers/monitor/router/routes/commonTable.js: -------------------------------------------------------------------------------- 1 | const { CommonTableController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * 查询表名 6 | */ 7 | router.post('/getTableList', CommonTableController.getTableList); 8 | /** 9 | * drop 表结构 10 | */ 11 | router.post('/dropTable', CommonTableController.dropTable); 12 | /** 13 | * create表结构 14 | */ 15 | router.post('/createLogTable', CommonTableController.createLogTable); 16 | /** 17 | * 更新表结构 18 | */ 19 | router.post('/updateTableBySql', CommonTableController.updateTableBySql); 20 | router.post('/updateFieldBySql', CommonTableController.updateFieldBySql); 21 | } 22 | -------------------------------------------------------------------------------- /servers/center/router/routes/noticeTemplate.js: -------------------------------------------------------------------------------- 1 | const { NoticeTemplateController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | router.get('/alarm/getNoticeTemplate', NoticeTemplateController.getNoticeTemplate) 5 | router.post('/alarm/createNoticeTemplate', NoticeTemplateController.createNoticeTemplate) 6 | router.get('/alarm/getNoticeTemplateById', NoticeTemplateController.getNoticeTemplateById) 7 | router.get('/alarm/deleteNoticeTemplate', NoticeTemplateController.deleteNoticeTemplate) 8 | router.put('/alarm/updateNoticeTemplate', NoticeTemplateController.updateNoticeTemplate) 9 | router.get('/alarm/getAllNoticeTemplate', NoticeTemplateController.getAllNoticeTemplate) 10 | } 11 | -------------------------------------------------------------------------------- /servers/logger/util/timer.js: -------------------------------------------------------------------------------- 1 | /** 定时器逻辑 */ 2 | // const log = require("../config/log"); 3 | const log = require("../../../config/log"); 4 | module.exports = (callback) => { 5 | const startTime = new Date().getTime(); 6 | let count = 0; 7 | const fixed = async () => { 8 | count ++; 9 | const tempDate = new Date() 10 | const tempTime = new Date().getTime() 11 | const wrongTime = startTime + count * 1000 12 | var offset = tempTime - wrongTime; 13 | var nextTime = 1000 - offset; 14 | if (nextTime < 0) nextTime = 0; 15 | try { 16 | callback(tempDate) 17 | } catch(e) { 18 | log.printError("定时器执行报错:", e) 19 | } 20 | setTimeout(fixed, nextTime); 21 | } 22 | setTimeout(fixed, 1000); 23 | } -------------------------------------------------------------------------------- /servers/event/schema/schemaLogList.js: -------------------------------------------------------------------------------- 1 | module.exports = [ 2 | "../schema/customerPV", 3 | "../schema/behaviorInfo", 4 | "../schema/customerPvLeave", 5 | "../schema/customerStayTime", 6 | "../schema/extendBehaviorInfo", 7 | "../schema/HttpErrorInfo", 8 | "../schema/HttpLogInfo.js", 9 | "../schema/HttpLogReqInfo", 10 | "../schema/javascriptErrorInfo", 11 | "../schema/pageLoadInfo", 12 | "../schema/pageLoadInfoByMinute", 13 | "../schema/resourceLoadInfo", 14 | "../schema/infoCountByDay", 15 | "../schema/infoCountByHour", 16 | "../schema/deviceInfoCountByDay", 17 | "../schema/deviceInfoCountByHour", 18 | "../schema/jsErrorHandleList", 19 | "../schema/httpErrorHandleList", 20 | "../schema/loadTimeInfoByHour", 21 | ] -------------------------------------------------------------------------------- /servers/logger/config/db.js: -------------------------------------------------------------------------------- 1 | const sequelizeTemp = require('./local_db') 2 | const Sequelize = require('sequelize'); 3 | let db = null 4 | if (sequelizeTemp) { 5 | db = sequelizeTemp.sequelize 6 | } else { 7 | const sequelize = new Sequelize('database', 'username', 'password', { 8 | host: 'ip', 9 | dialect: 'mysql', 10 | // operatorsAliases: false, 11 | dialectOptions: { 12 | charset: "utf8mb4", 13 | supportBigNumbers: true, 14 | bigNumberStrings: true 15 | }, 16 | 17 | pool: { 18 | max: 30, 19 | min: 0, 20 | acquire: 30000, 21 | idle: 10000 22 | }, 23 | timezone: '+08:00' //东八时区 24 | }); 25 | 26 | db = sequelize 27 | 28 | } 29 | module.exports = { 30 | sequelize: db, 31 | client: db, 32 | } 33 | -------------------------------------------------------------------------------- /servers/monitor/router/routes/ignoreError.js: -------------------------------------------------------------------------------- 1 | const { IgnoreErrorController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * 忽略js错误信息接口 6 | */ 7 | // 创建忽略js错误信息 8 | router.post('/ignoreError', IgnoreErrorController.create); 9 | // 获取忽略js错误信息列表 10 | router.get('/ignoreError', IgnoreErrorController.getIgnoreErrorList); 11 | // 获取应用忽略js错误信息列表 12 | router.get('/ignoreErrorByApplication', IgnoreErrorController.ignoreErrorByApplication); 13 | // 获取忽略js错误信息详情 14 | router.get('/ignoreError/:id', IgnoreErrorController.detail); 15 | // 删除忽略js错误信息 16 | router.delete('/ignoreError/:id', IgnoreErrorController.delete); 17 | // 更改忽略js错误信息 18 | router.put('/ignoreError/:id', IgnoreErrorController.update); 19 | } 20 | -------------------------------------------------------------------------------- /servers/monitor/schema/schemaLogList.js: -------------------------------------------------------------------------------- 1 | module.exports = [ 2 | "../schema/customerPV", 3 | "../schema/behaviorInfo", 4 | "../schema/customerPvLeave", 5 | "../schema/customerStayTime", 6 | "../schema/extendBehaviorInfo", 7 | "../schema/HttpErrorInfo", 8 | "../schema/HttpLogInfo.js", 9 | "../schema/HttpLogReqInfo", 10 | "../schema/javascriptErrorInfo", 11 | "../schema/pageLoadInfo", 12 | "../schema/screenShotInfo", 13 | "../schema/pageLoadInfoByMinute", 14 | "../schema/resourceLoadInfo", 15 | "../schema/infoCountByDay", 16 | "../schema/infoCountByHour", 17 | "../schema/deviceInfoCountByDay", 18 | "../schema/deviceInfoCountByHour", 19 | "../schema/jsErrorHandleList", 20 | "../schema/httpErrorHandleList", 21 | "../schema/loadTimeInfoByHour", 22 | ] -------------------------------------------------------------------------------- /servers/event/router/routes/buryPointTask.js: -------------------------------------------------------------------------------- 1 | const { BuryPointTaskController } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | //任务管理 5 | router.post('/buryPointTask/create', BuryPointTaskController.create); 6 | router.post('/buryPointTask/delete', BuryPointTaskController.delete); 7 | router.post('/buryPointTask/batchDeletion', BuryPointTaskController.batchDeletion); 8 | router.post('/buryPointTask/update', BuryPointTaskController.update); 9 | router.post('/buryPointTask/list', BuryPointTaskController.list); 10 | router.post('/buryPointTask/detail', BuryPointTaskController.detail); 11 | router.post('/buryPointTask/updateStatus', BuryPointTaskController.updateStatus); 12 | router.post('/buryPointTask/changeHandleMan', BuryPointTaskController.changeHandleMan); 13 | } 14 | -------------------------------------------------------------------------------- /servers/center/router/routes/alarmRule.js: -------------------------------------------------------------------------------- 1 | const { AlarmRuleController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | router.get('/alarm/getAlarmRuleList', AlarmRuleController.getAlarmRule) 5 | router.post('/alarm/createAlarmRule', AlarmRuleController.createAlarmRule) 6 | router.get('/alarm/getAlarmRuleById', AlarmRuleController.getAlarmRuleById) 7 | router.post('/alarm/deleteAlarmRule', AlarmRuleController.deleteAlarmRule) 8 | router.put('/alarm/updateAlarmRule', AlarmRuleController.updateAlarmRule) 9 | router.post('/alarm/updateAlarmRuleStatus', AlarmRuleController.updateAlarmRuleStatus) 10 | router.post('/alarm/addRuleForApplication', AlarmRuleController.addRuleForApplication) 11 | router.post('/alarm/getRulesOfApplication', AlarmRuleController.getRulesOfApplication) 12 | } 13 | -------------------------------------------------------------------------------- /servers/center/router/routes/flowDataInfoByDay.js: -------------------------------------------------------------------------------- 1 | // const FlowDataInfoByDayController = require('../../controllers/flowDataInfoByDay') 2 | const { FlowDataInfoByDayController } = require("../../controllers/controllers.js") 3 | 4 | module.exports = (router) => { 5 | // 获取总流量信息 6 | router.get('/getTotalFlowData', FlowDataInfoByDayController.getTotalFlowData); 7 | // 获取流量趋势数据 8 | router.get('/getFlowTrendData', FlowDataInfoByDayController.getFlowTrendData); 9 | // 获取流量列表数据 10 | router.get('/getFlowTableListData', FlowDataInfoByDayController.getFlowTableListData); 11 | // 获取流量列表数据 12 | router.get('/getFlowListByCompanyIdAndProjectIds', FlowDataInfoByDayController.getFlowListByCompanyIdAndProjectIds); 13 | // 获取流量耗尽的公司id 14 | router.get('/getLimitCompanyIdForCloud', FlowDataInfoByDayController.getLimitCompanyIdForCloud); 15 | } 16 | -------------------------------------------------------------------------------- /servers/event/router/routes/buryPointCircleSelect.js: -------------------------------------------------------------------------------- 1 | // const BuryPointCircleSelectController = require('../../controllers/buryPointCircleSelect') 2 | const { BuryPointCircleSelectController } = require("../../controllers/controllers") 3 | 4 | module.exports = (router) => { 5 | // 圈选人管理 6 | router.post('/buryPointCircleSelect/create', BuryPointCircleSelectController.create); 7 | router.post('/buryPointCircleSelect/update', BuryPointCircleSelectController.update); 8 | router.post('/buryPointCircleSelect/getPageList', BuryPointCircleSelectController.getPageList); 9 | router.post('/buryPointCircleSelect/delete', BuryPointCircleSelectController.delete); 10 | router.get('/buryPointCircleSelect/detail', BuryPointCircleSelectController.detail); 11 | router.post('/buryPointCircleSelect/getAllBindUserId', BuryPointCircleSelectController.getAllBindUserId); 12 | } 13 | -------------------------------------------------------------------------------- /servers/event/router/routes/buryPointVisualTracking.js: -------------------------------------------------------------------------------- 1 | // const BuryPointVisualTrackingController = require('../../controllers/buryPointVisualTracking') 2 | const { BuryPointVisualTrackingController } = require("../../controllers/controllers") 3 | 4 | module.exports = (router) => { 5 | // 可视化全埋点 6 | router.post('/buryPointVisualTracking/create', BuryPointVisualTrackingController.create); 7 | router.post('/buryPointVisualTracking/update', BuryPointVisualTrackingController.update); 8 | router.post('/buryPointVisualTracking/getPageList', BuryPointVisualTrackingController.getPageList); 9 | router.post('/buryPointVisualTracking/delete', BuryPointVisualTrackingController.delete); 10 | router.get('/buryPointVisualTracking/detail', BuryPointVisualTrackingController.detail); 11 | router.post('/buryPointVisualTracking/updateNameById', BuryPointVisualTrackingController.updateNameById); 12 | } 13 | -------------------------------------------------------------------------------- /servers/center/router/routes/product.js: -------------------------------------------------------------------------------- 1 | // const ProductController = require('../../controllers/product') 2 | const { ProductController } = require("../../controllers/controllers.js") 3 | 4 | module.exports = (router) => { 5 | /** 旧版接口,已无效 */ 6 | // 获取当月生效的产品 7 | router.post('/getProjectByCompanyIdForMonth', ProductController.getProjectByCompanyIdForMonth); 8 | // 创建产品 9 | router.post('/createNewProduct', ProductController.createNewProduct); 10 | // 批量创建产品 11 | router.post('/batchCreateProduct', ProductController.batchCreateProduct); 12 | // 批量更新产品 13 | router.post('/batchUpdateProduct', ProductController.batchUpdateProduct); 14 | // 批量更新和创建产品 15 | router.post('/batchCreateOrUpdateProduct', ProductController.batchCreateOrUpdateProduct); 16 | /** 旧版接口,已无效 */ 17 | 18 | // 获取当前有效的产品 19 | router.post('/getValidProduct', ProductController.getValidProduct); 20 | } 21 | -------------------------------------------------------------------------------- /servers/event/router/routes/buryPointAlarm.js: -------------------------------------------------------------------------------- 1 | const { BuryPointAlarmController } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | // 告警规则 5 | router.post('/buryPointAlarm/create', BuryPointAlarmController.create); 6 | router.post('/buryPointAlarm/copy', BuryPointAlarmController.copy); 7 | router.post('/buryPointAlarm/update', BuryPointAlarmController.update); 8 | router.post('/buryPointAlarm/updateStatus', BuryPointAlarmController.updateStatus); 9 | router.post('/buryPointAlarm/list', BuryPointAlarmController.list); 10 | router.post('/buryPointAlarm/getListByProjectId', BuryPointAlarmController.getListByProjectId); 11 | router.post('/buryPointAlarm/delete', BuryPointAlarmController.delete); 12 | router.post('/buryPointAlarm/batchDeletion', BuryPointAlarmController.batchDeletion); 13 | router.get('/buryPointAlarm/detail', BuryPointAlarmController.detail); 14 | } 15 | -------------------------------------------------------------------------------- /servers/monitor/config/errorList.js: -------------------------------------------------------------------------------- 1 | export const JsErrorType = { 2 | syntaxerror: { 3 | name: "语法错误", 4 | des: "这种问题一般为:JSON格式转换、变量名的命名不规范,给关键字进行赋值,花括号没有成对儿出现等等" 5 | }, 6 | referenceerror: { 7 | name: "引用错误", 8 | des: "这种问题一般为:引用一个不存在的变量、将一个值分配给无法分配的对象等等" 9 | }, 10 | rangeerror: { 11 | name: "范围错误", 12 | des: "这种问题一般为:一个值超出有效范围时会发生的错误" 13 | }, 14 | typeerror: { 15 | name: "类型错误", 16 | des: "这种问题一般为:变量或参数不是预期类型时发生的错误" 17 | }, 18 | urierror: { 19 | name: "URL错误", 20 | des: "这种问题一般为:调用相关函数的参数不正确时发生的错误" 21 | }, 22 | "script error": { 23 | name: "第三方脚本错误", 24 | des: "这种问题一般为:引入非同源的第三方js文件中发生的错误" 25 | }, 26 | unhandledrejection: { 27 | name: "未处理的异常", 28 | des: "这种问题一般为:没有处理Promise异常结果时发生的错误" 29 | }, 30 | customizeerror: { 31 | name: "自定义错误", 32 | des: "这种问题一般为:通过console.error打印的错误信息,一般用于提醒", 33 | }, 34 | unknown: { 35 | name: "未知错误类型", 36 | des: "" 37 | } 38 | } -------------------------------------------------------------------------------- /servers/event/router/routes/buryPointSdkRelease.js: -------------------------------------------------------------------------------- 1 | const { SdkReleaseController } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * SDK发布接口 6 | */ 7 | router.post('/sdkRelease/create', SdkReleaseController.create); 8 | router.post('/sdkRelease/update', SdkReleaseController.update); 9 | router.post('/sdkRelease/delete', SdkReleaseController.delete); 10 | router.get('/sdkRelease/detail', SdkReleaseController.detail); 11 | router.post('/sdkRelease/changeUploadDomain', SdkReleaseController.changeUploadDomain); 12 | router.post('/sdkRelease/page', SdkReleaseController.getPageList); 13 | router.post('/sdkRelease/list', SdkReleaseController.getList); 14 | router.get('/sdkRelease/AllList', SdkReleaseController.getAllList); 15 | router.post('/sdkRelease/createReleaseScript', SdkReleaseController.createReleaseScript); 16 | router.get('/sdkRelease/downLoad', SdkReleaseController.downloadScript); 17 | } 18 | -------------------------------------------------------------------------------- /servers/monitor/router/routesFail.js: -------------------------------------------------------------------------------- 1 | const Fail = require('../controllers/fail') 2 | const Common = require('../controllers/common') 3 | const UserController = require("../controllers/user") 4 | const createRoutesFail = (router) => { 5 | // 用户激活码无效 6 | router.get('/getSysInfo', Common.getSysInfo); 7 | 8 | router.post('/createPurchaseCode', Fail.createPurchaseCode); 9 | 10 | // 管理员注册接口 11 | router.post('/registerForAdmin', UserController.registerForAdmin); 12 | 13 | // 注册用户 14 | router.get('/register', UserController.register); 15 | 16 | // 登录 17 | router.post('/login', UserController.login); 18 | // 重置验证码 19 | router.post('/refreshValidateCode', UserController.refreshValidateCode) 20 | // 获取验证码 21 | router.post('/getValidateCode', UserController.getValidateCode) 22 | 23 | /** 24 | * Docker 心跳检测 25 | */ 26 | router.get('/health', Common.dockerHealth); 27 | } 28 | 29 | module.exports = { 30 | createRoutesFail 31 | } -------------------------------------------------------------------------------- /servers/logger/config/log_server.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var { accountInfo } = require("./AccountConfig") 9 | // var debug = require('debug')('demo:server'); 10 | // var http = require('http'); 11 | global.serverType = "master" 12 | 13 | /** 14 | * Get port from environment and store in Express. 15 | */ 16 | 17 | var port = normalizePort(process.env.PORT || accountInfo.localServerPort); 18 | 19 | /** 20 | * Listen on provided port, on all network interfaces. 21 | */ 22 | 23 | app.listen(port, () => { 24 | // console.log("服务启动中...") 25 | }); 26 | 27 | /** 28 | * Normalize a port into a number, string, or false. 29 | */ 30 | 31 | function normalizePort(val) { 32 | var port = parseInt(val, 10); 33 | 34 | if (isNaN(port)) { 35 | // named pipe 36 | return val; 37 | } 38 | 39 | if (port >= 0) { 40 | // port number 41 | return port; 42 | } 43 | 44 | return false; 45 | } 46 | -------------------------------------------------------------------------------- /servers/event/router/routes/buryPointTest.js: -------------------------------------------------------------------------------- 1 | const { BuryPointTestController } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * 打点测试 6 | */ 7 | router.post('/buryPointTest/page', BuryPointTestController.getPageList); 8 | // 查询失败的 9 | router.post('/buryPointTest/page/error', BuryPointTestController.failList); 10 | // 查询失败的 11 | router.post('/buryPointTest/page/failOverView', BuryPointTestController.failOverView); 12 | // 点位查询 13 | router.post('/buryPointTest/search', BuryPointTestController.search); 14 | // api导出数据 15 | router.post('/buryPointTest/apiExport', BuryPointTestController.apiExport); 16 | // 根据userId查询点位列表 17 | router.post('/buryPointTest/searchAllRecord', BuryPointTestController.searchAllRecord); 18 | // 根据字段的key查询字段名称 19 | router.post('/buryPointTest/searchFieldName', BuryPointTestController.searchFieldName); 20 | // 点位查询导出 21 | router.get('/buryPointTest/searchExport', BuryPointTestController.exportData); 22 | } 23 | -------------------------------------------------------------------------------- /servers/center/util/status-code.js: -------------------------------------------------------------------------------- 1 | const statusCode = { 2 | ERROR_500: (msg) => { 3 | return { 4 | code: 500, 5 | msg 6 | } 7 | }, 8 | ERROR_401: (msg) => { 9 | return { 10 | code: 401, 11 | msg 12 | } 13 | }, 14 | 15 | ERROR_403: (msg) => { 16 | return { 17 | code: 403, 18 | msg 19 | } 20 | }, 21 | 22 | ERROR_404: (msg) => { 23 | return { 24 | code: 404, 25 | msg 26 | } 27 | }, 28 | 29 | ERROR_412: (msg) => { 30 | return { 31 | code: 412, 32 | msg 33 | } 34 | }, 35 | 36 | ERROR_413: (msg) => { 37 | return { 38 | code: 413, 39 | msg 40 | } 41 | }, 42 | 43 | SUCCESS_200: (msg, data) => { 44 | return { 45 | code: 200, 46 | msg, 47 | data, 48 | } 49 | } 50 | } 51 | 52 | module.exports = statusCode -------------------------------------------------------------------------------- /servers/logger/util/status-code.js: -------------------------------------------------------------------------------- 1 | const statusCode = { 2 | ERROR_500: (msg) => { 3 | return { 4 | code: 500, 5 | msg 6 | } 7 | }, 8 | ERROR_401: (msg) => { 9 | return { 10 | code: 401, 11 | msg 12 | } 13 | }, 14 | 15 | ERROR_403: (msg) => { 16 | return { 17 | code: 403, 18 | msg 19 | } 20 | }, 21 | 22 | ERROR_404: (msg) => { 23 | return { 24 | code: 404, 25 | msg 26 | } 27 | }, 28 | 29 | ERROR_412: (msg) => { 30 | return { 31 | code: 412, 32 | msg 33 | } 34 | }, 35 | 36 | ERROR_413: (msg) => { 37 | return { 38 | code: 413, 39 | msg 40 | } 41 | }, 42 | 43 | SUCCESS_200: (msg, data) => { 44 | return { 45 | code: 200, 46 | msg, 47 | data, 48 | } 49 | } 50 | } 51 | 52 | module.exports = statusCode -------------------------------------------------------------------------------- /servers/monitor/router/routes/customerStayTime.js: -------------------------------------------------------------------------------- 1 | const { CustomerStayTimeController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | // 每小时的平均在线时长 5 | router.post('/getStayTimeForHour', CustomerStayTimeController.getStayTimeForHour); 6 | // 平均在线时长 7 | router.post('/getStayTimeForEveryDay', CustomerStayTimeController.getStayTimeForEveryDay); 8 | // 获取每天的平均在线时长和平均活跃时长 9 | router.post('/getAvgStayTimeForDay', CustomerStayTimeController.getAvgStayTimeForDay); 10 | // 获取每天的在线时长范围的正态分布图 11 | router.post('/getStayTimeScopeForDay', CustomerStayTimeController.getStayTimeScopeForDay); 12 | //根据userId获取每天的在线时长 13 | router.post('/getStayTimeForDayByPerson', CustomerStayTimeController.getStayTimeForDayByPerson); 14 | //根据userId获取每天的在线时长记录 15 | router.post('/getStayTimeForBehaviorByPerson', CustomerStayTimeController.getStayTimeForBehaviorByPerson); 16 | // 根据在线时间拍讯获取页面列表 17 | router.post('/getPageListOrderByStayTime', CustomerStayTimeController.getPageListOrderByStayTime); 18 | } 19 | -------------------------------------------------------------------------------- /servers/monitor/util/status-code.js: -------------------------------------------------------------------------------- 1 | const statusCode = { 2 | ERROR_500: (msg) => { 3 | return { 4 | code: 500, 5 | msg 6 | } 7 | }, 8 | ERROR_401: (msg) => { 9 | return { 10 | code: 401, 11 | msg 12 | } 13 | }, 14 | 15 | ERROR_403: (msg) => { 16 | return { 17 | code: 403, 18 | msg 19 | } 20 | }, 21 | 22 | ERROR_404: (msg) => { 23 | return { 24 | code: 404, 25 | msg 26 | } 27 | }, 28 | 29 | ERROR_412: (msg) => { 30 | return { 31 | code: 412, 32 | msg 33 | } 34 | }, 35 | 36 | ERROR_413: (msg) => { 37 | return { 38 | code: 413, 39 | msg 40 | } 41 | }, 42 | 43 | SUCCESS_200: (msg, data) => { 44 | return { 45 | code: 200, 46 | msg, 47 | data, 48 | } 49 | } 50 | } 51 | 52 | module.exports = statusCode -------------------------------------------------------------------------------- /utils/status-code.js: -------------------------------------------------------------------------------- 1 | const statusCode = { 2 | ERROR_500: (msg, data) => { 3 | return { 4 | code: 500, 5 | msg, 6 | data 7 | } 8 | }, 9 | ERROR_401: (msg) => { 10 | return { 11 | code: 401, 12 | msg 13 | } 14 | }, 15 | 16 | ERROR_403: (msg) => { 17 | return { 18 | code: 403, 19 | msg 20 | } 21 | }, 22 | 23 | ERROR_404: (msg) => { 24 | return { 25 | code: 404, 26 | msg 27 | } 28 | }, 29 | 30 | ERROR_412: (msg) => { 31 | return { 32 | code: 412, 33 | msg 34 | } 35 | }, 36 | 37 | ERROR_413: (msg) => { 38 | return { 39 | code: 413, 40 | msg 41 | } 42 | }, 43 | 44 | SUCCESS_200: (msg, data) => { 45 | return { 46 | code: 200, 47 | msg, 48 | data, 49 | } 50 | } 51 | } 52 | 53 | module.exports = statusCode -------------------------------------------------------------------------------- /servers/center/config/db_local.js: -------------------------------------------------------------------------------- 1 | 2 | const Sequelize = require('sequelize'); 3 | const { accountInfo } = require('./AccountConfig'); 4 | 5 | const {write, read} = accountInfo.mysqlConfig; 6 | const replication = { 7 | read: read, 8 | write: { host: write.ip, username: write.userName, password: write.password } 9 | } 10 | 11 | const configList = { 12 | host: write.ip, 13 | port: write.port, 14 | logging: (sql) => { 15 | // 这里处理sql的日志,暂时不打印 16 | // console.log(sql) 17 | }, 18 | dialect: 'mysql', 19 | // operatorsAliases: false, 20 | dialectOptions: { 21 | charset: "utf8mb4", 22 | supportBigNumbers: true, 23 | bigNumberStrings: true 24 | }, 25 | pool: { 26 | max: 500, 27 | min: 0, 28 | acquire: 30000, 29 | idle: 10000 30 | }, 31 | timezone: '+08:00' //东八时区 32 | } 33 | if (read && read.length > 0) { 34 | configList.replication = replication 35 | } 36 | // 下一个迭代数据库 37 | const sequelize = new Sequelize(write.dataBaseName, write.userName, write.password, { 38 | ...configList 39 | }) 40 | 41 | module.exports = { 42 | sequelize: sequelize 43 | } 44 | -------------------------------------------------------------------------------- /servers/event/router/routes/buryPointTemplate.js: -------------------------------------------------------------------------------- 1 | const { BuryPointTemplateController } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * 模板接口 6 | */ 7 | router.post('/buryPointTemplate/create', BuryPointTemplateController.create); 8 | router.post('/buryPointTemplate/updateName', BuryPointTemplateController.updateName); 9 | router.post('/buryPointTemplate/delete', BuryPointTemplateController.delete); 10 | router.post('/buryPointTemplate/deleteBatch', BuryPointTemplateController.deleteBatch); 11 | router.post('/buryPointTemplate/copy', BuryPointTemplateController.copy); 12 | router.post('/buryPointTemplate/createProject', BuryPointTemplateController.createProject); 13 | router.post('/buryPointTemplate/getMyList', BuryPointTemplateController.getMyTemplatePageList); 14 | router.post('/buryPointTemplate/getCommonList', BuryPointTemplateController.getCommonTemplatePageList); 15 | router.post('/buryPointTemplate/getSysList', BuryPointTemplateController.getSysTemplatePageList); 16 | router.post('/buryPointTemplate/detail', BuryPointTemplateController.detail); 17 | } 18 | -------------------------------------------------------------------------------- /servers/event/router/routes/buryPointWarehouse.js: -------------------------------------------------------------------------------- 1 | const { BuryPointWarehouseController } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * 点位仓库接口 6 | */ 7 | router.post('/buryPointWarehouse/create', BuryPointWarehouseController.create); 8 | router.post('/buryPointWarehouse/update', BuryPointWarehouseController.update); 9 | router.post('/buryPointWarehouse/delete', BuryPointWarehouseController.delete); 10 | router.get('/buryPointWarehouse/detail', BuryPointWarehouseController.detail); 11 | router.post('/buryPointWarehouse/page', BuryPointWarehouseController.getPageList); 12 | router.post('/buryPointWarehouse/list', BuryPointWarehouseController.getList); 13 | router.post('/buryPointWarehouse/getProjectAndWeList', BuryPointWarehouseController.getAllPointList); 14 | router.post('/buryPointWarehouse/getProjectAndOldList', BuryPointWarehouseController.getProjectAndOldList); 15 | router.get('/buryPointWarehouse/AllList', BuryPointWarehouseController.getAllList); 16 | router.post('/buryPointWarehouse/pointExport', BuryPointWarehouseController.exportPoint); 17 | } 18 | -------------------------------------------------------------------------------- /utils/rewriteConsole.js: -------------------------------------------------------------------------------- 1 | const WebfunnyConfig = require('../webfunny.config') 2 | const { otherConfig } = WebfunnyConfig 3 | const loggerUpload = require("../middlreware/loggerUpload") 4 | module.exports = function() { 5 | const consoleLog = console.log; 6 | console.log = (...args) => { 7 | const timestamp = new Date().Format('yyyy-MM-dd hh:mm:ss'); 8 | 9 | if (otherConfig.uploadServerErrorToWebfunny === true) { 10 | // 打印日志都进行上报 11 | let message = "" 12 | const tempMsg = args[0] 13 | if (typeof tempMsg === "string") { 14 | message = tempMsg.length > 200 ? tempMsg.substring(0,200) : tempMsg 15 | } else { 16 | message = "" 17 | } 18 | 19 | const content = JSON.stringify(args) 20 | // projectId = "", userId = Utils.getMac(), message = "", content = "", otherInfo = "" 21 | loggerUpload.log({ 22 | projectId: "webfunny_log_sys", 23 | message, 24 | content, 25 | }) 26 | } 27 | 28 | // 配置开启了打印,打印console 29 | if (otherConfig.printConsole === true) { 30 | consoleLog(timestamp + " - ", ...args); 31 | } 32 | }; 33 | } -------------------------------------------------------------------------------- /servers/event/middlreware/sqlCheck.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断判断是否有sql注入逻辑 3 | */ 4 | const statusCode = require('../util/status-code') 5 | const { DANGER_SQL_PARAMS } = require('../config/consts') 6 | module.exports = function () { 7 | return async function (ctx, next) { 8 | const { url, query } = ctx 9 | const { body } = ctx.request 10 | // 过滤掉一些接口 11 | if ( url.indexOf("upEvent") === -1) { 12 | let goOnFlag = true 13 | const tempQuery = JSON.stringify(query).toLowerCase() 14 | const tempBody = JSON.stringify(body).toLowerCase() 15 | DANGER_SQL_PARAMS.forEach((item) => { 16 | if (tempBody.indexOf(item) !== -1) { 17 | goOnFlag = false 18 | } else if (tempQuery.indexOf(item) !== -1) { 19 | goOnFlag = false 20 | } 21 | }) 22 | if (!goOnFlag) { 23 | ctx.response.status = 413; 24 | ctx.body = statusCode.ERROR_413(`请求参数不合法,不能包含;,',<,>,(,)`); 25 | return 26 | } 27 | } 28 | await next(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /servers/event/util/status-code.js: -------------------------------------------------------------------------------- 1 | const statusCode = { 2 | ERROR_500: (msg) => { 3 | return { 4 | code: 500, 5 | msg 6 | } 7 | }, 8 | ERROR_401: (msg) => { 9 | return { 10 | code: 401, 11 | msg 12 | } 13 | }, 14 | 15 | ERROR_403: (msg) => { 16 | return { 17 | code: 403, 18 | msg 19 | } 20 | }, 21 | 22 | ERROR_404: (msg) => { 23 | return { 24 | code: 404, 25 | msg 26 | } 27 | }, 28 | 29 | ERROR_412: (msg) => { 30 | return { 31 | code: 412, 32 | msg 33 | } 34 | }, 35 | 36 | ERROR_413: (msg) => { 37 | return { 38 | code: 413, 39 | msg 40 | } 41 | }, 42 | ERROR_CARD_BALANCE_414: (msg) => { 43 | return { 44 | code: 414, 45 | msg 46 | } 47 | }, 48 | SUCCESS_200: (msg, data) => { 49 | return { 50 | code: 200, 51 | msg, 52 | data, 53 | } 54 | } 55 | } 56 | 57 | module.exports = statusCode -------------------------------------------------------------------------------- /middlreware/cacheData/handleCache.js: -------------------------------------------------------------------------------- 1 | const timerUtil = require("../../util/timer") 2 | const Utils = require('../../util/utils') 3 | global.CacheDataList = {} 4 | //启动一个定时器,每分钟清理一次 5 | timerUtil((time) => { 6 | const minuteTimeStr = time.Format("mm:ss") 7 | // console.log(minuteTimeStr, global.CacheDataList) 8 | // 每隔1分钟执行, 清理缓存数据 9 | if (minuteTimeStr.substring(3) == "00") { 10 | // 即将执行清理 11 | global.CacheDataList = {} 12 | } 13 | }) 14 | const HandleCache = { 15 | cacheData: (ctx, webMonitorId, data) => { 16 | let wfParam = {} 17 | const { method, url, body } = ctx.request 18 | if (method.toLowerCase() === "get") { 19 | wfParam = Utils.parseQs(url) 20 | } else { 21 | wfParam = typeof body === "string" ? JSON.parse(body) : body 22 | } 23 | // console.log("===============", url) 24 | if (!global.CacheDataList[webMonitorId]) { 25 | global.CacheDataList[webMonitorId] = {} 26 | } 27 | // 把参数和结果都存进去 28 | global.CacheDataList[webMonitorId][url] = { 29 | param: wfParam, 30 | data 31 | } 32 | // console.log(global.CacheDataList[webMonitorId]) 33 | } 34 | } 35 | module.exports = HandleCache -------------------------------------------------------------------------------- /servers/center/config/db.js: -------------------------------------------------------------------------------- 1 | 2 | const Sequelize = require('sequelize'); 3 | const { accountInfo } = require('./AccountConfig'); 4 | 5 | const {write, read} = accountInfo.mysqlConfig; 6 | const replication = { 7 | read: read, 8 | write: { host: write.ip, username: write.userName, password: write.password } 9 | } 10 | 11 | const configList = { 12 | host: write.ip, 13 | port: write.port, 14 | logging: (sql) => { 15 | // 这里处理sql的日志,暂时不打印 16 | if (accountInfo.printSql && accountInfo.printSql.center === true) { 17 | console.log(sql) 18 | } 19 | }, 20 | dialect: 'mysql', 21 | // operatorsAliases: false, 22 | dialectOptions: { 23 | charset: "utf8mb4", 24 | supportBigNumbers: true, 25 | bigNumberStrings: true 26 | }, 27 | pool: { 28 | max: 500, 29 | min: 0, 30 | acquire: 30000, 31 | idle: 10000 32 | }, 33 | timezone: '+08:00' //东八时区 34 | } 35 | if (read && read.length > 0) { 36 | configList.replication = replication 37 | } 38 | // 下一个迭代数据库 39 | const sequelize = new Sequelize(write.dataBaseName, write.userName, write.password, { 40 | ...configList 41 | }) 42 | 43 | module.exports = { 44 | sequelize: sequelize 45 | } 46 | -------------------------------------------------------------------------------- /servers/monitor/router/routes/alarm.js: -------------------------------------------------------------------------------- 1 | const { AlarmController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | // 获取警报检查频率 5 | router.post('/getCheckTime', AlarmController.getCheckTime) 6 | // 设置警报检查频率 7 | router.post('/changeCheckTime', AlarmController.changeCheckTime) 8 | // 获取JsError报警参数 9 | router.post('/getJsErrorConfig', AlarmController.getJsErrorConfig) 10 | // 设置JsError报警参数 11 | router.post('/changeJsErrorConfig', AlarmController.changeJsErrorConfig) 12 | // 获取console Error报警参数 13 | router.post('/getConsoleErrorConfig', AlarmController.getConsoleErrorConfig) 14 | // 设置ConsoleError报警参数 15 | router.post('/changeConsoleErrorConfig', AlarmController.changeConsoleErrorConfig) 16 | // 获取Http Error报警参数 17 | router.post('/getHttpErrorConfig', AlarmController.getHttpErrorConfig) 18 | // 设置HttpError报警参数 19 | router.post('/changeHttpErrorConfig', AlarmController.changeHttpErrorConfig) 20 | // 获取Resource Error报警参数 21 | router.post('/getResourceErrorConfig', AlarmController.getResourceErrorConfig) 22 | // 设置ResourceError报警参数 23 | router.post('/changeResourceErrorConfig', AlarmController.changeResourceErrorConfig) 24 | } 25 | -------------------------------------------------------------------------------- /views/resource/wf_event/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "app.css": "./app.34a7f697857109e4113f.css", 3 | "app.js": "app.dd070d85.js", 4 | "index.html": "index.html", 5 | "src/assets/img/customer/index.scss": "src/assets/img/customer/customer_header_bg.webp", 6 | "src/assets/img/dataView/animation.png": "src/assets/img/dataView/animation.png", 7 | "src/assets/img/dataView/hotPer.png": "src/assets/img/dataView/hotPer.png", 8 | "src/assets/img/dataView/hotValue.png": "src/assets/img/dataView/hotValue.png", 9 | "src/assets/img/dataView/index.scss": "src/assets/img/dataView/warning.png", 10 | "src/assets/img/task/no-task.png": "src/assets/img/task/no-task.png", 11 | "src/modules/dataView/image/earth-chart.png": "src/modules/dataView/image/earth-chart.png", 12 | "src/modules/dataView/image/heat-chart.png": "src/modules/dataView/image/heat-chart.png", 13 | "src/modules/dataView/image/index.scss": "src/modules/dataView/image/no-card.png", 14 | "src/modules/dataView/image/number-chart.png": "src/modules/dataView/image/number-chart.png", 15 | "src/modules/dataView/image/path-analysis.png": "src/modules/dataView/image/path-analysis.png", 16 | "src/modules/dataView/image/words-chart.png": "src/modules/dataView/image/words-chart.png" 17 | } -------------------------------------------------------------------------------- /servers/center/schema/config.js: -------------------------------------------------------------------------------- 1 | //delete// 2 | const moment = require('moment'); 3 | //delete// 4 | const Config = function (sequelize, DataTypes) { 5 | return sequelize.define('Config', { 6 | // ID 主键 7 | id: { 8 | type: DataTypes.INTEGER, 9 | primaryKey: true, 10 | allowNull: false, 11 | autoIncrement: true, 12 | }, 13 | // 配置名称 14 | configName: { 15 | type: DataTypes.STRING(100), 16 | allowNull: true, 17 | field: 'configName' 18 | }, 19 | // 配置的值 20 | configValue: { 21 | type: DataTypes.STRING(50), 22 | allowNull: true, 23 | field: 'configValue' 24 | }, 25 | // 创建时间 26 | createdAt: { 27 | type: DataTypes.DATE, 28 | get() { 29 | return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss'); 30 | } 31 | }, 32 | // 更新时间 33 | updatedAt: { 34 | type: DataTypes.DATE, 35 | get() { 36 | return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss'); 37 | } 38 | } 39 | }, { 40 | // 如果为 true 则表的名称和 model 相同,即 user 41 | // 为 false MySQL创建的表名称会是复数 users 42 | // 如果指定的表名称本就是复数形式则不变 43 | freezeTableName: true 44 | }) 45 | 46 | } 47 | //exports// 48 | module.exports = Config 49 | //exports// -------------------------------------------------------------------------------- /servers/center/schema/userToken.js: -------------------------------------------------------------------------------- 1 | //delete// 2 | const moment = require('moment'); 3 | //delete// 4 | const Config = function (sequelize, DataTypes) { 5 | return sequelize.define('UserToken', { 6 | // ID 主键 7 | id: { 8 | type: DataTypes.INTEGER, 9 | primaryKey: true, 10 | allowNull: false, 11 | autoIncrement: true, 12 | }, 13 | // 用户唯一标识 14 | userId: { 15 | type: DataTypes.STRING(200), 16 | allowNull: true, 17 | field: 'userId' 18 | }, 19 | // accessToken 20 | accessToken: { 21 | type: DataTypes.TEXT, 22 | allowNull: true, 23 | field: 'accessToken' 24 | }, 25 | // 创建时间 26 | createdAt: { 27 | type: DataTypes.DATE, 28 | get() { 29 | return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss'); 30 | } 31 | }, 32 | // 更新时间 33 | updatedAt: { 34 | type: DataTypes.DATE, 35 | get() { 36 | return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss'); 37 | } 38 | } 39 | }, { 40 | // 如果为 true 则表的名称和 model 相同,即 user 41 | // 为 false MySQL创建的表名称会是复数 users 42 | // 如果指定的表名称本就是复数形式则不变 43 | freezeTableName: true 44 | }) 45 | 46 | } 47 | //exports// 48 | module.exports = Config 49 | //exports// -------------------------------------------------------------------------------- /utils/extension.js: -------------------------------------------------------------------------------- 1 | if (!String.prototype.format) { 2 | String.prototype.format = function() { 3 | var fmt = this; 4 | var params = Array.prototype.slice.call(arguments); 5 | return fmt.replace(/(\{(\d+)\})/g, function(match, firstCap, index) { 6 | return ((params[index] === undefined) ? match : params[index]); 7 | }); 8 | }; 9 | } 10 | if (!String.prototype.trim) { 11 | var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 12 | String.prototype.trim = function() { 13 | return this.replace(rtrim, ""); 14 | }; 15 | } 16 | if (!Date.prototype.Format) { 17 | Date.prototype.Format = function (fmt) { //author: meizz 18 | var o = { 19 | "M+": this.getMonth() + 1, //月份 20 | "d+": this.getDate(), //日 21 | "h+": this.getHours(), //小时 22 | "m+": this.getMinutes(), //分 23 | "s+": this.getSeconds(), //秒 24 | "q+": Math.floor((this.getMonth() + 3) / 3), //季度 25 | "S": this.getMilliseconds() //毫秒 26 | }; 27 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 28 | for (var k in o) 29 | if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); 30 | return fmt; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /servers/center/node_clickhouse/consts.js: -------------------------------------------------------------------------------- 1 | const DataTypes = { 2 | UINT: (len) => { 3 | return `UInt${len}` 4 | }, 5 | INT: (len) => { 6 | return `Int${len}` // 在普遍观念中,常用Tinyint、Smallint、Int和Bigint指代整数的不同取值范围。而ClickHouse则直接使用Int8、Int16、Int32和Int64指代4种大小的Int类型,其末尾的数字正好表明了占用字节的大小(8位=1字节)。 7 | }, 8 | FLOAT: (len) => { 9 | return `Float${len}` // ClickHouse直接使用Float32和Float64代表单精度浮点数以及双精度浮点数。在使用浮点数的时候,要意识到它是有限精度的。对Float32和Float64写入超过有效精度的数值,结果就会出现数据误差,会被截断。 10 | }, 11 | DECIMAL: (len) => { 12 | return `Decimal${len}` // 要更高精度的数值运算,需要使用定点数。ClickHouse提供了Decimal32、Decimal64和Decimal128三种精度的定点数。 13 | }, 14 | STRING: "String", // 字符串由String定义,长度不限。因此在使用String的时候无须声明大小。它完全代替了传统意义上数据库的Varchar、Text、Clob和Blob等字符类型。String类型不限定字符集,因为它根本就没有这个概念,所以可以将任意编码的字符串存入其中。 15 | FIXED_STRING: "FixedString", // FixedString类型和传统意义上的Char类型有些类似,对于一些字符有明确长度的场合,可以使用固定长度的字符串。定长字符串通过FixedString(N)声明,其中N表示字符串长度。但与Char不同的是,FixedString使用null字节填充末尾字符,而Char通常使用空格填充。 16 | UUID: "UUID", // UUID是一种数据库常见的主键类型,在ClickHouse中直接把它作为一种数据类型。UUID共有32位,它的格式为8-4-4-4-12。如果一个UUID类型的字段在写入数据时没有被赋值,则会依照格式使用0填充。 17 | DATE: "Date", // Date类型不包含具体的时间信息,只精确到天。 18 | DATE_TIME: "DateTime", // DateTime类型包含时、分、秒信息,精确到秒。 19 | DATE_TIME_64: "DateTime64" // DateTime64可以记录亚秒,它在DateTime之上增加了精度的设置。 20 | } 21 | module.exports = { 22 | DataTypes 23 | } -------------------------------------------------------------------------------- /servers/event/node_clickhouse/consts.js: -------------------------------------------------------------------------------- 1 | const DataTypes = { 2 | UINT: (len) => { 3 | return `UInt${len}` 4 | }, 5 | INT: (len) => { 6 | return `Int${len}` // 在普遍观念中,常用Tinyint、Smallint、Int和Bigint指代整数的不同取值范围。而ClickHouse则直接使用Int8、Int16、Int32和Int64指代4种大小的Int类型,其末尾的数字正好表明了占用字节的大小(8位=1字节)。 7 | }, 8 | FLOAT: (len) => { 9 | return `Float${len}` // ClickHouse直接使用Float32和Float64代表单精度浮点数以及双精度浮点数。在使用浮点数的时候,要意识到它是有限精度的。对Float32和Float64写入超过有效精度的数值,结果就会出现数据误差,会被截断。 10 | }, 11 | DECIMAL: (len) => { 12 | return `Decimal${len}` // 要更高精度的数值运算,需要使用定点数。ClickHouse提供了Decimal32、Decimal64和Decimal128三种精度的定点数。 13 | }, 14 | STRING: "String", // 字符串由String定义,长度不限。因此在使用String的时候无须声明大小。它完全代替了传统意义上数据库的Varchar、Text、Clob和Blob等字符类型。String类型不限定字符集,因为它根本就没有这个概念,所以可以将任意编码的字符串存入其中。 15 | FIXED_STRING: "FixedString", // FixedString类型和传统意义上的Char类型有些类似,对于一些字符有明确长度的场合,可以使用固定长度的字符串。定长字符串通过FixedString(N)声明,其中N表示字符串长度。但与Char不同的是,FixedString使用null字节填充末尾字符,而Char通常使用空格填充。 16 | UUID: "UUID", // UUID是一种数据库常见的主键类型,在ClickHouse中直接把它作为一种数据类型。UUID共有32位,它的格式为8-4-4-4-12。如果一个UUID类型的字段在写入数据时没有被赋值,则会依照格式使用0填充。 17 | DATE: "Date", // Date类型不包含具体的时间信息,只精确到天。 18 | DATE_TIME: "DateTime", // DateTime类型包含时、分、秒信息,精确到秒。 19 | DATE_TIME_64: "DateTime64" // DateTime64可以记录亚秒,它在DateTime之上增加了精度的设置。 20 | } 21 | module.exports = { 22 | DataTypes 23 | } -------------------------------------------------------------------------------- /servers/logger/node_clickhouse/consts.js: -------------------------------------------------------------------------------- 1 | const DataTypes = { 2 | UINT: (len) => { 3 | return `UInt${len}` 4 | }, 5 | INT: (len) => { 6 | return `Int${len}` // 在普遍观念中,常用Tinyint、Smallint、Int和Bigint指代整数的不同取值范围。而ClickHouse则直接使用Int8、Int16、Int32和Int64指代4种大小的Int类型,其末尾的数字正好表明了占用字节的大小(8位=1字节)。 7 | }, 8 | FLOAT: (len) => { 9 | return `Float${len}` // ClickHouse直接使用Float32和Float64代表单精度浮点数以及双精度浮点数。在使用浮点数的时候,要意识到它是有限精度的。对Float32和Float64写入超过有效精度的数值,结果就会出现数据误差,会被截断。 10 | }, 11 | DECIMAL: (len) => { 12 | return `Decimal${len}` // 要更高精度的数值运算,需要使用定点数。ClickHouse提供了Decimal32、Decimal64和Decimal128三种精度的定点数。 13 | }, 14 | STRING: "String", // 字符串由String定义,长度不限。因此在使用String的时候无须声明大小。它完全代替了传统意义上数据库的Varchar、Text、Clob和Blob等字符类型。String类型不限定字符集,因为它根本就没有这个概念,所以可以将任意编码的字符串存入其中。 15 | FIXED_STRING: "FixedString", // FixedString类型和传统意义上的Char类型有些类似,对于一些字符有明确长度的场合,可以使用固定长度的字符串。定长字符串通过FixedString(N)声明,其中N表示字符串长度。但与Char不同的是,FixedString使用null字节填充末尾字符,而Char通常使用空格填充。 16 | UUID: "UUID", // UUID是一种数据库常见的主键类型,在ClickHouse中直接把它作为一种数据类型。UUID共有32位,它的格式为8-4-4-4-12。如果一个UUID类型的字段在写入数据时没有被赋值,则会依照格式使用0填充。 17 | DATE: "Date", // Date类型不包含具体的时间信息,只精确到天。 18 | DATE_TIME: "DateTime", // DateTime类型包含时、分、秒信息,精确到秒。 19 | DATE_TIME_64: "DateTime64" // DateTime64可以记录亚秒,它在DateTime之上增加了精度的设置。 20 | } 21 | module.exports = { 22 | DataTypes 23 | } -------------------------------------------------------------------------------- /servers/monitor/node_clickhouse/consts.js: -------------------------------------------------------------------------------- 1 | const DataTypes = { 2 | UINT: (len) => { 3 | return `UInt${len}` 4 | }, 5 | INT: (len) => { 6 | return `Int${len}` // 在普遍观念中,常用Tinyint、Smallint、Int和Bigint指代整数的不同取值范围。而ClickHouse则直接使用Int8、Int16、Int32和Int64指代4种大小的Int类型,其末尾的数字正好表明了占用字节的大小(8位=1字节)。 7 | }, 8 | FLOAT: (len) => { 9 | return `Float${len}` // ClickHouse直接使用Float32和Float64代表单精度浮点数以及双精度浮点数。在使用浮点数的时候,要意识到它是有限精度的。对Float32和Float64写入超过有效精度的数值,结果就会出现数据误差,会被截断。 10 | }, 11 | DECIMAL: (len) => { 12 | return `Decimal${len}` // 要更高精度的数值运算,需要使用定点数。ClickHouse提供了Decimal32、Decimal64和Decimal128三种精度的定点数。 13 | }, 14 | STRING: "String", // 字符串由String定义,长度不限。因此在使用String的时候无须声明大小。它完全代替了传统意义上数据库的Varchar、Text、Clob和Blob等字符类型。String类型不限定字符集,因为它根本就没有这个概念,所以可以将任意编码的字符串存入其中。 15 | FIXED_STRING: "FixedString", // FixedString类型和传统意义上的Char类型有些类似,对于一些字符有明确长度的场合,可以使用固定长度的字符串。定长字符串通过FixedString(N)声明,其中N表示字符串长度。但与Char不同的是,FixedString使用null字节填充末尾字符,而Char通常使用空格填充。 16 | UUID: "UUID", // UUID是一种数据库常见的主键类型,在ClickHouse中直接把它作为一种数据类型。UUID共有32位,它的格式为8-4-4-4-12。如果一个UUID类型的字段在写入数据时没有被赋值,则会依照格式使用0填充。 17 | DATE: "Date", // Date类型不包含具体的时间信息,只精确到天。 18 | DATE_TIME: "DateTime", // DateTime类型包含时、分、秒信息,精确到秒。 19 | DATE_TIME_64: "DateTime64" // DateTime64可以记录亚秒,它在DateTime之上增加了精度的设置。 20 | } 21 | module.exports = { 22 | DataTypes 23 | } -------------------------------------------------------------------------------- /servers/center/util/extension.js: -------------------------------------------------------------------------------- 1 | if (!String.prototype.format) { 2 | String.prototype.format = function() { 3 | var fmt = this; 4 | var params = Array.prototype.slice.call(arguments); 5 | return fmt.replace(/(\{(\d+)\})/g, function(match, firstCap, index) { 6 | return ((params[index] === undefined) ? match : params[index]); 7 | }); 8 | }; 9 | } 10 | if (!String.prototype.trim) { 11 | var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 12 | String.prototype.trim = function() { 13 | return this.replace(rtrim, ""); 14 | }; 15 | } 16 | if (!Date.prototype.Format) { 17 | Date.prototype.Format = function (fmt) { //author: meizz 18 | var o = { 19 | "M+": this.getMonth() + 1, //月份 20 | "d+": this.getDate(), //日 21 | "h+": this.getHours(), //小时 22 | "m+": this.getMinutes(), //分 23 | "s+": this.getSeconds(), //秒 24 | "q+": Math.floor((this.getMonth() + 3) / 3), //季度 25 | "S": this.getMilliseconds() //毫秒 26 | }; 27 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 28 | for (var k in o) 29 | if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); 30 | return fmt; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /servers/event/util/extension.js: -------------------------------------------------------------------------------- 1 | if (!String.prototype.format) { 2 | String.prototype.format = function() { 3 | var fmt = this; 4 | var params = Array.prototype.slice.call(arguments); 5 | return fmt.replace(/(\{(\d+)\})/g, function(match, firstCap, index) { 6 | return ((params[index] === undefined) ? match : params[index]); 7 | }); 8 | }; 9 | } 10 | if (!String.prototype.trim) { 11 | var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 12 | String.prototype.trim = function() { 13 | return this.replace(rtrim, ""); 14 | }; 15 | } 16 | if (!Date.prototype.Format) { 17 | Date.prototype.Format = function (fmt) { //author: meizz 18 | var o = { 19 | "M+": this.getMonth() + 1, //月份 20 | "d+": this.getDate(), //日 21 | "h+": this.getHours(), //小时 22 | "m+": this.getMinutes(), //分 23 | "s+": this.getSeconds(), //秒 24 | "q+": Math.floor((this.getMonth() + 3) / 3), //季度 25 | "S": this.getMilliseconds() //毫秒 26 | }; 27 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 28 | for (var k in o) 29 | if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); 30 | return fmt; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /servers/logger/util/extension.js: -------------------------------------------------------------------------------- 1 | if (!String.prototype.format) { 2 | String.prototype.format = function() { 3 | var fmt = this; 4 | var params = Array.prototype.slice.call(arguments); 5 | return fmt.replace(/(\{(\d+)\})/g, function(match, firstCap, index) { 6 | return ((params[index] === undefined) ? match : params[index]); 7 | }); 8 | }; 9 | } 10 | if (!String.prototype.trim) { 11 | var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 12 | String.prototype.trim = function() { 13 | return this.replace(rtrim, ""); 14 | }; 15 | } 16 | if (!Date.prototype.Format) { 17 | Date.prototype.Format = function (fmt) { //author: meizz 18 | var o = { 19 | "M+": this.getMonth() + 1, //月份 20 | "d+": this.getDate(), //日 21 | "h+": this.getHours(), //小时 22 | "m+": this.getMinutes(), //分 23 | "s+": this.getSeconds(), //秒 24 | "q+": Math.floor((this.getMonth() + 3) / 3), //季度 25 | "S": this.getMilliseconds() //毫秒 26 | }; 27 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 28 | for (var k in o) 29 | if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); 30 | return fmt; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /servers/monitor/util/extension.js: -------------------------------------------------------------------------------- 1 | if (!String.prototype.format) { 2 | String.prototype.format = function() { 3 | var fmt = this; 4 | var params = Array.prototype.slice.call(arguments); 5 | return fmt.replace(/(\{(\d+)\})/g, function(match, firstCap, index) { 6 | return ((params[index] === undefined) ? match : params[index]); 7 | }); 8 | }; 9 | } 10 | if (!String.prototype.trim) { 11 | var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 12 | String.prototype.trim = function() { 13 | return this.replace(rtrim, ""); 14 | }; 15 | } 16 | if (!Date.prototype.Format) { 17 | Date.prototype.Format = function (fmt) { //author: meizz 18 | var o = { 19 | "M+": this.getMonth() + 1, //月份 20 | "d+": this.getDate(), //日 21 | "h+": this.getHours(), //小时 22 | "m+": this.getMinutes(), //分 23 | "s+": this.getSeconds(), //秒 24 | "q+": Math.floor((this.getMonth() + 3) / 3), //季度 25 | "S": this.getMilliseconds() //毫秒 26 | }; 27 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 28 | for (var k in o) 29 | if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); 30 | return fmt; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /servers/center/schema/applicationConfig.js: -------------------------------------------------------------------------------- 1 | //delete// 2 | const moment = require('moment'); 3 | //delete// 4 | const ApplicationConfig = function (sequelize, DataTypes) { 5 | return sequelize.define('ApplicationConfig', { 6 | // ID 主键 7 | id: { 8 | type: DataTypes.INTEGER, 9 | primaryKey: true, 10 | allowNull: false, 11 | autoIncrement: true, 12 | }, 13 | // 配置名称 14 | systemName: { 15 | type: DataTypes.STRING(500), 16 | allowNull: true, 17 | field: 'systemName' 18 | }, 19 | // 配置的值 20 | configValue: { 21 | type: DataTypes.TEXT, 22 | allowNull: true, 23 | field: 'configValue' 24 | }, 25 | // 创建时间 26 | createdAt: { 27 | type: DataTypes.DATE, 28 | get() { 29 | return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss'); 30 | } 31 | }, 32 | // 更新时间 33 | updatedAt: { 34 | type: DataTypes.DATE, 35 | get() { 36 | return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss'); 37 | } 38 | } 39 | }, { 40 | // 如果为 true 则表的名称和 model 相同,即 user 41 | // 为 false MySQL创建的表名称会是复数 users 42 | // 如果指定的表名称本就是复数形式则不变 43 | freezeTableName: true 44 | }) 45 | 46 | } 47 | //exports// 48 | module.exports = ApplicationConfig 49 | //exports// -------------------------------------------------------------------------------- /views/resource/wf_logger/index.html: -------------------------------------------------------------------------------- 1 | Webfunny一体化埋点系统
-------------------------------------------------------------------------------- /servers/event/router/routes/buryPointField.js: -------------------------------------------------------------------------------- 1 | const { BuryPointFieldController } = require("../../controllers/controllers") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * 点位字段接口 6 | */ 7 | router.post('/buryPointField/create', BuryPointFieldController.create); 8 | router.get('/buryPointField/detail', BuryPointFieldController.detail); 9 | router.post('/buryPointField/update', BuryPointFieldController.update); 10 | router.post('/buryPointField/delete', BuryPointFieldController.delete); 11 | router.post('/buryPointField/page', BuryPointFieldController.getPageList); 12 | router.post('/buryPointField/list', BuryPointFieldController.getNoWeList); 13 | router.post('/buryPointField/getListByPointId', BuryPointFieldController.getListByPointId); 14 | router.post('/buryPointField/getListAndWfByPointId', BuryPointFieldController.getListAndWfByPointId); 15 | router.post('/buryPointField/getListAndWfByProjectId', BuryPointFieldController.getListAndWfByProjectId); 16 | router.get('/buryPointField/AllList', BuryPointFieldController.getAllList); 17 | router.post('/buryPointField/fieldExport', BuryPointFieldController.exportField); 18 | router.post('/buryPointField/getFieldCount', BuryPointFieldController.getFieldCount); 19 | router.post('/buryPointField/getCommonFieldList', BuryPointFieldController.getCommonFieldList); 20 | } 21 | -------------------------------------------------------------------------------- /servers/center/config/monitorKeys.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | a: 'webMonitorId', 3 | b: 'customerKey', 4 | c: 'userId', 5 | d: 'firstUserParam', 6 | e: 'secondUserParam', 7 | f: 'completeUrl', 8 | g: 'simpleUrl', 9 | h: 'happenTime', 10 | i: 'uploadType', 11 | j: 'projectVersion', 12 | k: 'pageKey', 13 | l: 'deviceName', 14 | m: 'os', 15 | n: 'browserName', 16 | o: 'browserVersion', 17 | p: 'monitorIp', 18 | q: 'country', 19 | r: 'province', 20 | s: 'city', 21 | t: 'loadType', 22 | u: 'loadTime', 23 | v: 'loadPage', 24 | w: 'domReady', 25 | x: 'redirect', 26 | y: 'lookupDomain', 27 | z: 'ttfb', 28 | A: 'request', 29 | B: 'loadEvent', 30 | C: 'appcache', 31 | D: 'unloadEvent', 32 | E: 'connect', 33 | da: 'behaviorType', 34 | G: 'className', 35 | H: 'placeholder', 36 | I: 'inputValue', 37 | L: 'tagName', 38 | M: 'innerText', 39 | O: 'infoType', 40 | P: 'errorMessage', 41 | Q: 'errorStack', 42 | R: 'browserInfo', 43 | S: 'httpUrl', 44 | T: 'status', 45 | U: 'statusText', 46 | V: 'statusResult', 47 | W: 'requestText', 48 | X: 'responseText', 49 | Y: 'description', 50 | Z: 'screenInfo', 51 | aa: 'imgType', 52 | ba: 'elementType', 53 | ca: 'sourceUrl', 54 | ea: 'behaviorResult', 55 | fa: 'event' } -------------------------------------------------------------------------------- /servers/event/config/monitorKeys.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | a: 'webMonitorId', 3 | b: 'customerKey', 4 | c: 'userId', 5 | d: 'firstUserParam', 6 | e: 'secondUserParam', 7 | f: 'completeUrl', 8 | g: 'simpleUrl', 9 | h: 'happenTime', 10 | i: 'uploadType', 11 | j: 'projectVersion', 12 | k: 'pageKey', 13 | l: 'deviceName', 14 | m: 'os', 15 | n: 'browserName', 16 | o: 'browserVersion', 17 | p: 'monitorIp', 18 | q: 'country', 19 | r: 'province', 20 | s: 'city', 21 | t: 'loadType', 22 | u: 'loadTime', 23 | v: 'loadPage', 24 | w: 'domReady', 25 | x: 'redirect', 26 | y: 'lookupDomain', 27 | z: 'ttfb', 28 | A: 'request', 29 | B: 'loadEvent', 30 | C: 'appcache', 31 | D: 'unloadEvent', 32 | E: 'connect', 33 | da: 'behaviorType', 34 | G: 'className', 35 | H: 'placeholder', 36 | I: 'inputValue', 37 | L: 'tagName', 38 | M: 'innerText', 39 | O: 'infoType', 40 | P: 'errorMessage', 41 | Q: 'errorStack', 42 | R: 'browserInfo', 43 | S: 'httpUrl', 44 | T: 'status', 45 | U: 'statusText', 46 | V: 'statusResult', 47 | W: 'requestText', 48 | X: 'responseText', 49 | Y: 'description', 50 | Z: 'screenInfo', 51 | aa: 'imgType', 52 | ba: 'elementType', 53 | ca: 'sourceUrl', 54 | ea: 'behaviorResult', 55 | fa: 'event' } -------------------------------------------------------------------------------- /servers/logger/config/AccountConfig.js: -------------------------------------------------------------------------------- 1 | const WebfunnyConfig = require("../../../webfunny.config") 2 | const { domainConfig, licenseConfig, mysqlConfig, otherConfig } = WebfunnyConfig 3 | 4 | 5 | const accountInfo = { 6 | uploadServerDomain: domainConfig.uploadDomain.monitor, // 上报域名 7 | 8 | localServerDomain: domainConfig.host.be, // 监控系统后端服务域名 9 | localServerPort: domainConfig.port.be, // 监控系统后端服务端口号 10 | localAssetsDomain: domainConfig.host.fe, // 数据可视化系统域名 11 | localAssetsPort: domainConfig.port.fe, // 数据可视化系统端口号 12 | 13 | centerServerDomain: domainConfig.host.be, // 控制台后端服务域名 14 | centerServerPort: domainConfig.port.be, // 控制台后端端口号 15 | centerAssetsDomain: domainConfig.host.fe, // 数据可视化服务域名 16 | centerAssetsPort: domainConfig.port.be, // 可视化系统端口号 17 | 18 | purchaseCode: licenseConfig.monitor.purchaseCode, // 激活码 19 | secretCode: licenseConfig.monitor.secretCode, // 解码 20 | protocol: otherConfig.protocol, // 服务器之间通信采用的协议; 21 | messageQueue: otherConfig.messageQueue, // 消息队列默认关闭,需手动开启。 前提:安装RabbitMq; 22 | batchInsert: otherConfig.business.batchInsert, 23 | 24 | saveDays: otherConfig.logSaveDays, // 日志保存周期 25 | mysqlConfig: mysqlConfig.logger, 26 | } 27 | 28 | module.exports = { 29 | accountInfo 30 | } -------------------------------------------------------------------------------- /servers/logger/config/monitorKeys.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | a: 'webMonitorId', 3 | b: 'customerKey', 4 | c: 'userId', 5 | d: 'firstUserParam', 6 | e: 'secondUserParam', 7 | f: 'completeUrl', 8 | g: 'simpleUrl', 9 | h: 'happenTime', 10 | i: 'uploadType', 11 | j: 'projectVersion', 12 | k: 'pageKey', 13 | l: 'deviceName', 14 | m: 'os', 15 | n: 'browserName', 16 | o: 'browserVersion', 17 | p: 'monitorIp', 18 | q: 'country', 19 | r: 'province', 20 | s: 'city', 21 | t: 'loadType', 22 | u: 'loadTime', 23 | v: 'loadPage', 24 | w: 'domReady', 25 | x: 'redirect', 26 | y: 'lookupDomain', 27 | z: 'ttfb', 28 | A: 'request', 29 | B: 'loadEvent', 30 | C: 'appcache', 31 | D: 'unloadEvent', 32 | E: 'connect', 33 | da: 'behaviorType', 34 | G: 'className', 35 | H: 'placeholder', 36 | I: 'inputValue', 37 | L: 'tagName', 38 | M: 'innerText', 39 | O: 'infoType', 40 | P: 'errorMessage', 41 | Q: 'errorStack', 42 | R: 'browserInfo', 43 | S: 'httpUrl', 44 | T: 'status', 45 | U: 'statusText', 46 | V: 'statusResult', 47 | W: 'requestText', 48 | X: 'responseText', 49 | Y: 'description', 50 | Z: 'screenInfo', 51 | aa: 'imgType', 52 | ba: 'elementType', 53 | ca: 'sourceUrl', 54 | ea: 'behaviorResult', 55 | fa: 'event' } -------------------------------------------------------------------------------- /servers/monitor/config/monitorKeys.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | a: 'webMonitorId', 3 | b: 'customerKey', 4 | c: 'userId', 5 | d: 'firstUserParam', 6 | e: 'secondUserParam', 7 | f: 'completeUrl', 8 | g: 'simpleUrl', 9 | h: 'happenTime', 10 | i: 'uploadType', 11 | j: 'projectVersion', 12 | k: 'pageKey', 13 | l: 'deviceName', 14 | m: 'os', 15 | n: 'browserName', 16 | o: 'browserVersion', 17 | p: 'monitorIp', 18 | q: 'country', 19 | r: 'province', 20 | s: 'city', 21 | t: 'loadType', 22 | u: 'loadTime', 23 | v: 'loadPage', 24 | w: 'domReady', 25 | x: 'redirect', 26 | y: 'lookupDomain', 27 | z: 'ttfb', 28 | A: 'request', 29 | B: 'loadEvent', 30 | C: 'appcache', 31 | D: 'unloadEvent', 32 | E: 'connect', 33 | da: 'behaviorType', 34 | G: 'className', 35 | H: 'placeholder', 36 | I: 'inputValue', 37 | L: 'tagName', 38 | M: 'innerText', 39 | O: 'infoType', 40 | P: 'errorMessage', 41 | Q: 'errorStack', 42 | R: 'browserInfo', 43 | S: 'httpUrl', 44 | T: 'status', 45 | U: 'statusText', 46 | V: 'statusResult', 47 | W: 'requestText', 48 | X: 'responseText', 49 | Y: 'description', 50 | Z: 'screenInfo', 51 | aa: 'imgType', 52 | ba: 'elementType', 53 | ca: 'sourceUrl', 54 | ea: 'behaviorResult', 55 | fa: 'event' } -------------------------------------------------------------------------------- /middlreware/cacheData/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 部分接口数据做缓存 3 | */ 4 | const Utils = require('../../utils/utils') 5 | const statusCode = require('../../utils/status-code') 6 | 7 | /** 8 | * 判断token是否可用 9 | */ 10 | module.exports = function () { 11 | return async function (ctx, next) { 12 | let wfParam = {} 13 | const { method, url, body } = ctx.request 14 | if (method.toLowerCase() === "get") { 15 | wfParam = Utils.parseQs(url) 16 | } else { 17 | wfParam = typeof body === "string" ? JSON.parse(body) : body 18 | } 19 | // 自动解析参数 20 | ctx.wfParam = wfParam 21 | const { webMonitorId } = wfParam 22 | // 被缓存数据拦截,不再进入真正的查询逻辑 23 | if (global.CacheDataList && global.CacheDataList[webMonitorId] && global.CacheDataList[webMonitorId][url]) { 24 | const result = global.CacheDataList[webMonitorId][url] 25 | const { param, data } = result 26 | let flag = true 27 | for (let key in param) { 28 | if (wfParam[key] === undefined || param[key] !== wfParam[key]) { 29 | flag = false 30 | } 31 | } 32 | // url和参数都一样,则使用缓存的数据 33 | if (flag === true) { 34 | ctx.response.status = 200; 35 | ctx.body = statusCode.SUCCESS_200('success', data); 36 | return 37 | } 38 | 39 | } 40 | 41 | await next(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /views/resource/wf_center/index.html: -------------------------------------------------------------------------------- 1 | 应用中心
-------------------------------------------------------------------------------- /servers/center/config/local_db.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | const { accountInfo } = require('./AccountConfig'); 3 | 4 | const {write, read} = accountInfo.mysqlConfig; 5 | const replication = { 6 | read: read, 7 | write: { host: write.ip, username: write.userName, password: write.password } 8 | } 9 | const configList = { 10 | host: write.ip, 11 | port: write.port, 12 | logging: (sql) => { 13 | // 这里处理sql的日志,暂时不打印 14 | // console.log(sql) 15 | }, 16 | dialect: 'mysql', 17 | // operatorsAliases: false, 18 | dialectOptions: { 19 | charset: "utf8mb4", 20 | supportBigNumbers: true, 21 | bigNumberStrings: true 22 | }, 23 | pool: { 24 | max: 500, 25 | min: 0, 26 | acquire: 30000, 27 | idle: 10000 28 | }, 29 | timezone: '+08:00' //东八时区 30 | } 31 | if (read && read.length > 0) { 32 | configList.replication = replication 33 | } 34 | // 下一个迭代数据库 35 | const sequelizeNext = new Sequelize(write.dataBaseName, write.userName, write.password, { 36 | ...configList 37 | }); 38 | 39 | const emailConfig = { 40 | user: "jiang1125712@163.com", // generated ethereal user 41 | pass: "yingwei1125712" // generated ethereal password 42 | } 43 | const defaultUser = { 44 | user: "597873885@qq.com", // generated ethereal user 45 | pass: "123456" // generated ethereal password 46 | } 47 | module.exports = { 48 | sequelizeNext, 49 | emailConfig, 50 | defaultUser 51 | } -------------------------------------------------------------------------------- /servers/monitor/middlreware/sqlCheck.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断判断是否有sql注入逻辑 3 | */ 4 | const statusCode = require('../util/status-code') 5 | const dangerParams = [";", "'", "<", ">", "(", ")", "update ", 6 | "select ", "union ", "and ", "or ", "from ", "insert ", 7 | "delete ", "database ", "drop ", "truncate ", "create ", "like "] 8 | module.exports = function () { 9 | return async function (ctx, next) { 10 | const { url, query } = ctx 11 | const { body } = ctx.request 12 | // 过滤掉一些接口 13 | if ( url.indexOf("upLog") === -1 && 14 | url.indexOf("upMyLog") === -1 && 15 | url.indexOf("upDLog") === -1 && 16 | url.indexOf("upMog") === -1 ) { 17 | let goOnFlag = true 18 | const tempQuery = JSON.stringify(query).toLowerCase() 19 | const tempBody = JSON.stringify(body).toLowerCase() 20 | dangerParams.forEach((item) => { 21 | if (tempBody.indexOf(item) !== -1) { 22 | goOnFlag = false 23 | } else if (tempQuery.indexOf(item) !== -1) { 24 | goOnFlag = false 25 | } 26 | }) 27 | if (!goOnFlag) { 28 | ctx.response.status = 413; 29 | ctx.body = statusCode.ERROR_413(`请求参数不合法`); 30 | return 31 | } 32 | } 33 | await next(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /servers/monitor/router/routes/httpErrorInfo.js: -------------------------------------------------------------------------------- 1 | const { HttpErrorInfoController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * 接口请求报错相关接口 6 | */ 7 | // 获取接口请求出错的实时数据量 8 | router.get('/getHttpErrorCountByHour', HttpErrorInfoController.getHttpErrorInfoListByHour); 9 | // 获取每天的接口请求出错的数据量 10 | router.get('/getHttpErrorCountByDay', HttpErrorInfoController.getHttpErrorCountByDay); 11 | // 获取每天的出错的接口请求列表 12 | router.post('/getHttpErrorListByDay', HttpErrorInfoController.getHttpErrorListByDay); 13 | // 获取每天的出错的ErrorCode数量 14 | router.post('/getStatusListGroupByErrorCode', HttpErrorInfoController.getStatusListGroupByErrorCode); 15 | // 获取每天的出错的HttpUrl列表 16 | router.post('/getHttpErrorSort', HttpErrorInfoController.getHttpErrorSort); 17 | // 获取httpError详情 18 | router.post('/getHttpErrorSortInfo', HttpErrorInfoController.getHttpErrorSortInfo); 19 | // 根据版本号获取Http错误数量 20 | router.post('/getHttpErrorCountByVersion', HttpErrorInfoController.getHttpErrorCountByVersion); 21 | // 根据版本号获取HTTP错误数量,的相关详情 22 | router.post('/getHttpErrorVersionSortInfo', HttpErrorInfoController.getHttpErrorVersionSortInfo); 23 | // 根据url获取的出错的接口请求列表 24 | router.post('/getHttpErrorListByUrl', HttpErrorInfoController.getHttpErrorListByUrl); 25 | // 根据错误码计算数据 26 | router.post('/getErrorCodeForGroup', HttpErrorInfoController.getErrorCodeForGroup); 27 | } 28 | -------------------------------------------------------------------------------- /servers/center/router/routes/index.js: -------------------------------------------------------------------------------- 1 | const applicationConfigRouter = require('./applicationConfig') 2 | const companyRouter = require('./company') 3 | const flowDataInfoRouter = require('./flowDataInfoByHour') 4 | const flowDataInfoByDayRouter = require('./flowDataInfoByDay') 5 | const teamRouter = require('./team') 6 | const userRouter = require('./user') 7 | const userTokenRouter = require('./userToken') 8 | const ProductRouter = require('./product') 9 | // const OrderRouter = require('./order') 10 | const ssoRouter = require('./sso') 11 | const alarmListRouter = require('./alarmList') 12 | const noticeTemplateRouter = require('./noticeTemplate') 13 | const alarmRuleRouter = require('./alarmRule') 14 | const alarmOverviewRouter = require('./alarmOverview') 15 | const orderInfoRouter = require('./orderInfo') 16 | const menuPermissionsRouter = require('./menuPermissions') 17 | 18 | const createRouter = (router) => { 19 | applicationConfigRouter(router) 20 | companyRouter(router) 21 | flowDataInfoByDayRouter(router) 22 | flowDataInfoRouter(router) 23 | teamRouter(router) 24 | userRouter(router) 25 | userTokenRouter(router) 26 | ProductRouter(router) 27 | // OrderRouter(router) 28 | ssoRouter(router) 29 | alarmListRouter(router) 30 | noticeTemplateRouter(router) 31 | alarmRuleRouter(router) 32 | alarmOverviewRouter(router) 33 | orderInfoRouter(router) 34 | menuPermissionsRouter(router) 35 | } 36 | 37 | module.exports = { 38 | createRouter 39 | } -------------------------------------------------------------------------------- /servers/logger/middlreware/sqlCheck.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断判断是否有sql注入逻辑 3 | */ 4 | const statusCode = require('../util/status-code') 5 | const dangerParams = [" update ", 6 | " select ", " union ", " and ", " or ", " from ", " insert ", 7 | " delete ", " database ", " drop ", " truncate ", " create ", " like "] 8 | module.exports = function () { 9 | return async function (ctx, next) { 10 | const { url, query } = ctx 11 | const { body } = ctx.request 12 | // 过滤掉一些接口 13 | if ( url.indexOf("upLog") === -1 && 14 | url.indexOf("upMyLog") === -1 && 15 | url.indexOf("upDLog") === -1 && 16 | url.indexOf("upMog") === -1 && 17 | url.indexOf("upgradeSystem") === -1) { 18 | let goOnFlag = true 19 | const tempQuery = JSON.stringify(query).toLowerCase() 20 | const tempBody = JSON.stringify(body).toLowerCase() 21 | dangerParams.forEach((item) => { 22 | if (tempBody.indexOf(item) !== -1) { 23 | goOnFlag = false 24 | } else if (tempQuery.indexOf(item) !== -1) { 25 | goOnFlag = false 26 | } 27 | }) 28 | if (!goOnFlag) { 29 | ctx.response.status = 412; 30 | ctx.body = statusCode.ERROR_412(`请求参数不合法`); 31 | return 32 | } 33 | } 34 | await next(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /servers/monitor/router/routes/pageLoadInfo.js: -------------------------------------------------------------------------------- 1 | const { PageLoadInfoController } = require("../../controllers/controllers.js") 2 | 3 | module.exports = (router) => { 4 | /** 5 | * 页面性能 6 | */ 7 | // 创建加载信息 8 | router.post('/pageLoad', PageLoadInfoController.create); 9 | router.post('/getPageLoadOverview', PageLoadInfoController.getPageLoadOverview); 10 | router.post('/getPageLoadOverviewSimple', PageLoadInfoController.getPageLoadOverviewSimple); 11 | router.post('/getPerformanceDataForMinute', PageLoadInfoController.getPerformanceDataForMinute); 12 | router.post('/getFastSlowDataForMinute', PageLoadInfoController.getFastSlowDataForMinute); 13 | router.post('/getPerfDataForUrlByDay', PageLoadInfoController.getPerfDataForUrlByDay); 14 | router.post('/getPerfDataForUrlByDaySimple', PageLoadInfoController.getPerfDataForUrlByDaySimple); 15 | router.post('/getPerfDataForWaterfall', PageLoadInfoController.getPerfDataForWaterfall); 16 | router.post('/getPerfDataForUrlDetail', PageLoadInfoController.getPerfDataForUrlDetail); 17 | router.post('/getPerfDataForMap', PageLoadInfoController.getPerfDataForMap); 18 | router.post('/getPerfInfoByVersion', PageLoadInfoController.getPerfInfoByVersion); 19 | router.post('/getPerfInfoByNetWork', PageLoadInfoController.getPerfInfoByNetWork); 20 | router.post('/getPerfInfoByOs', PageLoadInfoController.getPerfInfoByOs); 21 | router.post('/getPageCompleteLoadedDataForHour', PageLoadInfoController.getPageCompleteLoadedDataForHour); 22 | } 23 | -------------------------------------------------------------------------------- /servers/monitor/schema/screenShotInfo.js: -------------------------------------------------------------------------------- 1 | 2 | const { DataTypes } = require("../node_clickhouse/consts") 3 | const BaseInfoSchema = require('./baseInfo') 4 | const Columns = { 5 | tableName: 'ScreenShotInfo', 6 | structure: { 7 | ...BaseInfoSchema(DataTypes), 8 | // 分析数据id 9 | dataId: { 10 | type: DataTypes.UUID, 11 | allowNull: true, 12 | field: 'dataId' 13 | }, 14 | // 截屏描述 15 | description: { 16 | type: DataTypes.STRING, 17 | allowNull: true, 18 | field: 'description' 19 | }, 20 | // 截屏信息 21 | screenInfo: { 22 | type: DataTypes.STRING, 23 | allowNull: true, 24 | field: 'screenInfo' 25 | }, 26 | // 图片类型 27 | imgType: { 28 | type: DataTypes.STRING, 29 | allowNull: true, 30 | field: 'imgType' 31 | } 32 | }, 33 | // 创建索引 34 | index: { 35 | // 如果为 true 则表的名称和 model 相同,即 user 36 | // 为 false MySQL创建的表名称会是复数 users 37 | // 如果指定的表名称本就是复数形式则不变 38 | freezeTableName: true 39 | }, 40 | engine: "ENGINE MergeTree()", 41 | // 创建索引Sql 42 | indexSql: "", 43 | // 数据模型 44 | dataModel: "", 45 | // 指定分区Key 46 | partition: "PARTITION BY toYYYYMMDD(happenDate)", 47 | // 排序规则 48 | orderBy: "ORDER BY (happenDate)", 49 | // 设置表属性 50 | properties: "" 51 | } 52 | const DefineTable = function (sequelize) { 53 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 54 | } 55 | 56 | module.exports = { 57 | Columns, 58 | DefineTable 59 | } -------------------------------------------------------------------------------- /servers/center/middlreware/sqlCheck.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断判断是否有sql注入逻辑 3 | */ 4 | const statusCode = require('../util/status-code') 5 | const dangerParams = [";", "'", "<", ">", "(", ")", "update ", 6 | "select ", "union ", "and ", "or ", "from ", "insert ", 7 | "delete ", "database ", "drop ", "truncate ", "create ", "like "] 8 | module.exports = function () { 9 | return async function (ctx, next) { 10 | const { url, query } = ctx 11 | const { body } = ctx.request 12 | // 过滤掉一些接口 13 | if ( url.indexOf("upLog") === -1 && 14 | url.indexOf("upMyLog") === -1 && 15 | url.indexOf("upDLog") === -1 && 16 | url.indexOf("upMog") === -1 && 17 | url.indexOf("upgradeSystem") === -1) { 18 | let goOnFlag = true 19 | const tempQuery = JSON.stringify(query).toLowerCase() 20 | const tempBody = JSON.stringify(body).toLowerCase() 21 | dangerParams.forEach((item) => { 22 | if (tempBody.indexOf(item) !== -1) { 23 | goOnFlag = false 24 | } else if (tempQuery.indexOf(item) !== -1) { 25 | goOnFlag = false 26 | } 27 | }) 28 | if (!goOnFlag) { 29 | ctx.response.status = 412; 30 | ctx.body = statusCode.ERROR_412(`请求参数不合法`); 31 | return 32 | } 33 | } 34 | await next(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /servers/monitor/schema/resourceLoadInfo.js: -------------------------------------------------------------------------------- 1 | 2 | const { DataTypes } = require("../node_clickhouse/consts") 3 | const BaseInfoSchema = require('./baseInfo') 4 | const Columns = { 5 | tableName: 'ResourceLoadInfo', 6 | structure: { 7 | ...BaseInfoSchema(DataTypes), 8 | // 分析数据id 9 | dataId: { 10 | type: DataTypes.UUID, 11 | allowNull: true, 12 | field: 'dataId' 13 | }, 14 | // 静态资源的请求路径 15 | sourceUrl: { 16 | type: DataTypes.STRING, 17 | allowNull: true, 18 | field: 'sourceUrl' 19 | }, 20 | // 静态资源的类型 21 | elementType: { 22 | type: DataTypes.STRING, 23 | allowNull: true, 24 | field: 'elementType' 25 | }, 26 | // 资源加载状态 27 | status: { 28 | type: DataTypes.STRING, 29 | allowNull: true, 30 | field: 'status' 31 | } 32 | }, 33 | // 创建索引 34 | index: { 35 | // 如果为 true 则表的名称和 model 相同,即 user 36 | // 为 false MySQL创建的表名称会是复数 users 37 | // 如果指定的表名称本就是复数形式则不变 38 | freezeTableName: true 39 | }, 40 | engine: "ENGINE MergeTree()", 41 | // 创建索引Sql 42 | indexSql: "", 43 | // 数据模型 44 | dataModel: "", 45 | // 指定分区Key 46 | // 指定分区Key 47 | partition: "PARTITION BY toYYYYMMDD(happenDate)", 48 | // 排序规则 49 | orderBy: "ORDER BY (happenDate)", 50 | // 设置表属性 51 | properties: "" 52 | } 53 | const DefineTable = function (sequelize) { 54 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 55 | } 56 | 57 | module.exports = { 58 | Columns, 59 | DefineTable 60 | } -------------------------------------------------------------------------------- /servers/center/schema/menuPermissions.js: -------------------------------------------------------------------------------- 1 | const moment = require('moment'); 2 | const MenuPermissions = function (sequelize, DataTypes) { 3 | return sequelize.define('MenuPermissions', { 4 | // ID 主键 5 | id: { 6 | type: DataTypes.INTEGER, 7 | primaryKey: true, 8 | allowNull: false, 9 | autoIncrement: true, 10 | }, 11 | // 公司ID 12 | companyId: { 13 | type: DataTypes.STRING(60), 14 | allowNull: true, 15 | field: 'companyId' 16 | }, 17 | // 团队ID 18 | teamId: { 19 | type: DataTypes.STRING(60), 20 | allowNull: true, 21 | field: 'teamId' 22 | }, 23 | // userId 24 | userId: { 25 | type: DataTypes.STRING(60), 26 | allowNull: true, 27 | field: 'userId' 28 | }, 29 | // 监控菜单权限,逗号分隔 30 | monitorMenu: { 31 | type: DataTypes.TEXT, 32 | allowNull: true, 33 | field: 'monitorMenu' 34 | }, 35 | // 埋点菜单权限,逗号分隔 36 | eventMenu: { 37 | type: DataTypes.TEXT, 38 | allowNull: true, 39 | field: 'eventMenu' 40 | }, 41 | // 创建时间 42 | createdAt: { 43 | type: DataTypes.DATE, 44 | get() { 45 | return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss'); 46 | } 47 | }, 48 | // 更新时间 49 | updatedAt: { 50 | type: DataTypes.DATE, 51 | get() { 52 | return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss'); 53 | } 54 | } 55 | }) 56 | } 57 | //exports// 58 | module.exports = MenuPermissions 59 | //exports// -------------------------------------------------------------------------------- /views/resource/wf_event/index.html: -------------------------------------------------------------------------------- 1 | Webfunny一体化埋点系统
-------------------------------------------------------------------------------- /middlreware/logger.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 日志中间件 3 | */ 4 | const WebfunnyConfig = require("../webfunny.config") 5 | const { otherConfig } = WebfunnyConfig 6 | const statusCode = require('../utils/status-code') 7 | const loggerUpload = require("./loggerUpload") 8 | const log = require("../config/log") 9 | const Utils = require("../utils/utils") 10 | module.exports = function () { 11 | return async function (ctx, next) { 12 | const { url, query } = ctx 13 | // 如果是上报接口,则直接过滤 14 | if (url.indexOf("wfLog/upLogs") !== -1) { 15 | await next(); 16 | return 17 | } 18 | 19 | const { body } = ctx.request 20 | const wfTraceId = ctx.header['wf-t'] || Utils.getUuid() // 获取traceId 21 | 22 | const start = new Date() 23 | let ms = 0 24 | try { 25 | await next(); 26 | ms = new Date() - start 27 | } catch (error) { 28 | 29 | let errorRes = "" 30 | let errorMsg = "服务器异常,请检查 logs/error 目录下日志文件" 31 | if (otherConfig.uploadServerErrorToWebfunny === true) { 32 | loggerUpload.trace({ 33 | projectId: "webfunny_log_sys", 34 | url, 35 | error, 36 | traceId: wfTraceId 37 | }) 38 | errorRes = {traceId: wfTraceId} 39 | errorMsg = "服务器异常,请查看错误日志" 40 | } else { 41 | log.error(error) 42 | } 43 | ctx.response.status = 500; 44 | ctx.body = statusCode.ERROR_500(errorMsg, errorRes) 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /servers/center/schema/alarmItem.js: -------------------------------------------------------------------------------- 1 | const moment = require('moment'); 2 | const AlarmItem = function (sequelize, DataTypes) { 3 | return sequelize.define('AlarmItem', { 4 | // ID 主键 5 | id: { 6 | type: DataTypes.INTEGER, 7 | primaryKey: true, 8 | allowNull: false, 9 | autoIncrement: true, 10 | }, 11 | // 公司ID 12 | companyId: { 13 | type: DataTypes.STRING(60), 14 | allowNull: true, 15 | field: 'companyId' 16 | }, 17 | // 所属应用ID 18 | applicationId: { 19 | type: DataTypes.STRING(60), 20 | allowNull: true, 21 | field: 'applicationId' 22 | }, 23 | // 告警状态 1: 告警中, 2: 已恢复, 3: 已失效 24 | alarmStatus: { 25 | type: DataTypes.INTEGER, 26 | allowNull: true, 27 | field: 'alarmStatus' 28 | }, 29 | // 告警规则ID 30 | ruleId: { 31 | type: DataTypes.STRING(60), 32 | allowNull: true, 33 | field: 'ruleId' 34 | }, 35 | // 最近发生时间 36 | latestHappen: { 37 | type: DataTypes.DATE, 38 | get() { 39 | return moment(this.getDataValue('latestHappen')).format('YYYY-MM-DD HH:mm:ss'); 40 | } 41 | }, 42 | 43 | // 创建时间 44 | createdAt: { 45 | type: DataTypes.DATE, 46 | get() { 47 | return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss'); 48 | } 49 | }, 50 | // 更新时间 51 | updatedAt: { 52 | type: DataTypes.DATE, 53 | get() { 54 | return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss'); 55 | } 56 | } 57 | }) 58 | } 59 | //exports// 60 | module.exports = AlarmItem 61 | //exports// -------------------------------------------------------------------------------- /views/resource/wf_monitor/index.html: -------------------------------------------------------------------------------- 1 | 前端监控系统,无埋点监控前端页面日志
-------------------------------------------------------------------------------- /servers/center/router/index.js: -------------------------------------------------------------------------------- 1 | const Router = require('koa-router') 2 | const Utils = require('../util/utils'); 3 | const { createRouter } = require("./routes"); 4 | const timerTask = require("./timer"); 5 | const UtilCus = require("../../../util_cus") 6 | 7 | 8 | global.centerInfo = { 9 | ssoForFeiShu: {}, 10 | purchaseCodeProjectCount: 3, 11 | registerEmailCode: {}, 12 | registerEmailCodeCheckError: {}, 13 | webMonitorIdList: [], 14 | userIdArray: [], 15 | tempDebugInfoArray: {}, 16 | debugInfoArray: [], 17 | debugInfoTimer: {}, 18 | debugTimer: null, 19 | debugInfo: {}, 20 | debugClearLocalInfo: [], // 记录将要清理本地缓存的userId 21 | logServerStatus: true, // 日志服务状态 22 | cacheWebMonitorIdList: [], // 开启上报服务的项目列表 23 | waitCounts: 40, // 日志等待上报的时间间隔,可以调整日志上报的密度(40代表8s上报一次) 24 | logCountInMinute: 0, // 每分钟的日志量 25 | logCountInMinuteList: [], // 每分钟日志量数组 26 | errorLogListForLast200: [], // 存放最近200条报错日志 27 | purchaseCodeValid: false, 28 | warningMessageList: [], 29 | loginValidateCode: "", 30 | projectConfigs: {}, // 携带每个项目的配置信息 31 | alarmInfoList: {}, // 警报信息暂存 32 | logInfoQueue: {}, // 存放日志队列的对象 33 | } 34 | global.tableTimeStamp = new Date().Format("yyyyMMdd") 35 | global.web_monitor_version = "1.0.0" 36 | global.BUILD_ENV = process.argv[3] 37 | global.MONITOR_PUBLISH_PREFIX = "/wfMonitor" // 监控系统,请求前缀 38 | global.EVENT_PUBLISH_PREFIX = "/wfEvent" // 埋点系统,请求前缀 39 | 40 | // 解析ip信息到内存中(供监控和埋点使用) 41 | UtilCus.storeIpList() 42 | 43 | const router = new Router({ 44 | prefix: '/wfCenter' 45 | }) 46 | 47 | createRouter(router) 48 | timerTask() 49 | 50 | module.exports = router 51 | -------------------------------------------------------------------------------- /servers/event/schema/config.js: -------------------------------------------------------------------------------- 1 | const { DataTypes } = require("../node_clickhouse/consts") 2 | const moment = require('moment') 3 | const Columns = { 4 | tableName: 'Config', 5 | structure: { 6 | // 分析数据id 7 | dataId: { 8 | type: DataTypes.UUID, 9 | allowNull: true, 10 | field: 'dataId' 11 | }, 12 | // 配置名称 13 | configName: { 14 | type: DataTypes.STRING, 15 | allowNull: true, 16 | field: 'configName', 17 | }, 18 | // 配置的值 19 | configValue: { 20 | type: DataTypes.STRING, 21 | allowNull: true, 22 | field: 'configValue', 23 | }, 24 | // 创建时间 25 | createdAt: { 26 | type: DataTypes.DATE_TIME, 27 | field: "createdAt", 28 | get() { 29 | return moment().format('YYYY-MM-DD HH:mm:ss'); 30 | } 31 | }, 32 | // 更新时间 33 | updatedAt: { 34 | type: DataTypes.DATE_TIME, 35 | field: "updatedAt", 36 | get() { 37 | return moment().format('YYYY-MM-DD HH:mm:ss'); 38 | } 39 | } 40 | }, 41 | // 创建索引 42 | index: { 43 | // 如果为 true 则表的名称和 model 相同,即 user 44 | // 为 false MySQL创建的表名称会是复数 users 45 | // 如果指定的表名称本就是复数形式则不变 46 | freezeTableName: true 47 | }, 48 | engine: "ENGINE MergeTree()", 49 | // 创建索引Sql 50 | indexSql: "", 51 | // 数据模型 52 | dataModel: "", 53 | // 指定分区Key 54 | partition: "", 55 | // 排序规则 56 | orderBy: "ORDER BY (dataId)", 57 | // 设置表属性 58 | properties: "" 59 | } 60 | const DefineTable = function (sequelize) { 61 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 62 | } 63 | 64 | module.exports = { 65 | Columns, 66 | DefineTable 67 | } -------------------------------------------------------------------------------- /servers/event/table_config.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | const utils = require('./util/utils') 3 | const log = require("./config/log"); 4 | const db = require('./config/db') 5 | const Sequelize = db.sequelize; 6 | // const webMonitorIdList = require('./bin/webMonitorIdList') 7 | var argv = process.argv 8 | var commandLine = "" 9 | var start = 0 10 | var end = argv[2] 11 | 12 | 13 | const handleCommandLine = (projectList) => { 14 | projectList.forEach((proName, index) => { 15 | for (var i = start; i < end; i ++) { 16 | var dataStr = utils.addDays(i).replace(/-/g, "") 17 | if (i == end - 1 && index == projectList.length - 1) { 18 | commandLine += "node " + "table_create.js " + proName + " " + dataStr 19 | } else { 20 | commandLine += "node " + "table_create.js " + proName + " " + dataStr + " && " 21 | } 22 | } 23 | }) 24 | 25 | fs.readFile('./package.json', function(err, data){ 26 | let newString = data.toString().replace(/table_create_command/g, commandLine) 27 | fs.writeFile('./package.json', newString, (err) => { 28 | if (err) throw err; 29 | log.printInfo("命令配置完成, 请执行命令: npm run table_create"); 30 | }); 31 | }) 32 | } 33 | 34 | // 获取项目列表 35 | let sql = "select webMonitorId from Project" 36 | Sequelize.query(sql, { type: Sequelize.QueryTypes.SELECT}).then((res) => { 37 | let webMonitorIdList = [] 38 | res.forEach((p) => { 39 | webMonitorIdList.push(p.webMonitorId) 40 | }) 41 | if (webMonitorIdList.length) { 42 | handleCommandLine(webMonitorIdList) 43 | } else { 44 | log.printError("未能查询到你的应用列表,无法创建对应的数据库表,请检查bin/webMonitorIdList.js文件") 45 | } 46 | }) 47 | 48 | 49 | -------------------------------------------------------------------------------- /servers/logger/schema/config.js: -------------------------------------------------------------------------------- 1 | const { DataTypes } = require("../node_clickhouse/consts") 2 | const moment = require('moment') 3 | const Columns = { 4 | tableName: 'Config', 5 | structure: { 6 | // 分析数据id 7 | dataId: { 8 | type: DataTypes.UUID, 9 | allowNull: true, 10 | field: 'dataId' 11 | }, 12 | // 配置名称 13 | configName: { 14 | type: DataTypes.STRING, 15 | allowNull: true, 16 | field: 'configName', 17 | }, 18 | // 配置的值 19 | configValue: { 20 | type: DataTypes.STRING, 21 | allowNull: true, 22 | field: 'configValue', 23 | }, 24 | // 创建时间 25 | createdAt: { 26 | type: DataTypes.DATE_TIME, 27 | field: "createdAt", 28 | get() { 29 | return moment().format('YYYY-MM-DD HH:mm:ss'); 30 | } 31 | }, 32 | // 更新时间 33 | updatedAt: { 34 | type: DataTypes.DATE_TIME, 35 | field: "updatedAt", 36 | get() { 37 | return moment().format('YYYY-MM-DD HH:mm:ss'); 38 | } 39 | } 40 | }, 41 | // 创建索引 42 | index: { 43 | // 如果为 true 则表的名称和 model 相同,即 user 44 | // 为 false MySQL创建的表名称会是复数 users 45 | // 如果指定的表名称本就是复数形式则不变 46 | freezeTableName: true 47 | }, 48 | engine: "ENGINE MergeTree()", 49 | // 创建索引Sql 50 | indexSql: "", 51 | // 数据模型 52 | dataModel: "", 53 | // 指定分区Key 54 | partition: "", 55 | // 排序规则 56 | orderBy: "ORDER BY (dataId)", 57 | // 设置表属性 58 | properties: "" 59 | } 60 | const DefineTable = function (sequelize) { 61 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 62 | } 63 | 64 | module.exports = { 65 | Columns, 66 | DefineTable 67 | } -------------------------------------------------------------------------------- /servers/monitor/schema/config.js: -------------------------------------------------------------------------------- 1 | const { DataTypes } = require("../node_clickhouse/consts") 2 | const moment = require('moment') 3 | const Columns = { 4 | tableName: 'Config', 5 | structure: { 6 | // 分析数据id 7 | dataId: { 8 | type: DataTypes.UUID, 9 | allowNull: true, 10 | field: 'dataId' 11 | }, 12 | // 配置名称 13 | configName: { 14 | type: DataTypes.STRING, 15 | allowNull: true, 16 | field: 'configName', 17 | }, 18 | // 配置的值 19 | configValue: { 20 | type: DataTypes.STRING, 21 | allowNull: true, 22 | field: 'configValue', 23 | }, 24 | // 创建时间 25 | createdAt: { 26 | type: DataTypes.DATE_TIME, 27 | field: "createdAt", 28 | get() { 29 | return moment().format('YYYY-MM-DD HH:mm:ss'); 30 | } 31 | }, 32 | // 更新时间 33 | updatedAt: { 34 | type: DataTypes.DATE_TIME, 35 | field: "updatedAt", 36 | get() { 37 | return moment().format('YYYY-MM-DD HH:mm:ss'); 38 | } 39 | } 40 | }, 41 | // 创建索引 42 | index: { 43 | // 如果为 true 则表的名称和 model 相同,即 user 44 | // 为 false MySQL创建的表名称会是复数 users 45 | // 如果指定的表名称本就是复数形式则不变 46 | freezeTableName: true 47 | }, 48 | engine: "ENGINE MergeTree()", 49 | // 创建索引Sql 50 | indexSql: "", 51 | // 数据模型 52 | dataModel: "", 53 | // 指定分区Key 54 | partition: "", 55 | // 排序规则 56 | orderBy: "ORDER BY (dataId)", 57 | // 设置表属性 58 | properties: "" 59 | } 60 | const DefineTable = function (sequelize) { 61 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 62 | } 63 | 64 | module.exports = { 65 | Columns, 66 | DefineTable 67 | } -------------------------------------------------------------------------------- /servers/center/schema/team.js: -------------------------------------------------------------------------------- 1 | //delete// 2 | const moment = require('moment'); 3 | //delete// 4 | const Project = function (sequelize, DataTypes) { 5 | return sequelize.define('Team', { 6 | // ID 主键 7 | id: { 8 | type: DataTypes.INTEGER, 9 | primaryKey: true, 10 | allowNull: false, 11 | autoIncrement: true, 12 | }, 13 | // 公司ID 14 | companyId: { 15 | type: DataTypes.STRING(100), 16 | allowNull: true, 17 | field: 'companyId' 18 | },// 团队名称 19 | teamName: { 20 | type: DataTypes.STRING(100), 21 | allowNull: true, 22 | field: 'teamName' 23 | }, 24 | // 团队成员 25 | members: { 26 | type: DataTypes.TEXT, 27 | allowNull: true, 28 | field: 'members' 29 | }, 30 | 31 | // 团队LeaderId 32 | leaderId: { 33 | type: DataTypes.STRING(200), 34 | allowNull: true, 35 | field: 'leaderId' 36 | }, 37 | // 项目ID 38 | webMonitorIds: { 39 | type: DataTypes.TEXT, 40 | allowNull: true, 41 | field: 'webMonitorIds' 42 | }, 43 | // 创建时间 44 | createdAt: { 45 | type: DataTypes.DATE, 46 | get() { 47 | return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss'); 48 | } 49 | }, 50 | // 更新时间 51 | updatedAt: { 52 | type: DataTypes.DATE, 53 | get() { 54 | return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss'); 55 | } 56 | } 57 | }, { 58 | // 如果为 true 则表的名称和 model 相同,即 user 59 | // 为 false MySQL创建的表名称会是复数 users 60 | // 如果指定的表名称本就是复数形式则不变 61 | freezeTableName: true 62 | }) 63 | 64 | } 65 | //exports// 66 | module.exports = Project 67 | //exports// -------------------------------------------------------------------------------- /servers/monitor/schema/ignoreError.js: -------------------------------------------------------------------------------- 1 | const { DataTypes } = require("../node_clickhouse/consts") 2 | const moment = require('moment') 3 | const Columns = { 4 | tableName: 'IgnoreError', 5 | structure: { 6 | // dataId 7 | dataId: { 8 | type: DataTypes.UUID, 9 | allowNull: true, 10 | field: 'dataId' 11 | }, 12 | // 需要忽略的JS报错信息 13 | ignoreErrorMessage: { 14 | type: DataTypes.STRING, 15 | allowNull: true, 16 | field: 'ignoreErrorMessage' 17 | }, 18 | // 类型,区分已解决问题和已忽略问题 19 | type: { 20 | type: DataTypes.STRING, 21 | allowNull: true, 22 | field: 'type' 23 | }, 24 | // 创建时间 25 | createdAt: { 26 | type: DataTypes.DATE_TIME, 27 | field: "createdAt", 28 | get() { 29 | return moment().format('YYYY-MM-DD HH:mm:ss'); 30 | } 31 | }, 32 | // 更新时间 33 | updatedAt: { 34 | type: DataTypes.DATE_TIME, 35 | field: "updatedAt", 36 | get() { 37 | return moment().format('YYYY-MM-DD HH:mm:ss'); 38 | } 39 | } 40 | }, 41 | // 创建索引 42 | index: { 43 | // 如果为 true 则表的名称和 model 相同,即 user 44 | // 为 false MySQL创建的表名称会是复数 users 45 | // 如果指定的表名称本就是复数形式则不变 46 | freezeTableName: true 47 | }, 48 | engine: "ENGINE MergeTree()", 49 | // 创建索引Sql 50 | indexSql: "", 51 | // 数据模型 52 | dataModel: "", 53 | // 指定分区Key 54 | partition: "", 55 | // 排序规则 56 | orderBy: "ORDER BY (ignoreErrorMessage)", 57 | // 设置表属性 58 | properties: "" 59 | } 60 | const DefineTable = function (sequelize) { 61 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 62 | } 63 | 64 | module.exports = { 65 | Columns, 66 | DefineTable 67 | } -------------------------------------------------------------------------------- /middlreware/sqlCheck.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断判断是否有sql注入逻辑 3 | */ 4 | const statusCode = require('../utils/status-code') 5 | const dangerParams = [//";", "'", "<", ">", "(", ")", 6 | " select ", " union ", " and ", " or ", " from ", " insert ", " update ", 7 | " delete ", " database ", " drop ", " truncate ", " create ", " like "] 8 | module.exports = function () { 9 | return async function (ctx, next) { 10 | const { url, query } = ctx 11 | const { body } = ctx.request 12 | // 过滤掉一些接口 13 | if ( 14 | url.indexOf("/wfLog/") === -1 && 15 | url.indexOf("upLog") === -1 && 16 | url.indexOf("upLogs") === -1 && 17 | url.indexOf("upMyLog") === -1 && 18 | url.indexOf("upDLog") === -1 && 19 | url.indexOf("upMog") === -1 && 20 | url.indexOf("upEvent") === -1 && 21 | url.indexOf("upEvents") === -1 && 22 | url.indexOf("otel/trace") === -1 23 | ) { 24 | let goOnFlag = true 25 | const tempQuery = JSON.stringify(query).toLowerCase() 26 | const tempBody = JSON.stringify(body).toLowerCase() 27 | dangerParams.forEach((item) => { 28 | if (tempBody.indexOf(item) !== -1) { 29 | goOnFlag = false 30 | } else if (tempQuery.indexOf(item) !== -1) { 31 | goOnFlag = false 32 | } 33 | }) 34 | if (!goOnFlag) { 35 | ctx.response.status = 413; 36 | ctx.body = statusCode.ERROR_413(`请求参数不合法`); 37 | return 38 | } 39 | } 40 | await next(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /config/log_config.js: -------------------------------------------------------------------------------- 1 | var log4js = require("log4js"); 2 | var path = require("path"); 3 | var fs = require("fs"); 4 | var basePath = path.resolve(__dirname, "../logs"); 5 | 6 | var errorPath = basePath + "/errors/"; 7 | var resPath = basePath + "/info/"; 8 | 9 | var errorFilename = errorPath + "/error"; 10 | var resFilename = resPath + "/info"; 11 | 12 | /** 13 | * 确定目录是否存在,如果不存在则创建目录 14 | */ 15 | var confirmPath = function(pathStr) { 16 | if (!fs.existsSync(pathStr)) { 17 | fs.mkdirSync(pathStr); 18 | console.log("createPath: " + pathStr); 19 | } 20 | }; 21 | log4js.configure({ 22 | appenders: { 23 | errorLog: { 24 | type: "dateFile", //日志类型 25 | filename: errorFilename, //日志输出位置 26 | alwaysIncludePattern: true, //是否总是有后缀名 27 | pattern: "-yyyy-MM-dd.log", //后缀,每小时创建一个新的日志文件 28 | //文件保留数量 29 | backups: 8, 30 | //时间文件 保存多少天,以前的log将被删除 31 | numBackups:8, 32 | }, 33 | responseLog: { 34 | type: "dateFile", 35 | filename: resFilename, 36 | alwaysIncludePattern: true, 37 | pattern: "-yyyy-MM-dd.log", 38 | //文件保留数量 39 | backups: 8, 40 | //时间文件 保存多少天,以前的log将被删除 41 | numBackups:8, 42 | } 43 | }, 44 | categories: { 45 | errorLog: { appenders: ['errorLog'], level: 'error' }, 46 | responseLog: { appenders: ["responseLog"], level: "info" }, 47 | default: { appenders: ['responseLog','errorLog',], level: 'trace' } 48 | }, 49 | // pm2: true, 50 | // pm2InstanceVar: 'INSTANCE_ID', 51 | disableClustering: true 52 | }); 53 | //创建log的根目录'logs' 54 | if (basePath) { 55 | confirmPath(basePath); 56 | //根据不同的logType创建不同的文件目录 57 | confirmPath(errorPath); 58 | confirmPath(resPath); 59 | } 60 | 61 | module.exports = log4js; -------------------------------------------------------------------------------- /servers/logger/config/log_config.js: -------------------------------------------------------------------------------- 1 | var log4js = require("log4js"); 2 | var path = require("path"); 3 | var fs = require("fs"); 4 | var basePath = path.resolve(__dirname, "../logs"); 5 | 6 | var errorPath = basePath + "/errors/"; 7 | var resPath = basePath + "/info/"; 8 | 9 | var errorFilename = errorPath + "/error"; 10 | var resFilename = resPath + "/info"; 11 | 12 | /** 13 | * 确定目录是否存在,如果不存在则创建目录 14 | */ 15 | var confirmPath = function(pathStr) { 16 | if (!fs.existsSync(pathStr)) { 17 | fs.mkdirSync(pathStr); 18 | console.log("createPath: " + pathStr); 19 | } 20 | }; 21 | log4js.configure({ 22 | appenders: { 23 | errorLog: { 24 | type: "dateFile", //日志类型 25 | filename: errorFilename, //日志输出位置 26 | alwaysIncludePattern: true, //是否总是有后缀名 27 | pattern: "-yyyy-MM-dd.log", //后缀,每小时创建一个新的日志文件 28 | //文件保留数量 29 | backups: 8, 30 | //时间文件 保存多少天,以前的log将被删除 31 | numBackups:8, 32 | }, 33 | responseLog: { 34 | type: "dateFile", 35 | filename: resFilename, 36 | alwaysIncludePattern: true, 37 | pattern: "-yyyy-MM-dd.log", 38 | //文件保留数量 39 | backups: 8, 40 | //时间文件 保存多少天,以前的log将被删除 41 | numBackups:8, 42 | } 43 | }, 44 | categories: { 45 | errorLog: { appenders: ['errorLog'], level: 'error' }, 46 | responseLog: { appenders: ["responseLog"], level: "info" }, 47 | default: { appenders: ['responseLog','errorLog',], level: 'trace' } 48 | }, 49 | // pm2: true, 50 | // pm2InstanceVar: 'INSTANCE_ID', 51 | disableClustering: true 52 | }); 53 | //创建log的根目录'logs' 54 | if (basePath) { 55 | confirmPath(basePath); 56 | //根据不同的logType创建不同的文件目录 57 | confirmPath(errorPath); 58 | confirmPath(resPath); 59 | } 60 | 61 | module.exports = log4js; -------------------------------------------------------------------------------- /servers/center/schema/noticeTemplate.js: -------------------------------------------------------------------------------- 1 | const moment = require('moment'); 2 | const NoticeTemplate = function (sequelize, DataTypes) { 3 | return sequelize.define('NoticeTemplate', { 4 | // ID 主键 5 | id: { 6 | type: DataTypes.INTEGER, 7 | primaryKey: true, 8 | allowNull: false, 9 | autoIncrement: true, 10 | }, 11 | // 公司ID 12 | companyId: { 13 | type: DataTypes.STRING(60), 14 | allowNull: true, 15 | field: 'companyId' 16 | }, 17 | noticeTemplateId: { 18 | type: DataTypes.STRING(60), 19 | allowNull: true, 20 | field: 'noticeTemplateId' 21 | }, 22 | // 模板名称 23 | templateName: { 24 | type: DataTypes.STRING(200), 25 | allowNull: true, 26 | field: 'templateName' 27 | }, 28 | // 通知类型 1:告警触发 2:告警恢复 29 | noticeType: { 30 | type: DataTypes.STRING(10), 31 | allowNull: true, 32 | field: 'noticeType' 33 | }, 34 | // 最后修改 35 | lastModified: { 36 | type: DataTypes.DATE, 37 | get() { 38 | return moment(this.getDataValue('lastModified')).format('YYYY-MM-DD HH:mm:ss'); 39 | } 40 | }, 41 | // 修改人 42 | modifyPeopleId: { 43 | type: DataTypes.STRING(60), 44 | allowNull: true, 45 | field: 'modifyPeopleId' 46 | }, 47 | // 创建时间 48 | createdAt: { 49 | type: DataTypes.DATE, 50 | get() { 51 | return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss'); 52 | } 53 | }, 54 | // 更新时间 55 | updatedAt: { 56 | type: DataTypes.DATE, 57 | get() { 58 | return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss'); 59 | } 60 | } 61 | }) 62 | } 63 | //exports// 64 | module.exports = NoticeTemplate 65 | //exports// -------------------------------------------------------------------------------- /servers/monitor/controllers/fail.js: -------------------------------------------------------------------------------- 1 | //delete// 2 | const statusCode = require('../util/status-code') 3 | const fs = require('fs'); 4 | const { spawn, exec, execFile } = require('child_process'); 5 | const { ConfigModel } = require('../modules/models') 6 | //delete// 7 | class FailController { 8 | static async getSysInfo(ctx) { 9 | ctx.response.status = 200; 10 | ctx.body = statusCode.SUCCESS_200('success', {invalid: true}) 11 | } 12 | static async createPurchaseCode(ctx) { 13 | const req = ctx.request.body 14 | const param = JSON.parse(req) 15 | const { inputPurchaseCode } = param 16 | 17 | const newString = `module.exports = { 18 | purchaseCode: '${inputPurchaseCode}', 19 | }` 20 | await fs.writeFile("./bin/purchaseCode.js", newString, (err) => { 21 | if (err) { 22 | throw err; 23 | } 24 | }); 25 | 26 | await ConfigModel.updateConfig("purchaseCode", {configValue: inputPurchaseCode}) 27 | 28 | FailController.restartServer() 29 | ctx.response.status = 200; 30 | ctx.body = statusCode.SUCCESS_200('success', 0) 31 | } 32 | 33 | /** 34 | * 重启服务 35 | */ 36 | static async restartServer() { 37 | 38 | switch (process.platform) { 39 | // windows系统下 40 | case "win32": 41 | spawn(process.platform === "win32" ? "npm.cmd" : "npm", ['run', 'prd_restart'], { stdio: 'inherit' }); 42 | break; 43 | case "darwin": // 默认mac系统 44 | default: 45 | try { 46 | execFile('./restart.sh', [], null, function (err, stdout, stderr) { 47 | console.log("服务已重启") 48 | }); 49 | } catch(e) { 50 | console.log("服务重启失败,请手动重启") 51 | } 52 | break; 53 | } 54 | 55 | } 56 | } 57 | //exports// 58 | module.exports = FailController 59 | //exports// -------------------------------------------------------------------------------- /servers/center/schema/noticeSetting.js: -------------------------------------------------------------------------------- 1 | const moment = require('moment'); 2 | const NoticeSetting = function (sequelize, DataTypes) { 3 | return sequelize.define('NoticeSetting', { 4 | // ID 主键 5 | id: { 6 | type: DataTypes.INTEGER, 7 | primaryKey: true, 8 | allowNull: false, 9 | autoIncrement: true, 10 | }, 11 | noticeSettingId: { 12 | type: DataTypes.STRING(60), 13 | allowNull: true, 14 | field: 'noticeSettingId' 15 | }, 16 | // 通知人ID 17 | noticePeopleId: { 18 | type: DataTypes.TEXT, 19 | allowNull: true, 20 | field: 'noticePeopleId' 21 | }, 22 | // 通知团队ID 23 | noticeTeamId: { 24 | type: DataTypes.STRING(60), 25 | allowNull: true, 26 | field: 'noticeTeamId' 27 | }, 28 | // 推送渠道 29 | channel: { 30 | type: DataTypes.STRING(200), 31 | allowNull: true, 32 | field: 'channel' 33 | }, 34 | // 通知周期 35 | cycle: { 36 | type: DataTypes.STRING(30), 37 | allowNull: true, 38 | field: 'cycle' 39 | }, 40 | // 静默时间 41 | slienceTime: { 42 | type: DataTypes.TEXT, 43 | allowNull: true, 44 | field: 'slienceTime' 45 | }, 46 | // 关联的通知模板 47 | noticeTemplateId: { 48 | type: DataTypes.STRING(60), 49 | allowNull: true, 50 | field: 'noticeTemplateId' 51 | }, 52 | // 创建时间 53 | createdAt: { 54 | type: DataTypes.DATE, 55 | get() { 56 | return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss'); 57 | } 58 | }, 59 | // 更新时间 60 | updatedAt: { 61 | type: DataTypes.DATE, 62 | get() { 63 | return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss'); 64 | } 65 | } 66 | }) 67 | } 68 | //exports// 69 | module.exports = NoticeSetting 70 | //exports// -------------------------------------------------------------------------------- /servers/logger/router/timer.js: -------------------------------------------------------------------------------- 1 | // const Common = require('../controllers/common') 2 | const { Common, LogProjectController } = require("../controllers/controllers") 3 | const TimerUtil = require("../util/timer") 4 | // const log = require("../config/log"); 5 | const AccountConfig = require("../config/AccountConfig"); 6 | const { accountInfo, localAssetsDomain } = AccountConfig 7 | const masterUuidKey = "monitor-master-uuid" 8 | /** 9 | * 定时任务 10 | */ 11 | module.exports = async (customerWarningCallback, serverType = "master") => { 12 | /** 13 | * 3秒后开始接收消息队列里的数据 14 | * */ 15 | setTimeout(() => { 16 | // if (accountInfo.messageQueue === true) { 17 | // // 开始接收消息队列的消息 18 | // Common.startReceiveMsg() 19 | // Common.startReceiveMsgForMog() 20 | // } 21 | // // 将每个项目的配置放入全局变量中 22 | // Common.setProjectConfigList() 23 | // setTimeout(() => { 24 | // console.log("启动监控项目列表:", JSON.stringify(global.logServerInfo.cacheWebMonitorIdList)) 25 | // }, 10000) 26 | 27 | // // 将项目的webMonitorId列表放入全局变量,并放入bin/webMonitorIdList.js文件中 28 | // // Common.setStopWebMonitorIdList() 29 | }, 3000) 30 | /** 31 | * 2秒后开始进行第一次分析 32 | * */ 33 | setTimeout(() => { 34 | // 检查是否有系统日志项目 35 | LogProjectController.checkSysProject() 36 | }, 20000) 37 | // Common.consoleLogo() 38 | 39 | /** * 定时任务 开始 */ 40 | setTimeout(() => { 41 | // Common.consoleInfo() 42 | Common.createTable(0) 43 | 44 | TimerUtil((time) => { 45 | const minuteTimeStr = time.Format("mm:ss") 46 | // 每隔10秒钟,取日志队列里的日志,执行入库操作 47 | if (minuteTimeStr.substring(4) == "0") { 48 | Common.handleLogInfoQueue() 49 | } 50 | }) 51 | }, 6000) 52 | } -------------------------------------------------------------------------------- /servers/event/controllers/fail.js: -------------------------------------------------------------------------------- 1 | //delete// 2 | const statusCode = require('../util/status-code') 3 | const fs = require('fs'); 4 | const { spawn, exec, execFile } = require('child_process'); 5 | const { ConfigModel } = require('../modules/models') 6 | //delete// 7 | class FailController { 8 | static async getSysInfo(ctx) { 9 | ctx.response.status = 200; 10 | ctx.body = statusCode.SUCCESS_200('success', {invalid: true}) 11 | } 12 | static async createPurchaseCode(ctx) { 13 | const req = ctx.request.body 14 | const param = JSON.parse(req) 15 | const { inputPurchaseCode } = param 16 | 17 | // const newString = `module.exports = { 18 | // purchaseCode: '${inputPurchaseCode}', 19 | // }` 20 | // await fs.writeFile("./bin/purchaseCode.js", newString, (err) => { 21 | // if (err) { 22 | // throw err; 23 | // } 24 | // }); 25 | 26 | await ConfigModel.updateConfig("purchaseCode", {configValue: inputPurchaseCode}) 27 | 28 | FailController.restartServer() 29 | ctx.response.status = 200; 30 | ctx.body = statusCode.SUCCESS_200('success', 0) 31 | } 32 | 33 | /** 34 | * 重启服务 35 | */ 36 | static async restartServer() { 37 | 38 | switch (process.platform) { 39 | // windows系统下 40 | case "win32": 41 | spawn(process.platform === "win32" ? "npm.cmd" : "npm", ['run', 'prd_restart'], { stdio: 'inherit' }); 42 | break; 43 | case "darwin": // 默认mac系统 44 | default: 45 | try { 46 | execFile('./restart.sh', [], null, function (err, stdout, stderr) { 47 | console.log("服务已重启") 48 | }); 49 | } catch(e) { 50 | console.log("服务重启失败,请手动重启") 51 | } 52 | break; 53 | } 54 | 55 | } 56 | } 57 | //exports// 58 | module.exports = FailController 59 | //exports// -------------------------------------------------------------------------------- /servers/logger/config/local_db.js: -------------------------------------------------------------------------------- 1 | 2 | const Sequelize = require('sequelize'); 3 | const { accountInfo } = require('./AccountConfig'); 4 | 5 | const {write, read} = accountInfo.mysqlConfig; 6 | 7 | // const readArray = [] 8 | // if (read && read.length) { 9 | // read.forEach((item) => { 10 | // readArray.push({host: item.ip, port: item.port, username: item.userName, password: item.password}) 11 | // }) 12 | // } 13 | // const replication = { 14 | // read: readArray, 15 | // write: { host: write.ip, port: write.port, username: write.userName, password: write.password } 16 | // } 17 | 18 | // const configList = { 19 | // host: write.ip, 20 | // port: write.port, 21 | // logging: (sql) => { 22 | // // 这里处理sql的日志,暂时不打印 23 | // console.log(sql) 24 | // }, 25 | // dialect: 'mysql', 26 | // // operatorsAliases: false, 27 | // dialectOptions: { 28 | // charset: "utf8mb4", 29 | // supportBigNumbers: true, 30 | // bigNumberStrings: true 31 | // }, 32 | // pool: { 33 | // max: 500, 34 | // min: 0, 35 | // acquire: 30000, 36 | // idle: 10000 37 | // }, 38 | // timezone: '+08:00' //东八时区 39 | // } 40 | // let sequelize = null 41 | // if (read && read.length > 0) { 42 | // configList.replication = replication 43 | // sequelize = new Sequelize(write.dataBaseName, null, null, { 44 | // ...configList 45 | // }) 46 | // } else { 47 | // // 下一个迭代数据库 48 | // sequelize = new Sequelize(write.dataBaseName, write.userName, write.password, { 49 | // ...configList 50 | // }) 51 | // } 52 | 53 | 54 | const { createClient } = require('@clickhouse/client'); 55 | 56 | const client = createClient({ 57 | host: `http://${write.ip}:${write.port}`, 58 | username: write.userName, 59 | password: write.password, 60 | database: write.dataBaseName 61 | }) 62 | 63 | 64 | 65 | module.exports = { 66 | sequelize: client, 67 | } 68 | -------------------------------------------------------------------------------- /servers/event/router/routes/index.js: -------------------------------------------------------------------------------- 1 | const buryPointAlarmRouter = require('./buryPointAlarm') 2 | const buryPointAlarmMessageRouter = require('./buryPointAlarmMessage') 3 | const buryPointCardRouter = require('./buryPointCard') 4 | const buryPointFieldRouter = require('./buryPointField') 5 | const buryPointProjectRouter = require('./buryPointProject') 6 | const sdkReleaseRouter = require('./buryPointSdkRelease') 7 | const buryPointTestRouter = require('./buryPointTest') 8 | const buryPointTaskRouter = require('./buryPointTask') 9 | const buryPointTemplateRouter = require('./buryPointTemplate') 10 | const buryPointWarehouseRouter = require('./buryPointWarehouse') 11 | const commonRouter = require('./common') 12 | const commonUpLogRouter = require('./commonUpLog') 13 | const sysInfoRouter = require('./sysInfo') 14 | const timerStatisticRouter = require('./timerStatistic') 15 | const weHandleDataRouter = require('./weHandleData') 16 | const buryPointCircleSelectRouter = require('./buryPointCircleSelect') 17 | const buryPointVisualTrackingRouter = require('./buryPointVisualTracking') 18 | const buryPointUserBehaviorRelationRouter = require('./buryPointUserBehaviorRelation') 19 | 20 | const createRouter = (router) => { 21 | buryPointFieldRouter(router) 22 | buryPointWarehouseRouter(router) 23 | buryPointAlarmRouter(router) 24 | buryPointAlarmMessageRouter(router) 25 | buryPointCardRouter(router) 26 | buryPointProjectRouter(router) 27 | buryPointTaskRouter(router) 28 | commonRouter(router) 29 | commonUpLogRouter(router) 30 | sdkReleaseRouter(router) 31 | sysInfoRouter(router) 32 | timerStatisticRouter(router) 33 | weHandleDataRouter(router) 34 | buryPointTestRouter(router) 35 | buryPointTemplateRouter(router) 36 | buryPointCircleSelectRouter(router) 37 | buryPointVisualTrackingRouter(router) 38 | buryPointUserBehaviorRelationRouter(router) 39 | } 40 | 41 | module.exports = { 42 | createRouter 43 | } -------------------------------------------------------------------------------- /servers/monitor/schema/infoCountByDay.js: -------------------------------------------------------------------------------- 1 | const { DataTypes } = require("../node_clickhouse/consts") 2 | const moment = require('moment') 3 | const Columns = { 4 | tableName: 'InfoCountByDay', 5 | structure: { 6 | // 日志类型 7 | uploadType: { 8 | type: DataTypes.STRING, 9 | allowNull: true, 10 | field: 'uploadType' 11 | }, 12 | // 每天的名称 2019-06-28 13 | dayName: { 14 | type: DataTypes.STRING, 15 | allowNull: true, 16 | field: 'dayName' 17 | }, 18 | // 数据ID 19 | dataId: { 20 | type: DataTypes.UUID, 21 | allowNull: true, 22 | field: 'dataId' 23 | }, 24 | // 版本号 25 | projectVersion: { 26 | type: DataTypes.STRING, 27 | field: 'projectVersion' 28 | }, 29 | // 每天的数量 30 | dayCount: { 31 | type: DataTypes.FLOAT(32), 32 | field: 'dayCount', 33 | }, 34 | // 创建时间 35 | createdAt: { 36 | type: DataTypes.DATE_TIME, 37 | field: "createdAt", 38 | get() { 39 | return moment().format('YYYY-MM-DD HH:mm:ss'); 40 | } 41 | }, 42 | // 更新时间 43 | updatedAt: { 44 | type: DataTypes.DATE_TIME, 45 | field: "updatedAt", 46 | get() { 47 | return moment().format('YYYY-MM-DD HH:mm:ss'); 48 | } 49 | } 50 | }, 51 | // 创建索引 52 | index: { 53 | // 如果为 true 则表的名称和 model 相同,即 user 54 | // 为 false MySQL创建的表名称会是复数 users 55 | // 如果指定的表名称本就是复数形式则不变 56 | freezeTableName: true 57 | }, 58 | engine: "ENGINE MergeTree()", 59 | // 创建索引Sql 60 | indexSql: "", 61 | // 数据模型 62 | dataModel: "", 63 | // 指定分区Key 64 | partition: "", 65 | // 排序规则 66 | orderBy: "ORDER BY (dayName)", 67 | // 设置表属性 68 | properties: "" 69 | } 70 | const DefineTable = function (sequelize) { 71 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 72 | } 73 | 74 | module.exports = { 75 | Columns, 76 | DefineTable 77 | } -------------------------------------------------------------------------------- /servers/event/app.js: -------------------------------------------------------------------------------- 1 | const Koa = require('koa') 2 | // 路由 3 | const bodyParser = require('koa-bodyparser') 4 | const httpRoute = require('./router') 5 | const log = require("./config/log") 6 | let WebSocket = require("koa-websocket") 7 | const statusCode = require('./util/status-code') 8 | const auth = require('./middlreware/auth') 9 | const sqlCheck = require('./middlreware/sqlCheck') 10 | const app = WebSocket(new Koa()) 11 | 12 | app.use(async (ctx, next) => { 13 | ctx.set("Access-Control-Allow-Origin", ctx.header.origin) 14 | ctx.set("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS") 15 | ctx.set("Access-Control-Allow-Headers", "access-token,webfunny-secret-code,x-requested-with,Content-Type,sw8") 16 | ctx.set("Access-Control-Allow-Credentials", true) 17 | ctx.set("X-Powered-By", "3.2.1") 18 | ctx.set("Content-Type", "application/json;charset=utf-8") 19 | ctx.set("Connection", "close") 20 | if (ctx.method == 'OPTIONS') { 21 | ctx.body = 200; 22 | } else { 23 | await next(); 24 | } 25 | }) 26 | // 登录校验 27 | app.use(auth()) 28 | // middlewares 29 | app.use(bodyParser({ 30 | enableTypes: ['json', 'form', 'text'], 31 | formLimit: "5mb", 32 | jsonLimit: "5mb", 33 | textLimit: "5mb" 34 | })) 35 | 36 | // 防sql注入 37 | app.use(sqlCheck()) 38 | 39 | app.use(async (ctx, next) => { 40 | const start = new Date() 41 | let ms = 0 42 | try { 43 | await next(); 44 | ms = new Date() - start 45 | } catch (error) { 46 | //记录异常日志 47 | log.error(ctx, error, ms); 48 | ctx.response.status = 500; 49 | ctx.body = statusCode.ERROR_500('服务器异常,请检查 logs/error 目录下日志文件', "") 50 | } 51 | }) 52 | 53 | // routes 54 | app.use(httpRoute.routes(), httpRoute.allowedMethods()) 55 | // error-handling 56 | app.on('error', (err, ctx) => { 57 | console.error('server error', err, ctx) 58 | }); 59 | 60 | module.exports = app 61 | 62 | -------------------------------------------------------------------------------- /servers/monitor/schema/behaviorInfo.js: -------------------------------------------------------------------------------- 1 | 2 | const { DataTypes } = require("../node_clickhouse/consts") 3 | const BaseInfoSchema = require('./baseInfo') 4 | const Columns = { 5 | tableName: 'BehaviorInfo', 6 | structure: { 7 | ...BaseInfoSchema(DataTypes), 8 | // 分析数据id 9 | dataId: { 10 | type: DataTypes.UUID, 11 | allowNull: true, 12 | field: 'dataId' 13 | }, 14 | // 行为类型 15 | behaviorType: { 16 | type: DataTypes.STRING, 17 | allowNull: true, 18 | field: 'behaviorType' 19 | }, 20 | // 元素的类名 21 | className: { 22 | type: DataTypes.STRING, 23 | allowNull: true, 24 | field: 'className' 25 | }, 26 | // Input 框的placeholder 27 | placeholder: { 28 | type: DataTypes.STRING, 29 | allowNull: true, 30 | field: 'placeholder' 31 | }, 32 | // 输入的内容 33 | inputValue: { 34 | type: DataTypes.STRING, 35 | allowNull: true, 36 | field: 'inputValue' 37 | }, 38 | // 输入的内容 39 | tagName: { 40 | type: DataTypes.STRING, 41 | allowNull: true, 42 | field: 'tagName' 43 | }, 44 | // 元素包含的内容 45 | innerText: { 46 | type: DataTypes.STRING, 47 | allowNull: true, 48 | field: 'innerText' 49 | } 50 | }, 51 | // 创建索引 52 | index: { 53 | // 如果为 true 则表的名称和 model 相同,即 user 54 | // 为 false MySQL创建的表名称会是复数 users 55 | // 如果指定的表名称本就是复数形式则不变 56 | freezeTableName: true 57 | }, 58 | engine: "ENGINE MergeTree()", 59 | // 创建索引Sql 60 | indexSql: "", 61 | // 数据模型 62 | dataModel: "", 63 | // 指定分区Key 64 | partition: "PARTITION BY toYYYYMMDD(happenDate)", 65 | // 排序规则 66 | orderBy: "ORDER BY (happenDate)", 67 | // 设置表属性 68 | properties: "" 69 | } 70 | const DefineTable = function (sequelize) { 71 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 72 | } 73 | 74 | module.exports = { 75 | Columns, 76 | DefineTable 77 | } -------------------------------------------------------------------------------- /servers/event/schema/team.js: -------------------------------------------------------------------------------- 1 | const { DataTypes } = require("../node_clickhouse/consts") 2 | const moment = require('moment') 3 | const Columns = { 4 | tableName: 'Team', 5 | structure: { 6 | // 数据ID 7 | dataId: { 8 | type: DataTypes.UUID, 9 | allowNull: true, 10 | field: 'dataId' 11 | }, 12 | // 团队名称 13 | teamName: { 14 | type: DataTypes.STRING, 15 | allowNull: true, 16 | field: 'teamName' 17 | }, 18 | // 团队成员 19 | members: { 20 | type: DataTypes.STRING, 21 | allowNull: true, 22 | field: 'members' 23 | }, 24 | 25 | // 团队LeaderId 26 | leaderId: { 27 | type: DataTypes.STRING, 28 | allowNull: true, 29 | field: 'leaderId' 30 | }, 31 | // 项目ID 32 | webMonitorIds: { 33 | type: DataTypes.STRING, 34 | allowNull: true, 35 | field: 'webMonitorIds' 36 | }, 37 | // 创建时间 38 | createdAt: { 39 | type: DataTypes.DATE_TIME, 40 | field: "createdAt", 41 | get() { 42 | return moment().format('YYYY-MM-DD HH:mm:ss'); 43 | } 44 | }, 45 | // 更新时间 46 | updatedAt: { 47 | type: DataTypes.DATE_TIME, 48 | field: "updatedAt", 49 | get() { 50 | return moment().format('YYYY-MM-DD HH:mm:ss'); 51 | } 52 | } 53 | }, 54 | // 创建索引 55 | index: { 56 | // 如果为 true 则表的名称和 model 相同,即 user 57 | // 为 false MySQL创建的表名称会是复数 users 58 | // 如果指定的表名称本就是复数形式则不变 59 | freezeTableName: true 60 | }, 61 | engine: "ENGINE MergeTree()", 62 | // 创建索引Sql 63 | indexSql: "", 64 | // 数据模型 65 | dataModel: "", 66 | // 指定分区Key 67 | partition: "", 68 | // 排序规则 69 | orderBy: "ORDER BY (dataId)", 70 | // 设置表属性 71 | properties: "" 72 | } 73 | const DefineTable = function (sequelize) { 74 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 75 | } 76 | 77 | module.exports = { 78 | Columns, 79 | DefineTable 80 | } -------------------------------------------------------------------------------- /servers/monitor/schema/team.js: -------------------------------------------------------------------------------- 1 | const { DataTypes } = require("../node_clickhouse/consts") 2 | const moment = require('moment') 3 | const Columns = { 4 | tableName: 'Team', 5 | structure: { 6 | // 数据ID 7 | dataId: { 8 | type: DataTypes.UUID, 9 | allowNull: true, 10 | field: 'dataId' 11 | }, 12 | // 团队名称 13 | teamName: { 14 | type: DataTypes.STRING, 15 | allowNull: true, 16 | field: 'teamName' 17 | }, 18 | // 团队成员 19 | members: { 20 | type: DataTypes.STRING, 21 | allowNull: true, 22 | field: 'members' 23 | }, 24 | 25 | // 团队LeaderId 26 | leaderId: { 27 | type: DataTypes.STRING, 28 | allowNull: true, 29 | field: 'leaderId' 30 | }, 31 | // 项目ID 32 | webMonitorIds: { 33 | type: DataTypes.STRING, 34 | allowNull: true, 35 | field: 'webMonitorIds' 36 | }, 37 | // 创建时间 38 | createdAt: { 39 | type: DataTypes.DATE_TIME, 40 | field: "createdAt", 41 | get() { 42 | return moment().format('YYYY-MM-DD HH:mm:ss'); 43 | } 44 | }, 45 | // 更新时间 46 | updatedAt: { 47 | type: DataTypes.DATE_TIME, 48 | field: "updatedAt", 49 | get() { 50 | return moment().format('YYYY-MM-DD HH:mm:ss'); 51 | } 52 | } 53 | }, 54 | // 创建索引 55 | index: { 56 | // 如果为 true 则表的名称和 model 相同,即 user 57 | // 为 false MySQL创建的表名称会是复数 users 58 | // 如果指定的表名称本就是复数形式则不变 59 | freezeTableName: true 60 | }, 61 | engine: "ENGINE MergeTree()", 62 | // 创建索引Sql 63 | indexSql: "", 64 | // 数据模型 65 | dataModel: "", 66 | // 指定分区Key 67 | partition: "", 68 | // 排序规则 69 | orderBy: "ORDER BY (dataId)", 70 | // 设置表属性 71 | properties: "" 72 | } 73 | const DefineTable = function (sequelize) { 74 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 75 | } 76 | 77 | module.exports = { 78 | Columns, 79 | DefineTable 80 | } -------------------------------------------------------------------------------- /servers/monitor/schema/deviceInfoCountByDay.js: -------------------------------------------------------------------------------- 1 | const { DataTypes } = require("../node_clickhouse/consts") 2 | const moment = require('moment') 3 | const Columns = { 4 | tableName: 'DeviceInfoCountByDay', 5 | structure: { 6 | // 日志类型 7 | uploadType: { 8 | type: DataTypes.STRING, 9 | allowNull: true, 10 | field: 'uploadType' 11 | }, 12 | // 每天的名称 2019-06-28 13 | dayName: { 14 | type: DataTypes.STRING, 15 | allowNull: true, 16 | field: 'dayName' 17 | }, 18 | // 分析数据id 19 | dataId: { 20 | type: DataTypes.UUID, 21 | allowNull: true, 22 | field: 'dataId' 23 | }, 24 | // 展示名称 25 | showName: { 26 | type: DataTypes.STRING, 27 | allowNull: true, 28 | field: 'showName' 29 | }, 30 | // 每天的数量 31 | dayCount: { 32 | type: DataTypes.FLOAT(32), 33 | allowNull: true, 34 | field: 'dayCount' 35 | }, 36 | // 创建时间 37 | createdAt: { 38 | type: DataTypes.DATE_TIME, 39 | field: "createdAt", 40 | get() { 41 | return moment().format('YYYY-MM-DD HH:mm:ss'); 42 | } 43 | }, 44 | // 更新时间 45 | updatedAt: { 46 | type: DataTypes.DATE_TIME, 47 | field: "updatedAt", 48 | get() { 49 | return moment().format('YYYY-MM-DD HH:mm:ss'); 50 | } 51 | } 52 | }, 53 | // 创建索引 54 | index: { 55 | // 如果为 true 则表的名称和 model 相同,即 user 56 | // 为 false MySQL创建的表名称会是复数 users 57 | // 如果指定的表名称本就是复数形式则不变 58 | freezeTableName: true 59 | }, 60 | engine: "ENGINE MergeTree()", 61 | // 创建索引Sql 62 | indexSql: "", 63 | // 数据模型 64 | dataModel: "", 65 | // 指定分区Key 66 | partition: "", 67 | // 排序规则 68 | orderBy: "ORDER BY (dayName)", 69 | // 设置表属性 70 | properties: "" 71 | } 72 | const DefineTable = function (sequelize) { 73 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 74 | } 75 | 76 | module.exports = { 77 | Columns, 78 | DefineTable 79 | } -------------------------------------------------------------------------------- /servers/monitor/schema/customerPvLeave.js: -------------------------------------------------------------------------------- 1 | 2 | const { DataTypes } = require("../node_clickhouse/consts") 3 | const BaseInfoSchema = require('./baseInfo') 4 | const Columns = { 5 | tableName: 'CustomerPvLeave', 6 | structure: { 7 | ...BaseInfoSchema(DataTypes), 8 | // 分析数据id 9 | dataId: { 10 | type: DataTypes.UUID, 11 | allowNull: true, 12 | field: 'dataId' 13 | }, 14 | // 监控ID 15 | webMonitorId: { 16 | type: DataTypes.STRING, 17 | allowNull: true, 18 | field: 'webMonitorId' 19 | }, 20 | // 用户标识ID 21 | customerKey: { 22 | type: DataTypes.STRING, 23 | allowNull: true, 24 | field: 'customerKey' 25 | }, 26 | // 日志类型 27 | uploadType: { 28 | type: DataTypes.STRING, 29 | allowNull: true, 30 | field: 'uploadType' 31 | }, 32 | // 发生的页面URL 33 | simpleUrl: { 34 | type: DataTypes.STRING, 35 | allowNull: true, 36 | field: 'simpleUrl' 37 | }, 38 | // 离开类型(是否访问单页就离开了, 1 仅浏览一个页面就离开了,2 浏览多个页面后离开) 39 | leaveType: { 40 | type: DataTypes.INT(32), 41 | allowNull: true, 42 | field: 'leaveType' 43 | }, 44 | // 发生时间字符串 45 | happenDate: { 46 | type: DataTypes.DATE_TIME, 47 | allowNull: true, 48 | field: 'happenDate' 49 | } 50 | }, 51 | // 创建索引 52 | index: { 53 | // 如果为 true 则表的名称和 model 相同,即 user 54 | // 为 false MySQL创建的表名称会是复数 users 55 | // 如果指定的表名称本就是复数形式则不变 56 | freezeTableName: true 57 | }, 58 | engine: "ENGINE MergeTree()", 59 | // 创建索引Sql 60 | indexSql: "", 61 | // 数据模型 62 | dataModel: "", 63 | // 指定分区Key 64 | partition: "PARTITION BY toYYYYMMDD(happenDate)", 65 | // 排序规则 66 | orderBy: "ORDER BY (happenDate)", 67 | // 设置表属性 68 | properties: "" 69 | } 70 | const DefineTable = function (sequelize) { 71 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 72 | } 73 | 74 | module.exports = { 75 | Columns, 76 | DefineTable 77 | } -------------------------------------------------------------------------------- /middlreware/ignorePathRes.js: -------------------------------------------------------------------------------- 1 | module.exports = [ 2 | // monitor 3 | "/getSysInfo", "/getValidateCode", "/refreshValidateCode", "/login", "/register", 4 | "/registerForAdmin", "/sendRegisterEmail", "/resetPwd", "/upBp", "/uploadMapFile", 5 | "/checkSsoToken", "/loginForApi", "/registerForApi", "/createNewTeamForApi", "/createNewProjectForApi", 6 | "/projectSimpleListByWebmonitorIds", "/addViewers", "/otel/trace", "/project/list/all", "/getAllProjectWithCompanyId", 7 | "/monitorBaseInfo", "/storeTokenToMemory", "getJavascriptErrorStackCodeForSource", "/wfMonitor/getLogCountInfoByDay", 8 | , "/wfMonitor/checkAlarmResult", "/uploadSourceMap", 9 | 10 | // center 11 | "/hasSuperAdminAccount", "/getValidateCode", "/refreshValidateCode", "/login", "/register", "/wfCenter/getUserByPhone", 12 | "/registerForAdmin", "/sendRegisterEmail", "/resetPwd", "/upBp", "/uploadMapFile", 13 | "/checkSsoToken", "/getUserTokenFromNetworkByToken", "/getSysConfigInfo", 14 | "/loginForApi", "/registerForApi", "/createNewTeamForApi", "/createNewProjectForApi", 15 | "/getTeams", "/getTeamListWithoutToken", "/getTeamDetail", "/updateTeam", "/createFlowData", 16 | "/getUserInfo", "/getSignatureForFeiShu", "/getAccessTokenByCodeForFeiShu", "/getCompanyList", "/checkUserByOpenid", 17 | 18 | //event 19 | "/sysInfo", "/getConcurrencyByMinuteInHour", "/initCf", "/upEvent", "/upEvents", 20 | "/export", "/sdkRelease/downLoad", "/getSysInfo", "/getValidateCode", 21 | "/refreshValidateCode", "/login", "/register", "/registerForAdmin", 22 | "/sendRegisterEmail", "/resetPwd", "/projectSimpleListByWebmonitorIds", 23 | "/eventBaseInfo", "/storeTokenToMemory", "/upgradeVersion", "buryPointTest/searchExport", 24 | "/buryPointCard/getHeatMapPerData", "/wfMonitor/getLogCountInfoByDay", "/buryPointVisualTracking/create", 25 | 26 | // logger 27 | "/wfLog/upLogs", "/wfLog/upErrLogs", 28 | 29 | // walkingfunny 过滤登录校验 30 | "/walkingfunnyWithoutLogin/", 31 | 32 | 33 | ] -------------------------------------------------------------------------------- /servers/monitor/schema/httpErrorHandleList.js: -------------------------------------------------------------------------------- 1 | const { DataTypes } = require("../node_clickhouse/consts") 2 | const moment = require('moment') 3 | const Columns = { 4 | tableName: 'HttpErrorHandleList', 5 | structure: { 6 | // dataId 7 | dataId: { 8 | type: DataTypes.UUID, 9 | allowNull: true, 10 | field: 'dataId' 11 | }, 12 | // 报错信息 13 | simpleHttpUrl: { 14 | type: DataTypes.STRING, 15 | allowNull: true, 16 | field: 'simpleHttpUrl' 17 | }, 18 | // 处理状态:未解决,已解决,已忽略 19 | // 处理状态:unsolved, solved, ignored 20 | errorStatus: { 21 | type: DataTypes.STRING, 22 | allowNull: true, 23 | field: 'errorStatus' 24 | }, 25 | // 处理人:userId 26 | handleMan: { 27 | type: DataTypes.STRING, 28 | allowNull: true, 29 | field: 'handleMan' 30 | }, 31 | // 处理开始时间 32 | handleStartDate: { 33 | type: DataTypes.DATE_TIME, 34 | allowNull: true, 35 | field: 'handleStartDate' 36 | }, 37 | // 创建时间 38 | createdAt: { 39 | type: DataTypes.DATE_TIME, 40 | field: "createdAt", 41 | get() { 42 | return moment().format('YYYY-MM-DD HH:mm:ss'); 43 | } 44 | }, 45 | // 更新时间 46 | updatedAt: { 47 | type: DataTypes.DATE_TIME, 48 | field: "updatedAt", 49 | get() { 50 | return moment().format('YYYY-MM-DD HH:mm:ss'); 51 | } 52 | } 53 | }, 54 | // 创建索引 55 | index: { 56 | // 如果为 true 则表的名称和 model 相同,即 user 57 | // 为 false MySQL创建的表名称会是复数 users 58 | // 如果指定的表名称本就是复数形式则不变 59 | freezeTableName: true 60 | }, 61 | engine: "ENGINE MergeTree()", 62 | // 创建索引Sql 63 | indexSql: "", 64 | // 数据模型 65 | dataModel: "", 66 | // 指定分区Key 67 | partition: "", 68 | // 排序规则 69 | orderBy: "ORDER BY (simpleHttpUrl)", 70 | // 设置表属性 71 | properties: "" 72 | } 73 | const DefineTable = function (sequelize) { 74 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 75 | } 76 | 77 | module.exports = { 78 | Columns, 79 | DefineTable 80 | } -------------------------------------------------------------------------------- /servers/center/schema/message.js: -------------------------------------------------------------------------------- 1 | //delete// 2 | const moment = require('moment'); 3 | //delete// 4 | const Message = function (sequelize, DataTypes) { 5 | return sequelize.define('Message', { 6 | // ID 主键 7 | id: { 8 | type: DataTypes.INTEGER, 9 | primaryKey: true, 10 | allowNull: false, 11 | autoIncrement: true, 12 | }, 13 | // 用户唯一标识 14 | userId: { 15 | type: DataTypes.STRING(200), 16 | allowNull: true, 17 | field: 'userId' 18 | }, 19 | // 消息标题 20 | title: { 21 | type: DataTypes.STRING(200), 22 | allowNull: true, 23 | field: 'title' 24 | }, 25 | // 消息内容 26 | content: { 27 | type: DataTypes.TEXT, 28 | allowNull: true, 29 | field: 'content' 30 | }, 31 | // 消息类型 32 | type: { 33 | type: DataTypes.STRING(20), 34 | allowNull: true, 35 | field: 'type' 36 | }, 37 | // 阅读状态 38 | isRead: { 39 | type: DataTypes.INTEGER, 40 | allowNull: true, 41 | field: 'isRead' 42 | }, 43 | // 跳转连接 44 | link: { 45 | type: DataTypes.STRING(200), 46 | allowNull: true, 47 | field: 'link' 48 | }, 49 | // 创建时间 50 | createdAt: { 51 | type: DataTypes.DATE, 52 | get() { 53 | return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss'); 54 | } 55 | }, 56 | // 更新时间 57 | updatedAt: { 58 | type: DataTypes.DATE, 59 | get() { 60 | return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss'); 61 | } 62 | } 63 | }, { 64 | // 如果为 true 则表的名称和 model 相同,即 user 65 | // 为 false MySQL创建的表名称会是复数 users 66 | // 如果指定的表名称本就是复数形式则不变 67 | freezeTableName: true, 68 | indexes: [ 69 | { 70 | name: "userIdIndex", 71 | method: "BTREE", 72 | fields: [ 73 | { 74 | attribute: "userId" 75 | } 76 | ] 77 | } 78 | ] 79 | }) 80 | 81 | } 82 | //exports// 83 | module.exports = Message 84 | //exports// -------------------------------------------------------------------------------- /servers/monitor/router/routes/index.js: -------------------------------------------------------------------------------- 1 | const alarmRouter = require('./alarm') 2 | const alarmRuleRouter = require('./alarmRule') 3 | const commonRouter = require('./common') 4 | const commonTableRouter = require('./commonTable') 5 | const configRouter = require('./config') 6 | const customerPvRouter = require('./customerPv') 7 | const customerPvLeaveRouter = require('./customerPvLeave') 8 | const customerStayTimeRouter = require('./customerStayTime') 9 | const extendBehaviorInfoRouter = require('./extendBehaviorInfo') 10 | const failRouter = require('./fail') 11 | const httpErrorHandleListRouter = require('./httpErrorHandleList') 12 | const httpErrorInfoRouter = require('./httpErrorInfo') 13 | const httpLogInfoRouter = require('./httpLogInfo') 14 | const ignoreErrorRouter = require('./ignoreError') 15 | const javascriptErrorInfoRouter = require('./javascriptErrorInfo') 16 | const jsErrorHandleListRouter = require('./jsErrorHandleList') 17 | const messageRouter = require('./message') 18 | const pageLoadInfoRouter = require('./pageLoadInfo') 19 | const projectRouter = require('./project') 20 | const resourceLoadInfoRouter = require('./resourceLoadInfo') 21 | 22 | // walkingfunny相关接口,统一管理 23 | const walkingfunnyRouter = require('./walkingfunny') 24 | 25 | const createRouter = (router) => { 26 | alarmRouter(router) 27 | alarmRuleRouter(router) 28 | commonRouter(router) 29 | commonTableRouter(router) 30 | configRouter(router) 31 | customerPvRouter(router) 32 | customerPvLeaveRouter(router) 33 | customerStayTimeRouter(router) 34 | extendBehaviorInfoRouter(router) 35 | failRouter(router) 36 | httpErrorHandleListRouter(router) 37 | httpErrorInfoRouter(router) 38 | httpLogInfoRouter(router) 39 | ignoreErrorRouter(router) 40 | javascriptErrorInfoRouter(router) 41 | jsErrorHandleListRouter(router) 42 | messageRouter(router) 43 | pageLoadInfoRouter(router) 44 | projectRouter(router) 45 | resourceLoadInfoRouter(router) 46 | 47 | walkingfunnyRouter(router) 48 | } 49 | 50 | module.exports = { 51 | createRouter 52 | } -------------------------------------------------------------------------------- /servers/monitor/schema/jsErrorHandleList.js: -------------------------------------------------------------------------------- 1 | const { DataTypes } = require("../node_clickhouse/consts") 2 | const moment = require('moment') 3 | const Columns = { 4 | tableName: 'JsErrorHandleList', 5 | structure: { 6 | // dataId 7 | dataId: { 8 | type: DataTypes.UUID, 9 | allowNull: true, 10 | field: 'dataId' 11 | }, 12 | // 报错信息 13 | errorMessage: { 14 | type: DataTypes.STRING, 15 | allowNull: true, 16 | field: 'errorMessage' 17 | }, 18 | // 处理状态:未解决,已解决,已忽略 19 | // 处理状态:unsolved, solved, ignored 20 | errorStatus: { 21 | type: DataTypes.STRING, 22 | allowNull: true, 23 | field: 'errorStatus' 24 | }, 25 | // 处理人:userId 26 | handleMan: { 27 | type: DataTypes.STRING, 28 | allowNull: true, 29 | field: 'handleMan' 30 | }, 31 | // 处理开始时间 32 | handleStartDate: { 33 | type: DataTypes.DATE_TIME, 34 | allowNull: true, 35 | field: 'handleStartDate' 36 | }, 37 | // 创建时间 38 | createdAt: { 39 | type: DataTypes.DATE_TIME, 40 | field: "createdAt", 41 | get() { 42 | return moment().format('YYYY-MM-DD HH:mm:ss'); 43 | } 44 | }, 45 | // 更新时间 46 | updatedAt: { 47 | type: DataTypes.DATE_TIME, 48 | field: "updatedAt", 49 | get() { 50 | return moment().format('YYYY-MM-DD HH:mm:ss'); 51 | } 52 | } 53 | }, 54 | // 创建索引 55 | index: { 56 | // 如果为 true 则表的名称和 model 相同,即 user 57 | // 为 false MySQL创建的表名称会是复数 users 58 | // 如果指定的表名称本就是复数形式则不变 59 | freezeTableName: true 60 | }, 61 | engine: "ENGINE MergeTree()", 62 | // 创建索引Sql 63 | indexSql: "", 64 | // 数据模型 65 | dataModel: "", 66 | // 指定分区Key 67 | partition: "", 68 | // 排序规则 69 | orderBy: "ORDER BY (errorMessage)", 70 | // 设置表属性 71 | properties: "" 72 | } 73 | const DefineTable = function (sequelize) { 74 | return sequelize.define(Columns.tableName, Columns.structure, Columns.index) 75 | } 76 | 77 | module.exports = { 78 | Columns, 79 | DefineTable 80 | } -------------------------------------------------------------------------------- /webfunny_init/sso.init.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var path = require('path'); 3 | const rootPath = path.resolve(__dirname, "..") 4 | 5 | /** 6 | * 初始化sso目录 7 | */ 8 | var ssoPathArray = [rootPath + "/sso/feishu.js", rootPath + "/sso/index.js"] 9 | var ssoFileArray = [ 10 | `module.exports = { 11 | appId: "", 12 | appSecret: "", 13 | redirectUri: "http://127.0.0.1:8008/webfunny_center/ssoLoading.html?ssoType=feishu", 14 | jsSdk: "https://lf1-cdn-tos.bytegoofy.com/goofy/lark/op/h5-js-sdk-1.5.23.js", 15 | getTenantTokenConfig: { 16 | method: "post", 17 | url: "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal" 18 | }, 19 | getAppTokenConfig: { 20 | method: "post", 21 | url: "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal" 22 | }, 23 | getUserTokenConfig: { 24 | method: "post", 25 | url: "https://open.feishu.cn/open-apis/authen/v1/access_token" 26 | }, 27 | getJsTicketConfig: { 28 | method: "get", 29 | url: "https://open.feishu.cn/open-apis/jssdk/ticket/get" 30 | }, 31 | getUserInfoConfig: { 32 | method: "get", 33 | url: "https://open.feishu.cn/open-apis/authen/v1/user_info" 34 | }, 35 | }`, 36 | `const feiShuConfig = require('./feishu') 37 | module.exports = { 38 | feiShuConfig 39 | }`, 40 | ] 41 | 42 | fs.mkdir( rootPath + "/sso", function(err){ 43 | if ( err ) { 44 | console.log(`= 文件夹 ${rootPath}/sso 已经存在`) 45 | } else { 46 | console.log(`= 创建文件夹 ${rootPath}/sso`) 47 | } 48 | ssoPathArray.forEach((path, index) => { 49 | fs.readFile(path, "", (err) => { 50 | if (err) { 51 | console.log("× " + path + " 配置文件不存在,即将创建...") 52 | fs.writeFile(path, ssoFileArray[index], (err) => { 53 | if (err) throw err; 54 | console.log("√ " + path + " 配置文件创建完成!"); 55 | }); 56 | } else { 57 | console.log("√ " + path + " 配置文件已存在!") 58 | } 59 | }); 60 | }) 61 | }); 62 | -------------------------------------------------------------------------------- /servers/event/config/AccountConfig.js: -------------------------------------------------------------------------------- 1 | const WebfunnyConfig = require("../../../webfunny.config") 2 | const { domainConfig, licenseConfig, mysqlConfig, otherConfig } = WebfunnyConfig 3 | 4 | const accountInfo = { 5 | isCloud: otherConfig.isCloud, // 云服务模式 6 | 7 | uploadServerDomain: domainConfig.uploadDomain.monitor, // 上报域名 8 | 9 | localServerDomain: domainConfig.host.be, // 监控系统后端服务域名 10 | localServerPort: domainConfig.port.be, // 监控系统后端服务端口号 11 | localAssetsDomain: domainConfig.host.fe, // 数据可视化系统域名 12 | localAssetsPort: domainConfig.port.fe, // 数据可视化系统端口号 13 | mainDomain: "", // 主域名 14 | 15 | centerServerDomain: domainConfig.host.be, // 控制台后端服务域名 16 | centerServerPort: domainConfig.port.be, // 控制台后端端口号 17 | centerAssetsDomain: domainConfig.host.fe, // 数据可视化服务域名 18 | centerAssetsPort: domainConfig.port.be, // 可视化系统端口号 19 | 20 | purchaseCode: licenseConfig.event.purchaseCode, // 激活码 21 | secretCode: licenseConfig.event.secretCode, // 解码 22 | protocol: otherConfig.protocol, // 服务器之间通信采用的协议; 23 | messageQueue: otherConfig.messageQueue, // 消息队列默认关闭,需手动开启。 前提:安装RabbitMq; 24 | openMonitor: otherConfig.openMonitor, // 开启系统监控 25 | 26 | saveDays: otherConfig.logSaveDays, // 日志保存周期 27 | isOpenTodayStatistic: otherConfig.isOpenTodayStatistic, //是否开启统计今天的数据(每小时分析一次,true:开启,false:不开启,默认开启) 28 | 29 | stayTimeScope: otherConfig.business.userStayTimeScope, // 用户停留时间范围 30 | batchInsert: otherConfig.business.batchInsert, 31 | 32 | mysqlConfig: mysqlConfig.event, 33 | 34 | useCusEmailSys: otherConfig.email.useCusEmailSys, // 是否开启自定义邮件系统 35 | emailUser: otherConfig.email.emailUser, 36 | emailPassword: otherConfig.email.emailPassword, 37 | 38 | printSql: otherConfig.printSql, // 是否打印sql配置 39 | printConsole: otherConfig.printConsole, // 是否打印console 40 | } 41 | 42 | module.exports = { 43 | accountInfo 44 | } --------------------------------------------------------------------------------