Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
E
ezijing-node-server
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
ezijing-node-server
Commits
fa57eaeb
提交
fa57eaeb
authored
11月 28, 2025
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: update
上级
0c468741
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
11 个修改的文件
包含
171 行增加
和
151 行删除
+171
-151
package-lock.json
package-lock.json
+0
-0
CkeditorMonitor.js
server/controller/CkeditorMonitor.js
+43
-34
ESignMonitor.js
server/controller/ESignMonitor.js
+0
-0
MixedFlowMonitor.js
server/controller/MixedFlowMonitor.js
+54
-50
NextToSend.js
server/controller/NextToSend.js
+21
-18
ProxyRequest.js
server/controller/ProxyRequest.js
+33
-30
RTMPMonitor.js
server/controller/RTMPMonitor.js
+3
-4
TestMonitor.js
server/controller/TestMonitor.js
+8
-6
WxMonitor.js
server/controller/WxMonitor.js
+1
-1
setCloudClassMonitor.js
server/controller/setCloudClassMonitor.js
+4
-4
wxChartSuccessMonitor.js
server/controller/wxChartSuccessMonitor.js
+4
-4
没有找到文件。
package-lock.json
浏览文件 @
fa57eaeb
This source diff could not be displayed because it is too large. You can
view the blob
instead.
server/controller/CkeditorMonitor.js
浏览文件 @
fa57eaeb
const
fs
=
require
(
'fs'
)
const
conf
=
require
(
'../config'
)
const
com
=
require
(
'@
god
/node-com'
)
const
com
=
require
(
'@
ezijing
/node-com'
)
const
Proxy
=
com
.
Proxy
const
ckeditorUpload
=
(
req
,
res
)
=>
{
/* 文件上传 ckeditor4.5以上返回格式 */
function
sendHtml
(
url
,
msg
)
{
function
sendHtml
(
url
,
msg
)
{
res
.
json
({
'uploaded'
:
url
?
1
:
0
,
'fileName'
:
'image'
,
'url'
:
url
,
'error'
:
{
'message'
:
msg
}
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
}
if
(
!
req
.
files
[
0
].
mimetype
.
startsWith
(
'image'
))
{
sendHtml
(
''
,
'文件类型错误,请上传图片'
)
return
}
if
(
req
.
files
[
0
].
size
>
10
*
1024
*
1024
)
{
sendHtml
(
''
,
'图片大小超限'
)
return
}
req
.
files
[
0
].
fieldname
=
'file'
Proxy
.
reqHttps
({
hostname
:
req
.
headers
.
reqhost
,
// 直接传 host,会被 kong的nginx接管,不能再调用,所以改为自定义host
path
:
'/api/lms/util/upload-file'
,
method
:
'POST'
,
data
:
req
.
body
||
{},
query
:
req
.
query
||
{},
files
:
req
.
files
,
headers
:
{
'tenant'
:
req
.
headers
.
tenant
,
'Cookie'
:
req
.
headers
.
cookie
||
''
,
'User-Agent'
:
req
.
headers
[
'user-agent'
],
'Content-Type'
:
'multipart/form-data'
}
},
function
(
str
,
obj
)
{
try
{
const
_json
=
JSON
.
parse
(
str
)
if
(
_json
.
success
)
{
sendHtml
(
_json
.
url
,
''
)
}
else
{
sendHtml
(
''
,
'上传错误,请重试'
)
Proxy
.
reqHttps
(
{
hostname
:
req
.
headers
.
reqhost
,
// 直接传 host,会被 kong的nginx接管,不能再调用,所以改为自定义host
path
:
'/api/lms/util/upload-file'
,
method
:
'POST'
,
data
:
req
.
body
||
{},
query
:
req
.
query
||
{},
files
:
req
.
files
,
headers
:
{
tenant
:
req
.
headers
.
tenant
,
Cookie
:
req
.
headers
.
cookie
||
''
,
'User-Agent'
:
req
.
headers
[
'user-agent'
],
'Content-Type'
:
'multipart/form-data'
,
},
},
function
(
str
,
obj
)
{
try
{
const
_json
=
JSON
.
parse
(
str
)
if
(
_json
.
success
)
{
sendHtml
(
_json
.
url
,
''
)
}
else
{
sendHtml
(
''
,
'上传错误,请重试'
)
}
}
catch
(
e
)
{
sendHtml
(
''
,
'上传错误,请重试1'
)
}
}
catch
(
e
)
{
sendHtml
(
''
,
'上传错误,请重试1'
)
}
}
)
)
}
}
module
.
exports
=
{
ckeditorUpload
:
ckeditorUpload
ckeditorUpload
:
ckeditorUpload
,
}
server/controller/ESignMonitor.js
浏览文件 @
fa57eaeb
差异被折叠。
点击展开。
server/controller/MixedFlowMonitor.js
浏览文件 @
fa57eaeb
var
com
=
require
(
'@
god
/node-com'
)
var
com
=
require
(
'@
ezijing
/node-com'
)
var
_ReqHttp
=
com
.
Proxy
.
reqHttp
var
_MD5
=
com
.
Tool
.
md5
...
...
@@ -9,7 +9,7 @@ var conf = {
StreamAppId
:
1400255568
,
bizid
:
'33393'
,
sessionId
:
''
,
outStreamId
:
''
outStreamId
:
''
,
}
/* 根据腾讯云 - 创建混流 */
var
getFlow
=
function
(
req
,
res
)
{
...
...
@@ -41,79 +41,83 @@ var _concelFlow = function (req, res) {
/* 处理 混流建立 方式 */
var
_dealCreateData
=
function
(
req
,
_time
)
{
conf
.
sessionId
=
'ne4MjXHKFce1yIwNMkKv9QtV6_hy0RoT'
||
_MD5
(
'zyx_'
+
_time
)
conf
.
outStreamId
=
'33393_ca44d26966c309105baca4dbd10bb279'
||
(
'stream_'
+
conf
.
sessionId
)
conf
.
outStreamId
=
'33393_ca44d26966c309105baca4dbd10bb279'
||
'stream_'
+
conf
.
sessionId
console
.
log
(
_time
,
conf
.
AppId
,
conf
.
sessionId
,
conf
.
outStreamId
,
req
.
body
)
return
JSON
.
stringify
({
'timestamp'
:
_time
,
// UNIX 时间戳数
'eventId'
:
_time
,
// 取随机数即可,标识一次网络请求
'interface'
:
{
'interfaceName'
:
'Mix_StreamV2'
,
// 固定值
'para'
:
{
'app_id'
:
conf
.
AppId
,
// 填写直播 APPID
'interface'
:
'mix_streamv2.start_mix_stream_advanced'
,
// 固定值
timestamp
:
_time
,
// UNIX 时间戳数
eventId
:
_time
,
// 取随机数即可,标识一次网络请求
interface
:
{
interfaceName
:
'Mix_StreamV2'
,
// 固定值
para
:
{
app_id
:
conf
.
AppId
,
// 填写直播 APPID
interface
:
'mix_streamv2.start_mix_stream_advanced'
,
// 固定值
// 'interface': 'mix_streamv2.cancel_mix_stream', // 固定值
'mix_stream_template_id'
:
0
,
'mix_stream_session_id'
:
conf
.
sessionId
,
// 标识一次网络请求
'output_stream_id'
:
conf
.
outStreamId
,
// 填输出流 ID
'output_stream_type'
:
0
,
// 生成新流时,写1
'input_stream_list'
:
[{
// 背景画面
'input_stream_id'
:
'33393_ca44d26966c309105baca4dbd10bb279'
,
// 流 ID
'layout_params'
:
{
'image_layer'
:
1
,
// 图层号,背景填1
'image_width'
:
640
,
'image_height'
:
360
}
},
{
// 小画面1
'input_stream_id'
:
'33393_9806f61c2d2193106b5bad448e80c3d8'
,
// 流 ID
'layout_params'
:
{
'image_layer'
:
2
,
// 图层标识号
'image_width'
:
120
,
// 画面宽度
'image_height'
:
90
,
// 画面高度
'location_x'
:
10
,
// x偏移:相对于背景画面左上角的横向偏移
'location_y'
:
10
// y偏移:相对于背景画面左上角的纵向偏移
}
}]
}
}
mix_stream_template_id
:
0
,
mix_stream_session_id
:
conf
.
sessionId
,
// 标识一次网络请求
output_stream_id
:
conf
.
outStreamId
,
// 填输出流 ID
output_stream_type
:
0
,
// 生成新流时,写1
input_stream_list
:
[
{
// 背景画面
input_stream_id
:
'33393_ca44d26966c309105baca4dbd10bb279'
,
// 流 ID
layout_params
:
{
image_layer
:
1
,
// 图层号,背景填1
image_width
:
640
,
image_height
:
360
,
},
},
{
// 小画面1
input_stream_id
:
'33393_9806f61c2d2193106b5bad448e80c3d8'
,
// 流 ID
layout_params
:
{
image_layer
:
2
,
// 图层标识号
image_width
:
120
,
// 画面宽度
image_height
:
90
,
// 画面高度
location_x
:
10
,
// x偏移:相对于背景画面左上角的横向偏移
location_y
:
10
,
// y偏移:相对于背景画面左上角的纵向偏移
},
},
],
},
},
})
}
/* 处理 混流取消 方式 */
var
_dealCancelData
=
function
(
req
,
_time
)
{
return
JSON
.
stringify
({
'timestamp'
:
_time
,
// UNIX 时间戳数
'eventId'
:
_time
,
// 混流事件ID,取时间戳即可
'interface'
:
{
'interfaceName'
:
'Mix_StreamV2'
,
// 固定值
'para'
:
{
'app_id'
:
conf
.
AppId
,
'interface'
:
'mix_streamv2.cancel_mix_stream'
,
// 取消混流
timestamp
:
_time
,
// UNIX 时间戳数
eventId
:
_time
,
// 混流事件ID,取时间戳即可
interface
:
{
interfaceName
:
'Mix_StreamV2'
,
// 固定值
para
:
{
app_id
:
conf
.
AppId
,
interface
:
'mix_streamv2.cancel_mix_stream'
,
// 取消混流
// 'interface': 'mix_streamv2.start_mix_stream_advanced', // 取消混流
'mix_stream_session_id'
:
conf
.
sessionId
,
'output_stream_id'
:
conf
.
outStreamId
}
}
mix_stream_session_id
:
conf
.
sessionId
,
output_stream_id
:
conf
.
outStreamId
,
}
,
}
,
})
}
/* 鉴权 - 返回参数 */
var
_getOpt
=
function
(
_time
)
{
/* 定义鉴权 */
var
str
=
'appid='
+
conf
.
AppId
+
'&interface=Mix_StreamV2&t='
+
(
_time
+
60
)
+
'&sign='
+
_MD5
(
conf
.
AppSecret
+
(
_time
+
60
))
var
str
=
'appid='
+
conf
.
AppId
+
'&interface=Mix_StreamV2&t='
+
(
_time
+
60
)
+
'&sign='
+
_MD5
(
conf
.
AppSecret
+
(
_time
+
60
))
var
opt
=
{
hostname
:
'fcgi.video.qcloud.com'
,
path
:
'/common_access?'
+
str
,
method
:
'POST'
,
headers
:
{
'Content-Type'
:
'application/json'
'Content-Type'
:
'application/json'
,
},
data
:
{}
data
:
{}
,
}
return
opt
}
module
.
exports
=
{
getFlow
getFlow
,
}
server/controller/NextToSend.js
浏览文件 @
fa57eaeb
const
fs
=
require
(
'fs'
)
const
path
=
require
(
'path'
)
const
com
=
require
(
'@
god
/node-com'
)
const
com
=
require
(
'@
ezijing
/node-com'
)
const
Proxy
=
com
.
Proxy
const
getData
=
(
req
,
res
)
=>
{
Proxy
.
reqHttps
({
hostname
:
'lms-api.ezijing.com'
,
path
:
'/v2/education/courses/'
+
req
.
path
.
replace
(
/
\/
abc
\/
test
\/
cba
\/
/gi
,
''
),
data
:
{},
query
:
{},
headers
:
{
'Host'
:
'lms-api.ezijing.com'
,
'tenant'
:
req
.
headers
.
tenant
,
'token'
:
req
.
headers
.
token
,
'apikey'
:
req
.
headers
.
apikey
,
'User-Agent'
:
req
.
headers
[
'user-agent'
],
'Content-Type'
:
'application/x-www-form-urlencoded'
Proxy
.
reqHttps
(
{
hostname
:
'lms-api.ezijing.com'
,
path
:
'/v2/education/courses/'
+
req
.
path
.
replace
(
/
\/
abc
\/
test
\/
cba
\/
/gi
,
''
),
data
:
{},
query
:
{},
headers
:
{
Host
:
'lms-api.ezijing.com'
,
tenant
:
req
.
headers
.
tenant
,
token
:
req
.
headers
.
token
,
apikey
:
req
.
headers
.
apikey
,
'User-Agent'
:
req
.
headers
[
'user-agent'
],
'Content-Type'
:
'application/x-www-form-urlencoded'
,
},
},
function
(
str
,
cookieStr
)
{
console
.
error
(
'接口读取数据'
,
req
.
headers
.
token
,
str
)
res
.
status
(
200
).
json
(
JSON
.
parse
(
str
))
}
},
function
(
str
,
cookieStr
)
{
console
.
error
(
'接口读取数据'
,
req
.
headers
.
token
,
str
)
res
.
status
(
200
).
json
(
JSON
.
parse
(
str
))
})
)
}
module
.
exports
=
{
getData
:
getData
getData
:
getData
,
}
server/controller/ProxyRequest.js
浏览文件 @
fa57eaeb
const
fs
=
require
(
'fs'
)
const
path
=
require
(
'path'
)
const
com
=
require
(
'@
god
/node-com'
)
const
com
=
require
(
'@
ezijing
/node-com'
)
const
Proxy
=
com
.
Proxy
const
md5
=
com
.
Tool
.
md5
const
use
=
(
req
,
res
)
=>
{
Proxy
.
reqHttps
({
hostname
:
'zws-api.ezijing.com'
,
path
:
req
.
baseUrl
,
method
:
req
.
method
,
data
:
req
.
body
||
{},
query
:
req
.
query
||
{},
headers
:
{
'Host'
:
'zws-api.ezijing.com'
,
'Cookie'
:
req
.
headers
.
cookie
||
''
,
'apikey'
:
'CXOIO7njD7o3RScs7MSHhvxeG4hbwX2S'
,
'User-Agent'
:
req
.
headers
[
'user-agent'
],
'Content-Type'
:
'application/x-www-form-urlencoded'
Proxy
.
reqHttps
(
{
hostname
:
'zws-api.ezijing.com'
,
path
:
req
.
baseUrl
,
method
:
req
.
method
,
data
:
req
.
body
||
{},
query
:
req
.
query
||
{},
headers
:
{
Host
:
'zws-api.ezijing.com'
,
Cookie
:
req
.
headers
.
cookie
||
''
,
apikey
:
'CXOIO7njD7o3RScs7MSHhvxeG4hbwX2S'
,
'User-Agent'
:
req
.
headers
[
'user-agent'
],
'Content-Type'
:
'application/x-www-form-urlencoded'
,
},
},
function
(
str
,
obj
)
{
console
.
error
(
'获取cookie - 123456789'
,
req
.
headers
.
cookie
)
if
(
/image/gi
.
test
(
obj
.
resHeader
[
'content-type'
]))
{
// 这种方式不够高级,还要先生成一个图片文件,能不能直接返回一个文档流
res
.
header
(
'Content-Type'
,
obj
.
resHeader
[
'content-type'
])
str
=
str
.
replace
(
/^data:image
\/\w
+;base64,/
,
''
)
let
bf
=
new
Buffer
(
str
,
'base64'
)
fs
.
writeFileSync
(
'upload_tmp/image.'
+
md5
(
bf
)
+
'.png'
,
bf
)
fs
.
createReadStream
(
'upload_tmp/image.'
+
md5
(
bf
)
+
'.png'
).
pipe
(
res
)
// 直接返回 base64字符串
// res.header('Content-Type', 'text/plain')
// res.status(200).send(str)
}
else
{
res
.
status
(
200
).
json
(
JSON
.
parse
(
str
))
}
}
},
function
(
str
,
obj
)
{
console
.
error
(
'获取cookie - 123456789'
,
req
.
headers
.
cookie
)
if
(
/image/gi
.
test
(
obj
.
resHeader
[
'content-type'
]))
{
// 这种方式不够高级,还要先生成一个图片文件,能不能直接返回一个文档流
res
.
header
(
'Content-Type'
,
obj
.
resHeader
[
'content-type'
])
str
=
str
.
replace
(
/^data:image
\/\w
+;base64,/
,
""
)
let
bf
=
new
Buffer
(
str
,
'base64'
)
fs
.
writeFileSync
(
'upload_tmp/image.'
+
md5
(
bf
)
+
'.png'
,
bf
)
fs
.
createReadStream
(
'upload_tmp/image.'
+
md5
(
bf
)
+
'.png'
).
pipe
(
res
)
// 直接返回 base64字符串
// res.header('Content-Type', 'text/plain')
// res.status(200).send(str)
}
else
{
res
.
status
(
200
).
json
(
JSON
.
parse
(
str
))
}
})
)
}
module
.
exports
=
{
use
:
use
use
:
use
,
}
server/controller/RTMPMonitor.js
浏览文件 @
fa57eaeb
// var com = require('@god/node-com')
// var com = require('@ezijing/node-com')
var
callback
=
function
(
req
,
res
)
{
var
_body
=
req
.
body
||
{}
console
.
log
(
JSON
.
stringify
(
_body
))
res
.
status
(
200
).
json
({
'msg'
:
'正常'
})
res
.
status
(
200
).
json
({
msg
:
'正常'
})
}
module
.
exports
=
{
callback
:
callback
callback
:
callback
,
}
server/controller/TestMonitor.js
浏览文件 @
fa57eaeb
var
com
=
require
(
'@god/node-com'
)
var
com
=
require
(
'@ezijing/node-com'
)
var
_MD5
=
com
.
Tool
.
md5
...
...
@@ -11,14 +10,17 @@ var isRun = function (req, res) {
var
apikey
=
req
.
headers
.
apikey
||
''
var
timestamp
=
Math
.
floor
(
new
Date
().
getTime
()
/
100000000
)
+
'00000000'
var
md5Str
=
_MD5
(
'godzyx.com'
+
timestamp
)
if
(
operate
===
'1'
)
{
res
.
status
(
200
).
json
({
'MD5-auth'
:
md5Str
});
return
}
if
(
operate
===
'1'
)
{
res
.
status
(
200
).
json
({
'MD5-auth'
:
md5Str
})
return
}
if
(
apikey
===
md5Str
)
{
res
.
status
(
200
).
json
({
'msg'
:
'数据正在处理'
})
res
.
status
(
200
).
json
({
msg
:
'数据正在处理'
})
}
else
{
res
.
status
(
200
).
json
({
'msg'
:
'拒绝访问该接口'
})
res
.
status
(
200
).
json
({
msg
:
'拒绝访问该接口'
})
}
}
module
.
exports
=
{
isRun
:
isRun
isRun
:
isRun
,
}
server/controller/WxMonitor.js
浏览文件 @
fa57eaeb
...
...
@@ -38,7 +38,7 @@ function getsignature (req, res) {
share_json
.
jsapi_ticket
=
JSON
.
parse
(
body
).
ticket
share_json
.
noncestr
=
Math
.
random
().
toString
(
36
).
substr
(
2
,
15
)
// 随机字符串
share_json
.
timestamp
=
parseInt
(
new
Date
().
getTime
()
/
1000
)
+
''
// 事件戳
share_json
.
url
=
req
.
body
.
url
||
req
.
headers
.
referer
share_json
.
url
=
encodeURIComponent
(
req
.
body
.
url
||
req
.
headers
.
referer
)
let
str1
=
'jsapi_ticket='
+
share_json
.
jsapi_ticket
+
'&noncestr='
+
share_json
.
noncestr
+
'×tamp='
+
share_json
.
timestamp
+
'&url='
+
share_json
.
url
let
token
=
sha1
(
str1
)
return
err
?
reject
(
err
)
:
res
.
send
({
...
...
server/controller/setCloudClassMonitor.js
浏览文件 @
fa57eaeb
const
fs
=
require
(
'fs'
)
const
path
=
require
(
'path'
)
const
com
=
require
(
'@
god
/node-com'
)
const
com
=
require
(
'@
ezijing
/node-com'
)
const
_mkdir
=
com
.
Tool
.
Directory
.
mkdir
...
...
@@ -10,7 +10,7 @@ const getTable = (req, res) => {
_mkdir
(
path1
.
replace
(
/
\/[^\/]
*
?
$/gi
,
''
),
()
=>
{
fs
.
writeFileSync
(
path1
,
JSON
.
stringify
({}),
'utf8'
)
})
res
.
status
(
200
).
json
({
'msg'
:
'文件不存在,创建文件'
})
res
.
status
(
200
).
json
({
msg
:
'文件不存在,创建文件'
})
return
}
let
_json
=
JSON
.
parse
(
fs
.
readFileSync
(
path1
).
toString
()
||
'{}'
)
...
...
@@ -21,7 +21,7 @@ const setTable = (req, res) => {
let
path1
=
path
.
resolve
(
process
.
cwd
(),
'../node-server-data/cloud-class.json'
)
if
(
!
fs
.
existsSync
(
path1
))
{
_mkdir
(
path1
)
res
.
status
(
200
).
json
({
'msg'
:
'文件不存在,创建文件'
})
res
.
status
(
200
).
json
({
msg
:
'文件不存在,创建文件'
})
return
}
let
_json
=
JSON
.
parse
(
fs
.
readFileSync
(
path1
).
toString
()
||
'{}'
)
...
...
@@ -38,5 +38,5 @@ const setTable = (req, res) => {
module
.
exports
=
{
getTable
:
getTable
,
setTable
:
setTable
setTable
:
setTable
,
}
server/controller/wxChartSuccessMonitor.js
浏览文件 @
fa57eaeb
const
fs
=
require
(
'fs'
)
const
path
=
require
(
'path'
)
const
com
=
require
(
'@
god
/node-com'
)
const
com
=
require
(
'@
ezijing
/node-com'
)
const
_mkdir
=
com
.
Tool
.
Directory
.
mkdir
...
...
@@ -10,7 +10,7 @@ const get = (req, res) => {
_mkdir
(
path1
.
replace
(
/
\/[^\/]
*
?
$/gi
,
''
),
()
=>
{
fs
.
writeFileSync
(
path1
,
JSON
.
stringify
({}),
'utf8'
)
})
res
.
status
(
200
).
json
({
'msg'
:
'文件不存在,创建文件'
})
res
.
status
(
200
).
json
({
msg
:
'文件不存在,创建文件'
})
return
}
let
_json
=
JSON
.
parse
(
fs
.
readFileSync
(
path1
).
toString
()
||
'{}'
)
...
...
@@ -23,7 +23,7 @@ const set = (req, res) => {
let
path1
=
path
.
resolve
(
process
.
cwd
(),
'../node-server-data/wxchart-success.json'
)
if
(
!
fs
.
existsSync
(
path1
))
{
_mkdir
(
path1
.
replace
(
/
\/[^\/]
*
?
$/gi
,
''
))
res
.
status
(
200
).
json
({
'msg'
:
'文件不存在,创建文件'
})
res
.
status
(
200
).
json
({
msg
:
'文件不存在,创建文件'
})
return
}
let
_json
=
JSON
.
parse
(
fs
.
readFileSync
(
path1
).
toString
()
||
'{}'
)
...
...
@@ -36,5 +36,5 @@ const set = (req, res) => {
module
.
exports
=
{
get
:
get
,
set
:
set
set
:
set
,
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论