Commit 49359afc by 孙香冬

no message

parent 2cd09dce
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
/test /test
/public /public
/logs /logs
/img
/video /video
*.logs *.logs
*.zip *.zip
[2024-05-27T09:19:32.854] [ERROR] errorLogger - errorInfo => token已过期 |
[2024-05-27T10:11:45.982] [ERROR] errorLogger - errorInfo => token已过期 |
[2024-05-27T10:13:38.606] [ERROR] errorLogger - errorInfo => token已过期 |
[2024-05-27T10:14:27.502] [ERROR] errorLogger - errorInfo => token已过期 |
[2024-05-27T10:14:41.723] [ERROR] errorLogger - errorInfo => token已过期 |
[2024-05-27T10:15:01.313] [ERROR] errorLogger - errorInfo => token已过期 |
[2024-05-27T10:15:34.485] [ERROR] errorLogger - errorInfo => token已过期 |
[2024-05-27T10:16:00.968] [ERROR] errorLogger - errorInfo => token已过期 |
[2024-05-27T10:16:19.813] [ERROR] errorLogger - errorInfo => token已过期 |
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
"@alicloud/pop-core": "^1.7.10", "@alicloud/pop-core": "^1.7.10",
"@alicloud/sms-sdk": "^1.1.6", "@alicloud/sms-sdk": "^1.1.6",
"@types/node": "^10.12.18", "@types/node": "^10.12.18",
"chokidar": "^4.0.3",
"compression": "^1.7.4", "compression": "^1.7.4",
"express": "^4.17.1", "express": "^4.17.1",
"express-async-handler": "^1.1.4", "express-async-handler": "^1.1.4",
...@@ -30,5 +31,8 @@ ...@@ -30,5 +31,8 @@
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"author": "", "author": "",
"license": "ISC" "license": "ISC",
"devDependencies": {
"@types/request": "^2.48.13"
}
} }
No preview for this file type
[
{
"name": "黄埔区",
"lng": 121.469240,
"lat": 31.229860,
"jjxmz": 1,
"ybqkfb": 2,
"ybqkfbInfo":[
{
"name":"天平路街道", //街道名称
"lng": 121.469240, //街道经纬度
"lat": 31.229860, //街道经纬度
"value": 1
}
]
},
{
"name": "徐汇区",
"lng": 121.437866,
"lat": 31.199190,
"jjxmz": 2,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "长宁区",
"lng": 121.424624,
"lat": 31.220367,
"jjxmz": 1,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "静安区",
"lng": 121.459384,
"lat": 31.247105,
"jjxmz": 1,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "普陀区",
"lng": 121.395555,
"lat": 31.249840,
"jjxmz": 3,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "虹口区",
"lng": 121.505133,
"lat": 31.264600,
"jjxmz": 2,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "杨浦区",
"lng": 121.526077,
"lat": 31.259541,
"jjxmz": 1,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "闵行区",
"lng": 121.381709,
"lat": 31.112813,
"jjxmz": 3,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "宝山区",
"lng": 121.489612,
"lat": 31.405457,
"jjxmz": 3,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "嘉定区",
"lng": 121.265300,
"lat": 31.375602,
"jjxmz": 1,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "浦东新区",
"lng": 121.544379,
"lat": 31.221517,
"jjxmz": 1,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "金山区",
"lng": 121.341970,
"lat": 30.741991,
"jjxmz": 1,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "松江区",
"lng": 121.227747,
"lat": 31.032243,
"jjxmz": 1,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "青浦区",
"lng": 121.124178,
"lat": 31.150681,
"jjxmz": 1,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "奉贤区",
"lng": 121.474042,
"lat": 30.917795,
"jjxmz": 1,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
},
{
"name": "崇明区",
"lng": 121.397417,
"lat": 31.623587,
"jjxmz": 1,
"ybqkfb": 1,
"ybqkfbInfo":{
"name":"天平路街道",
"value": 1
}
}
]
\ No newline at end of file
export const MapDataDefault = {
"黄埔区": {
"lng": "121.469240",
"lat": "31.229860"
},
"徐汇区": {
"lng": "121.437866",
"lat": "31.199190"
},
"长宁区": {
"lng": "121.424624",
"lat": "31.220367"
},
"静安区": {
"lng": "121.459384",
"lat": "31.247105"
},
"普陀区": {
"lng": "121.395555",
"lat": "31.249840"
},
"虹口区": {
"lng": "121.505133",
"lat": "31.264600"
},
"杨浦区": {
"lng": "121.526077",
"lat": "31.259541"
},
"闵行区": {
"lng": "121.381709",
"lat": "31.112813"
},
"宝山区": {
"lng": "121.489612",
"lat": "31.405457"
},
"嘉定区": {
"lng": "121.265300",
"lat": "31.375602"
},
"浦东新区": {
"lng": "121.544379",
"lat": "31.221517"
},
"金山区": {
"lng": "121.341970",
"lat": "30.741991"
},
"松江区": {
"lng": "121.227747",
"lat": "31.032243"
},
"青浦区": {
"lng": "121.124178",
"lat": "31.150681"
},
"奉贤区": {
"lng": "121.474042",
"lat": "30.917795"
},
"崇明区": {
"lng": "121.397417",
"lat": "31.623587"
}
};
\ No newline at end of file
{
"userId":""
}
\ No newline at end of file
{
"1": {
"id": 1,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk (11170ms)",
"操作状态": "成功"
},
"2": {
"id": 2,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/jjxmz (1164ms)",
"操作状态": "成功"
},
"3": {
"id": 3,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/gfjbqs (1263ms)",
"操作状态": "成功"
},
"4": {
"id": 4,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/ybqkqs (1253ms)",
"操作状态": "成功"
},
"5": {
"id": 5,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/jrsbxx (3216ms)",
"操作状态": "成功"
},
"6": {
"id": 6,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/map (2046ms)",
"操作状态": "成功"
},
"7": {
"id": 7,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/cityname (2147ms)",
"操作状态": "成功"
},
"8": {
"id": 8,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/jrsbxx (628ms)",
"操作状态": "成功"
},
"9": {
"id": 9,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/ybqkqs (1282ms)",
"操作状态": "成功"
},
"10": {
"id": 10,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /qsnkjcxsjgzz (1227ms)",
"操作状态": "成功"
},
"11": {
"id": 11,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /qsnkjcxsjgzz (1188ms)",
"操作状态": "成功"
},
"12": {
"id": 12,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /qsnkjcxsjgzz (1225ms)",
"操作状态": "成功"
},
"13": {
"id": 13,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/ybqkqs (1228ms)",
"操作状态": "成功"
},
"14": {
"id": 14,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/jrsbxx (1296ms)",
"操作状态": "成功"
},
"15": {
"id": 15,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/jrsbxx (620ms)",
"操作状态": "成功"
},
"16": {
"id": 16,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk (9939ms)",
"操作状态": "成功"
},
"17": {
"id": 17,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/ybqkqs (1119ms)",
"操作状态": "成功"
},
"18": {
"id": 18,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/jjxmz (655ms)",
"操作状态": "成功"
},
"19": {
"id": 19,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/gfjbqs (565ms)",
"操作状态": "成功"
},
"20": {
"id": 20,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/jrsbxx (2370ms)",
"操作状态": "成功"
},
"21": {
"id": 21,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/map (1167ms)",
"操作状态": "成功"
},
"22": {
"id": 22,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/cityname (1952ms)",
"操作状态": "成功"
},
"23": {
"id": 23,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/jrsbxx (604ms)",
"操作状态": "成功"
},
"24": {
"id": 24,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/ybqkqs (632ms)",
"操作状态": "成功"
},
"25": {
"id": 25,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/ybqkqs (581ms)",
"操作状态": "成功"
}
}
\ No newline at end of file
{"e6e4aaaf-2184-4be4-adb9-4e8f5c15dbb5":{"sub":"e6e4aaaf-2184-4be4-adb9-4e8f5c15dbb5","id":1,"phone":"18918589400","otherPage":true,"name":"吴靖","isAdmin":true,"pm":{"1":true,"2":true,"3":true,"11":true}}} {
\ No newline at end of file "e6e4aaaf-2184-4be4-adb9-4e8f5c15dbb5": {
"sub": "e6e4aaaf-2184-4be4-adb9-4e8f5c15dbb5",
"id": 1,
"phone": "18918589400",
"otherPage": true,
"name": "吴靖",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true,
"22": true,
"23": true,
"24": true
}
},
"150203198212284527": {
"sub": "150203198212284527",
"id": 2,
"phone": "18016272282",
"otherPage": true,
"name": "李晶",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true
}
},
"4ef51e92-fa32-4c64-8f63-7e1719a1165b": {
"sub": "4ef51e92-fa32-4c64-8f63-7e1719a1165b",
"id": 3,
"phone": "13384928945",
"otherPage": true,
"name": "张家萌",
"isAdmin": false,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true
}
},
"c3d5150d-adbb-4aa3-985e-130158292523": {
"sub": "c3d5150d-adbb-4aa3-985e-130158292523",
"id": 4,
"phone": "13917568424",
"otherPage": true,
"name": "朱青",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true
}
},
"f6d7835e-8502-40b4-9191-ad5f01af339e": {
"sub": "f6d7835e-8502-40b4-9191-ad5f01af339e",
"id": 5,
"phone": "18621939307",
"otherPage": true,
"name": "谭佳丽",
"isAdmin": false,
"pm": {
"11": true
}
},
"2968c112-481c-43ae-bc91-81ac0b0deabf": {
"sub": "2968c112-481c-43ae-bc91-81ac0b0deabf",
"id": 6,
"phone": "13564320268",
"otherPage": true,
"name": "洪筱菡",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true
}
},
"95803394-b2e6-4ec9-9869-7ed22fc75006": {
"sub": "95803394-b2e6-4ec9-9869-7ed22fc75006",
"id": 7,
"phone": "13917726527",
"otherPage": true,
"name": "沈玉婷",
"isAdmin": false,
"pm": {
"1": false,
"2": false,
"3": false
}
},
"340702199307201019": {
"sub": "340702199307201019",
"id": 8,
"phone": "15805166833",
"otherPage": true,
"name": "王旻",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true
}
},
"430603200201062020": {
"sub": "430603200201062020",
"id": 9,
"phone": "13575002256",
"otherPage": true,
"name": "陈金晶",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true,
"22": true,
"23": true,
"24": true
}
},
"142629199708142530": {
"sub": "142629199708142530",
"id": 10,
"phone": "18234720432",
"otherPage": true,
"name": "王东晨",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true,
"22": true,
"23": true,
"24": true
}
},
"342427198610287415": {
"sub": "342427198610287415",
"id": 11,
"phone": "15000600246",
"otherPage": true,
"name": "项兴彬",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true,
"22": true,
"23": true,
"24": true
}
},
"412823199810164830": {
"sub": "412823199810164830",
"id": 12,
"phone": "15539653018",
"otherPage": true,
"name": "梅开元",
"isAdmin": false,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true,
"22": true,
"23": true,
"24": true
}
}
}
\ No newline at end of file
{
"e6e4aaaf-2184-4be4-adb9-4e8f5c15dbb5": {
"sub": "e6e4aaaf-2184-4be4-adb9-4e8f5c15dbb5",
"id": 1,
"phone": "18918589400",
"otherPage": true,
"name": "吴靖",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true,
"22": true,
"23": true,
"24": true
}
},
"150203198212284527": {
"sub": "150203198212284527",
"id": 2,
"phone": "18016272282",
"otherPage": true,
"name": "李晶",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true
}
},
"4ef51e92-fa32-4c64-8f63-7e1719a1165b": {
"sub": "4ef51e92-fa32-4c64-8f63-7e1719a1165b",
"id": 3,
"phone": "13384928945",
"otherPage": true,
"name": "张家萌",
"isAdmin": false,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true
}
},
"c3d5150d-adbb-4aa3-985e-130158292523": {
"sub": "c3d5150d-adbb-4aa3-985e-130158292523",
"id": 4,
"phone": "13917568424",
"otherPage": true,
"name": "朱青",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true
}
},
"f6d7835e-8502-40b4-9191-ad5f01af339e": {
"sub": "f6d7835e-8502-40b4-9191-ad5f01af339e",
"id": 6,
"phone": "18621939307",
"otherPage": true,
"name": "谭佳丽",
"isAdmin": false,
"pm": {
"11": true
}
},
"2968c112-481c-43ae-bc91-81ac0b0deabf": {
"sub": "2968c112-481c-43ae-bc91-81ac0b0deabf",
"id": 7,
"phone": "13564320268",
"otherPage": true,
"name": "洪筱菡",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true
}
},
"95803394-b2e6-4ec9-9869-7ed22fc75006": {
"sub": "95803394-b2e6-4ec9-9869-7ed22fc75006",
"id": 7,
"phone": "13917726527",
"otherPage": true,
"name": "沈玉婷",
"isAdmin": false,
"pm": {
"1": false,
"2": false,
"3": false
}
},
"340702199307201019": {
"sub": "340702199307201019",
"id": 8,
"phone": "15805166833",
"otherPage": true,
"name": "王旻",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true
}
},
"430603200201062020": {
"sub": "430603200201062020",
"id": 9,
"phone": "13575002256",
"otherPage": true,
"name": "陈金晶",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true,
"22": true,
"23": true,
"24": true,
"25": true
}
},
"142629199708142530": {
"sub": "142629199708142530",
"id": 9,
"phone": "18234720432",
"otherPage": true,
"name": "王东晨",
"isAdmin": true,
"pm": {
"1": true,
"2": true,
"3": true,
"11": true,
"21": true,
"22": true,
"23": true,
"24": true
}
},
}
\ No newline at end of file
import { authConfig, secsaConfig } from "../serverConfig";
import { BizError } from "../util/bizError";
import { get, getParmiss, post, postForm, postParmiss } from "../util/request";
/**
* 应用鉴权,获取访问令牌
*/
export async function getAccessToken() {
let url = `${secsaConfig.host}${secsaConfig.access_token}`;
let headers = {"Content-Type":"application/json"};
let param = {
app_id:secsaConfig.appId,
app_secret:secsaConfig.appSecret
};
let result: any = await post(url, param, headers);
if (!result || !result.result.access_token) throw new BizError("应用鉴权失败,没有获取到访问令牌");
return result.result.access_token;
}
/**
* 获取授权码
*/
export async function getAuthorize() {
let url = `${authConfig.baseUrl}${authConfig.endpoints.authorize}`;
let param = {
auth_type:"authentication",
response_type:"code",
scope:"openid",
client_id:authConfig.client.client_id,
redirect_uri:authConfig.client.redirect_uri,
}
// url:"https://auth.secsa.cn/api/authn/person/authorize"
// param:{
// auth_type: "authentication",
// response_type: "code",
// scope: "openid",
// client_id: "6d093073f958439aa40d827903004056",
// redirect_uri: "https://shsunshine-zp.shec.edu.cn/bi/platform/#/index",
// }
let result = await get(url, param, {});
return result;
}
/**
* 授权码回调处理 - 用授权码换取访问令牌
*/
export async function handleAuthCallback(req, res) {
let authorize = await getAuthorize()
let code = req.body.code;
let url = `${authConfig.baseUrl}${authConfig.endpoints.token}`;
// 使用 Basic Auth 认证
const credentials = Buffer.from(
`${authConfig.client.client_id}:${authConfig.client.client_secret}`
).toString('base64');
const headers = {
'Authorization': `Basic ${credentials}`,
'Content-Type': 'application/x-www-form-urlencoded'
};
const params = new URLSearchParams({
grant_type: 'authorization_code',
code: code,
redirect_uri: authConfig.client.redirect_uri
});
const result:any = await postForm(url, params.toString(), headers);
if (!result.access_token) {
throw new BizError('获取访问令牌失败');
}
return result;
}
/**
* 使用访问令牌获取用户信息
*/
export async function getUserInfo(accessToken: string) {
const url = `${authConfig.baseUrl}${authConfig.endpoints.userInfo}`;
const params = { access_token: accessToken };
const userInfo = await get(url, params, {});
return userInfo;
}
/**
* 文件监控服务
*/
import * as fs from 'fs';
import { exec } from 'child_process';
import { addOperationLog } from './operationLogService';
import * as path from 'path';
export class FileMonitorService {
private watcher: fs.FSWatcher | null = null;
private isProcessing = false;
// 开始监控文件
startMonitoring(filePath: string) {
console.log(`开始监控文件: ${filePath}`);
try {
this.watcher = fs.watch(filePath, (eventType, filename) => {
if (this.isProcessing) return;
this.isProcessing = true;
if (eventType === 'change') {
this.handleFileChange(filePath).finally(() => {
this.isProcessing = false;
});
}
// 延迟重置状态,避免频繁触发
setTimeout(() => {
this.isProcessing = false;
}, 1000);
});
this.watcher.on('error', (error) => {
console.error('文件监控错误:', error);
this.isProcessing = false;
});
console.log(`文件监控已启动: ${filePath}`);
} catch (error) {
console.error('启动文件监控失败:', error);
}
}
// 处理文件变化
private async handleFileChange(filePath: string) {
try {
// 检查是否是vi/vim进程在操作
const isViEdit = await this.checkViProcess();
if (!isViEdit) {
console.log('文件变化不是由vi编辑器引起,跳过记录');
return;
}
// 获取当前登录用户
const userName = await this.getCurrentUser();
// 获取文件修改的详细信息
const fileStats = await this.getFileStats(filePath);
const fileInfo = fileStats ?
`大小: ${fileStats.size}字节, 修改时间: ${fileStats.mtime.toISOString()}` :
'无法获取文件信息';
// 记录操作日志
addOperationLog(
userName,
'文件编辑',
'系统管理',
`使用vi编辑器修改用户配置文件: ${path.basename(filePath)} (${fileInfo})`,
);
console.log(`记录文件编辑操作: ${userName} - ${filePath}`);
} catch (error) {
console.error('处理文件变化时出错:', error);
}
}
// 检查是否有vi/vim进程
private checkViProcess(): Promise<boolean> {
return new Promise((resolve) => {
exec('ps aux | grep -E "[v]i |[v]im " | grep -v grep', (error, stdout) => {
if (error) {
console.error('检查进程时出错:', error);
resolve(false);
return;
}
const hasViProcess = stdout.trim().length > 0;
console.log(`检测到vi进程: ${hasViProcess}, 进程信息: ${stdout.trim()}`);
resolve(hasViProcess);
});
});
}
// 获取文件状态信息
private getFileStats(filePath: string): Promise<fs.Stats | null> {
return new Promise((resolve) => {
fs.stat(filePath, (error, stats) => {
if (error) {
console.error('获取文件状态失败:', error);
resolve(null);
} else {
resolve(stats);
}
});
});
}
// 获取当前登录用户
private getCurrentUser(): Promise<string> {
return new Promise((resolve) => {
exec('who | awk \'{print $1}\' | sort | uniq | head -1', (error, stdout) => {
if (error || !stdout.trim()) {
console.log('无法获取当前用户,使用默认值');
resolve('系统用户');
} else {
resolve(stdout.trim());
}
});
});
}
// 停止监控
stopMonitoring() {
if (this.watcher) {
this.watcher.close();
this.watcher = null;
console.log('文件监控已停止');
}
}
}
/**
* 创建操作日志服务
*/
const fs = require("fs");
const path = require("path");
const logPath = path.join(__dirname.substring(0, __dirname.indexOf("out")), 'res', 'operation_logs.json');
// 操作日志缓存
let logQueue = {};
// 结构: {logId: {id, name, time, action, module, description, success}}
// 初始化操作日志
export function initOperationLog() {
logQueue = readLogFile();
console.log("操作日志数据初始化成功");
}
// 添加操作日志
export function addOperationLog(name, action, module, description, success = true) {
const time = new Date().toISOString().split('T')[0];
const id = Object.keys(logQueue).length + 1;
logQueue[id] = {
id,
姓名: name,
操作时间: time,
操作动作: action,
操作模块: module,
操作描述: description,
操作状态: success ? '成功' : '失败'
};
updateLogQueueInFile();
return id;
}
// 查询操作日志列表(支持分页)
export function selectOperationLogList(selectInfo, startDate, endDate, successFilter, page = 1, pageSize = 10) {
let filteredList = [];
// 首先进行数据筛选
for (let logId in logQueue) {
let log = logQueue[logId];
let {id, 姓名, 操作时间, 操作描述, 操作状态, 操作动作, 操作模块} = log;
// 时间筛选
if (startDate && 操作时间 < startDate) continue;
if (endDate && 操作时间 > endDate) continue;
// 操作状态筛选
if (successFilter && 操作状态 !== successFilter) continue;
// 关键词筛选
if (selectInfo) {
if (姓名.indexOf(selectInfo) > -1 || 操作描述.indexOf(selectInfo) > -1) {
filteredList.push({
id,
name: 姓名,
time: 操作时间,
action: 操作动作,
module: 操作模块,
description: 操作描述,
success: 操作状态
});
}
} else {
filteredList.push({
id,
name: 姓名,
time: 操作时间,
action: 操作动作,
module: 操作模块,
description: 操作描述,
success: 操作状态
});
}
}
// 按时间倒序排列(最新的在前面)
filteredList.sort((a, b) => b.id - a.id);
// 分页处理
const total = filteredList.length;
const totalPages = Math.ceil(total / pageSize);
// 计算分页起始位置
const startIndex = (page - 1) * pageSize;
const endIndex = Math.min(startIndex + pageSize, total);
// 获取当前页数据
const paginatedList = filteredList.slice(startIndex, endIndex);
return {
list: paginatedList,
pagination: {
current: page,
pageSize: pageSize,
total: total,
totalPages: totalPages
}
};
}
// 读取日志文件
function readLogFile() {
try {
// 检查目录是否存在,不存在则创建
const logDir = path.dirname(logPath);
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true });
console.log(`创建日志目录: ${logDir}`);
}
// 检查文件是否存在
if (!fs.existsSync(logPath)) {
console.log("日志文件不存在,创建新文件");
// 创建空的日志文件
fs.writeFileSync(logPath, JSON.stringify({}, null, 2));
return {};
}
// 读取文件内容
let data = fs.readFileSync(logPath, 'utf8');
// 检查文件是否为空
if (!data.trim()) {
console.log("日志文件为空,初始化空对象");
fs.writeFileSync(logPath, JSON.stringify({}, null, 2));
return {};
}
let logs = JSON.parse(data);
// 兼容旧版本日志格式,添加操作状态字段
for (let logId in logs) {
if (!logs[logId].操作状态) {
logs[logId].操作状态 = '成功'; // 默认为成功
}
}
console.log(`成功读取日志文件,共 ${Object.keys(logs).length} 条记录`);
return logs;
} catch(err) {
console.log("日志文件读取失败,创建新文件:", err.message);
try {
// 尝试创建新的日志文件
const logDir = path.dirname(logPath);
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true });
}
fs.writeFileSync(logPath, JSON.stringify({}, null, 2));
console.log("成功创建新的日志文件");
return {};
} catch (writeErr) {
console.error("创建日志文件失败:", writeErr.message);
return {};
}
}
}
// 更新日志文件
function updateLogQueueInFile() {
try {
// 确保目录存在
const logDir = path.dirname(logPath);
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true });
}
fs.writeFileSync(logPath, JSON.stringify(logQueue, null, 2));
console.log(`日志文件更新成功,当前记录数: ${Object.keys(logQueue).length}`);
} catch(err) {
console.log("日志文件更新失败:", err.message);
}
}
// 获取操作日志列表(分页版本)
export async function getOperationLogList(req, res) {
try {
let {
selectInfo,
startDate,
endDate,
successFilter,
page,
pageSize = 10
} = req.body;
// 参数验证和转换
page = parseInt(page) || 1;
pageSize = parseInt(pageSize) || 10;
// 确保页码和页大小在合理范围内
page = Math.max(1, page);
pageSize = Math.max(1, Math.min(pageSize, 100)); // 限制最大页大小为100
const result = selectOperationLogList(selectInfo, startDate, endDate, successFilter, page, pageSize);
res.json({
success: true,
data: result.list,
pagination: result.pagination,
message: '获取操作日志成功'
});
} catch (error) {
console.error('获取操作日志失败:', error);
res.json({
success: false,
data: [],
pagination: {
current: 1,
pageSize: 10,
total: 0,
totalPages: 0
},
error: '获取操作日志失败'
});
}
}
// 获取操作日志统计信息
export async function getOperationLogStats(req, res) {
try {
const { startDate, endDate } = req.body;
let totalCount = 0;
let successCount = 0;
let failCount = 0;
// 统计日志数据
for (let logId in logQueue) {
let log = logQueue[logId];
let { 操作时间, 操作状态 } = log;
// 时间筛选
if (startDate && 操作时间 < startDate) continue;
if (endDate && 操作时间 > endDate) continue;
totalCount++;
if (操作状态 === '成功') {
successCount++;
} else {
failCount++;
}
}
const successRate = totalCount > 0 ? ((successCount / totalCount) * 100).toFixed(2) : 0;
res.json({
success: true,
data: {
total: totalCount,
success: successCount,
fail: failCount,
successRate: `${successRate}%`
},
message: '获取日志统计成功'
});
} catch (error) {
console.error('获取日志统计失败:', error);
res.json({
success: false,
error: '获取日志统计失败'
});
}
}
/**
* 系统级操作日志记录
* @param req
* @param res
*/
export async function addOperationLogFromSystem(req, res) {
try {
const { userName, action, module, description, success = true } = req.body;
// 添加系统级操作日志
const logId = addOperationLog(userName, action, module, description, success);
res.json({
success: true,
data: { logId },
message: '系统操作日志记录成功'
});
} catch (error) {
console.error('记录系统操作日志失败:', error);
res.json({
success: false,
error: '记录操作日志失败'
});
}
}
...@@ -16,70 +16,70 @@ export async function getData(req, res) { ...@@ -16,70 +16,70 @@ export async function getData(req, res) {
// let {stuData, dayStuData, monthStuData, differentSchoolType, differentSchoolStuNum, defferentSymptomsTypeList, differentDistrictStuNum, // let {stuData, dayStuData, monthStuData, differentSchoolType, differentSchoolStuNum, defferentSymptomsTypeList, differentDistrictStuNum,
// dataStatistics, deadline, todayReportList, mapDistrictServiceData, highIncidenceData, symptomTypes, symptomRanking, notice, healthRate} = getHealthData(); // dataStatistics, deadline, todayReportList, mapDistrictServiceData, highIncidenceData, symptomTypes, symptomRanking, notice, healthRate} = getHealthData();
let stuData = await getStuData(); let dtData = await getMapDistrictServiceData();
ret["xssbjs"] = getKeyStringValueOutData("各年级健康上报情况总数", stuData); ret["dt"] = getReflectionData("地图坐标数据", dtData, "");
let dayStuData = await getDayStuData(); // let stuData = await getStuData();
let monthStuData = await getMonthStuData(); // ret["xssbjs"] = getKeyStringValueOutData("各年级健康上报情况总数", stuData);
ret["gnjjksbqsfx"] = getChartOutData("各年级健康上报趋势分析", {"日": {unit:"", dataInfo:dayStuData}, "月": {unit: "", dataInfo:monthStuData}});
let differentSchoolType = ["幼儿园","托育机构","早教中心","托儿所","小学","初级中学","高级中学","中职校","完中","九年一贯制","十年一贯制","十二年一贯制","其他"]; // let dayStuData = await getDayStuData();
ret["gxdlx"] = differentSchoolType; // let monthStuData = await getMonthStuData();
// ret["gnjjksbqsfx"] = getChartOutData("各年级健康上报趋势分析", {"日": {unit:"", dataInfo:dayStuData}, "月": {unit: "", dataInfo:monthStuData}});
let differentSchoolStuNum = await getDifferentSchoolStuNum() // let differentSchoolType = ["幼儿园","托育机构","早教中心","托儿所","小学","初级中学","高级中学","中职校","完中","九年一贯制","十年一贯制","十二年一贯制","其他"];
ret["gxdzzrsqk"] = getKeyStringValueOutData("各学段症状人数情况", differentSchoolStuNum); // ret["gxdlx"] = differentSchoolType;
let defferentSymptomsTypeList = await getDefferentSymptomsTypeList(); // let differentSchoolStuNum = await getDifferentSchoolStuNum()
let defferentSymptomsTypeData = {}; // ret["gxdzzrsqk"] = getKeyStringValueOutData("各学段症状人数情况", differentSchoolStuNum);
for(let key in defferentSymptomsTypeList) {
if (defferentSymptomsTypeList[key]["list"]) defferentSymptomsTypeData[key] = { unit: "", dataInfo: defferentSymptomsTypeList[key]["list"]}; // let defferentSymptomsTypeList = await getDefferentSymptomsTypeList();
} // let defferentSymptomsTypeData = {};
// for(let key in defferentSymptomsTypeList) {
// if (defferentSymptomsTypeList[key]["list"]) defferentSymptomsTypeData[key] = { unit: "", dataInfo: defferentSymptomsTypeList[key]["list"]};
// }
let glzzrsyjChartData = getChartOutData("各类症状人数预警", defferentSymptomsTypeData); // let glzzrsyjChartData = getChartOutData("各类症状人数预警", defferentSymptomsTypeData);
let glzzrsyjDataList = glzzrsyjChartData["dataList"];
let glzzrsyjData = {title:"各类症状人数预警", dataList: []};
glzzrsyjDataList.forEach( item => {
let title = item.title;
for(let key in defferentSymptomsTypeList) {
if(title == key) {
item["earlyWarningNum"] = defferentSymptomsTypeList[key]["earlyWarningNum"];
glzzrsyjData["dataList"].push(item);
}
}
})
ret["glzzrsyj"] = glzzrsyjChartData;
let highIncidenceData = await getHighIncidenceData();
ret["gfzzsjd"] = getChartOutData("高发症状时间段", {"高发症状时间段": {unit:"", dataInfo:highIncidenceData}});
let dataStatistics = await getDataStatistics();
let dtjcsjData = getKeyStringValueOutData("地图基础数据", dataStatistics);
let deadline = await getDeadline();
dtjcsjData["deadline"] = deadline;
ret["dtjcsj"] = dtjcsjData;
let dtData = await getMapDistrictServiceData(); // let glzzrsyjDataList = glzzrsyjChartData["dataList"];
ret["dt"] = getReflectionData("地图坐标数据", dtData, ""); // let glzzrsyjData = {title:"各类症状人数预警", dataList: []};
// glzzrsyjDataList.forEach( item => {
// let title = item.title;
// for(let key in defferentSymptomsTypeList) {
// if(title == key) {
// item["earlyWarningNum"] = defferentSymptomsTypeList[key]["earlyWarningNum"];
// glzzrsyjData["dataList"].push(item);
// }
// }
// })
// ret["glzzrsyj"] = glzzrsyjChartData;
// let highIncidenceData = await getHighIncidenceData();
// ret["gfzzsjd"] = getChartOutData("高发症状时间段", {"高发症状时间段": {unit:"", dataInfo:highIncidenceData}});
// let dataStatistics = await getDataStatistics();
// let dtjcsjData = getKeyStringValueOutData("地图基础数据", dataStatistics);
// let deadline = await getDeadline();
// dtjcsjData["deadline"] = deadline;
// ret["dtjcsj"] = dtjcsjData;
ret["gg"] = await getNotice(); // ret["gg"] = await getNotice();
let todayReportList = await getTodayReportList(); // let todayReportList = await getTodayReportList();
ret["jrsblb"] = getListOutData("今日上报列表", todayReportList); // ret["jrsblb"] = getListOutData("今日上报列表", todayReportList);
let differentDistrictStuNum = await getDifferentDistrictStuNum(); // let differentDistrictStuNum = await getDifferentDistrictStuNum();
ret["jksbqk"] = getChartOutData("健康上报情况", {"区域": {unit:"", dataInfo:differentDistrictStuNum}}); // ret["jksbqk"] = getChartOutData("健康上报情况", {"区域": {unit:"", dataInfo:differentDistrictStuNum}});
let {symptomTypes, symptomRanking} = await getSymptomRanking(); // let {symptomTypes, symptomRanking} = await getSymptomRanking();
ret["zzlxfx"] = getKeyStringValueOutData("症状类型分析", symptomTypes); // ret["zzlxfx"] = getKeyStringValueOutData("症状类型分析", symptomTypes);
ret["zzph"] = getKeyStringValueOutData("症状排行", symptomRanking); // ret["zzph"] = getKeyStringValueOutData("症状排行", symptomRanking);
let healthRate = await getHealthRate(); // let healthRate = await getHealthRate();
ret["lsjksjjkl"] = getKeyStringValueOutData("历史健康数据分析健康率", healthRate); // ret["lsjksjjkl"] = getKeyStringValueOutData("历史健康数据分析健康率", healthRate);
let historicalHealthData = await getHistoricalHealthData(); // let historicalHealthData = await getHistoricalHealthData();
ret["lsjksj"] = getChartOutData("历史健康数据分析趋势", historicalHealthData); // ret["lsjksj"] = getChartOutData("历史健康数据分析趋势", historicalHealthData);
res.send(ret); res.send(ret);
......
...@@ -19,7 +19,7 @@ export async function getData(req, res) { ...@@ -19,7 +19,7 @@ export async function getData(req, res) {
let jcsjData = await popup.getBaseData(wsid); let jcsjData = await popup.getBaseData(wsid);
ret["jcsj"] = getKeyStringValueOutData("工作站弹窗基础数据", jcsjData); ret["jcsj"] = getKeyStringValueOutData("工作站弹窗基础数据", jcsjData);
ret["jcsjsl"] = getKeyStringValueOutData("基础数据数量", baseNum); ret["jcsjsl"] = getKeyStringValueOutData("基础数据数量", baseNum);
ret["xsxkjd"] = getKeyNumberValueOutData("学生选课进度", stuCourseSchedule); ret["xsxkjd"] = getKeyNumberValueOutData("学生选课进度", stuCourseSchedule);
...@@ -41,4 +41,5 @@ export async function getData(req, res) { ...@@ -41,4 +41,5 @@ export async function getData(req, res) {
ret["yjkt"] = getListOutData("研究课题", yjkt); ret["yjkt"] = getListOutData("研究课题", yjkt);
res.send(ret); res.send(ret);
} }
\ No newline at end of file
...@@ -2,17 +2,175 @@ ...@@ -2,17 +2,175 @@
* 数据治理体系 * 数据治理体系
*/ */
import { SJZLENUM, SJZLSIGNENUM } from "../config/appIdConfig";
import { getSzjltxData } from "../data/interface/data"; import { getSzjltxData } from "../data/interface/data";
import { postDataDianXin } from "../util/request";
import { getKeyValueListData, getReflectionData } from "./out"; import { getKeyValueListData, getReflectionData } from "./out";
export async function getData(req, res) { export async function getData(req, res) {
let ret:any = {}; let ret:any = {};
let {sjlyInfo, sjzc, sjzl} = await getSzjltxData();
ret["sjly"] = getKeyValueListData("数据来源", sjlyInfo); let sjly = [
ret["sjzl"] = getReflectionData("数据治理", sjzl, {t_num:"tableNum", name:"key", row_num:"dataNum"}); {
ret["sjzc"] = getReflectionData("数据资产", sjzc, { name:"key"}); "key": "信息管理部",
"value": [
"上海学生活动网",
"上海学生活动管理平台",
"上海市青少年科学创新实践工作站",
"上海市青少年科学研究院",
"上海市“明日科技之星”评选活动管理系统",
"上海国际青少年科技博览会",
"人工智能创新季",
"昆虫识别竞赛活动",
"青少年科技节",
"科普知识进家庭",
"大学生艺术节",
"上海市学生体育网",
"上海市青少年校园足球精英训练营",
"上海市学生体育科技艺术教育活动平台",
"中学生综合素质评价数据报送系统",
"《体育与健康》学科日常测试管理系统"
]
},
{
"key": "师训部",
"value": [
"上海学生活动网",
"上海学生活动管理平台",
"上海市青少年科学创新实践工作站",
"上海市青少年科学研究院",
"上海市“明日科技之星”评选活动管理系统",
"上海国际青少年科技博览会",
"人工智能创新季",
"昆虫识别竞赛活动",
"青少年科技节",
"科普知识进家庭",
"大学生艺术节",
"上海市学生体育网",
"上海市青少年校园足球精英训练营",
"上海市学生体育科技艺术教育活动平台",
"中学生综合素质评价数据报送系统",
"《体育与健康》学科日常测试管理系统"
]
},
{
"key": "体育活动部",
"value": [
"上海学生活动网",
"上海学生活动管理平台",
"上海市青少年科学创新实践工作站",
"上海市青少年科学研究院",
"上海市“明日科技之星”评选活动管理系统",
"上海国际青少年科技博览会",
"人工智能创新季",
"昆虫识别竞赛活动",
"青少年科技节",
"科普知识进家庭",
"大学生艺术节",
"上海市学生体育网",
"上海市青少年校园足球精英训练营",
"上海市学生体育科技艺术教育活动平台",
"中学生综合素质评价数据报送系统",
"《体育与健康》学科日常测试管理系统"
]
},
{
"key": "健康教育部",
"value": [
"上海学生活动网",
"上海学生活动管理平台",
"上海市青少年科学创新实践工作站",
"上海市青少年科学研究院",
"上海市“明日科技之星”评选活动管理系统",
"上海国际青少年科技博览会",
"人工智能创新季",
"昆虫识别竞赛活动",
"青少年科技节",
"科普知识进家庭",
"大学生艺术节",
"上海市学生体育网",
"上海市青少年校园足球精英训练营",
"上海市学生体育科技艺术教育活动平台",
"中学生综合素质评价数据报送系统",
"《体育与健康》学科日常测试管理系统"
]
},
{
"key": "艺术教育部",
"value": [
"上海学生活动网",
"上海学生活动管理平台",
"上海市青少年科学创新实践工作站",
"上海市青少年科学研究院",
"上海市“明日科技之星”评选活动管理系统",
"上海国际青少年科技博览会",
"人工智能创新季",
"昆虫识别竞赛活动",
"青少年科技节",
"科普知识进家庭",
"大学生艺术节",
"上海市学生体育网",
"上海市青少年校园足球精英训练营",
"上海市学生体育科技艺术教育活动平台",
"中学生综合素质评价数据报送系统",
"《体育与健康》学科日常测试管理系统"
]
},
{
"key": "科技教育部",
"value": [
"上海学生活动网",
"上海学生活动管理平台",
"上海市青少年科学创新实践工作站",
"上海市青少年科学研究院",
"上海市“明日科技之星”评选活动管理系统",
"上海国际青少年科技博览会",
"人工智能创新季",
"昆虫识别竞赛活动",
"青少年科技节",
"科普知识进家庭",
"大学生艺术节",
"上海市学生体育网",
"上海市青少年校园足球精英训练营",
"上海市学生体育科技艺术教育活动平台",
"中学生综合素质评价数据报送系统",
"《体育与健康》学科日常测试管理系统"
]
},
{
"key": "综合办公室",
"value": [
"上海学生活动网",
"上海学生活动管理平台",
"上海市青少年科学创新实践工作站",
"上海市青少年科学研究院",
"上海市“明日科技之星”评选活动管理系统",
"上海国际青少年科技博览会",
"人工智能创新季",
"昆虫识别竞赛活动",
"青少年科技节",
"科普知识进家庭",
"大学生艺术节",
"上海市学生体育网",
"上海市青少年校园足球精英训练营",
"上海市学生体育科技艺术教育活动平台",
"中学生综合素质评价数据报送系统",
"《体育与健康》学科日常测试管理系统"
]
}
];
ret["sjly"] = {title:"数据来源", dataList:sjly}
let sjzl:any = await postDataDianXin(SJZLENUM.数字治理, SJZLSIGNENUM.数字治理);
ret["sjzl"] = {title:"数字治理", dataList:sjzl.data}
let sjzc:any = await postDataDianXin(SJZLENUM.数据资产, SJZLSIGNENUM.数据资产);;
ret["sjzc"] = {title:"数据资产", dataList:sjzc.data}
res.send(ret); res.send(ret);
} }
\ No newline at end of file
...@@ -55,17 +55,17 @@ export function getData(req, res) { ...@@ -55,17 +55,17 @@ export function getData(req, res) {
let yzkctopb = []; let yzkctopb = [];
yzkctopbPackageData.forEach( info => { yzkctopbPackageData.forEach( info => {
let {key, value, unit} = info; let {key, value, unit} = info;
yzkctopb.push({key, value:`${ImgPath}/${value}`, unit}); yzkctopb.push({key, value:`${ImgPath}/优质课程/${value}${unit}`});
}) })
ret['yzkctopb'] = getKeyValueOut('优质课程TOP榜', yzkctopb); ret['yzkctopb'] = {title:'优质课程TOP榜', dataList:yzkctopb};
let zxppzyPackageData = keyValuePackage(excelData['专项品牌资源'].dataList); let zxppzyPackageData = keyValuePackage(excelData['专项品牌资源'].dataList);
let zxppzy = []; let zxppzy = [];
zxppzyPackageData.forEach( info => { zxppzyPackageData.forEach( info => {
let {key, value, unit} = info; let {key, value, unit} = info;
zxppzy.push({key, value:`${ImgPath}/${value}`, unit}); zxppzy.push({key, value:`${ImgPath}/专项品牌资源/${value}`, unit});
}) })
ret['zxppzy'] = getKeyValueOut('专项品牌资源', zxppzy); ret['zxppzy'] = {title:'专项品牌资源', dataList:zxppzy};
let lsdwPackageData = stringListPackage(excelData['理事单位'].dataList); let lsdwPackageData = stringListPackage(excelData['理事单位'].dataList);
ret['lsdw'] = getStringOut('理事单位', lsdwPackageData); ret['lsdw'] = getStringOut('理事单位', lsdwPackageData);
......
import { kxyjyDataDefault, mapDistrictDataDefault } from '../../config/mapConfig';
import { kxyjyTableData } from '../../data/table/kxyjyData'; import { kxyjyTableData } from '../../data/table/kxyjyData';
import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, stringListPackage, tablePackage } from '../../dataPackage/inFrontOut'; import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, stringListPackage, tablePackage } from '../../dataPackage/inFrontOut';
import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getStringOut, getTableOut } from '../../dataPackage/out'; import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getStringOut, getTableOut } from '../../dataPackage/out';
import { ImgPath } from '../../serverConfig';
import { BizError } from '../../util/bizError'; import { BizError } from '../../util/bizError';
/* 科学研究院 */ /* 科学研究院 */
...@@ -57,13 +59,40 @@ export function getData(req, res) { ...@@ -57,13 +59,40 @@ export function getData(req, res) {
ret['db'] = getKeyValueOut('顶部', dbPackageData); ret['db'] = getKeyValueOut('顶部', dbPackageData);
let yxxsfclTableData = tablePackage(excelData["优秀学生风采录"].headerList[0], excelData["优秀学生风采录"].bodyList); let yxxsfclTableData = tablePackage(excelData["优秀学生风采录"].headerList[0], excelData["优秀学生风采录"].bodyList);
ret['yxxsfcl'] = getTableOut( '优秀学生风采录', yxxsfclTableData); let yxxsfcl = {titleList:yxxsfclTableData.titleList, dataList:[]};
yxxsfclTableData.dataList.forEach( info => {
let {A, B} = info;
let imgUrl = `${ImgPath}/${B}`;
yxxsfcl.dataList.push({A, B:imgUrl});
})
ret['yxxsfcl'] = getTableOut( '优秀学生风采录', yxxsfcl);
let ktyjtpTableData = tablePackage(excelData["课题研究图片"].headerList[0], excelData["课题研究图片"].bodyList); let ktyjtpTableData = tablePackage(excelData["课题研究图片"].headerList[0], excelData["课题研究图片"].bodyList);
ret['ktyjtp'] = getTableOut( '课题研究图片', ktyjtpTableData); let ktyjtp = {titleList:ktyjtpTableData.titleList, dataList:[]};
ktyjtpTableData.dataList.forEach( info => {
let {A, B} = info;
let imgUrl = `${ImgPath}/${B}`;
ktyjtp.dataList.push({A, B:imgUrl});
})
ret['ktyjtp'] = getTableOut( '课题研究图片', ktyjtp);
let xsxbfbPackageData = keyValuePackage(excelData['学生性别分布'].dataList); let xsxbfbPackageData = keyValuePackage(excelData['学生性别分布'].dataList);
ret['xsxbfb'] = getKeyValueOut('学生性别分布', xsxbfbPackageData); ret['xsxbfb'] = getKeyValueOut('学生性别分布', xsxbfbPackageData);
res.send(ret); res.send(ret);
} }
\ No newline at end of file
/**地图 */
export function getMap(req, res) {
let ret:any = {};
let gzzData = {map: mapDistrictDataDefault , pyjd: kxyjyDataDefault}
ret["dt"] = gzzData;
res.send(ret);
}
import { SYSTEMERRORENUM } from '../../config/enum';
import { MapDataDefault, WorkstationMapDefault } from '../../config/mapConfig';
import { gzzTableData } from '../../data/table/gzzData'; import { gzzTableData } from '../../data/table/gzzData';
import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, stringListPackage, tablePackage } from '../../dataPackage/inFrontOut'; import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, stringListPackage, tablePackage } from '../../dataPackage/inFrontOut';
import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getStringOut, getTableOut } from '../../dataPackage/out'; import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getStringOut, getTableOut } from '../../dataPackage/out';
import { ImgPath } from '../../serverConfig';
import { BizError } from '../../util/bizError'; import { BizError } from '../../util/bizError';
/* 青少年科技创新实践工作站 */ /* 青少年科技创新实践工作站 */
export function getData(req, res) { export function getData(req, res) {
let wsid = req.body.id || "";
// if (!wsid) throw new BizError(SYSTEMERRORENUM.参数错误, '工作站id为空');
let excelData = gzzTableData(); let excelData = gzzTableData();
let ret:any = {}; let ret:any = {};
let lnzmxyqkPackageData = onceYBarChartPackage( excelData['历年招募学员情况'], '','年'); let lnzmxyqkPackageData = onceYBarChartPackage( excelData['历年招募学员情况'], '','年');
ret['lnzmxyqk'] = getOnceYBarChartOut('历年招募学员情况', lnzmxyqkPackageData); ret['lnzmxyqk'] = getOnceYBarChartOut('历年招募学员情况', lnzmxyqkPackageData);
...@@ -89,19 +92,39 @@ export function getData(req, res) { ...@@ -89,19 +92,39 @@ export function getData(req, res) {
ret['ktyj'] = getKeyValueOut('课题研究', ktyjPackageData); ret['ktyj'] = getKeyValueOut('课题研究', ktyjPackageData);
let yxxyPackageData = keyValuePackage(excelData['优秀学员'].dataList); let yxxyPackageData = keyValuePackage(excelData['优秀学员'].dataList);
ret['yxxy'] = getKeyValueOut('优秀学员', yxxyPackageData); let yxxy = [];
yxxyPackageData.forEach( info => {
let {key, value, unit} = info;
let imgUrl = `${ImgPath}/头像/${value}${unit}`;
yxxy.push({key, value:imgUrl});
})
ret['yxxy'] = {title:'优秀学员', dataList:yxxy};
let dbPackageData = keyValuePackage(excelData['顶部'].dataList); let dbPackageData = keyValuePackage(excelData['顶部'].dataList);
ret['db'] = getKeyValueOut('顶部', dbPackageData); ret['db'] = getKeyValueOut('顶部', dbPackageData);
let ggzzxsslPackageData = keyValuePackage(excelData['各工作站学生数量'].dataList); let ggzzxsslPackageData = keyValuePackage(excelData['各工作站学生数量'].dataList);
ret['ggzzxssl'] = getKeyValueOut('各工作站学生数量', ggzzxsslPackageData); ret['ggzzxssl'] = getKeyValueOut('各工作站学生数量', ggzzxsslPackageData);
let zpjxTableData = tablePackage(excelData["作品奖项"].headerList[0], excelData["作品奖项"].bodyList); let zpjxPackageData = stringListPackage(excelData['作品奖项'].dataList);
ret['zpjx'] = getTableOut( '作品奖项', zpjxTableData); let zpjx = [];
for(let i = 0; i < zpjxPackageData.length; i++) {
let img = `${ImgPath}/作品奖项/${zpjxPackageData[i]}`;
zpjx.push(img);
}
ret['zpjx'] = getStringOut('作品奖项', zpjx);
let ktyjlbTableData = tablePackage(excelData["课题研究列表"].headerList[0], excelData["课题研究列表"].bodyList); let ktyjlbTableData = tablePackage(excelData["课题研究列表"].headerList[0], excelData["课题研究列表"].bodyList);
ret['ktyjlb'] = getTableOut( '课题研究列表', ktyjlbTableData); ret['ktyjlb'] = getTableOut( '课题研究列表', ktyjlbTableData);
let gzzData = {map: MapDataDefault , workstationMap: WorkstationMapDefault["data"]}
ret["dt"] = gzzData;
res.send(ret); res.send(ret);
} }
\ No newline at end of file
/** /**
* 上海市学生素质教育优质资源平台(周周播) * 上海市学生素质教育优质资源平台
*/ */
import { curriculumTableData, weeklyPlayTableData } from "../../data/table/tableData"; import { curriculumTableData, weeklyPlayTableData } from "../../data/table/tableData";
import { keyValuePackage, onceYBarChartPackage, stringListPackage, tablePackage } from "../../dataPackage/inFrontOut"; import { keyValuePackage, onceYBarChartPackage, stringListPackage, tablePackage } from "../../dataPackage/inFrontOut";
import { getKeyValueOut, getStringOut, getOnceYBarChartOut } from "../../dataPackage/out"; import { getKeyValueOut, getStringOut, getOnceYBarChartOut } from "../../dataPackage/out";
import { ImgPath } from "../../serverConfig";
export function getData(req, res) { export function getData(req, res) {
...@@ -26,7 +27,12 @@ export function getData(req, res) { ...@@ -26,7 +27,12 @@ export function getData(req, res) {
ret['kclbys'] = getOnceYBarChartOut('课程类别(艺术)', kclbysChartPackage); ret['kclbys'] = getOnceYBarChartOut('课程类别(艺术)', kclbysChartPackage);
let kctfptPackageData = stringListPackage(excelData['课程投放平台'].dataList); let kctfptPackageData = stringListPackage(excelData['课程投放平台'].dataList);
ret['kctfpt'] = getStringOut('课程投放平台', kctfptPackageData); let kctfpt = [];
for(let i = 0; i < kctfptPackageData.length; i++) {
let img = `${ImgPath}/课程投放平台/${kctfptPackageData[i]}`;
kctfpt.push(img);
}
ret['kctfpt'] = getStringOut('课程投放平台', kctfpt);
let jcsjPackageData = keyValuePackage(excelData['基础数据'].dataList); let jcsjPackageData = keyValuePackage(excelData['基础数据'].dataList);
ret['jcsj'] = getKeyValueOut('基础数据', jcsjPackageData); ret['jcsj'] = getKeyValueOut('基础数据', jcsjPackageData);
...@@ -189,6 +195,7 @@ function getConfData(info, conf) { ...@@ -189,6 +195,7 @@ function getConfData(info, conf) {
for (let i = 0; i < conf.length; i++) { for (let i = 0; i < conf.length; i++) {
result[conf[i]] = info[conf[i]]; result[conf[i]] = info[conf[i]];
if (conf[i] == "kcdz") result[conf[i]] = `${ImgPath}/${info[conf[i]]}`;
} }
return result; return result;
......
...@@ -18,10 +18,19 @@ export function getData(req, res) { ...@@ -18,10 +18,19 @@ export function getData(req, res) {
ret['yxxsxxb'] = getKeyValueOut( '优秀学生信息表', yxxsxxbTableData); ret['yxxsxxb'] = getKeyValueOut( '优秀学生信息表', yxxsxxbTableData);
let gzxxbTableData = keyValuePackage(excelData["工作信息表"].dataList); let gzxxbTableData = keyValuePackage(excelData["工作信息表"].dataList);
ret['gzxxb'] = getKeyValueOut( '工作信息表', gzxxbTableData); let gzxxb = [];
gzxxbTableData.forEach( info => {
let {key, value, unit} = info;
if (key == "所辖事件点") value = value.split(",");
gzxxb.push({key, value, unit});
})
ret['gzxxb'] = {title:'工作信息表', dataList:gzxxb};
let jdgxTableData = keyValuePackage(excelData["阶段感想"].dataList); let jdgxTableData = stringListPackage(excelData['阶段感想'].dataList);
ret['jdgx'] = getKeyValueOut( '阶段感想', jdgxTableData); ret['jdgx'] = getStringOut('阶段感想', jdgxTableData);
// let jdgxTableData = keyValuePackage(excelData["阶段感想"].dataList);
// ret['jdgx'] = getKeyValueOut( '阶段感想', jdgxTableData);
let kqfxPackageData = keyValuePackage(excelData['考情分析'].dataList); let kqfxPackageData = keyValuePackage(excelData['考情分析'].dataList);
ret['kqfx'] = getKeyValueOut('考情分析', kqfxPackageData); ret['kqfx'] = getKeyValueOut('考情分析', kqfxPackageData);
...@@ -32,11 +41,9 @@ export function getData(req, res) { ...@@ -32,11 +41,9 @@ export function getData(req, res) {
let zpjxPackageData = keyValuePackage(excelData['作品奖项'].dataList); let zpjxPackageData = keyValuePackage(excelData['作品奖项'].dataList);
ret['zpjx'] = getKeyValueOut('作品奖项', zpjxPackageData); ret['zpjx'] = getKeyValueOut('作品奖项', zpjxPackageData);
let yynrhzPackageData = onceYBarChartPackage( excelData['原因内容汇总'], '',''); let yynrhzPackageData = onceYBarChartPackage( excelData['原因内容汇总'], '','');
ret['yynrhz'] = getOnceYBarChartOut('原因内容汇总', yynrhzPackageData); ret['yynrhz'] = getOnceYBarChartOut('原因内容汇总', yynrhzPackageData);
let fkypgPackageData = onceYBarChartPackage(excelData['反馈与评估'], '',''); let fkypgPackageData = onceYBarChartPackage(excelData['反馈与评估'], '','');
ret['fkypg'] = getOnceYBarChartOut('反馈与评估', fkypgPackageData); ret['fkypg'] = getOnceYBarChartOut('反馈与评估', fkypgPackageData);
......
...@@ -6,37 +6,56 @@ import { BizError } from '../../util/bizError'; ...@@ -6,37 +6,56 @@ import { BizError } from '../../util/bizError';
/* 重要活动保障 */ /* 重要活动保障 */
export function getData(req, res) { export function getData(req, res) {
let {name, year, month, type} = req.body;
let excelData = zyhdbzTableData(); let excelData = zyhdbzTableData();
let ret:any = {}; let ret:any = {};
let map = {};
let dhlData = keyValuePackage(excelData['导航栏'].dataList); let data = excelData["活动列表"].dataList;
ret['dhl'] = getKeyValueOut('导航栏', dhlData); let zyhdbzCount = {
"全部活动":data.length,
let glData = keyValuePackage(excelData['概览'].dataList); "报名中活动":0,
ret['gl'] = getKeyValueOut('概览', glData); "即将开始活动":0,
"进行中活动":0,
let hdztData = keyValuePackage(excelData['活动状态'].dataList); "已结束活动":0,
ret['hdzt'] = getKeyValueOut('活动状态', hdztData); }
for (let key in excelData) {
if (key == "导航栏" || key == "概览" || key == "活动状态") continue;
if (key.indexOf("趋势") > -1) {
let keyStr = key.replace("趋势", "");
if (!map[keyStr]) map[keyStr] = {qs:{}, gl:{}, name:keyStr};
let qsData = onceYBarChartPackage( excelData[key], '','');
map[keyStr].qs = getOnceYBarChartOut('访问流量趋势', qsData);
} else if (key.indexOf("概览") > -1) {
let keyStr = key.replace("概览", "");
if (!map[keyStr]) map[keyStr] = {qs:{}, gl:{}, name:keyStr};
let glData = keyValuePackage(excelData[key].dataList);
map[keyStr].gl = getKeyValueOut('青少年人工智能奥林匹克挑战赛', glData);
let zyhdData = {};
data.forEach( info => {
let {hdmc, hdzt, hdsj, zcrs, fwrc, yhts} = info;
let fwllqs = excelData['访问流量趋势'].dataList;
zyhdData[hdmc] = {
baseData:info,
fwllqs
};
switch (hdzt) {
case '即将开始':
zyhdbzCount.即将开始活动 += 1;
break;
case '报名中':
zyhdbzCount.报名中活动 += 1;
break;
case '活动进行中':
zyhdbzCount.进行中活动 += 1;
break;
case '活动结束':
zyhdbzCount.已结束活动 += 1;
break;
} }
})
let zyhdbzData = [];
for (let key in zyhdbzCount) {
zyhdbzData.push({key, value:zyhdbzCount[key]});
} }
ret['jcsj'] = {title:"基础数据", dataList:zyhdbzData};
ret["list"] = Object.values(map); let zyhdbz = {};
if (name) zyhdbz = zyhdData[name];
else zyhdbz = zyhdData;
ret['zyhdbz'] = {title:"重要活动保障", dataList:zyhdbz};
res.send(ret); res.send(ret);
} }
\ No newline at end of file
import { zzbznbTableData } from '../../data/table/zzb_100znbData';
import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, stringListPackage, tablePackage } from '../../dataPackage/inFrontOut';
import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getStringOut, getTableOut } from '../../dataPackage/out';
import { BizError } from '../../util/bizError';
/* 周周播_100周年版 */
export function getData(req, res) {
let excelData = zzbznbTableData();
let ret:any = {};
let kclbPackageData = onceYBarChartPackage( excelData['课程类别(艺术)'], '','');
ret['kclb'] = getOnceYBarChartOut('课程类别(艺术)', kclbPackageData);
let escsakctfptPackageData = onceYBarChartPackage( excelData['ESCSA课程投放平台'], '','月');
ret['escsakctfpt'] = getOnceYBarChartOut('ESCSA课程投放平台', escsakctfptPackageData);
let zgdxkctfptPackageData = onceYBarChartPackage( excelData['中国电信课程投放平台'], '','月');
ret['zgdxkctfpt'] = getOnceYBarChartOut('中国电信课程投放平台', zgdxkctfptPackageData);
let dfwjykctfptPackageData = onceYBarChartPackage( excelData['东方网教育课程投放平台'], '','月');
ret['dfwjykctfpt'] = getOnceYBarChartOut('东方网教育课程投放平台', dfwjykctfptPackageData);
let bilibilikctfptPackageData = onceYBarChartPackage( excelData['bilibili课程投放平台'], '','月');
ret['bilibilikctfpt'] = getOnceYBarChartOut('bilibili课程投放平台', bilibilikctfptPackageData);
let kcgkqsPackageData = onceYBarChartPackage( excelData['课程观看趋势(本周)'], '','');
ret['kcgkqs'] = getOnceYBarChartOut('课程观看趋势(本周)', kcgkqsPackageData);
let kclyqkPackageData = keyValuePackage(excelData['课程来源情况'].dataList);
ret['kclyqk'] = getKeyValueOut('课程来源情况', kclyqkPackageData);
let kcsynjdPackageData = keyValuePackage(excelData['课程适用年级段'].dataList);
ret['kcsynjd'] = getKeyValueOut('课程适用年级段', kcsynjdPackageData);
let kclyfbPackageData = keyValuePackage(excelData['课程领域分布'].dataList);
ret['kclyfb'] = getKeyValueOut('课程领域分布', kclyfbPackageData);
let kcsfxPackageData = keyValuePackage(excelData['课程数分析'].dataList);
ret['kcsfx'] = getKeyValueOut('课程数分析', kcsfxPackageData);
let sslfxPackageData = keyValuePackage(excelData['搜索栏分析'].dataList);
ret['sslfx'] = getKeyValueOut('搜索栏分析', sslfxPackageData);
let kcxxPackageData = keyValuePackage(excelData['课程信息'].dataList);
ret['kcxx'] = getKeyValueOut('课程信息', kcxxPackageData);
let kcfksjPackageData = keyValuePackage(excelData['课程反馈数据'].dataList);
ret['kcfksj'] = getKeyValueOut('课程反馈数据', kcfksjPackageData);
let kcbfqkPackageData = keyValuePackage(excelData['课程播放情况'].dataList);
ret['kcbfqk'] = getKeyValueOut('课程播放情况', kcbfqkPackageData);
let rmkcphtop10PackageData = keyValuePackage(excelData['热门课程排行top10(本周)'].dataList);
ret['rmkcphtop10'] = getKeyValueOut('热门课程排行top10(本周)', rmkcphtop10PackageData);
let rmbqPackageData = keyValuePackage(excelData['热门标签'].dataList);
ret['rmbq'] = getKeyValueOut('热门标签', rmbqPackageData);
let kcfkPackageData = keyValuePackage(excelData['课程反馈'].dataList);
ret['kcfk'] = getKeyValueOut('课程反馈', kcfkPackageData);
let zxgykcpfPackageData = keyValuePackage(excelData['在线公益课程评分'].dataList);
ret['zxgykcpf'] = getKeyValueOut('在线公益课程评分', zxgykcpfPackageData);
let ptbflqsPackageData = onceYBarChartPackage( excelData['平台播放量趋势'], '','');
ret['ptbflqs'] = getOnceYBarChartOut('平台播放量趋势', ptbflqsPackageData);
let kcsczflPackageData = onceYBarChartPackage( excelData['课程收藏/转发量'], '','月');
ret['kcsczfl'] = getOnceYBarChartOut('课程收藏/转发量', kcsczflPackageData);
let kclxrdphPackageData = onceYBarChartPackage( excelData['课程类型热度排行'], '','');
ret['kclxrdph'] = getOnceYBarChartOut('课程类型热度排行', kclxrdphPackageData);
res.send(ret);
}
\ No newline at end of file
import { PAGEENUM, PAGEENUM1, PAGEENUM2, PAGEENUM3, SYSTEMERRORENUM } from "../config/enum";
import { addTokenInfo, addUserInfo, checkAdminPermission, checkPagePermission, selectUserList, updateUser } from "../data/user/user";
import { uacInfomation } from "../serverConfig";
import { BizError, SysError } from "../util/bizError";
import { get, getParmiss, post, postParmiss } from "../util/request";
//登录
export async function getUserToken(req, res) {
let {grant_type, code, redirect_uri} = req.body;
let body = {
code,
grant_type,
client_id:uacInfomation.client_id,
client_secret:uacInfomation.client_secret,
redirect_uri,
};
let result:any = await postParmiss(uacInfomation.getTokenUrl, body, {});
let token;
if (result.error) {
console.log();
throw new SysError(SYSTEMERRORENUM.您的登录已失效);
} else if (result.access_token) { //获取用户信息
let { isAdmin, sub, real_name, phone, otherPage } = await getUserInfo(result.access_token);
if (sub && real_name && phone && otherPage) {
let lastTokenMs = new Date().valueOf();
addUserInfo(sub, phone, real_name, isAdmin, otherPage);
token = addTokenInfo(sub, lastTokenMs, result.access_token, result.refresh_token, isAdmin);
} else {
throw new SysError(SYSTEMERRORENUM.您的账户没有访问权限);
}
} else {
throw new SysError(SYSTEMERRORENUM.获取不到access_token);
}
res.success({token});
}
//刷新 玑脉 token
async function refreshToken(refresh_token) {
let body = {
client_id:uacInfomation.client_id,
client_secret:uacInfomation.client_secret,
refresh_token,
grant_type:"refresh_token",
scope:"openid profile"
};
let result:any = await postParmiss(uacInfomation.refreshTokenUrl, body, {});
}
//检验玑脉token 是否失效
export async function checkAccessToken(access_token) {
let result:any = await getParmiss(uacInfomation.getUserInfoUrl, {}, {"Authorization": `Bearer ${access_token}`});
let {sub, permission, phone, real_name} = result;
console.log(JSON.stringify(result))
if (!sub) return {sub:false };
permission = permission || "";
let isAdmin = permission.indexOf("dpzs_client_admin") > -1;//是否能进入管理后天
let otherPage = permission.indexOf("dpzs_client_znfx") > -1; //是否能进入二级页面
//检验是否有变化
addUserInfo(sub, phone, real_name, isAdmin, otherPage);
return {sub, userName:real_name, isAdmin, otherPage};
}
//获取统一认证用户信息
async function getUserInfo(access_token) {
let result:any = await getParmiss(uacInfomation.getUserInfoUrl, {}, {"Authorization": `Bearer ${access_token}`})
let isAdmin = false;
let {sub, role, permission, real_name, phone} = result;
if (!sub) throw new SysError(SYSTEMERRORENUM.获取玑脉用户信息失败);
permission = permission || "";
isAdmin = permission.indexOf("dpzs_client_admin") > -1;//是否能进入管理后天
let otherPage = permission.indexOf("dpzs_client_znfx") > -1; //是否能进入二级页面
console.log(isAdmin, sub, role, real_name, phone, otherPage)
return {isAdmin, sub, role, real_name, phone, otherPage};
}
//校验是否有权限跳转管理后台
export function checkPermissionForAdmin(req, res) {
let userId = req.headers.userid;
let ownOrNot = checkAdminPermission(userId);
res.success({ownOrNot});
}
//校验是否有权限跳转大屏
export function checkPermissionForPage(req, res) {
let { page } = req.body;
if ( !page ) throw new SysError(SYSTEMERRORENUM.参数错误);
let userId = req.headers.userid;
let ownOrNot = checkPagePermission(userId, page);
res.success({ownOrNot});
}
//检验是否有权限跳转二级页面
export function checkPermissionForHomePage(req, res) {
let ownOrNot = req.headers.otherpage == true;
res.success({ownOrNot});
}
//修改权限
export async function updatePermissions(req, res) {
let { allow, userId } = req.body;
let adminUser = req.headers.userid;
if ( !Array.isArray(allow) ) throw new SysError(SYSTEMERRORENUM.请求参数错误);
//校验参数
let config = {};
for(let key in PAGEENUM) {
let enumValue:any = PAGEENUM[key];
if (!isNaN(enumValue)) {
config[enumValue] = key;
}
}
let updateInfo = {};
allow.forEach(info => {
if ( !config[info] ) throw new SysError(SYSTEMERRORENUM.请求参数错误);
updateInfo[info] = true;
});
let isAdmin = checkAdminPermission(adminUser);
if (!isAdmin) throw new SysError(SYSTEMERRORENUM.您的账户没有访问权限);
let addSuccess = updateUser(userId, updateInfo);
if (!addSuccess ) throw new SysError(SYSTEMERRORENUM.没有找到目标用户);
res.success({isOk:true});
}
//用户列表
export async function permissionList(req, res) {
let { select, page, typeList } = req.body;
if ( isNaN(page) ) throw new SysError(SYSTEMERRORENUM.参数错误);
if ( !Array.isArray(typeList) ) throw new SysError(SYSTEMERRORENUM.参数错误);
typeList.forEach(key => {
if ( isNaN(key) ) throw new SysError(SYSTEMERRORENUM.参数错误);
});
if (select.length > 60) throw new SysError(SYSTEMERRORENUM.参数错误);
let config1 = [];
for(let key in PAGEENUM1) {
let enumValue:any = PAGEENUM1[key];
if (!isNaN(enumValue)) {
config1.push({
value:enumValue,
lab:key
});
}
}
let config2 = [];
for(let key in PAGEENUM2) {
let enumValue:any = PAGEENUM2[key];
if (!isNaN(enumValue)) {
config2.push({
value:enumValue,
lab:key
});
}
}
let config3 = [];
for(let key in PAGEENUM3) {
let enumValue:any = PAGEENUM3[key];
if (!isNaN(enumValue)) {
config3.push({
value:enumValue,
lab:key
});
}
}
let allUser = selectUserList(select, typeList || []);
//截取分页
let index = (page - 1) * 10;
let checkList = allUser.slice(index, index+10);
let result = [];
checkList.forEach(info => {
let { pm, name, phone, id, sub} = info;
let allow = [];
for (let pmKey in pm) {
if (pm[pmKey]) allow.push({
value:pmKey,
lab:PAGEENUM[pmKey]
});
}
let addInfo = {name, phoneNumber:phone, id, userId:sub , allow};
result.push(addInfo);
});
res.success({config1, config2, config3, userList:result, count:allUser.length, name:req.headers.username});
}
\ No newline at end of file
import { PAGEENUM, PAGEENUM1, PAGEENUM2, PAGEENUM3, SYSTEMERRORENUM } from "../config/enum"; import { PAGEENUM, PAGEENUM1, PAGEENUM2, PAGEENUM3, SYSTEMERRORENUM } from "../config/enum";
import { addTokenInfo, addUserInfo, checkAdminPermission, checkPagePermission, selectUserList, updateUser } from "../data/user/user"; import { addTokenInfo, addUserInfo, checkAdminPermission, checkPagePermission, selectUserList, updateUser } from "../data/user/user";
import { uacInfomation } from "../serverConfig"; import { authConfig, uacInfomation } from "../serverConfig";
import { BizError, SysError } from "../util/bizError"; import { BizError, SysError } from "../util/bizError";
import { get, getParmiss, post, postParmiss } from "../util/request"; import { get, getParmiss, post, postForm, postParmiss } from "../util/request";
const fs = require('fs');
const path = require('path');
//登录 //登录
export async function getUserToken(req, res) { export async function getUserToken(req, res) {
...@@ -10,23 +12,40 @@ export async function getUserToken(req, res) { ...@@ -10,23 +12,40 @@ export async function getUserToken(req, res) {
let body = { let body = {
code, code,
grant_type, grant_type,
client_id:uacInfomation.client_id,
client_secret:uacInfomation.client_secret,
redirect_uri, redirect_uri,
};
let url = `${authConfig.baseUrl}${authConfig.endpoints.token}`;
// // 使用 Basic Auth 认证
let credentials = Buffer.from(
`${authConfig.client.client_id}:${authConfig.client.client_secret}`
).toString('base64');
let headers = {
'Authorization': `Basic ${credentials}`,
'Content-Type': 'application/x-www-form-urlencoded',
'client_id': authConfig.client.client_id,
'client_secret': authConfig.client.client_secret,
}; };
let result:any = await postParmiss(uacInfomation.getTokenUrl, body, {});
// let result:any = await postForm(url, body.toString(), {});
let result:any = await postForm(url, body, headers);
console.log(`result:${JSON.stringify(result)}`);
let token; let token;
if (result.error) { if (result.error) {
console.log(); console.log();
throw new SysError(SYSTEMERRORENUM.您的登录已失效); throw new SysError(SYSTEMERRORENUM.您的登录已失效);
} else if (result.access_token) { //获取用户信息 } else if (result.access_token) { //获取用户信息
let { isAdmin, sub, real_name, phone, otherPage } = await getUserInfo(result.access_token); let { isAdmin, sub, real_name, phone, otherPage } = await getUserInfo(result.access_token);
console.log(`获取用户信息:${isAdmin}, ${sub}, ${real_name}, ${phone}, ${otherPage}`);
if (sub && real_name && phone && otherPage) { if (sub && real_name && phone && otherPage) {
let lastTokenMs = new Date().valueOf(); let lastTokenMs = new Date().valueOf();
addUserInfo(sub, phone, real_name, isAdmin, otherPage); addUserInfo(sub, phone, real_name, isAdmin, otherPage);
token = addTokenInfo(sub, lastTokenMs, result.access_token, result.refresh_token, isAdmin); token = addTokenInfo(sub, lastTokenMs, result.access_token, result.refresh_token, isAdmin);
console.log(`token:${token}`)
} else { } else {
throw new SysError(SYSTEMERRORENUM.您的账户没有访问权限); throw new SysError(SYSTEMERRORENUM.您的账户没有访问权限);
} }
...@@ -38,11 +57,12 @@ export async function getUserToken(req, res) { ...@@ -38,11 +57,12 @@ export async function getUserToken(req, res) {
res.success({token}); res.success({token});
} }
//刷新 玑脉 token //刷新 玑脉 token
async function refreshToken(refresh_token) { async function refreshToken(refresh_token) {
let body = { let body = {
client_id:uacInfomation.client_id, client_id:authConfig.client.client_id,
client_secret:uacInfomation.client_secret, client_secret:authConfig.client.client_secret,
refresh_token, refresh_token,
grant_type:"refresh_token", grant_type:"refresh_token",
scope:"openid profile" scope:"openid profile"
...@@ -51,44 +71,126 @@ async function refreshToken(refresh_token) { ...@@ -51,44 +71,126 @@ async function refreshToken(refresh_token) {
let result:any = await postParmiss(uacInfomation.refreshTokenUrl, body, {}); let result:any = await postParmiss(uacInfomation.refreshTokenUrl, body, {});
} }
// //检验玑脉token 是否失效
// export async function checkAccessToken(access_token) {
// let userInfoUrl = `${authConfig.baseUrl}${authConfig.endpoints.userInfo}`;
// let result:any = await getParmiss(userInfoUrl, {}, {"Authorization": `Bearer ${access_token}`});
// let {sub, permission, phone, real_name} = result;
// console.log(JSON.stringify(result))
// if (!sub) return {sub:false };
// permission = permission || "";
// let isAdmin = permission.indexOf("dpzs_client_admin") > -1;//是否能进入管理后天
// let otherPage = permission.indexOf("dpzs_client_znfx") > -1; //是否能进入二级页面
// //检验是否有变化
// addUserInfo(sub, phone, real_name, isAdmin, otherPage);
// return {sub, userName:real_name, isAdmin, otherPage};
// }
//检验玑脉token 是否失效 //检验玑脉token 是否失效
export async function checkAccessToken(access_token) { export async function checkAccessToken(access_token) {
let result:any = await getParmiss(uacInfomation.getUserInfoUrl, {}, {"Authorization": `Bearer ${access_token}`}); let credentials = Buffer.from(
let {sub, permission, phone, real_name} = result; `${authConfig.client.client_id}:${authConfig.client.client_secret}`
console.log(JSON.stringify(result)) ).toString('base64');
if (!sub) return {sub:false };
let headers = {
'Authorization': `Basic ${credentials}`,
'Content-Type': 'application/x-www-form-urlencoded',
'client_id': authConfig.client.client_id,
'client_secret': authConfig.client.client_secret,
};
permission = permission || ""; let userInfoUrl = `${authConfig.baseUrl}${authConfig.endpoints.userInfo}`;
let isAdmin = permission.indexOf("dpzs_client_admin") > -1;//是否能进入管理后天 let result:any = await get(userInfoUrl, {access_token}, headers)
let otherPage = permission.indexOf("dpzs_client_znfx") > -1; //是否能进入二级页面
let {id_no, mobile, name, id_type, student_num, teacher_num} = result;
// console.log(JSON.stringify(result))
if (!id_no) return {sub:false };
let urlFile = path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", "user.json" );
let jsonData:any = await readJsonFile(urlFile);
let isAdmin = false;
let otherPage = false;
for (let key in jsonData) {
if (mobile == jsonData[key].phone) {
isAdmin = jsonData[key].isAdmin; //是否能进入管理后台
otherPage = jsonData[key].otherPage; //是否能进入二级页面
}
}
//检验是否有变化 //检验是否有变化
addUserInfo(sub, phone, real_name, isAdmin, otherPage); addUserInfo(id_no, mobile, name, isAdmin, otherPage);
return {sub, userName:real_name, isAdmin, otherPage}; return {sub:id_no, userName:name, isAdmin, otherPage};
} }
//获取统一认证用户信息 //获取统一认证用户信息
async function getUserInfo(access_token) { export async function getUserInfo(access_token) {
let result:any = await getParmiss(uacInfomation.getUserInfoUrl, {}, {"Authorization": `Bearer ${access_token}`}) // 使用 Basic Auth 认证
let credentials = Buffer.from(
`${authConfig.client.client_id}:${authConfig.client.client_secret}`
).toString('base64');
let headers = {
'Authorization': `Basic ${credentials}`,
'Content-Type': 'application/x-www-form-urlencoded',
'client_id': authConfig.client.client_id,
'client_secret': authConfig.client.client_secret,
};
let userInfoUrl = `${authConfig.baseUrl}${authConfig.endpoints.userInfo}`;
let result:any = await get(userInfoUrl, {access_token}, headers)
console.log(`获取统一认证用户信息:${result}`);
// let {sub, role, permission, real_name, phone} = result;
let {id_no, mobile, name, id_type, student_num, teacher_num} = result;
if (!id_no) throw new SysError(SYSTEMERRORENUM.获取统一登录用户信息失败);
let urlFile = path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", "user.json" );
let jsonData:any = await readJsonFile(urlFile);
let isAdmin = false; let isAdmin = false;
let {sub, role, permission, real_name, phone} = result; let otherPage = false;
if (!sub) throw new SysError(SYSTEMERRORENUM.获取玑脉用户信息失败); for (let key in jsonData) {
if (mobile == jsonData[key].phone) {
permission = permission || ""; isAdmin = jsonData[key].isAdmin; //是否能进入管理后台
isAdmin = permission.indexOf("dpzs_client_admin") > -1;//是否能进入管理后天 otherPage = jsonData[key].otherPage; //是否能进入二级页面
let otherPage = permission.indexOf("dpzs_client_znfx") > -1; //是否能进入二级页面 }
console.log(isAdmin, sub, role, real_name, phone, otherPage) }
return {isAdmin, sub, role, real_name, phone, otherPage}; // console.log(isAdmin, id_no, name, mobile, otherPage);
return {isAdmin, sub:id_no, role:"", real_name:name, phone:mobile, otherPage};
}
function readJsonFile(filePath) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
reject(err);
return;
}
try {
const jsonData = JSON.parse(data);
resolve(jsonData);
} catch (parseErr) {
reject(parseErr);
}
});
});
} }
//校验是否有权限跳转管理后台 //校验是否有权限跳转管理后台
export function checkPermissionForAdmin(req, res) { export function checkPermissionForAdmin(req, res) {
let userId = req.headers.userid; let userId = req.headers.userid;
let ownOrNot = checkAdminPermission(userId); let ownOrNot = checkAdminPermission(userId);
res.success({ownOrNot}); res.success({ownOrNot});
} }
//校验是否有权限跳转大屏 //校验是否有权限跳转大屏
export function checkPermissionForPage(req, res) { export function checkPermissionForPage(req, res) {
let { page } = req.body; let { page } = req.body;
...@@ -98,6 +200,7 @@ export function checkPermissionForPage(req, res) { ...@@ -98,6 +200,7 @@ export function checkPermissionForPage(req, res) {
res.success({ownOrNot}); res.success({ownOrNot});
} }
//检验是否有权限跳转二级页面 //检验是否有权限跳转二级页面
export function checkPermissionForHomePage(req, res) { export function checkPermissionForHomePage(req, res) {
let ownOrNot = req.headers.otherpage == true; let ownOrNot = req.headers.otherpage == true;
...@@ -135,6 +238,7 @@ export async function updatePermissions(req, res) { ...@@ -135,6 +238,7 @@ export async function updatePermissions(req, res) {
res.success({isOk:true}); res.success({isOk:true});
} }
//用户列表 //用户列表
export async function permissionList(req, res) { export async function permissionList(req, res) {
let { select, page, typeList } = req.body; let { select, page, typeList } = req.body;
...@@ -198,5 +302,5 @@ export async function permissionList(req, res) { ...@@ -198,5 +302,5 @@ export async function permissionList(req, res) {
}); });
res.success({config1, config2, config3, userList:result, count:allUser.length, name:req.headers.username}); res.success({config1, config2, config3, userList:result, count:allUser.length, name:req.headers.username});
}
}
\ No newline at end of file
/**
* 数据治理
*/
export enum SJZLENUM { //apiId
数字治理 = "2588061136066902247",
数据资产 = "2588317066015734010"
}
export enum SJZLSIGNENUM { //sign
数字治理 = "7ebe51175d4c46c7e1ea30ffc4318b53",
数据资产 = "9340c68ff9138a8daab351dc469ca483"
}
/**
* 申生康
*/
export enum SSKENUM { //apiId
基本情况 = "2588952646676314374",
性别占比 = "2588956148104362258",
学段人数分析 = "2588964313211533603",
各区学生老师机构数 = "2588965841480644913",
近一周未上报学校 = "2588968137756178762",
今日上报率 = "2588968998717815122",
今日上报率趋势图 = "2588973415951169892",
今日未上报区学校 = "2588974362180909430",
因病缺课人数汇总 = "2588981074479741313",
学生不同学段因病缺课人数 = "2588983051296110991",
中间地图_学生因病缺课分布 = "2588984152590317981",
因病缺课趋势月 = "2589069623095917032",
因病缺课趋势周 = "2589068655795042745",
市级区级校级苗子数量 = "2589070903667259912",
聚集性症状疾病苗子数量 = "2589073451293800982",
近期学生老师缺课分析 = "2589240801543518756",
学生老师近期缺课原因占比 = "2589242257730370098",
近期高发疾病排行_高发疾病分析 = "2589316773637716547",
近期高发疾病趋势_高发疾病分析_ = "2589319189977299534", //废弃
今年_近期高发疾病趋势_高发疾病分析_ = "2589319930494253663",
前年_近期高发疾病趋势_高发疾病分析_ = "2589320902626966128",
病症情况分析总人数新发病例数_病症人数分布 = "2589329791383698062",
病发时间情况分析_全部_病症人数分布 = "2589332270119844508",
病发时间情况分析_学校类型分组_病症人数分布 = "2593682341743491128"
}
export enum SSKSIGNENUM { //sign
基本情况 = "fc0c2467db2363d6fcd1f163b591f906",
性别占比 = "5a869568633b9393ae2df01d5fc24d4c",
学段人数分析 = "404c1d600862ebff4e6c8a2d88e7d9ec",
各区学生老师机构数 = "1cf7b5969f9e6a9fc744cb8c51ea70d0",
近一周未上报学校 = "b129c29812a1f9f5d4615c2b84115b60",
今日上报率 = "f05628fb167cbbd8bb359a5638bcae88",
今日上报率趋势图 = "10a943502569909a6f43679ed0820ed6",
今日未上报区学校 = "49e2ecc7a867e6584680d1cba2210033",
因病缺课人数汇总 = "db1950f56d28a9e8d4c155a56bac39b7",
学生不同学段因病缺课人数 = "118dbe8072795c8ab94114da13c04770",
中间地图_学生因病缺课分布 = "bcd89dc109e187f22a9a062f3370bb25",
因病缺课趋势月 = "6ba1e61f3b06a6a3b300ebaa175586f9",
因病缺课趋势周 = "d9033253f4f23bf10708dd1b365ed4dc",
市级区级校级苗子数量 = "710c9a193106954e8477549146aab8e4",
聚集性症状疾病苗子数量 = "58b5d1a99affc9be0448229c182b2a69",
近期学生老师缺课分析 = "daef9c23d0081f91e9e703b3199fbdc2",
学生老师近期缺课原因占比 = "0010ce3b7e9dfdf08a01b432fe0052e8",
近期高发疾病排行_高发疾病分析 = "651182313eecf3802d7d049eb837cc1f",
近期高发疾病趋势_高发疾病分析_ = "f2b532e8a41d4aa84532fd196a746e29", //废弃
今年_近期高发疾病趋势_高发疾病分析_ = "2dcd53411f77630408b2093aeb696b65",
前年_近期高发疾病趋势_高发疾病分析_ = "fc26f4781bb84eaf18ae556f2a2bfe12",
病症情况分析总人数新发病例数_病症人数分布 = "d6af84500779b7117cc867dc3bc4b7b9",
病发时间情况分析_全部_病症人数分布 = "bf868c7a72490ac61f651c225fb9eb1f",
病发时间情况分析_学校类型分组_病症人数分布 = "6c7913369fba795d5f29c9b95f934cef"
}
...@@ -6,7 +6,10 @@ export enum SYSTEMERRORENUM { ...@@ -6,7 +6,10 @@ export enum SYSTEMERRORENUM {
获取不到access_token, 获取不到access_token,
没有找到目标用户, 没有找到目标用户,
token已过期, token已过期,
获取玑脉用户信息失败 获取玑脉用户信息失败,
获取用户信息失败,
无效的授权类型,
获取统一登录用户信息失败
} }
export enum TYPEENUM { export enum TYPEENUM {
...@@ -24,7 +27,9 @@ export enum PAGEENUM { ...@@ -24,7 +27,9 @@ export enum PAGEENUM {
健康 = 11, 健康 = 11,
创新实践工作站 = 21, 创新实践工作站 = 21,
优秀资源平台 = 22, 优秀资源平台 = 22,
周周播 = 23 周周播 = 23,
科学研究院 = 24,
科学素养 = 25
} }
export enum PAGEENUM1 { export enum PAGEENUM1 {
...@@ -40,7 +45,9 @@ export enum PAGEENUM2 { ...@@ -40,7 +45,9 @@ export enum PAGEENUM2 {
export enum PAGEENUM3 { export enum PAGEENUM3 {
创新实践工作站 = 21, 创新实践工作站 = 21,
优秀资源平台 = 22, 优秀资源平台 = 22,
周周播 = 23 周周播 = 23,
科学研究院 = 24,
科学素养 = 25
} }
export enum INTERFACEREQUESTTYPEENUM { export enum INTERFACEREQUESTTYPEENUM {
...@@ -55,4 +62,10 @@ for (let key in SYSTEMERRORENUM) { ...@@ -55,4 +62,10 @@ for (let key in SYSTEMERRORENUM) {
export function getSysMsg(param) { export function getSysMsg(param) {
return systemErrorMsgMap[param]; return systemErrorMsgMap[param];
} }
\ No newline at end of file
/**
* 路由到操作描述的映射配置
*/
const routeConfig = {
// 数据治理体系
'/sjzltx': {
module: '驾驶舱页面',
action: 'select',
description: '查看数据治理体系页面'
},
'/ztyxts': {
module: '驾驶舱页面',
action: 'select',
description: '查看整体运行态势页面'
},
'/zyhdbz': {
module: '驾驶舱页面',
action: 'select',
description: '查看重要活动保障页面'
},
'/zyhdbzpop': {
module: '驾驶舱页面',
action: 'select',
description: '查看重要活动保障弹窗'
},
// 权限管理
'/permission/getlist': {
module: '权限管理',
action: 'select',
description: '查看权限列表'
},
'/permission/updatepermission': {
module: '权限管理',
action: 'update',
description: '更新用户权限'
},
// 认证相关
'/gettoken': {
module: '认证管理',
action: 'login',
description: '用户登录获取token'
},
'/auth/accesstoken': {
module: '认证管理',
action: 'auth',
description: '统一认证回调'
},
// 权限检查
'/permission/checkpage': {
module: '权限管理',
action: 'check',
description: '检查页面权限'
},
'/permission/checkadmin': {
module: '权限管理',
action: 'check',
description: '检查管理员权限'
},
'/permission/checkhomepage': {
module: '权限管理',
action: 'check',
description: '检查首页权限'
},
// 二期页面
'/secondPhase/gradehealth': {
module: '二期页面',
action: 'select',
description: '查看健康等级页面'
},
// 三期页面
'/weeklyplay': {
module: '三期页面',
action: 'select',
description: '查看周周播页面'
},
'/curriculumpop': {
module: '三期页面',
action: 'select',
description: '查看课程弹窗'
},
'/dropdown': {
module: '三期页面',
action: 'select',
description: '查看下拉选项'
},
// 2024-12-28 新增
'/qsnkjcxsjgzz': {
module: '三期页面',
action: 'select',
description: '查看青少年科创实践工作站'
},
'/ysysda': {
module: '三期页面',
action: 'select',
description: '查看一生一档案页面'
},
'/zyhdbzlist': {
module: '三期页面',
action: 'select',
description: '查看重要活动保障列表'
},
'/jyyzzy': {
module: '三期页面',
action: 'select',
description: '查看教育优质资源页面'
},
'/jyyzzy/kcsj': {
module: '三期页面',
action: 'select',
description: '查看教育优质资源课程数据'
},
'/kxyjy': {
module: '三期页面',
action: 'select',
description: '查看科学研究院页面'
},
'/kxyjy/map': {
module: '三期页面',
action: 'select',
description: '查看科学研究院地图'
},
'/ssk': {
module: '三期页面',
action: 'select',
description: '查看申申康页面'
},
'/ssk/jrsbxx': {
module: '三期页面',
action: 'select',
description: '查看今日上报信息'
},
'/ssk/cityname': {
module: '三期页面',
action: 'select',
description: '查看城市名称'
},
'/ssk/map': {
module: '三期页面',
action: 'select',
description: '查看申申康地图'
},
'/ssk/gfjbqs': {
module: '三期页面',
action: 'select',
description: '查看高峰就诊情况'
},
'/ssk/jjxmz': {
module: '三期页面',
action: 'select',
description: '查看紧急项目统计'
},
'/ssk/ybqkqs': {
module: '三期页面',
action: 'select',
description: '查看医保情况趋势'
}
};
// 获取路由配置
function getRouteConfig(path) {
return routeConfig[path];
}
module.exports = {
getRouteConfig
};
...@@ -37,7 +37,7 @@ let refreshExpiresTime; ...@@ -37,7 +37,7 @@ let refreshExpiresTime;
*/ */
export async function getAccessToken(authCode?) { export async function getAccessToken(authCode?) {
let url = "https://u.baidu.com/oauth/accessToken"; let url = "https://u.baidu.com/oauth/accessToken";
if(!authCode) authCode = "eyJhbGciOiJIUzM4NCJ9.eyJhdWQiOiLmmbrog73liIbmnpDkuozmioDpobXpnaIiLCJzdWIiOiJleGMiLCJ1aWQiOjU1NjU5MDExLCJhcHBJZCI6IjcxZWQwOGIxM2E5ZWYxMDJiMGUwOTEzYzM3Y2ZiY2E0IiwiaXNzIjoi5ZWG5Lia5byA5Y-R6ICF5Lit5b-DIiwicGxhdGZvcm1JZCI6IjQ5NjAzNDU5NjU5NTg1NjE3OTQiLCJleHAiOjE3MzUzODY5OTQsImp0aSI6IjkxMDEyNjIwNjIxOTEyMTQ1OTQifQ.9z6tXtCovRwshEff3etnW4ieMCrAr_ePz7aCnopHJ8r0-oBq550liH81SULc-D1v"; if(!authCode) authCode = "eyJhbGciOiJIUzM4NCJ9.eyJhdWQiOiLmmbrog73liIbmnpDkuozmioDpobXpnaIiLCJzdWIiOiJleGMiLCJ1aWQiOjU1NjU5MDExLCJhcHBJZCI6IjcxZWQwOGIxM2E5ZWYxMDJiMGUwOTEzYzM3Y2ZiY2E0IiwiaXNzIjoi5ZWG5Lia5byA5Y-R6ICF5Lit5b-DIiwicGxhdGZvcm1JZCI6IjQ5NjAzNDU5NjU5NTg1NjE3OTQiLCJleHAiOjE3MzU2MDg4NzIsImp0aSI6IjkxNDQxMzYxNzgwODY1NzYyMDEifQ.T8WeHYuOBnpR8OwOvVBB-JmVlNEluMkXBW45M8WVaVW2WTQFARiO9m0Vk_j18CRE";
let grantType = "auth_code"; let grantType = "auth_code";
// let accessToken = "eyJhbGciOiJIUzM4NCJ9.eyJzdWIiOiJhY2MiLCJhdWQiOiLmmbrog73liIbmnpDkuozmioDpobXpnaIiLCJ1aWQiOjU1NjU5MDExLCJhcHBJZCI6IjcxZWQwOGIxM2E5ZWYxMDJiMGUwOTEzYzM3Y2ZiY2E0IiwiaXNzIjoi5ZWG5Lia5byA5Y-R6ICF5Lit5b-DIiwicGxhdGZvcm1JZCI6IjQ5NjAzNDU5NjU5NTg1NjE3OTQiLCJleHAiOjQxMDI0MTYwMDAsImp0aSI6IjgyMjcyODc4OTQ0OTk2NTU3MDQifQ.OiL3rJ2zTdFcw3YDvkx5cwvZPF4dz57MVUX9jUwAoSYugckUw5BhttzHFK-OY1OB"; // let accessToken = "eyJhbGciOiJIUzM4NCJ9.eyJzdWIiOiJhY2MiLCJhdWQiOiLmmbrog73liIbmnpDkuozmioDpobXpnaIiLCJ1aWQiOjU1NjU5MDExLCJhcHBJZCI6IjcxZWQwOGIxM2E5ZWYxMDJiMGUwOTEzYzM3Y2ZiY2E0IiwiaXNzIjoi5ZWG5Lia5byA5Y-R6ICF5Lit5b-DIiwicGxhdGZvcm1JZCI6IjQ5NjAzNDU5NjU5NTg1NjE3OTQiLCJleHAiOjQxMDI0MTYwMDAsImp0aSI6IjgyMjcyODc4OTQ0OTk2NTU3MDQifQ.OiL3rJ2zTdFcw3YDvkx5cwvZPF4dz57MVUX9jUwAoSYugckUw5BhttzHFK-OY1OB";
let accessToken = "klnPbCG2Rexuk1e1H1F2wIEsFv6GxiOV@jGObOQvDH1tPIfGkPBzbENGc7dZ68xBR"; let accessToken = "klnPbCG2Rexuk1e1H1F2wIEsFv6GxiOV@jGObOQvDH1tPIfGkPBzbENGc7dZ68xBR";
......
...@@ -10,7 +10,7 @@ import { getAccessToken } from "./baiduyun"; ...@@ -10,7 +10,7 @@ import { getAccessToken } from "./baiduyun";
const userUrl = './mock/platform.json'; const userUrl = './mock/platform.json';
let token = "eyJhbGciOiJIUzM4NCJ9.eyJzdWIiOiJhY2MiLCJhdWQiOiLmmbrog73liIbmnpDkuozmioDpobXpnaIiLCJ1aWQiOjU1NjU5MDExLCJhcHBJZCI6IjcxZWQwOGIxM2E5ZWYxMDJiMGUwOTEzYzM3Y2ZiY2E0IiwiaXNzIjoi5ZWG5Lia5byA5Y-R6ICF5Lit5b-DIiwicGxhdGZvcm1JZCI6IjQ5NjAzNDU5NjU5NTg1NjE3OTQiLCJleHAiOjE3MzU0NzIyMjAsImp0aSI6Ijg4NDg1MjMzNzE2MjY5MDU2MTMifQ.V4MY9XNXWAif2Xs_gykJcUnay1vJnUOJOWc6qvQKYuomCltFbOrQ39kVNfSE0wb6"; let token = "eyJhbGciOiJIUzM4NCJ9.eyJzdWIiOiJhY2MiLCJhdWQiOiLmmbrog73liIbmnpDkuozmioDpobXpnaIiLCJ1aWQiOjU1NjU5MDExLCJhcHBJZCI6IjcxZWQwOGIxM2E5ZWYxMDJiMGUwOTEzYzM3Y2ZiY2E0IiwiaXNzIjoi5ZWG5Lia5byA5Y-R6ICF5Lit5b-DIiwicGxhdGZvcm1JZCI6IjQ5NjAzNDU5NjU5NTg1NjE3OTQiLCJleHAiOjE3MzU2OTM1NjEsImp0aSI6IjkxMDEzNzg1NDE3MDQyODIxNjIifQ.I4suqfuPXUzU1lhLEQsPoTRjR6uQOx3DmaFpIq496bgVETUFPmpjmAFMSVhqq69y";
let tokenTime = 0;//有效时间 let tokenTime = 0;//有效时间
let lastTime = 0;//上一次时间 let lastTime = 0;//上一次时间
const timeOutTime = 50;//超时时间s const timeOutTime = 50;//超时时间s
...@@ -73,7 +73,6 @@ export async function getSzjltxData() { ...@@ -73,7 +73,6 @@ export async function getSzjltxData() {
if (onceItem.system != "/") sjlyInfo[name].push(onceItem.system); if (onceItem.system != "/") sjlyInfo[name].push(onceItem.system);
}); });
} }
return { sjzl, sjzc, sjlyInfo }; return { sjzl, sjzc, sjlyInfo };
} }
......
...@@ -214,16 +214,17 @@ export async function getMapDistrictServiceData() { ...@@ -214,16 +214,17 @@ export async function getMapDistrictServiceData() {
let {name} = item; let {name} = item;
body["conditions"] = {"xzq": name}; body["conditions"] = {"xzq": name};
let mapSchoolListSourceData:any = await post(getSecondPhaseUrl(healthEnum.不同学校上报情况信息中间地图), body, headers); // let mapSchoolListSourceData:any = await post(getSecondPhaseUrl(healthEnum.不同学校上报情况信息中间地图), body, headers);
// let mapSchoolListSourceData:any = await getInterfaceByInterfaceName("不同学校上报情况信息中间地图", body, headers); // // let mapSchoolListSourceData:any = await getInterfaceByInterfaceName("不同学校上报情况信息中间地图", body, headers);
let mapSchoolListSource:any = mapSchoolListSourceData || defaultConf.MapSchoolDataDefault; // let mapSchoolListSource:any = mapSchoolListSourceData || defaultConf.MapSchoolDataDefault;
let mapSchoolListSource:any = defaultConf.MapSchoolDataDefault;
let differentDistrictStuNumSourceData:any = await post(getSecondPhaseUrl(healthEnum.不同行政区上报学生数),
getHealthParameter(healthEnum.不同行政区上报学生数, healthTokenEnum.不同行政区上报学生数).body, // let differentDistrictStuNumSourceData:any = await post(getSecondPhaseUrl(healthEnum.不同行政区上报学生数),
getHealthParameter(healthEnum.不同行政区上报学生数, healthTokenEnum.不同行政区上报学生数).headers); // getHealthParameter(healthEnum.不同行政区上报学生数, healthTokenEnum.不同行政区上报学生数).body,
// let differentDistrictStuNumSourceData:any = await getInterfaceByInterfaceName("不同行政区上报学生数", getParameter(healthEnum.不同行政区上报学生数, healthTokenEnum.不同行政区上报学生数).body, getParameter(healthEnum.不同行政区上报学生数, healthTokenEnum.不同行政区上报学生数).headers); // getHealthParameter(healthEnum.不同行政区上报学生数, healthTokenEnum.不同行政区上报学生数).headers);
let differentDistrictStuNumSource:any = differentDistrictStuNumSourceData || defaultConf.DifferentDistrictStuNumDefault; // // let differentDistrictStuNumSourceData:any = await getInterfaceByInterfaceName("不同行政区上报学生数", getParameter(healthEnum.不同行政区上报学生数, healthTokenEnum.不同行政区上报学生数).body, getParameter(healthEnum.不同行政区上报学生数, healthTokenEnum.不同行政区上报学生数).headers);
// let differentDistrictStuNumSource:any = differentDistrictStuNumSourceData || defaultConf.DifferentDistrictStuNumDefault;
let differentDistrictStuNumSource:any = defaultConf.DifferentDistrictStuNumDefault;
item["schoolInfo"] = mapSchoolListSource["data"]; item["schoolInfo"] = mapSchoolListSource["data"];
differentDistrictStuNumSource["data"].forEach( info => { differentDistrictStuNumSource["data"].forEach( info => {
......
...@@ -8,10 +8,10 @@ import { post } from "../../../util/request"; ...@@ -8,10 +8,10 @@ import { post } from "../../../util/request";
const appKey = 200000086; const appKey = 200000086;
export async function getBaseNumData(id) { export async function getBaseNumData(id) {
let {body, headers} = getParameter(workstationEnum.工作站整体数字, workstationTokenEnum.工作站整体数字); // let {body, headers} = getParameter(workstationEnum.工作站整体数字, workstationTokenEnum.工作站整体数字);
let baseNumData:any = await post(getWorkstationUrl(workstationEnum.工作站整体数字), body, headers); // let baseNumData:any = await post(getWorkstationUrl(workstationEnum.工作站整体数字), body, headers);
let baseNumSource:any = baseNumData || defaultConf.BaseNumDefault; // let baseNumSource:any = baseNumData || defaultConf.BaseNumDefault;
// let baseNumSource = defaultConf.BaseNumDefault; let baseNumSource = defaultConf.BaseNumDefault;
//基础整合数据 //基础整合数据
let baseNumConf = {lssl:"老师数量", xssl:"学生数量", ktsl:"课题数量"}; let baseNumConf = {lssl:"老师数量", xssl:"学生数量", ktsl:"课题数量"};
...@@ -53,13 +53,13 @@ export async function getBaseNumData(id) { ...@@ -53,13 +53,13 @@ export async function getBaseNumData(id) {
export async function getBaseData(id) { export async function getBaseData(id) {
let {body, headers} = getParameter(workstationEnum.左侧实践站介绍, workstationTokenEnum.左侧实践站介绍); // let {body, headers} = getParameter(workstationEnum.左侧实践站介绍, workstationTokenEnum.左侧实践站介绍);
let baseData:any = await post(getWorkstationUrl(workstationEnum.左侧实践站介绍), body, headers); // let baseData:any = await post(getWorkstationUrl(workstationEnum.左侧实践站介绍), body, headers);
let baseSource:any = baseData || defaultConf.BaseDefault; // let baseSource:any = baseData || defaultConf.BaseDefault;
// let baseSource = defaultConf.BaseDefault; let baseSource = defaultConf.BaseDefault;
let baseConf = {wsname:"名称", wsaddress:"地址", soname:"学科", plname:"所辖实践点"}; let baseConf = {wsname:"名称", wsaddress:"地址", soname:"学科", plname:"所辖实践点"};
let base = {"名称":"", "地址":"", "学科":"", "所辖实践点":""}; let base:any = {"名称":"", "地址":"", "学科":"", "所辖实践点":""};
baseSource["data"].forEach( item => { baseSource["data"].forEach( item => {
let {wsid, plname, soname, wsaddress, wsname} = item; let {wsid, plname, soname, wsaddress, wsname} = item;
if (id == wsid) { if (id == wsid) {
...@@ -76,10 +76,10 @@ export async function getBaseData(id) { ...@@ -76,10 +76,10 @@ export async function getBaseData(id) {
export async function getCityResearchProgress(id) { export async function getCityResearchProgress(id) {
let {body, headers} = getParameter(workstationEnum.中间市级课题研究进度, workstationTokenEnum.中间市级课题研究进度); // let {body, headers} = getParameter(workstationEnum.中间市级课题研究进度, workstationTokenEnum.中间市级课题研究进度);
let cityResearchData:any = await post(getWorkstationUrl(workstationEnum.中间市级课题研究进度), body, headers); // let cityResearchData:any = await post(getWorkstationUrl(workstationEnum.中间市级课题研究进度), body, headers);
let cityResearchSouorce:any = cityResearchData || defaultConf.CityResearchDefault; // let cityResearchSouorce:any = cityResearchData || defaultConf.CityResearchDefault;
// let cityResearchSouorce = defaultConf.CityResearchDefault; let cityResearchSouorce = defaultConf.CityResearchDefault;
let cityResearch = {"开题报告":"", "中期报告":"", "结题报告":""}; let cityResearch = {"开题报告":"", "中期报告":"", "结题报告":""};
cityResearchSouorce["data"].forEach( item => { cityResearchSouorce["data"].forEach( item => {
...@@ -96,10 +96,10 @@ export async function getCityResearchProgress(id) { ...@@ -96,10 +96,10 @@ export async function getCityResearchProgress(id) {
export async function getSubjectStuScore(id) { export async function getSubjectStuScore(id) {
let {body, headers} = getParameter(workstationEnum.中间各学科学生得分, workstationTokenEnum.中间各学科学生得分); // let {body, headers} = getParameter(workstationEnum.中间各学科学生得分, workstationTokenEnum.中间各学科学生得分);
let subjectStuScoreData:any = await post(getWorkstationUrl(workstationEnum.中间各学科学生得分), body, headers); // let subjectStuScoreData:any = await post(getWorkstationUrl(workstationEnum.中间各学科学生得分), body, headers);
let subjectStuScoreSouorce:any = subjectStuScoreData || defaultConf.SubjectStuScoreDefault; // let subjectStuScoreSouorce:any = subjectStuScoreData || defaultConf.SubjectStuScoreDefault;
// let subjectStuScoreSouorce = defaultConf.SubjectStuScoreDefault; let subjectStuScoreSouorce = defaultConf.SubjectStuScoreDefault;
let subjectStuScore = {}; let subjectStuScore = {};
subjectStuScoreSouorce["data"].forEach( item => { subjectStuScoreSouorce["data"].forEach( item => {
...@@ -120,10 +120,10 @@ export async function getSubjectStuScore(id) { ...@@ -120,10 +120,10 @@ export async function getSubjectStuScore(id) {
export async function getQuitReason(id) { export async function getQuitReason(id) {
let {body, headers} = getParameter(workstationEnum.右侧退出原因分析, workstationTokenEnum.右侧退出原因分析); // let {body, headers} = getParameter(workstationEnum.右侧退出原因分析, workstationTokenEnum.右侧退出原因分析);
let quitReasonData:any = await post(getWorkstationUrl(workstationEnum.右侧退出原因分析), body, headers); // let quitReasonData:any = await post(getWorkstationUrl(workstationEnum.右侧退出原因分析), body, headers);
let quitReasonSouorce:any = quitReasonData || defaultConf.QuitReasonDefault; // let quitReasonSouorce:any = quitReasonData || defaultConf.QuitReasonDefault;
// let quitReasonSouorce = defaultConf.QuitReasonDefault; let quitReasonSouorce = defaultConf.QuitReasonDefault;
let quitReason = []; let quitReason = [];
quitReasonSouorce["data"].forEach( item => { quitReasonSouorce["data"].forEach( item => {
...@@ -138,10 +138,10 @@ export async function getQuitReason(id) { ...@@ -138,10 +138,10 @@ export async function getQuitReason(id) {
export async function getResearchSubject(id) { export async function getResearchSubject(id) {
let {body, headers} = getParameter(workstationEnum.右侧研究课题, workstationTokenEnum.右侧研究课题); // let {body, headers} = getParameter(workstationEnum.右侧研究课题, workstationTokenEnum.右侧研究课题);
let researchSubjectData:any = await post(getWorkstationUrl(workstationEnum.右侧研究课题), body, headers); // let researchSubjectData:any = await post(getWorkstationUrl(workstationEnum.右侧研究课题), body, headers);
let researchSubjectSouorce:any = researchSubjectData || defaultConf.ResearchSubjectDefault; // let researchSubjectSouorce:any = researchSubjectData || defaultConf.ResearchSubjectDefault;
// let researchSubjectSouorce = defaultConf.ResearchSubjectDefault; let researchSubjectSouorce = defaultConf.ResearchSubjectDefault;
let researchSubject = [ let researchSubject = [
{key:"年份", values:[]}, {key:"年份", values:[]},
......
...@@ -25,10 +25,10 @@ export function gzzTableData() { ...@@ -25,10 +25,10 @@ export function gzzTableData() {
let blockDataList = onceSheetBecomeOfblockData('kyszhglpt.xlsx', '青少年科技创新实践工作站'); let blockDataList = onceSheetBecomeOfblockData('kyszhglpt.xlsx', '青少年科技创新实践工作站');
let keyValueOrTitleList = ["学科老师分布","工作站类型分布","历年工作站类型分布","选拔情况","课程资源","培训活动","新增课程资源数","新增培训活动数","课程资源类型数","培训活动类型数","课程资源特色课题","培训活动特色课题","工作站分布键值","历年工作站分布键值","日常管理","学生考勤分析","课题研究","优秀学员","顶部","各工作站学生数量", "学科老师数量"];//适配 饼图 键值以及需要多个key的 let keyValueOrTitleList = ["作品奖项","学科老师分布","工作站类型分布","历年工作站类型分布","选拔情况","课程资源","培训活动","新增课程资源数","新增培训活动数","课程资源类型数","培训活动类型数","课程资源特色课题","培训活动特色课题","工作站分布键值","历年工作站分布键值","日常管理","学生考勤分析","课题研究","优秀学员","顶部","各工作站学生数量", "学科老师数量"];//适配 饼图 键值以及需要多个key的
let barChartList = ["历年招募学员情况","学生来源分布","课程历年资源数","培训历年资源数","各工作站学生数量分析","日常管理趋势","专业匹配率分析"]; //适配 柱状图 折线图 let barChartList = ["历年招募学员情况","学生来源分布","课程历年资源数","培训历年资源数","各工作站学生数量分析","日常管理趋势","专业匹配率分析"]; //适配 柱状图 折线图
let stringList = []; let stringList = [];
let decollatePlanarList =["作品奖项","课题研究列表"];//适配 表格 let decollatePlanarList =["课题研究列表"];//适配 表格
let titltListConfig = {}; let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList); let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
......
...@@ -26,7 +26,7 @@ function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, ...@@ -26,7 +26,7 @@ function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList,
export function weeklyPlayTableData() { export function weeklyPlayTableData() {
let blockDataList = onceSheetBecomeOfblockData('上海市学生素质教育优质资源平台.xlsx', 'Sheet1'); let blockDataList = onceSheetBecomeOfblockData('kyszhglpt.xlsx', '周周播');
let keyValueOrTitleList = ['课程来源情况', '课程适用年级段', '课程领域分布', '课程投放平台', '基础数据', '课程播放情况', '课程反馈', '在线公益课程评分', '热门标签']; //适配 饼图 键值以及需要多个Key的 let keyValueOrTitleList = ['课程来源情况', '课程适用年级段', '课程领域分布', '课程投放平台', '基础数据', '课程播放情况', '课程反馈', '在线公益课程评分', '热门标签']; //适配 饼图 键值以及需要多个Key的
let barChartList = ['课程类别(艺术)', '平台播放量趋势', '平台播放量趋势(直播)', '平台播放量趋势(回放)', '课程收藏/转发量', '课程类型热度排行(本周)']; //适配 柱状图 折线图 let barChartList = ['课程类别(艺术)', '平台播放量趋势', '平台播放量趋势(直播)', '平台播放量趋势(回放)', '课程收藏/转发量', '课程类型热度排行(本周)']; //适配 柱状图 折线图
...@@ -40,7 +40,7 @@ export function weeklyPlayTableData() { ...@@ -40,7 +40,7 @@ export function weeklyPlayTableData() {
export function curriculumTableData() { export function curriculumTableData() {
let blockDataList = onceSheetBecomeOfblockData('上海市学生素质教育优质资源平台.xlsx', 'Sheet2'); let blockDataList = onceSheetBecomeOfblockData('kyszhglpt.xlsx', '直播数据');
let keyValueOrTitleList = ['课程数据']; //适配 饼图 键值以及需要多个Key的 let keyValueOrTitleList = ['课程数据']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图 let barChartList = []; //适配 柱状图 折线图
......
...@@ -23,7 +23,7 @@ function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, ...@@ -23,7 +23,7 @@ function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList,
export function ysysdaTableData() { export function ysysdaTableData() {
let blockDataList = onceSheetBecomeOfblockData('kyszhglpt.xlsx', '一生一世档案'); let blockDataList = onceSheetBecomeOfblockData('kyszhglpt.xlsx', '实践工作站弹窗');
let keyValueOrTitleList = ["优秀学生信息表", "工作信息表","阶段感想", "学习方法分析","考情分析","退出原因分析","作品奖项"];//适配 饼图 键值以及需要多个key的 let keyValueOrTitleList = ["优秀学生信息表", "工作信息表","阶段感想", "学习方法分析","考情分析","退出原因分析","作品奖项"];//适配 饼图 键值以及需要多个key的
let barChartList = ["原因内容汇总", "反馈与评估"]; //适配 柱状图 折线图 let barChartList = ["原因内容汇总", "反馈与评估"]; //适配 柱状图 折线图
......
...@@ -25,21 +25,13 @@ export function zyhdbzTableData() { ...@@ -25,21 +25,13 @@ export function zyhdbzTableData() {
let blockDataList = onceSheetBecomeOfblockData('kyszhglpt.xlsx', '重要活动保障'); let blockDataList = onceSheetBecomeOfblockData('kyszhglpt.xlsx', '重要活动保障');
let keyValueOrTitleList = [];//适配 饼图 键值以及需要多个key的 let keyValueOrTitleList = ["活动列表", "访问流量趋势"];//适配 饼图 键值以及需要多个key的
let barChartList = []; //适配 柱状图 折线图 let barChartList = []; //适配 柱状图 折线图
// let stringList = []; let stringList = [];
// let decollatePlanarList =[];//适配 表格d let decollatePlanarList =[];//适配 表格d
// let titltListConfig = {}; let titltListConfig = {};
blockDataList.forEach(info => {
if (info.blockTitle.indexOf("趋势") > -1) {
barChartList.push(info.blockTitle);
} else {
keyValueOrTitleList.push(info.blockTitle);
}
});
let result = packageDataProcess(blockDataList, {}, keyValueOrTitleList, barChartList, [], []); let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result; return result;
......
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function zzbznbTableData() {
let blockDataList = onceSheetBecomeOfblockData('kyszhglpt.xlsx', '周周播_100周年版');
let keyValueOrTitleList = ["课程来源情况","课程适用年级段","课程领域分布","课程数分析","搜索栏分析","课程信息","课程反馈数据","课程播放情况","热门课程排行top10(本周)","热门标签","课程反馈","在线公益课程评分"];//适配 饼图 键值以及需要多个key的
let barChartList = ["课程类别(艺术)","ESCSA课程投放平台","中国电信课程投放平台","东方网教育课程投放平台","bilibili课程投放平台","课程观看趋势(本周)","平台播放量趋势","课程收藏/转发量","课程类型热度排行"]; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =[];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
\ No newline at end of file
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function zzbrcbTableData() {
let blockDataList = onceSheetBecomeOfblockData('kyszhglpt.xlsx', '周周播_日程版');
let keyValueOrTitleList = ["课程类别_艺术","ESCSA课程投放平台","课程来源情况","课程适用年级段","课程领域分布","课程数分析","搜索栏分析","课程信息","课程反馈数据","课程播放情况","热门课程排行top10_本周",
"热门标签","课程反馈","在线公益课程评分"];//适配 饼图 键值以及需要多个key的
let barChartList = ["中国电信课程投放平台","东方网教育课程投放平台","bilibili课程投放平台",
"9月平台播放量趋势","课程收藏/转发量"]; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =[];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
\ No newline at end of file
...@@ -82,7 +82,6 @@ let tokenInfoQueue = {}; ...@@ -82,7 +82,6 @@ let tokenInfoQueue = {};
//结构 sub: {lastTokenMs, access_token, refresh_token, isAdmin} //结构 sub: {lastTokenMs, access_token, refresh_token, isAdmin}
//登录成功后添加tokne //登录成功后添加tokne
export function addTokenInfo(sub, lastTokenMs, access_token, refresh_token, isAdmin) { export function addTokenInfo(sub, lastTokenMs, access_token, refresh_token, isAdmin) {
tokenInfoQueue[sub] = { tokenInfoQueue[sub] = {
lastTokenMs, access_token, refresh_token, isAdmin lastTokenMs, access_token, refresh_token, isAdmin
}; };
...@@ -132,7 +131,8 @@ export function checkAdminPermission(userId) { ...@@ -132,7 +131,8 @@ export function checkAdminPermission(userId) {
//校验是否有权限到大屏 //校验是否有权限到大屏
export function checkPagePermission(userId, page) { export function checkPagePermission(userId, page) {
let { pm } = userQueue[userId]; // let { pm } = userQueue[userId];
if (pm && pm[page] ) return true return true
return false // if (pm && pm[page] ) return true
// return false
} }
\ No newline at end of file
...@@ -60,6 +60,7 @@ export function getOnceYBarChartOut(title, data, stepCount?) { ...@@ -60,6 +60,7 @@ export function getOnceYBarChartOut(title, data, stepCount?) {
* @returns {title:标题, xUnit:x轴单位, leftYUnit:左边单位, rightYUnit:右边单位, leftYMinValue:左边最小值, leftYMaxValue:左边最大值, leftYStepValue:左边间隔, * @returns {title:标题, xUnit:x轴单位, leftYUnit:左边单位, rightYUnit:右边单位, leftYMinValue:左边最小值, leftYMaxValue:左边最大值, leftYStepValue:左边间隔,
* rightYMinValue:右边最小值, rightYMaxValue:右边最大值, rightYStepValue:右边间隔, * rightYMinValue:右边最小值, rightYMaxValue:右边最大值, rightYStepValue:右边间隔,
* dataList:[{subTitle:数据名称, total:总数, unit:单位, subDataList:[{name:y轴名称, value:值, unit:单位}] }] } * dataList:[{subTitle:数据名称, total:总数, unit:单位, subDataList:[{name:y轴名称, value:值, unit:单位}] }] }
*
* 入参data里面的dataInfo中的unit可以为空 会读取yUnit 所以入参优先度 yUnit > unit 默认值都是空字符串 * 入参data里面的dataInfo中的unit可以为空 会读取yUnit 所以入参优先度 yUnit > unit 默认值都是空字符串
*/ */
export function getDoubleYBarChartOut(title, data, stepCountInfo?) { export function getDoubleYBarChartOut(title, data, stepCountInfo?) {
...@@ -146,10 +147,10 @@ export function getKeyValueOut(title, data) { ...@@ -146,10 +147,10 @@ export function getKeyValueOut(title, data) {
let {key, value, unit} = info; let {key, value, unit} = info;
let typeChangeValue; let typeChangeValue;
if (!isNaN(value)) { if (!isNaN(value)) {
typeChangeValue = parseFloat(value); typeChangeValue = Math.round(parseFloat(value) * 100) /100;
total+= typeChangeValue; total+= typeChangeValue;
} else typeChangeValue = value; } else typeChangeValue = value;
dataList.push({name:key, value: Math.round(typeChangeValue * 100) /100, unit}); dataList.push({name:key, value: typeChangeValue, unit});
}); });
return {title, total: Math.round(total * 100) /100, count:dataList.length, dataList}; return {title, total: Math.round(total * 100) /100, count:dataList.length, dataList};
......
/**
* 申生康接口返回格式处理
*/
/**
* 处理学生和教职工的性别占比
* @param rawData
* @returns
*/
export function formatGenderData(rawData: any[]) {
let studentData = rawData.filter(item => item.rylx === "学生");
let teacherData = rawData.filter(item => item.rylx === "教职工");
let formatItem = (item: any) => {
let genderKey = item.gender === "男" ? "男生" : "女生";
let percent = parseFloat(item.value).toFixed(2); // 保留一位小数
let value = `${item.nums}${percent}%)`;
return { key: genderKey, value };
};
// 确保男生在前、女生在后
let sortByGender = (arr: any[]) => arr.sort((a, b) => (a.gender === "男" ? -1 : 1));
let xbzbxs = sortByGender(studentData).map(formatItem);
let xbzbls = sortByGender(teacherData).map(formatItem);
return { xbzbxs, xbzbls };
}
/**
* 处理学段人数分析
* @param rawData
* @returns
*/
export function formatXDRSFX(rawData: any[]) {
let order = ["托幼", "小学", "初中", "高中", "大学", "其他"];
let students = rawData
.filter(item => item.rylx === "学生")
.map(item => ({ name: item.xxlx, value: parseInt(item.nums), unit: "" }));
let teachers = rawData
.filter(item => item.rylx === "教职工")
.map(item => ({ name: item.xxlx, value: parseInt(item.nums), unit: "" }));
let sortByOrder = (arr: { name: string; value: number; unit: string }[]) =>
arr.sort((a, b) => order.indexOf(a.name) - order.indexOf(b.name));
return {
xxs: sortByOrder(students),
jzg: sortByOrder(teachers)
};
}
/**
* 处理各区学生老师机构数
* @param rawData
* @returns
*/
export function formatDistrictData(rawData: any[]) {
let students = rawData.map(item => ({ key: item.xzqmc, value: parseInt(item.stu_count) }));
let teachers = rawData.map(item => ({ key: item.xzqmc, value: parseInt(item.tea_count) }));
let orgs = rawData.map(item => ({ key: item.xzqmc, value: parseInt(item.org_count) }));
let sortDesc = (arr: { key: string; value: number }[]) =>
arr.sort((a, b) => b.value - a.value).map(item => ({ key: item.key, value: `${item.value}人` }));
return {
"gqxssfb": sortDesc(students),
"gqjssfb": sortDesc(teachers),
"gqjgsfb": sortDesc(orgs)
};
}
/**
* 处理近一周上报率
* @param data
* @returns
*/
export function getLastWeekReportRate(data: any[]) {
// 按日期降序排序
let sorted = [...data].sort((a, b) => new Date(b.rq).getTime() - new Date(a.rq).getTime());
// 取最近7天
let last7Days = sorted.slice(0, 7);
// 按日期升序排序
last7Days.sort((a, b) => new Date(a.rq).getTime() - new Date(b.rq).getTime());
return last7Days.map(item => ({
key: item.rq.slice(5).replace('-', '.'), // "2026-05-20" -> "05.20"
value: item.jrsbl
}));
}
/**
* 处理学生和教职工因病缺课人数
* @param rawData
* @returns
*/
export function formatAbsenceDetail(data: any[]) {
let student = data.find(item => item.name === "学生");
let teacher = data.find(item => item.name === "教职工");
return {
xsjqybqkrs: [
{ key: "因病缺课人数", value: student ? parseInt(student.ybqk) : 0 },
{ key: "其他缺课人数", value: student ? parseInt(student.qtqk) : 0 }
],
jzgjqybqkrs: [
{ key: "因病缺课人数", value: teacher ? parseInt(teacher.ybqk) : 0 },
{ key: "其他缺课人数", value: teacher ? parseInt(teacher.qtqk) : 0 }
]
};
}
/**
* 处理学生和教职工近期缺课原因占比
* @param data
* @returns
*/
export function formatAbsenceReason(data: any[]) {
let typeMap: Record<string, string> = {
"症状信息": "症状",
"疾病信息": "疾病",
"伤害信息": "伤害",
"其他原因": "其他"
};
let students = data.filter(item => item.rylx === "学生");
let teachers = data.filter(item => item.rylx === "教职工");
let buildResult = (items: any[]) => {
return items.map(item => ({
key: typeMap[item.fl],
value: item.nums,
ratio: parseFloat(item.ratio) // 如需整数:Math.round(parseFloat(item.ratio))
}));
};
// 按自定义顺序排序:症状、疾病、伤害、其他
let order = ["症状", "疾病", "伤害", "其他"];
let sortByOrder = (arr: { key: string; value: number }[]) =>
arr.sort((a, b) => order.indexOf(a.key) - order.indexOf(b.key));
return {
jqqkyyzb: sortByOrder(buildResult(students)),
jzgjqqkyyzb: sortByOrder(buildResult(teachers))
};
}
/**
* 处理病症人数分析
* @param rawData
* @returns
*/
export function formatSymptomData(rawData: any[]) {
let sorted = [...rawData].sort((a, b) => Number(b.zrs) - Number(a.zrs));
let zrs = sorted.map(item => ({
key: item.xx,
value: Number(item.zrs)
}));
let xfbls = sorted.map(item => ({
key: item.xx,
value: Number(item.xfbls)
}));
return { zrs, xfbls };
}
/**
* 病发时间情况分析
* @param data
* @returns
*/
export function formatBFSJQKFX(data: any[]) {
let schoolTypes = ["托幼", "小学", "初中", "高中", "大学"];
let timeKeys = ["非教学日", "放学后", "未到校", "入校后"];
let outputKeyMap: Record<string, string> = {
"非教学日": "非教学日",
"放学后": "放学日",
"未到校": "未到校",
"入校后": "入校后"
};
// 初始化每个学段的数据
let schoolData: Record<string, Record<string, number>> = {};
schoolTypes.forEach(school => {
schoolData[school] = {};
timeKeys.forEach(tk => {
schoolData[school][tk] = 0;
});
});
// 填充数据
data.forEach(item => {
let school = item.xxlx;
let timeName = item.name;
let value = parseInt(item.nums);
if (schoolTypes.includes(school) && timeKeys.includes(timeName)) {
schoolData[school][timeName] = value;
}
});
// 计算全部
let totalData: Record<string, number> = {};
timeKeys.forEach(tk => { totalData[tk] = 0; });
schoolTypes.forEach(school => {
timeKeys.forEach(tk => {
totalData[tk] += schoolData[school][tk];
});
});
// 构建输出
let dataList: any = {};
// 添加全部
dataList["全部"] = timeKeys.map(tk => ({
key: outputKeyMap[tk],
value: totalData[tk]
}));
// 添加各学段
schoolTypes.forEach(school => {
dataList[school] = timeKeys.map(tk => ({
key: outputKeyMap[tk],
value: schoolData[school][tk]
}));
});
return dataList;
}
/**
* 处理顶部缺勤
* @param data
* @returns
*/
export function formatAbsenceTotal(data: any[]) {
let studentItem = data.find(item => item.type === "学生");
let teacherItem = data.find(item => item.type === "教职工");
let qkzrs = [
{
key: "缺课总人数",
ybqkljxs: studentItem ? parseInt(studentItem.nums) : 0,
drxz: studentItem ? parseInt(studentItem.nums) : 0
}
];
let qqjzg = [
{
key: "缺勤教职工",
ybqkljxs: teacherItem ? parseInt(teacherItem.nums) : 0,
drxz: teacherItem ? parseInt(teacherItem.nums) : 0
}
];
return { qkzrs, qqjzg };
}
/**
* 处理顶部缺课学生数
* @param data
* @returns
*/
export function formatQkxss(data: any[]) {
let order = ["托幼", "小学", "初中", "高中", "大学"];
let map: Record<string, number> = {};
data.forEach(item => {
map[item.xxlx] = parseInt(item.nums);
});
let result = order.map(school => ({
key: school,
ybqkljxs: map[school] || 0,
drxz: 0 // 无当日新增数据,默认为0
}));
return result;
}
import { initActivityQueue } from "./data/interface/activeQueueData"; import { initOperationLog } from "./biz/operationLogService";
import { initBaiDuToken } from "./data/interface/baiduStats"; import { getUserInfo } from "./biz/user";
import { getAccessToken, getRefreshToken } from "./data/interface/baiduyun";
import { initInterfaceData, post } from "./data/interface/cronJob";
import { initToken } from "./data/interface/data"; import { initToken } from "./data/interface/data";
import { initQueueData } from "./data/interface/queueData"; import { initQueueData } from "./data/interface/queueData";
import * as healthInformation from "./data/interface/secondPhase/healthInformation"; import * as healthInformation from "./data/interface/secondPhase/healthInformation";
...@@ -20,11 +18,12 @@ async function lanuch() { ...@@ -20,11 +18,12 @@ async function lanuch() {
} }
initUser(); initUser();
// initActivityQueue();
// test();
httpServer.createServer(getPort()); httpServer.createServer(getPort());
// 初始化操作日志
// initOperationLog();
// console.log("操作日志系统初始化完成");
} }
async function test() { async function test() {
......
...@@ -2,12 +2,12 @@ import express = require('express'); ...@@ -2,12 +2,12 @@ import express = require('express');
import bodyParser = require('body-parser'); import bodyParser = require('body-parser');
import routers = require('../routers/router'); import routers = require('../routers/router');
import compression = require('compression'); import compression = require('compression');
import { encryptionReturn } from '../middleware/encryptionReturn'; import fallback from 'express-history-api-fallback';
import { getEnv } from '../serverConfig';
import * as fallback from 'express-history-api-fallback';
import * as path from "path"; import * as path from "path";
import { watch } from '../middleware/watch'; import { watch } from '../middleware/watch';
import { httpErrorHandler } from '../middleware/httpErrorHandler'; import { httpErrorHandler } from '../middleware/httpErrorHandler';
import { operationLogger } from '../middleware/operationLogger';
import { FileMonitorService } from '../biz/fileMonitorService';
export class httpServer { export class httpServer {
static createServer(port:number) { static createServer(port:number) {
...@@ -27,14 +27,25 @@ export class httpServer { ...@@ -27,14 +27,25 @@ export class httpServer {
next(); next();
} }
}); });
httpServer.use(bodyParser.json({limit:"10mb"}));
httpServer.use(bodyParser.json({limit:"10kb"})); httpServer.use(bodyParser.urlencoded({ extended: true, limit: "10mb" }));
httpServer.use(compression()) httpServer.use(compression())
// 应用操作日志中间件到所有路由
httpServer.use(operationLogger);
httpServer.use(watch); httpServer.use(watch);
routers.setRouter(httpServer); routers.setRouter(httpServer);
httpServer.use(httpErrorHandler); httpServer.use(httpErrorHandler);
// 启动文件监控服务
const fileMonitor = new FileMonitorService();
const userJsonPath = path.join(__dirname, '../../res/user.json');
fileMonitor.startMonitoring(userJsonPath);
console.log('文件监控服务已启动');
httpServer.use(express.static(path.join(__dirname, "../../img/")) );
const root = path.join(__dirname, "../../public/") const root = path.join(__dirname, "../../public/")
httpServer.use(express.static(root)) httpServer.use(express.static(root))
httpServer.use(fallback('index.html', { root })) httpServer.use(fallback('index.html', { root }))
......
import * as asyncHandler from 'express-async-handler'
import asyncHandler = require('express-async-handler');
import * as sjzltxBiz from '../biz/sjzltx'; import * as sjzltxBiz from '../biz/sjzltx';
import * as ztyxtsBiz from '../biz/ztyxts'; import * as ztyxtsBiz from '../biz/ztyxts';
import * as zyhdbzBiz from '../biz/zyhdbz'; import * as zyhdbzBiz from '../biz/zyhdbz';
import * as userBiz from '../biz/user'; import * as userBiz from '../biz/user';
import * as weeklyPlayBiz from '../biz/three/zzb';
import * as zzb_100znbBiz from '../biz/three/zzb_100znb';
import * as qsnkjcxsjgzzBiz from '../biz/three/qsnkjcxsjgzz'; import * as qsnkjcxsjgzzBiz from '../biz/three/qsnkjcxsjgzz';
import * as ysysdaBiz from '../biz/three/ysysda'; import * as ysysdaBiz from '../biz/three/ysysda';
import * as zyhdbzListBiz from '../biz/three/zyhdbz'; import * as zyhdbzListBiz from '../biz/three/zyhdbz';
import * as jyyzzyBiz from '../biz/three/jyyzzy'; import * as jyyzzyBiz from '../biz/three/jyyzzy';
import * as kxyjyBiz from '../biz/three/kxyjy'; import * as kxyjyBiz from '../biz/three/kxyjy';
import * as sskBiz from '../biz/three/ssk'; import * as sskBiz from '../biz/three/ssk';
import * as weeklyPlayBiz from '../biz/three/weeklyPlay';
import * as logsBiz from '../biz/operationLogService';
import { adminPermission, checkToken, pagePermission } from '../middleware/sign'; import { adminPermission, checkToken, pagePermission } from '../middleware/sign';
//二期 //二期
import * as healthBiz from '../biz/secondPhase/healthInformation'; import * as healthBiz from '../biz/secondPhase/healthInformation';
import * as workstationBiz from '../biz/secondPhase/workstation'; import * as workstationBiz from '../biz/secondPhase/workstation';
import * as workstationPopupBiz from '../biz/secondPhase/workstationPopup'; import * as workstationPopupBiz from '../biz/secondPhase/workstationPopup';
import * as authBiz from '../biz/auth';
export function setRouter(httpServer){ export function setRouter(httpServer){
// httpServer.get('/interface/sjzltx', asyncHandler(sjzltxBiz.getData));
// httpServer.post('/interface/sjzltx', asyncHandler(sjzltxBiz.getData));
// httpServer.get('/interface/ztyxts', asyncHandler(ztyxtsBiz.getData));
// httpServer.post('/interface/ztyxts', asyncHandler(ztyxtsBiz.getData));
// httpServer.get('/interface/zyhdbz', asyncHandler(zyhdbzBiz.getData));
// httpServer.post('/interface/zyhdbz', asyncHandler(zyhdbzBiz.getData));
// httpServer.get('/interface/zyhdbzpop', asyncHandler(zyhdbzBiz.getPopData));
// httpServer.post('/interface/zyhdbzpop', asyncHandler(zyhdbzBiz.getPopData));
// // //分配权限
// httpServer.post('/interface/permission/getlist', checkToken, adminPermission, asyncHandler(userBiz.permissionList));
// httpServer.post('/interface/permission/updatepermission',checkToken, adminPermission, asyncHandler(userBiz.updatePermissions));
// //==二级页面
// httpServer.post('/interface/gettoken', asyncHandler(userBiz.getUserToken));
// httpServer.post('/interface/permission/checkpage', checkToken, pagePermission, asyncHandler(userBiz.checkPermissionForPage) );
// httpServer.post('/interface/permission/checkadmin', checkToken, pagePermission, asyncHandler(userBiz.checkPermissionForAdmin) );
// httpServer.post('/interface/permission/checkhomepage', checkToken, asyncHandler(userBiz.checkPermissionForHomePage) );
// //二期
// httpServer.get('/interface/secondPhase/gradehealth', checkToken, asyncHandler(healthBiz.getData));
// httpServer.get('/interface/secondPhase/workstation', checkToken, asyncHandler(workstationBiz.getData));
// httpServer.get('/interface/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData));
// httpServer.post('/interface/secondPhase/gradehealth', checkToken, asyncHandler(healthBiz.getData));
// httpServer.post('/interface/secondPhase/workstation', checkToken, asyncHandler(workstationBiz.getData));
// httpServer.post('/interface/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData));
// httpServer.get('/test/secondPhase/workstation', asyncHandler(workstationBiz.getTest));
// httpServer.post('/test/secondPhase/workstation', asyncHandler(workstationBiz.getTest));
//数据治理体系 //数据治理体系
httpServer.get('/sjzltx', asyncHandler(sjzltxBiz.getData)); httpServer.get('/sjzltx', asyncHandler(sjzltxBiz.getData));
httpServer.post('/sjzltx', asyncHandler(sjzltxBiz.getData)); httpServer.post('/sjzltx', asyncHandler(sjzltxBiz.getData));
...@@ -67,29 +33,24 @@ export function setRouter(httpServer){ ...@@ -67,29 +33,24 @@ export function setRouter(httpServer){
httpServer.get('/zyhdbzpop', asyncHandler(zyhdbzBiz.getPopData)); httpServer.get('/zyhdbzpop', asyncHandler(zyhdbzBiz.getPopData));
httpServer.post('/zyhdbzpop', asyncHandler(zyhdbzBiz.getPopData)); httpServer.post('/zyhdbzpop', asyncHandler(zyhdbzBiz.getPopData));
// //分配权限
httpServer.post('/interface/permission/getlist', checkToken, adminPermission, asyncHandler(userBiz.permissionList));
httpServer.post('/interface/permission/updatepermission',checkToken, adminPermission, asyncHandler(userBiz.updatePermissions));
//==二级页面 //=========二级页面
httpServer.post('/gettoken', asyncHandler(userBiz.getUserToken)); httpServer.post('/gettoken', asyncHandler(userBiz.getUserToken));
httpServer.post('/permission/checkpage', pagePermission, asyncHandler(userBiz.checkPermissionForPage) ); // httpServer.post('/permission/checkpage', pagePermission, asyncHandler(userBiz.checkPermissionForPage) );
httpServer.post('/permission/checkadmin', pagePermission, asyncHandler(userBiz.checkPermissionForAdmin) ); // httpServer.post('/permission/checkadmin', pagePermission, asyncHandler(userBiz.checkPermissionForAdmin) );
httpServer.post('/permission/checkpage', asyncHandler(userBiz.checkPermissionForPage) );
httpServer.post('/permission/checkadmin', asyncHandler(userBiz.checkPermissionForAdmin) );
httpServer.post('/permission/checkhomepage', asyncHandler(userBiz.checkPermissionForHomePage) ); httpServer.post('/permission/checkhomepage', asyncHandler(userBiz.checkPermissionForHomePage) );
//二期 //二期
// httpServer.get('/secondPhase/gradehealth', asyncHandler(healthBiz.getData)); httpServer.get('/secondPhase/gradehealth', asyncHandler(healthBiz.getData));
// httpServer.post('/secondPhase/gradehealth', asyncHandler(healthBiz.getData)); httpServer.post('/secondPhase/gradehealth', asyncHandler(healthBiz.getData));
httpServer.get('/secondPhase/workstation', asyncHandler(workstationBiz.getData)); httpServer.get('/secondPhase/workstation', asyncHandler(workstationBiz.getData));
httpServer.post('/secondPhase/workstation', asyncHandler(workstationBiz.getData)); httpServer.post('/secondPhase/workstation', asyncHandler(workstationBiz.getData));
httpServer.get('/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData)); httpServer.get('/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData));
httpServer.post('/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData)); httpServer.post('/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData));
// httpServer.get('/test/secondPhase/workstation', asyncHandler(workstationBiz.getTest));
// httpServer.post('/test/secondPhase/workstation', asyncHandler(workstationBiz.getTest));
//三期 //三期
//周周播 //周周播
httpServer.get('/weeklyplay', asyncHandler(weeklyPlayBiz.getData)); httpServer.get('/weeklyplay', asyncHandler(weeklyPlayBiz.getData));
...@@ -100,9 +61,6 @@ export function setRouter(httpServer){ ...@@ -100,9 +61,6 @@ export function setRouter(httpServer){
httpServer.post('/dropdown', asyncHandler(weeklyPlayBiz.dropDown)); httpServer.post('/dropdown', asyncHandler(weeklyPlayBiz.dropDown));
//2024-12-28 //2024-12-28
//周周播 success
httpServer.post('/zzb_100znb', asyncHandler(zzb_100znbBiz.getData));
httpServer.get('/zzb_100znb', asyncHandler(zzb_100znbBiz.getData));
//实践工作站 success //实践工作站 success
httpServer.post('/qsnkjcxsjgzz', asyncHandler(qsnkjcxsjgzzBiz.getData)); httpServer.post('/qsnkjcxsjgzz', asyncHandler(qsnkjcxsjgzzBiz.getData));
httpServer.get('/qsnkjcxsjgzz', asyncHandler(qsnkjcxsjgzzBiz.getData)); httpServer.get('/qsnkjcxsjgzz', asyncHandler(qsnkjcxsjgzzBiz.getData));
...@@ -119,9 +77,19 @@ export function setRouter(httpServer){ ...@@ -119,9 +77,19 @@ export function setRouter(httpServer){
httpServer.post('/jyyzzy/kcsj', asyncHandler(jyyzzyBiz.getKcsj)); httpServer.post('/jyyzzy/kcsj', asyncHandler(jyyzzyBiz.getKcsj));
httpServer.get('/jyyzzy/kcsj', asyncHandler(jyyzzyBiz.getKcsj)); httpServer.get('/jyyzzy/kcsj', asyncHandler(jyyzzyBiz.getKcsj));
//科学研究院 success //科学研究院 success
httpServer.post('/kxyjy', asyncHandler(kxyjyBiz.getData));//弃用 httpServer.post('/kxyjy', asyncHandler(kxyjyBiz.getData));
httpServer.get('/kxyjy', asyncHandler(kxyjyBiz.getData));//弃用 httpServer.get('/kxyjy', asyncHandler(kxyjyBiz.getData));
//科学研究院地图
httpServer.post('/kxyjy/map', asyncHandler(kxyjyBiz.getMap));
httpServer.get('/kxyjy/map', asyncHandler(kxyjyBiz.getMap));
//申申康 名称 success //申申康 名称 success
httpServer.post('/ssk', asyncHandler(sskBiz.getData));
httpServer.get('/ssk', asyncHandler(sskBiz.getData));
httpServer.post('/ssk/jrsbxx', asyncHandler(sskBiz.getJrsbxx));
httpServer.get('/ssk/jrsbxx', asyncHandler(sskBiz.getJrsbxx));
httpServer.post('/ssk/cityname', asyncHandler(sskBiz.getCityName)); httpServer.post('/ssk/cityname', asyncHandler(sskBiz.getCityName));
httpServer.get('/ssk/cityname', asyncHandler(sskBiz.getCityName)); httpServer.get('/ssk/cityname', asyncHandler(sskBiz.getCityName));
...@@ -136,4 +104,23 @@ export function setRouter(httpServer){ ...@@ -136,4 +104,23 @@ export function setRouter(httpServer){
httpServer.post('/ssk/ybqkqs', asyncHandler(sskBiz.getYbqkqs)); httpServer.post('/ssk/ybqkqs', asyncHandler(sskBiz.getYbqkqs));
httpServer.get('/ssk/ybqkqs', asyncHandler(sskBiz.getYbqkqs)); httpServer.get('/ssk/ybqkqs', asyncHandler(sskBiz.getYbqkqs));
//2025统一认证调整
httpServer.post('/auth/accesstoken', asyncHandler(authBiz.handleAuthCallback));
httpServer.get('/auth/accesstoken', asyncHandler(authBiz.handleAuthCallback));
// //分配权限
// httpServer.post('/permission/getlist', adminPermission, asyncHandler(userBiz.permissionList));
// httpServer.post('/permission/updatepermission', adminPermission, asyncHandler(userBiz.updatePermissions));
// //获取操作日志列表
// httpServer.post('/permission/operationlog', adminPermission, asyncHandler(logsBiz.getOperationLogList));
//分配权限
httpServer.post('/permission/getlist', asyncHandler(userBiz.permissionList));
httpServer.post('/permission/updatepermission', asyncHandler(userBiz.updatePermissions));
//获取操作日志列表
httpServer.post('/permission/operationlog', asyncHandler(logsBiz.getOperationLogList));
} }
\ No newline at end of file
/**
* 线上环境使用这份路由配置
*/
import asyncHandler = require('express-async-handler');
import * as sjzltxBiz from '../biz/sjzltx';
import * as ztyxtsBiz from '../biz/ztyxts';
import * as zyhdbzBiz from '../biz/zyhdbz';
import * as userBiz from '../biz/user';
import * as qsnkjcxsjgzzBiz from '../biz/three/qsnkjcxsjgzz';
import * as ysysdaBiz from '../biz/three/ysysda';
import * as zyhdbzListBiz from '../biz/three/zyhdbz';
import * as jyyzzyBiz from '../biz/three/jyyzzy';
import * as kxyjyBiz from '../biz/three/kxyjy';
import * as sskBiz from '../biz/three/ssk';
import * as weeklyPlayBiz from '../biz/three/weeklyPlay';
import * as logsBiz from '../biz/operationLogService';
import { adminPermission, checkToken, pagePermission } from '../middleware/sign';
//二期
import * as healthBiz from '../biz/secondPhase/healthInformation';
import * as workstationBiz from '../biz/secondPhase/workstation';
import * as workstationPopupBiz from '../biz/secondPhase/workstationPopup';
import * as authBiz from '../biz/auth';
export function setRouter(httpServer){
// httpServer.get('/interface/sjzltx', asyncHandler(sjzltxBiz.getData));
// httpServer.post('/interface/sjzltx', asyncHandler(sjzltxBiz.getData));
// httpServer.get('/interface/ztyxts', asyncHandler(ztyxtsBiz.getData));
// httpServer.post('/interface/ztyxts', asyncHandler(ztyxtsBiz.getData));
// httpServer.get('/interface/zyhdbz', asyncHandler(zyhdbzBiz.getData));
// httpServer.post('/interface/zyhdbz', asyncHandler(zyhdbzBiz.getData));
// httpServer.get('/interface/zyhdbzpop', asyncHandler(zyhdbzBiz.getPopData));
// httpServer.post('/interface/zyhdbzpop', asyncHandler(zyhdbzBiz.getPopData));
// // //分配权限
// httpServer.post('/interface/permission/getlist', checkToken, adminPermission, asyncHandler(userBiz.permissionList));
// httpServer.post('/interface/permission/updatepermission',checkToken, adminPermission, asyncHandler(userBiz.updatePermissions));
// //==二级页面
// httpServer.post('/interface/gettoken', asyncHandler(userBiz.getUserToken));
// httpServer.post('/interface/permission/checkpage', checkToken, pagePermission, asyncHandler(userBiz.checkPermissionForPage) );
// httpServer.post('/interface/permission/checkadmin', checkToken, pagePermission, asyncHandler(userBiz.checkPermissionForAdmin) );
// httpServer.post('/interface/permission/checkhomepage', checkToken, asyncHandler(userBiz.checkPermissionForHomePage) );
// //二期
httpServer.get('/interface/secondPhase/gradehealth', checkToken, asyncHandler(healthBiz.getData));
httpServer.get('/interface/secondPhase/workstation', checkToken, asyncHandler(workstationBiz.getData));
httpServer.get('/interface/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData));
// httpServer.post('/interface/secondPhase/gradehealth', checkToken, asyncHandler(healthBiz.getData));
// httpServer.post('/interface/secondPhase/workstation', checkToken, asyncHandler(workstationBiz.getData));
// httpServer.post('/interface/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData));
// httpServer.get('/test/secondPhase/workstation', asyncHandler(workstationBiz.getTest));
// httpServer.post('/test/secondPhase/workstation', asyncHandler(workstationBiz.getTest));
//数据治理体系
httpServer.get('/interface/sjzltx', checkToken, asyncHandler(sjzltxBiz.getData));
httpServer.post('/interface/sjzltx', checkToken, asyncHandler(sjzltxBiz.getData));
//整体运行态势
httpServer.get('/interface/ztyxts', checkToken, asyncHandler(ztyxtsBiz.getData));
httpServer.post('/interface/ztyxts', checkToken, asyncHandler(ztyxtsBiz.getData));
//重要活动保障
httpServer.get('/interface/zyhdbz', checkToken, asyncHandler(zyhdbzBiz.getData));
httpServer.post('/interface/zyhdbz', checkToken, asyncHandler(zyhdbzBiz.getData));
httpServer.get('/interface/zyhdbzpop', checkToken, asyncHandler(zyhdbzBiz.getPopData));
httpServer.post('/interface/zyhdbzpop', checkToken, asyncHandler(zyhdbzBiz.getPopData));
// //分配权限
httpServer.post('/interface/permission/getlist', checkToken, adminPermission, asyncHandler(userBiz.permissionList));
httpServer.post('/interface/permission/updatepermission', checkToken, adminPermission, asyncHandler(userBiz.updatePermissions));
//==二级页面
httpServer.post('/interface/gettoken', asyncHandler(userBiz.getUserToken));
httpServer.post('/interface/permission/checkpage', checkToken, pagePermission, asyncHandler(userBiz.checkPermissionForPage) );
httpServer.post('/interface/permission/checkadmin', checkToken, pagePermission, asyncHandler(userBiz.checkPermissionForAdmin) );
httpServer.post('/interface/permission/checkhomepage', checkToken, asyncHandler(userBiz.checkPermissionForHomePage) );
//二期
httpServer.get('/interface/secondPhase/gradehealth', checkToken, asyncHandler(healthBiz.getData));
httpServer.post('/interface/secondPhase/gradehealth', checkToken, asyncHandler(healthBiz.getData));
// httpServer.get('/secondPhase/workstation', asyncHandler(workstationBiz.getData));
// httpServer.post('/secondPhase/workstation', asyncHandler(workstationBiz.getData));
// httpServer.get('/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData));
// httpServer.post('/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData));
// httpServer.get('/test/secondPhase/workstation', asyncHandler(workstationBiz.getTest));
// httpServer.post('/test/secondPhase/workstation', asyncHandler(workstationBiz.getTest));
//三期
//周周播
httpServer.get('/interface/weeklyplay', checkToken, asyncHandler(weeklyPlayBiz.getData));
httpServer.post('/interface/weeklyplay', checkToken, asyncHandler(weeklyPlayBiz.getData));
httpServer.get('/interface/curriculumpop', checkToken, asyncHandler(weeklyPlayBiz.curriculumPop));
httpServer.post('/interface/curriculumpop', checkToken, asyncHandler(weeklyPlayBiz.curriculumPop));
httpServer.get('/interface/dropdown', checkToken, asyncHandler(weeklyPlayBiz.dropDown));
httpServer.post('/interface/dropdown', checkToken, asyncHandler(weeklyPlayBiz.dropDown));
//2024-12-28
//实践工作站 success
httpServer.post('/interface/qsnkjcxsjgzz', checkToken, asyncHandler(qsnkjcxsjgzzBiz.getData));
httpServer.get('/interface/qsnkjcxsjgzz', checkToken, asyncHandler(qsnkjcxsjgzzBiz.getData));
//一生一档案 success
httpServer.post('/interface/ysysda', checkToken, asyncHandler(ysysdaBiz.getData));
httpServer.get('/interface/ysysda', checkToken, asyncHandler(ysysdaBiz.getData));
//重要活动保障 error
httpServer.post('/interface/zyhdbzlist', checkToken, asyncHandler(zyhdbzListBiz.getData));
httpServer.get('/interface/zyhdbzlist', checkToken, asyncHandler(zyhdbzListBiz.getData));
//教育优质资源 success
httpServer.post('/interface/jyyzzy', checkToken, asyncHandler(jyyzzyBiz.getData));
httpServer.get('/interface/jyyzzy', checkToken, asyncHandler(jyyzzyBiz.getData));
//教育优质资源右侧内容 error
httpServer.post('/interface/jyyzzy/kcsj', checkToken, asyncHandler(jyyzzyBiz.getKcsj));
httpServer.get('/interface/jyyzzy/kcsj', checkToken, asyncHandler(jyyzzyBiz.getKcsj));
//科学研究院 success
httpServer.post('/interface/kxyjy', checkToken, asyncHandler(kxyjyBiz.getData));
httpServer.get('/interface/kxyjy', checkToken, asyncHandler(kxyjyBiz.getData));
//科学研究院地图
httpServer.post('/interface/kxyjy/map', checkToken, asyncHandler(kxyjyBiz.getMap));
httpServer.get('/interface/kxyjy/map', checkToken, asyncHandler(kxyjyBiz.getMap));
//申申康 名称 success
httpServer.post('/interface/ssk', checkToken, asyncHandler(sskBiz.getData));
httpServer.get('/interface/ssk', checkToken, asyncHandler(sskBiz.getData));
httpServer.post('/interface/ssk/jrsbxx', checkToken, asyncHandler(sskBiz.getJrsbxx));
httpServer.get('/interface/ssk/jrsbxx', checkToken, asyncHandler(sskBiz.getJrsbxx));
httpServer.post('/interface/ssk/cityname', checkToken, asyncHandler(sskBiz.getCityName));
httpServer.get('/interface/ssk/cityname', checkToken, asyncHandler(sskBiz.getCityName));
httpServer.post('/interface/ssk/map', checkToken, asyncHandler(sskBiz.getMap));
httpServer.get('/interface/ssk/map', checkToken, asyncHandler(sskBiz.getMap));
httpServer.post('/interface/ssk/gfjbqs', checkToken, asyncHandler(sskBiz.getGfjbqs));
httpServer.get('/interface/ssk/gfjbqs', checkToken, asyncHandler(sskBiz.getGfjbqs));
httpServer.post('/interface/ssk/jjxmz', checkToken, asyncHandler(sskBiz.getJjxmz));
httpServer.get('/interface/ssk/jjxmz', checkToken, asyncHandler(sskBiz.getJjxmz));
httpServer.post('/interface/ssk/ybqkqs', checkToken, asyncHandler(sskBiz.getYbqkqs));
httpServer.get('/interface/ssk/ybqkqs', checkToken, asyncHandler(sskBiz.getYbqkqs));
//2025统一认证调整
httpServer.post('/interface/auth/accesstoken', asyncHandler(authBiz.handleAuthCallback));
httpServer.get('/interface/auth/accesstoken', asyncHandler(authBiz.handleAuthCallback));
//获取操作日志列表
// httpServer.post('/interface/operationlog', adminPermission, asyncHandler(logsBiz.getOperationLogList));
httpServer.post('/interface/permission/operationlog', checkToken, adminPermission, asyncHandler(logsBiz.getOperationLogList));
}
\ No newline at end of file
//端口 //端口
export function getPort() : number { export function getPort() : number {
return Number(process.env.PORT) || Number(process.argv[3]) || 30026;//测试环境30024 return Number(process.env.PORT) || Number(process.argv[3]) || 30026;//测试环境30027 正式环境30026
} }
// sit 测试环境 prod 生产环境 dem 演示环境(测试数据,前端无密码访问) // sit 测试环境 prod 生产环境 dem 演示环境(测试数据,前端无密码访问)
...@@ -10,13 +10,14 @@ export function getEnv() : string { ...@@ -10,13 +10,14 @@ export function getEnv() : string {
} }
export let requestConfig = { export let requestConfig = {
url:'http://192.168.0.71:40301', // url:'http://127.0.0.1:40301',
url:'http://172.22.235.5:28080',
client_id:'75cb2a016ec640a886f681b2d3ae6f3c', client_id:'75cb2a016ec640a886f681b2d3ae6f3c',
client_secret:'df795bea090e441fba6361645d18d5de' client_secret:'df795bea090e441fba6361645d18d5de'
}; };
//统一认证信息 //统一认证信息-弃用
export const uacInfomation = { export const uacInfomation = {
getTokenUrl:'https://account.shsunshine.org/connect/token', getTokenUrl:'https://account.shsunshine.org/connect/token',
refreshTokenUrl:"https://account.shsunshine.org/connect/token" , refreshTokenUrl:"https://account.shsunshine.org/connect/token" ,
...@@ -25,10 +26,50 @@ export const uacInfomation = { ...@@ -25,10 +26,50 @@ export const uacInfomation = {
client_secret:'R5KpJGxN98o$up' client_secret:'R5KpJGxN98o$up'
} }
//应用登记配置
export const secsaConfig = {
host:"https://auth.secsa.cn",
appId:"6d093073f958439aa40d827903004056",
appSecret:"FA6D47D23D594DCE982F9F9191F90DD2",
access_token:"/unitrust/oauth2/client_credentials/access_token", //获取访问令牌
userRegister:"/unitrust/login/userRegister", //账号注册
accountLogin:"/unitrust/login/accountLogin", //账密登录
mobileLogin:"/unitrust/login/mobileLogin", //手机验证码登录
sendMobileCode:"/unitrust/login/sendMobileCode", //发送验证码
}
// 科艺SaaS认证配置
export const authConfig = {
// 基础接口地址
baseUrl: 'https://auth.secsa.cn/api',
host: 'https://server.example.com',
// 接口端点
endpoints: {
authorize: '/authn/person/authorize',
token: '/authn/token',
userInfo: '/id/person'
},
client: {
client_id:'6d093073f958439aa40d827903004056',
client_secret:'FA6D47D23D594DCE982F9F9191F90DD2',
redirect_uri: 'https://shsunshine-zp.shec.edu.cn/bi/platform/index' // 回调地址
},
// 认证参数
authParams: {
auth_type: 'authentication',
response_type: 'code',
scope: 'openid'
}
};
export let healthConfig = { export let healthConfig = {
// url:'http://172.22.235.5:28080/dataengine-center-oneservice/list/', url:'http://172.22.235.5:28080/dataengine-center-oneservice/list/',
url:'http://127.0.0.1:40301/dataengine-center-oneservice/list/', // url:'http://127.0.0.1:40301/dataengine-center-oneservice/list/',
appKey:"200000085", appKey:"200000085",
// account:"man_001", //yujc // account:"man_001", //yujc
// execType:3, // execType:3,
...@@ -37,8 +78,8 @@ export let healthConfig = { ...@@ -37,8 +78,8 @@ export let healthConfig = {
} }
export let workstationConfig = { export let workstationConfig = {
// url:'http://172.22.235.5:28080/dataengine-center-oneservice/list/', url:'http://172.22.235.5:28080/dataengine-center-oneservice/list/',
url:'http://127.0.0.1:40301/dataengine-center-oneservice/list/', // url:'http://127.0.0.1:40301/dataengine-center-oneservice/list/',
appKey:"200000086", appKey:"200000086",
// account:"man_001", //yujc // account:"man_001", //yujc
// execType:3, // execType:3,
...@@ -47,4 +88,5 @@ export let workstationConfig = { ...@@ -47,4 +88,5 @@ export let workstationConfig = {
} }
export const ImgPath = "http://192.168.0.189:50001" // export const ImgPath = "http://192.168.0.71:30026"
export const ImgPath = "https://shsunshine-zp.shec.edu.cn/bi/platform"
import * as request from 'request'; import request from 'request';
import { BizError } from './bizError'; import { BizError } from './bizError';
const https = require("https"); import https from "https";
export function get(url:string, query?, headers?) { export function get(url:string, query?, headers?) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误"); if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
...@@ -28,7 +28,7 @@ export function post(url, reqBody, headers) { ...@@ -28,7 +28,7 @@ export function post(url, reqBody, headers) {
headers: Object.assign(header, headers), headers: Object.assign(header, headers),
body: reqBody body: reqBody
}, function(error, response, body) { }, function(error, response, body) {
if (!error && response.statusCode == 200) { if (!error && response.statusCode == 200) {
resolve(body); resolve(body);
} }
else { else {
...@@ -51,6 +51,7 @@ export function postParmiss(url, reqBody, headers) { ...@@ -51,6 +51,7 @@ export function postParmiss(url, reqBody, headers) {
}); });
}) })
} }
export function getParmiss(url, query?, headers?) { export function getParmiss(url, query?, headers?) {
return new Promise((resolve, reject)=>{ return new Promise((resolve, reject)=>{
let paramater:any = { url, json:true }; let paramater:any = { url, json:true };
...@@ -83,3 +84,41 @@ export function postForm(url, body, headers) { ...@@ -83,3 +84,41 @@ export function postForm(url, body, headers) {
}); });
}) })
} }
/**
* 电信接口专用 POST 请求(标准 JSON Body)
* @param apiId 接口ID(同时用于URL路径、Header 和 Body)
* @param sign 签名(用于Header)
* @param additionalHeaders 可选额外Headers(如 token 等)
* @returns Promise 响应体
*/
export async function postDataDianXin(apiId, sign, additionalHeaders?) {
// 构造 URL(API ID 出现在路径最后)
const url = `http://61.129.134.230/api/dataengine-center-oneservice/dataengine-center-oneservice/list/${apiId}`;
let appKey = 200000001;
// 请求体(JSON 格式)
const body = {
apiId,
appKey
};
// 必填 Headers(根据原成功调用示例)
const defaultHeaders = {
"appKey": appKey,
"apiId": apiId,
"sign": sign,
"account": "xdata_admin",
"X-Real-Hostname": "http://172.22.235.13/yundt-boot-ui-xdata-oneservice-web/"
};
// 合并额外 Headers(例如 token)
const headers = Object.assign(defaultHeaders, additionalHeaders || {});
// 调用已有的 post 方法(自动处理 JSON 序列化)
return post(url, body, headers);
}
import { TYPEENUM } from "../config/enum"; import { TYPEENUM } from "../config/enum";
import { authConfig } from '../serverConfig';
//对象判空 //对象判空
export function objectKeyIsNull(obj, ...keyNames) { export function objectKeyIsNull(obj, ...keyNames) {
...@@ -19,6 +20,7 @@ export function objectKeyIsNull(obj, ...keyNames) { ...@@ -19,6 +20,7 @@ export function objectKeyIsNull(obj, ...keyNames) {
return isNull; return isNull;
} }
/** /**
* 校验类型 * 校验类型
* @param target 目标值 * @param target 目标值
...@@ -57,6 +59,13 @@ export function checkType(target, type) { ...@@ -57,6 +59,13 @@ export function checkType(target, type) {
return false; return false;
} }
export function checkStrLeng(str) { export function checkStrLeng(str) {
return str.length < 40; return str.length < 40;
} }
\ No newline at end of file
...@@ -4,7 +4,13 @@ ...@@ -4,7 +4,13 @@
"target": "es2017", "target": "es2017",
"sourceMap": true, "sourceMap": true,
"rootDir":"./src", "rootDir":"./src",
"outDir":"./out" "outDir":"./out",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": false,
"noImplicitAny": false,
"strictNullChecks": false,
"types": ["node"]
}, },
"exclude": [ "exclude": [
"node_modules" "node_modules"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment