Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
L
learn-online-pc
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
learn-online-pc
Commits
73f584cd
提交
73f584cd
authored
10月 19, 2020
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
删除无用文件
上级
730905b8
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
0 行增加
和
418 行删除
+0
-418
launch.json
.vscode/launch.json
+0
-30
package.json
server/package.json
+0
-42
config.js
server/server/config.js
+0
-15
ProxyMonitor.js
server/server/controller/ProxyMonitor.js
+0
-254
ckeditorMonitor.js
server/server/controller/ckeditorMonitor.js
+0
-77
没有找到文件。
.vscode/launch.json
deleted
100644 → 0
浏览文件 @
730905b8
{
//
Use
IntelliSense
to
learn
about
possible
attributes.
//
Hover
to
view
descriptions
of
existing
attributes.
//
For
more
information
,
visit
:
https
:
//go.microsoft.com/fwlink/?linkid=
830387
"version"
:
"0.2.0"
,
"configurations"
:
[
{
"type"
:
"node"
,
"request"
:
"launch"
,
"name"
:
"dev"
,
"program"
:
"${workspaceFolder}/server/server/distRun.js"
,
"runtimeExecutable"
:
"/usr/local/bin/node"
,
"env"
:
{
"SERVER_PORT"
:
"4002"
,
"NODE_ENV"
:
"test"
}
},
{
"type"
:
"node"
,
"request"
:
"launch"
,
"name"
:
"production"
,
"program"
:
"${workspaceFolder}/server/server/distRun.js"
,
"runtimeExecutable"
:
"/usr/local/bin/node"
,
"env"
:
{
"SERVER_PORT"
:
"4006"
,
"NODE_ENV"
:
"production"
}
}
]
}
server/package.json
deleted
100644 → 0
浏览文件 @
730905b8
{
"name"
:
"nodejs"
,
"version"
:
"1.0.0"
,
"description"
:
"kelley - node服务"
,
"main"
:
"index.js"
,
"scripts"
:
{
"lint"
:
"eslint --ext .js server/"
,
"lint:fix"
:
"eslint --fix --ext .js server/"
,
"deploy:test"
:
"cross-env NODE_ENV=test SERVER_PORT=3301 pm2 start ./server/distRun.js -i 1 -n elearning-kelley -o upload_tmp/pm2_elearning-kelley.stdout.log -e upload_tmp/pm2_elearning-kelley.stderr.log --log-date-format 'YYYY-MM-DD HH:mm Z'"
,
"deploy"
:
"cross-env NODE_ENV=production SERVER_PORT=3301 pm2 start ./server/distRun.js -i 2 -n elearning-kelley -o /data/logs/pm3/elearning-kelley/pm2_elearning-kelley.stdout.log -e /data/logs/pm3/elearning-kelley/pm2_elearning-kelley.stderr.log --log-date-format 'YYYY-MM-DD HH:mm Z'"
,
"reload"
:
"pm2 reload elearning-kelley"
},
"author"
:
"ZYX"
,
"license"
:
"ISC"
,
"eslintIgnore"
:
[
"build/"
],
"devDependencies"
:
{
"babel-core"
:
"^6.26.3"
,
"babel-eslint"
:
"^8.2.6"
,
"eslint"
:
"^4.19.1"
,
"eslint-config-standard"
:
"^11.0.0"
,
"eslint-plugin-import"
:
"^2.14.0"
,
"eslint-plugin-node"
:
"^6.0.1"
,
"eslint-plugin-promise"
:
"^3.8.0"
,
"eslint-plugin-standard"
:
"^3.1.0"
},
"dependencies"
:
{
"@god/node-com"
:
"^1.1.4"
,
"adm-zip"
:
"^0.4.13"
,
"axios"
:
"^0.19.0"
,
"body-parser"
:
"^1.18.3"
,
"child_process"
:
"^1.0.2"
,
"connect-history-api-fallback"
:
"^1.6.0"
,
"cors"
:
"^2.8.5"
,
"express"
:
"^4.16.4"
,
"form-data"
:
"^2.5.0"
,
"multer"
:
"^1.4.1"
,
"promise.prototype.finally"
:
"^3.1.1"
,
"cross-env"
:
"^5.2.0"
}
}
server/server/config.js
deleted
100644 → 0
浏览文件 @
730905b8
const
state
=
process
.
env
.
NODE_ENV
let
conf
=
{}
if
(
state
===
'test'
)
{
conf
.
agentApiUrl
=
'https://api2.ezijing.com/'
conf
.
apiKey
=
'vT2P4rwrqNOp6EBqxCPj7vuolaLw1dHN'
conf
.
host
=
'lms-api2.ezijing.com'
}
else
if
(
state
===
'production'
)
{
conf
.
agentApiUrl
=
'https://zapi.ezijing.com/'
conf
.
apiKey
=
'vT2P4rwrqNOp6EBqxCPj7vuolaLw1dHN'
conf
.
host
=
'lms-api.ezijing.com'
}
global
.
app
=
null
module
.
exports
=
conf
server/server/controller/ProxyMonitor.js
deleted
100644 → 0
浏览文件 @
730905b8
const
fs
=
require
(
'fs'
)
const
conf
=
require
(
'../config'
)
const
com
=
require
(
'@god/node-com'
)
const
axios
=
require
(
'axios'
)
const
AdmZip
=
require
(
'adm-zip'
)
/* 支持 finally函数 */
require
(
'promise.prototype.finally'
).
shim
()
/* 通过API统一过拦截器,接口代理转发请求 */
const
agentProcessor
=
()
=>
{
/* 目录在服务器,启动时,直接创建号 */
let
_totalDir
=
'001'
// 默认表示,存储从第一学期开始
com
.
Tool
.
Directory
.
mkdir
(
'upload_tmp/'
+
_totalDir
)
return
(
req
,
res
)
=>
{
/* 获取 日志必须 返回 + 视频行为日志信息 */
const
_logJson
=
com
.
Log
.
EzijingVideo
.
setLogVideo
(
req
,
{
_totalDir
})
let
headers
=
req
.
headers
let
options
=
{}
/* 删除一些 不必要属性 */
let
pwdBase64
=
headers
[
'pmd5'
]
||
''
delete
headers
[
'pmd5'
]
// pwd base64
try
{
options
=
{
timeout
:
60
*
1000
,
url
:
req
.
params
[
0
],
// .replace(/tenant\//gi, '')
baseURL
:
conf
.
agentApiUrl
,
method
:
req
.
method
,
data
:
req
.
body
,
params
:
req
.
query
,
maxContentLength
:
Infinity
,
maxBodyLength
:
Infinity
}
options
.
url
=
options
.
url
.
replace
(
/tenant
\/
/gi
,
''
)
headers
[
'apikey'
]
=
conf
.
apiKey
if
(
/user_center/gi
.
test
(
options
.
url
))
{
headers
[
'Host'
]
=
'sso.ezijing.com'
headers
[
'host'
]
=
'sso.ezijing.com'
}
else
{
// headers['Host'] = 'lms-api.ezijing.com'
// headers['host'] = 'lms-api.ezijing.com'
headers
[
'Host'
]
=
conf
.
host
headers
[
'host'
]
=
conf
.
host
}
/* 测试 */
// if (/\/essay/gi.test(options.url) && /post/gi.test(req.method)) {
// console.time('essay')
// options.baseURL = 'http://192.168.10.199:8081/'
// options.url = options.url.replace(/tenant\//gi, '')
// console.log(options.baseURL + options.url)
// }
headers
[
'accept'
]
=
'*/*'
delete
headers
[
'accept-language'
]
com
.
Tool
.
ReqType
.
toUrlEncoded
(
req
,
options
)
let
_fileName
=
com
.
Tool
.
ReqType
.
toFormData
(
req
,
options
)
/* 获取cookie,解析SUP,设置token */
headers
[
'ticket'
]
=
com
.
Tool
.
Cookie
.
getTicketByCAS
(
'_SUP'
,
req
)
// _SUP获取
headers
[
'token'
]
=
headers
[
'ticket'
]
axios
.
defaults
.
headers
=
headers
axios
.
defaults
.
withCredentials
=
true
/* 处理特殊请求,在域名为e-learing2时生效 */
// let _stoken = com.Tool.Cookie.getCookie('_SUP', req)
// if (_stoken) {
// headers['stoken'] = _stoken
// }
/* 重新转发请求 */
let
_reqTime
=
0
let
_status
=
0
axios
(
options
)
.
then
((
data
)
=>
{
/* 记录 请求处理时长 + 请求状态 */
_reqTime
=
new
Date
().
getTime
()
-
_logJson
.
_nodeServerCurrentTime
+
'ms'
_status
=
200
// /* 兼容老版本,登录接口 清除_SUP; 退出登录 清除_SUP */
/* 重新修改,改为只能服务端 设置 cookie */
if
(
/user_center
\/
login/gi
.
test
(
options
.
url
)
||
/user_center
\/
code_login/gi
.
test
(
options
.
url
)
)
{
com
.
Tool
.
Cookie
.
setTicketByCAS
(
'_SUP'
,
'.ezijing.com'
,
data
.
data
.
ticket
,
res
)
com
.
Tool
.
Cookie
.
setCookie
(
'_AUTH'
,
'.ezijing.com'
,
pwdBase64
,
res
)
}
if
(
/user_center
\/
logout/gi
.
test
(
options
.
url
))
{
res
.
clearCookie
(
'_SUP'
,
{
path
:
'/'
,
domain
:
'.ezijing.com'
})
res
.
clearCookie
(
'_AUTH'
,
{
path
:
'/'
,
domain
:
'.ezijing.com'
})
res
.
clearCookie
(
'TGC'
,
{
path
:
'/'
,
domain
:
'.ezijing.com'
})
res
.
clearCookie
(
'CAS_USER_ID'
,
{
path
:
'/'
,
domain
:
'.ezijing.com'
})
}
/* 如果是大作业提价,先docx解析,解析不出来则报错 */
if
(
/util
\/
upload-file/gi
.
test
(
options
.
url
)
&&
req
.
body
.
special
&&
req
.
body
.
special
===
'course-work'
)
{
let
_strContent
=
''
let
contentXml
=
null
try
{
let
zip
=
new
AdmZip
(
_fileName
[
0
])
// filePath为文件路径
contentXml
=
zip
.
readAsText
(
'word/document.xml'
)
// 将document.xml读取为text内容;
_strContent
=
contentXml
.
replace
(
/<
[/]{0,1}\w[^
>
]
*>/gi
,
''
)
// contentXml.match(/<w:t[^>]*?>[\s\S]*?<\/w:t>/ig).forEach((item) => {
// _strContent += item.slice(5, -6) // 不能换行,应该是 解析某些换行规则会比较慢
// })
data
.
data
.
dataStr
=
Buffer
.
from
(
_strContent
,
'utf8'
).
toString
(
'base64'
)
}
catch
(
e
)
{
res
.
status
(
500
).
json
({
message
:
'文档上传出错,错误原因:请不要直接修改后缀“.doc”为“.docx”或者正文内容必须大于400字'
,
errMsg
:
'err'
,
code
:
500
})
return
}
}
/* getInfo 时,则写入 用户基本信息 */
if
(
/user_center
\/
get_user_info/gi
.
test
(
options
.
url
))
{
/* check-access接口 */
// headers['Host'] = 'lms-api.ezijing.com'
// headers['host'] = 'lms-api.ezijing.com'
headers
[
'Host'
]
=
conf
.
host
headers
[
'host'
]
=
conf
.
host
axios
.
defaults
.
headers
=
headers
axios
({
timeout
:
30
*
1000
,
url
:
'user/check-access'
,
baseURL
:
conf
.
agentApiUrl
,
method
:
'GET'
,
data
:
{},
params
:
''
})
.
then
((
_data
)
=>
{
if
(
_data
.
data
.
id
)
{
data
.
data
[
'auth_key'
]
=
headers
[
'token'
]
data
.
data
[
'id'
]
=
headers
[
'uid'
]
data
.
data
.
student_info
=
_data
.
data
let
_name
=
(
data
.
data
.
student_info
&&
data
.
data
.
student_info
.
personal_name
)
||
data
.
data
.
nickname
let
_email
=
(
data
.
data
.
student_info
&&
data
.
data
.
student_info
.
email
)
||
data
.
data
.
email
com
.
Log
.
EzijingVideo
.
writeBasicInfo
(
req
,
_logJson
,
{
_name
,
// 用于重新 定位学生目录
_email
,
// 用于重新 定位学生目录
_totalDir
// 用于重新 定位学生目录
})
res
.
status
(
200
).
send
(
data
.
data
)
}
else
{
res
.
status
(
403
).
send
({
name
:
'Unauthorized'
,
message
:
'非学习系统用户,请联系管理员'
,
code
:
0
,
status
:
401
})
}
})
.
catch
((
e
)
=>
{
try
{
res
.
status
(
e
.
response
.
status
).
send
(
e
.
response
.
data
)
}
catch
(
e
)
{
res
.
status
(
500
).
send
({
name
:
'undefined'
,
message
:
'接口请求异常'
,
code
:
0
,
status
:
500
})
}
})
}
else
{
res
.
status
(
200
).
send
(
data
.
data
)
}
})
.
catch
((
e
)
=>
{
/* 记录 请求处理时长 + 请求状态 */
_reqTime
=
new
Date
().
getTime
()
-
_logJson
.
_nodeServerCurrentTime
+
'ms'
_status
=
(
e
.
response
&&
e
.
response
.
status
)
||
500
/* 未登录,则全部清空 _SUP */
if
(
e
.
response
&&
e
.
response
.
status
===
403
)
{
res
.
clearCookie
(
'_SUP'
,
{
path
:
'/'
,
domain
:
'.ezijing.com'
})
res
.
clearCookie
(
'_AUTH'
,
{
path
:
'/'
,
domain
:
'.ezijing.com'
})
}
/* 返回执行代码出错 或者 服务器请求错误 */
if
(
e
.
response
&&
e
.
response
.
data
)
{
/* 如果未登录 强制 弹出到 登录页 */
// setPorxyHeader(e.response, res)
res
.
status
(
e
.
response
.
status
).
json
(
e
.
response
.
data
)
console
.
error
(
_logJson
.
_uuid
+
String
.
fromCharCode
(
0x001
)
+
JSON
.
stringify
(
options
)
+
String
.
fromCharCode
(
0x001
)
+
JSON
.
stringify
(
axios
.
defaults
.
headers
)
+
String
.
fromCharCode
(
0x001
)
+
JSON
.
stringify
(
e
.
response
.
data
)
)
}
else
{
res
.
status
(
500
).
json
({
message
:
'系统错误,请稍后重试或联系管理员'
,
errMsg
:
'Error Proxy Request or BackData Excute Error'
,
code
:
500
})
console
.
error
(
_logJson
.
_uuid
,
e
)
}
})
.
finally
(()
=>
{
/* 请求结束,删除服务器端 缓存文件 */
if
(
_fileName
.
length
)
{
for
(
let
i
=
0
;
i
<
_fileName
.
length
;
i
++
)
{
fs
.
unlinkSync
(
_fileName
[
i
])
}
}
/* 视频行为日志 写入 */
com
.
Log
.
EzijingVideo
.
writeLogVideo
(
_logJson
,
{
_reqTime
,
_status
})
})
}
catch
(
e
)
{
res
.
status
(
500
).
json
({
message
:
'系统错误,请稍后重试或联系管理员'
,
errMsg
:
'Network Server Excute Error'
,
code
:
500
})
console
.
error
(
_logJson
.
_uuid
,
e
)
}
}
}
module
.
exports
=
{
agentProcessor
:
agentProcessor
}
server/server/controller/ckeditorMonitor.js
deleted
100644 → 0
浏览文件 @
730905b8
const
fs
=
require
(
'fs'
)
const
conf
=
require
(
'../config'
)
const
com
=
require
(
'@god/node-com'
)
const
axios
=
require
(
'axios'
)
/* 支持 finally函数 */
require
(
'promise.prototype.finally'
).
shim
()
const
ckeditorUpload
=
(
req
,
res
)
=>
{
/* 文件上传 ckeditor4.5以上返回格式 */
function
sendHtml
(
url
,
msg
)
{
res
.
json
({
'uploaded'
:
url
?
1
:
0
,
'fileName'
:
'image'
,
'url'
:
url
,
'error'
:
{
'message'
:
msg
}
})
}
if
(
req
.
files
.
length
)
{
if
(
!
req
.
files
[
0
].
mimetype
.
startsWith
(
'image'
))
{
sendHtml
(
''
,
'文件类型错误,请上传图片'
);
return
}
if
(
req
.
files
[
0
].
size
>
10
*
1024
*
1024
)
{
sendHtml
(
''
,
'图片大小超限'
);
return
}
req
.
files
[
0
].
fieldname
=
'image'
let
headers
=
req
.
headers
let
options
=
{}
options
=
{
timeout
:
30
*
1000
,
url
:
'util/upload-image'
,
baseURL
:
conf
.
agentApiUrl
,
method
:
req
.
method
,
data
:
req
.
body
,
params
:
req
.
query
}
headers
[
'accept'
]
=
'*/*'
delete
headers
[
'accept-language'
]
let
_fileName
=
com
.
Tool
.
ReqType
.
toFormData
(
req
,
options
)
headers
[
'token'
]
=
com
.
Tool
.
Cookie
.
getTicketByCAS
(
'_SUP'
,
req
)
headers
[
'tenant'
]
=
'kelley'
headers
[
'apikey'
]
=
'vT2P4rwrqNOp6EBqxCPj7vuolaLw1dHN'
headers
[
'Host'
]
=
'lms-api.ezijing.com'
headers
[
'host'
]
=
'lms-api.ezijing.com'
axios
.
defaults
.
headers
=
headers
/* 重新转发请求 */
axios
(
options
).
then
((
data
)
=>
{
if
(
data
.
data
.
success
)
{
sendHtml
(
data
.
data
.
url
,
''
)
}
else
{
sendHtml
(
''
,
'上传错误,请重试'
)
}
req
.
files
.
forEach
((
elem
,
i
)
=>
{
fs
.
stat
(
elem
.
destination
+
elem
.
originalname
,
(
error
,
stats
)
=>
{
if
(
error
)
{
return
}
fs
.
unlink
(
elem
.
destination
+
elem
.
originalname
,
(
error
)
=>
{
if
(
error
)
console
.
log
(
error
)
})
})
})
}).
catch
((
e
)
=>
{
sendHtml
(
''
,
'上传错误,请重试1'
)
}).
finally
(()
=>
{
/* 请求结束,删除服务器端 缓存文件 */
if
(
_fileName
.
length
)
{
for
(
let
i
=
0
;
i
<
_fileName
.
length
;
i
++
)
{
fs
.
unlinkSync
(
_fileName
[
i
])
}
}
})
}
}
module
.
exports
=
{
ckeditorUpload
:
ckeditorUpload
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论