正在显示
2 个修改的文件
包含
101 行增加
和
101 行删除
| 1 | { | 1 | { |
| 2 | - "GETCLASSURL":"http://139.196.126.156:8081/getLogs/recordClassList", | ||
| 3 | - "GETCLASSURLPARAMETER":{ | ||
| 4 | - "siteId":["beidatest","funexenglish"], | ||
| 5 | - "key":"xdymp4record20191225", | ||
| 6 | - "page":1, | ||
| 7 | - "maxMedia":1 | ||
| 8 | - }, | ||
| 9 | - "PROJECTWINCATALOG":"F:/project/web_capture_release/win-x64", | ||
| 10 | - "PROJECTCATALOG":"F:/project/web_capture_release", | ||
| 11 | - "BACKMEDIACONFIG":{ | ||
| 12 | - "url" : "https://pclive.xuedianyun.com/pcBase/pclive2/dev/index.html", | ||
| 13 | - "recordMp4":true, | ||
| 14 | - "classId":"", | ||
| 15 | - "userId":0, | ||
| 16 | - "userName":"", | ||
| 17 | - "userRole":"normal", | ||
| 18 | - "portalIP":"saas.xuedianyun.com", | ||
| 19 | - "portalPort":80, | ||
| 20 | - "channels":2, | ||
| 21 | - "playRecord":1, | ||
| 22 | - "d":21600000, | ||
| 23 | - "s":3000, | ||
| 24 | - "fa":15, | ||
| 25 | - "k":0, | ||
| 26 | - "w":1280, | ||
| 27 | - "h":720 | ||
| 28 | - } | ||
| 29 | -} | ||
| 2 | + "GETCLASSURL": "http://139.196.126.156:8081/getLogs/recordClassList", | ||
| 3 | + "GETCLASSURLPARAMETER": { | ||
| 4 | + "siteId": [], | ||
| 5 | + "key": "xdymp4record20191225", | ||
| 6 | + "page": 1, | ||
| 7 | + "maxMedia": 1 | ||
| 8 | + }, | ||
| 9 | + "PROJECTWINCATALOG": "F:/project/web_capture_release/win-x64", | ||
| 10 | + "PROJECTCATALOG": "F:/project/web_capture_release", | ||
| 11 | + "BACKMEDIACONFIG": { | ||
| 12 | + "url": "https://pclive.xuedianyun.com/pcBase/pclive2/dev/index.html", | ||
| 13 | + "recordMp4": true, | ||
| 14 | + "classId": "", | ||
| 15 | + "userId": 0, | ||
| 16 | + "userName": "", | ||
| 17 | + "userRole": "normal", | ||
| 18 | + "portalIP": "saas.xuedianyun.com", | ||
| 19 | + "portalPort": 80, | ||
| 20 | + "channels": 2, | ||
| 21 | + "playRecord": 1, | ||
| 22 | + "d": 21600000, | ||
| 23 | + "s": 3000, | ||
| 24 | + "fa": 15, | ||
| 25 | + "k": 0, | ||
| 26 | + "w": 1280, | ||
| 27 | + "h": 720 | ||
| 28 | + } | ||
| 29 | +} |
| 1 | var express = require('express'); | 1 | var express = require('express'); |
| 2 | var router = express.Router(); | 2 | var router = express.Router(); |
| 3 | -const {spawn, exec} = require('child_process'); | 3 | +const { spawn, exec } = require('child_process'); |
| 4 | const fs = require("fs"); | 4 | const fs = require("fs"); |
| 5 | var path = require('path') | 5 | var path = require('path') |
| 6 | 6 | ||
| @@ -8,7 +8,7 @@ const method = require("../config/method") | @@ -8,7 +8,7 @@ const method = require("../config/method") | ||
| 8 | const config = require("../config/config") | 8 | const config = require("../config/config") |
| 9 | 9 | ||
| 10 | // const { GETCLASSURL, GETCLASSURLPARAMETER, PROJECTCATALOG, PROJECTWINCATALOG, BACKMEDIACONFIG } = config | 10 | // const { GETCLASSURL, GETCLASSURLPARAMETER, PROJECTCATALOG, PROJECTWINCATALOG, BACKMEDIACONFIG } = config |
| 11 | -const {YesterdayTime, getRequestClassIds, dayTimeYMD} = method | 11 | +const { YesterdayTime, getRequestClassIds, dayTimeYMD } = method |
| 12 | 12 | ||
| 13 | let siteIds = [] | 13 | let siteIds = [] |
| 14 | 14 | ||
| @@ -29,11 +29,11 @@ class MediaCreat { | @@ -29,11 +29,11 @@ class MediaCreat { | ||
| 29 | 29 | ||
| 30 | // 取出所有数据 | 30 | // 取出所有数据 |
| 31 | async allData() { | 31 | async allData() { |
| 32 | - const {startTime, endTime} = YesterdayTime() | 32 | + const { startTime, endTime } = YesterdayTime() |
| 33 | let fileConfig = new MediaCreat().getConfigFileJson() | 33 | let fileConfig = new MediaCreat().getConfigFileJson() |
| 34 | if (!fileConfig) return false | 34 | if (!fileConfig) return false |
| 35 | className = siteIds.shift() | 35 | className = siteIds.shift() |
| 36 | - const {GETCLASSURL, GETCLASSURLPARAMETER} = JSON.parse(fileConfig) | 36 | + const { GETCLASSURL, GETCLASSURLPARAMETER } = JSON.parse(fileConfig) |
| 37 | let page = 1 | 37 | let page = 1 |
| 38 | if (className) { | 38 | if (className) { |
| 39 | let result = await getRequestClassIds(GETCLASSURL, className, GETCLASSURLPARAMETER.key, startTime, endTime, page) | 39 | let result = await getRequestClassIds(GETCLASSURL, className, GETCLASSURLPARAMETER.key, startTime, endTime, page) |
| @@ -42,7 +42,7 @@ class MediaCreat { | @@ -42,7 +42,7 @@ class MediaCreat { | ||
| 42 | classid.push(result.data.data.list[j]) | 42 | classid.push(result.data.data.list[j]) |
| 43 | parentData[result.data.data.siteId].add(result.data.data.list[j]['classId']) | 43 | parentData[result.data.data.siteId].add(result.data.data.list[j]['classId']) |
| 44 | } | 44 | } |
| 45 | - const {siteId, list, totalPage} = result.data.data | 45 | + const { siteId, list, totalPage } = result.data.data |
| 46 | for (let i = page += 1; i <= totalPage; i++) { | 46 | for (let i = page += 1; i <= totalPage; i++) { |
| 47 | let result = await getRequestClassIds(GETCLASSURL, className, GETCLASSURLPARAMETER.key, startTime, endTime, i) | 47 | let result = await getRequestClassIds(GETCLASSURL, className, GETCLASSURLPARAMETER.key, startTime, endTime, i) |
| 48 | for (let j = 0; j < result.data.data.list.length; j++) { | 48 | for (let j = 0; j < result.data.data.list.length; j++) { |
| @@ -123,7 +123,7 @@ class MediaCreat { | @@ -123,7 +123,7 @@ class MediaCreat { | ||
| 123 | this.wrieLog(" 课堂录制开始:------>" + id) | 123 | this.wrieLog(" 课堂录制开始:------>" + id) |
| 124 | let fileConfig = this.getConfigFileJson() | 124 | let fileConfig = this.getConfigFileJson() |
| 125 | if (!fileConfig) return false | 125 | if (!fileConfig) return false |
| 126 | - const {BACKMEDIACONFIG, PROJECTWINCATALOG, PROJECTCATALOG} = JSON.parse(fileConfig) | 126 | + const { BACKMEDIACONFIG, PROJECTWINCATALOG, PROJECTCATALOG } = JSON.parse(fileConfig) |
| 127 | let mediaDir = PROJECTCATALOG + "/media/" | 127 | let mediaDir = PROJECTCATALOG + "/media/" |
| 128 | let classDir = PROJECTCATALOG + "/media/" + siteId | 128 | let classDir = PROJECTCATALOG + "/media/" + siteId |
| 129 | let ymdDir = PROJECTCATALOG + "/media/" + siteId + "/" + dayTimeYMD().ymd | 129 | let ymdDir = PROJECTCATALOG + "/media/" + siteId + "/" + dayTimeYMD().ymd |
| @@ -140,73 +140,73 @@ class MediaCreat { | @@ -140,73 +140,73 @@ class MediaCreat { | ||
| 140 | // export DISPLAY=:7 | 140 | // export DISPLAY=:7 |
| 141 | // let url = `${path.resolve(__dirname, PROJECTWINCATALOG+"/web_capture_c")} -o=${ymdDir}/${id}.mp4 -u="${BACKMEDIACONFIG.url}?classId=${id}&recordMp4=${BACKMEDIACONFIG.recordMp4}&userId=${BACKMEDIACONFIG.userId}&userName=${BACKMEDIACONFIG.userName}&userRole=${BACKMEDIACONFIG.userRole}&portalIP=${BACKMEDIACONFIG.portalIP}&portalPort=${BACKMEDIACONFIG.portalPort}&channels=${BACKMEDIACONFIG.channels}&playRecord=${BACKMEDIACONFIG.playRecord}" -d=${BACKMEDIACONFIG.d} -s=${BACKMEDIACONFIG.s} -fa=${BACKMEDIACONFIG.fa} -k=${BACKMEDIACONFIG.k} -w=${BACKMEDIACONFIG.w} -h=${BACKMEDIACONFIG.h}` | 141 | // let url = `${path.resolve(__dirname, PROJECTWINCATALOG+"/web_capture_c")} -o=${ymdDir}/${id}.mp4 -u="${BACKMEDIACONFIG.url}?classId=${id}&recordMp4=${BACKMEDIACONFIG.recordMp4}&userId=${BACKMEDIACONFIG.userId}&userName=${BACKMEDIACONFIG.userName}&userRole=${BACKMEDIACONFIG.userRole}&portalIP=${BACKMEDIACONFIG.portalIP}&portalPort=${BACKMEDIACONFIG.portalPort}&channels=${BACKMEDIACONFIG.channels}&playRecord=${BACKMEDIACONFIG.playRecord}" -d=${BACKMEDIACONFIG.d} -s=${BACKMEDIACONFIG.s} -fa=${BACKMEDIACONFIG.fa} -k=${BACKMEDIACONFIG.k} -w=${BACKMEDIACONFIG.w} -h=${BACKMEDIACONFIG.h}` |
| 142 | // console.log("url", url) | 142 | // console.log("url", url) |
| 143 | - let url = `${PROJECTWINCATALOG}/web_capture_c -o=${ymdDir}/${id}.mp4 -u="${BACKMEDIACONFIG.url}?classId=${id}&recordMp4=${BACKMEDIACONFIG.recordMp4}&userId=${BACKMEDIACONFIG.userId}&userName=${BACKMEDIACONFIG.userName}&userRole=${BACKMEDIACONFIG.userRole}&portalIP=${BACKMEDIACONFIG.portalIP}&portalPort=${BACKMEDIACONFIG.portalPort}&channels=${BACKMEDIACONFIG.channels}&playRecord=${BACKMEDIACONFIG.playRecord}" -d=${BACKMEDIACONFIG.d} -s=${BACKMEDIACONFIG.s} -fa=${BACKMEDIACONFIG.fa} -k=${BACKMEDIACONFIG.k} -w=${BACKMEDIACONFIG.w} -h=${BACKMEDIACONFIG.h} -k=0` | 143 | + let url = `${PROJECTWINCATALOG}/web_capture_c -o=${ymdDir}/${id}.mp4 -u="${BACKMEDIACONFIG.url}?classId=${id}&recordMp4=${BACKMEDIACONFIG.recordMp4}&userId=${BACKMEDIACONFIG.userId}&userName=${BACKMEDIACONFIG.userName}&userRole=${BACKMEDIACONFIG.userRole}&portalIP=${BACKMEDIACONFIG.portalIP}&portalPort=${BACKMEDIACONFIG.portalPort}&channels=${BACKMEDIACONFIG.channels}&playRecord=${BACKMEDIACONFIG.playRecord}&language=zh-cn" -d=${BACKMEDIACONFIG.d} -s=${BACKMEDIACONFIG.s} -fa=${BACKMEDIACONFIG.fa} -k=${BACKMEDIACONFIG.k} -w=${BACKMEDIACONFIG.w} -h=${BACKMEDIACONFIG.h}` |
| 144 | // console.log("url", url) | 144 | // console.log("url", url) |
| 145 | // console.log("PROJECTWINCATALOG", PROJECTWINCATALOG) | 145 | // console.log("PROJECTWINCATALOG", PROJECTWINCATALOG) |
| 146 | - exec(url, {maxBuffer:1073741824},(err, stdout, stderr) => { | 146 | + exec(url, { maxBuffer: 1073741824 }, (err, stdout, stderr) => { |
| 147 | // setTimeout(()=>{ | 147 | // setTimeout(()=>{ |
| 148 | - if (err != null) { | ||
| 149 | - this.wrieLog(" 错误" + id +":" + err) | ||
| 150 | - this.wrieLog(" 错误 stdout" + id +":" + stdout) | ||
| 151 | - this.wrieLog(" 错误 stderr" + id +":" + stderr) | ||
| 152 | - // if (files.indexOf(id + ".mp4") == -1) { | ||
| 153 | - // // //当前课堂没有写入到文件夹,进入重录 | ||
| 154 | - // this.wrieLog(" 课堂录制未发现该" + id + "课堂号") | ||
| 155 | - // this.recordingCreat(id, siteId) | ||
| 156 | - // // return false | ||
| 157 | - // } | ||
| 158 | - // if (classid.length) { | ||
| 159 | - // setTimeout(()=>{ | ||
| 160 | - // let shiftData = classid.shift() | ||
| 161 | - // this.wrieLog(" 录制下一节课 课堂号:" + shiftData['classId']) | ||
| 162 | - // this.recordingCreat(shiftData['classId'], shiftData['siteId']) | ||
| 163 | - // },20000) | ||
| 164 | - // // clearInterval(interValGetFile) | ||
| 165 | - // } | ||
| 166 | - return | ||
| 167 | - } | ||
| 168 | - let files = fs.readdirSync(ymdDir); | ||
| 169 | - // let interValGetFile = setInterval(()=>{ | ||
| 170 | - if (files.indexOf(id + ".mp4") == -1) { | ||
| 171 | - this.wrieLog(" 课堂录制未发现该" + id + "课堂号") | ||
| 172 | - }else{ | ||
| 173 | - if (classid.length) { | ||
| 174 | - setTimeout(()=>{ | ||
| 175 | - let shiftData = classid.shift() | ||
| 176 | - this.wrieLog(" 录制下一节课 课堂号:" + shiftData['classId']) | ||
| 177 | - this.recordingCreat(shiftData['classId'], shiftData['siteId']) | ||
| 178 | - },60*1000*5) | ||
| 179 | - // clearInterval(interValGetFile) | ||
| 180 | - }else{ | ||
| 181 | - this.wrieLog("录制结束:------>") | ||
| 182 | - fs.writeFile(ymdDir + "/download.json", `{ "code": "0", "success": "ok"}`, function (err) { | ||
| 183 | - if (err) { | ||
| 184 | - console.log(err); | ||
| 185 | - } | ||
| 186 | - }); | ||
| 187 | - // clearInterval(interValGetFile) | ||
| 188 | - } | ||
| 189 | - } | ||
| 190 | - // },3000) | 148 | + if (err != null) { |
| 149 | + this.wrieLog(" 错误" + id + ":" + err) | ||
| 150 | + this.wrieLog(" 错误 stdout" + id + ":" + stdout) | ||
| 151 | + this.wrieLog(" 错误 stderr" + id + ":" + stderr) | ||
| 191 | // if (files.indexOf(id + ".mp4") == -1) { | 152 | // if (files.indexOf(id + ".mp4") == -1) { |
| 192 | // // //当前课堂没有写入到文件夹,进入重录 | 153 | // // //当前课堂没有写入到文件夹,进入重录 |
| 193 | // this.wrieLog(" 课堂录制未发现该" + id + "课堂号") | 154 | // this.wrieLog(" 课堂录制未发现该" + id + "课堂号") |
| 194 | // this.recordingCreat(id, siteId) | 155 | // this.recordingCreat(id, siteId) |
| 195 | // // return false | 156 | // // return false |
| 196 | - // } else { | ||
| 197 | - // if (classid.length) { | 157 | + // } |
| 158 | + // if (classid.length) { | ||
| 159 | + // setTimeout(()=>{ | ||
| 198 | // let shiftData = classid.shift() | 160 | // let shiftData = classid.shift() |
| 199 | // this.wrieLog(" 录制下一节课 课堂号:" + shiftData['classId']) | 161 | // this.wrieLog(" 录制下一节课 课堂号:" + shiftData['classId']) |
| 200 | // this.recordingCreat(shiftData['classId'], shiftData['siteId']) | 162 | // this.recordingCreat(shiftData['classId'], shiftData['siteId']) |
| 201 | - // } else { | ||
| 202 | - // this.wrieLog("录制结束:------>") | ||
| 203 | - // fs.writeFile(ymdDir + "/download.json", `{ "code": "0", "success": "ok"}`, function (err) { | ||
| 204 | - // if (err) { | ||
| 205 | - // console.log(err); | ||
| 206 | - // } | ||
| 207 | - // }); | ||
| 208 | - // } | 163 | + // },20000) |
| 164 | + // // clearInterval(interValGetFile) | ||
| 209 | // } | 165 | // } |
| 166 | + return | ||
| 167 | + } | ||
| 168 | + let files = fs.readdirSync(ymdDir); | ||
| 169 | + // let interValGetFile = setInterval(()=>{ | ||
| 170 | + if (files.indexOf(id + ".mp4") == -1) { | ||
| 171 | + this.wrieLog(" 课堂录制未发现该" + id + "课堂号") | ||
| 172 | + } else { | ||
| 173 | + if (classid.length) { | ||
| 174 | + setTimeout(() => { | ||
| 175 | + let shiftData = classid.shift() | ||
| 176 | + this.wrieLog(" 录制下一节课 课堂号:" + shiftData['classId']) | ||
| 177 | + this.recordingCreat(shiftData['classId'], shiftData['siteId']) | ||
| 178 | + }, 60 * 1000 * 5) | ||
| 179 | + // clearInterval(interValGetFile) | ||
| 180 | + } else { | ||
| 181 | + this.wrieLog("录制结束:------>") | ||
| 182 | + fs.writeFile(ymdDir + "/download.json", `{ "code": "0", "success": "ok"}`, function (err) { | ||
| 183 | + if (err) { | ||
| 184 | + console.log(err); | ||
| 185 | + } | ||
| 186 | + }); | ||
| 187 | + // clearInterval(interValGetFile) | ||
| 188 | + } | ||
| 189 | + } | ||
| 190 | + // },3000) | ||
| 191 | + // if (files.indexOf(id + ".mp4") == -1) { | ||
| 192 | + // // //当前课堂没有写入到文件夹,进入重录 | ||
| 193 | + // this.wrieLog(" 课堂录制未发现该" + id + "课堂号") | ||
| 194 | + // this.recordingCreat(id, siteId) | ||
| 195 | + // // return false | ||
| 196 | + // } else { | ||
| 197 | + // if (classid.length) { | ||
| 198 | + // let shiftData = classid.shift() | ||
| 199 | + // this.wrieLog(" 录制下一节课 课堂号:" + shiftData['classId']) | ||
| 200 | + // this.recordingCreat(shiftData['classId'], shiftData['siteId']) | ||
| 201 | + // } else { | ||
| 202 | + // this.wrieLog("录制结束:------>") | ||
| 203 | + // fs.writeFile(ymdDir + "/download.json", `{ "code": "0", "success": "ok"}`, function (err) { | ||
| 204 | + // if (err) { | ||
| 205 | + // console.log(err); | ||
| 206 | + // } | ||
| 207 | + // }); | ||
| 208 | + // } | ||
| 209 | + // } | ||
| 210 | // },20000) | 210 | // },20000) |
| 211 | }) | 211 | }) |
| 212 | // console.log("/web_capture_c",path.resolve(__dirname, PROJECTWINCATALOG+"./web_capture_c")) | 212 | // console.log("/web_capture_c",path.resolve(__dirname, PROJECTWINCATALOG+"./web_capture_c")) |
| @@ -267,18 +267,18 @@ class MediaCreat { | @@ -267,18 +267,18 @@ class MediaCreat { | ||
| 267 | router.get('/', async function (req, res, next) { | 267 | router.get('/', async function (req, res, next) { |
| 268 | if (classid.length > 0) { | 268 | if (classid.length > 0) { |
| 269 | // 有正在录制中的课堂,禁止重复 | 269 | // 有正在录制中的课堂,禁止重复 |
| 270 | - res.send({code: "1", message: "有正在录制中的课堂", data: classid}); | 270 | + res.send({ code: "1", message: "有正在录制中的课堂", data: classid }); |
| 271 | return | 271 | return |
| 272 | } | 272 | } |
| 273 | new MediaCreat().wrieLog("脚本录制开始:------>") | 273 | new MediaCreat().wrieLog("脚本录制开始:------>") |
| 274 | let fileConfig = new MediaCreat().getConfigFileJson() | 274 | let fileConfig = new MediaCreat().getConfigFileJson() |
| 275 | if (!fileConfig) return false | 275 | if (!fileConfig) return false |
| 276 | 276 | ||
| 277 | - const {GETCLASSURLPARAMETER} = JSON.parse(fileConfig) | 277 | + const { GETCLASSURLPARAMETER } = JSON.parse(fileConfig) |
| 278 | siteIds = GETCLASSURLPARAMETER.siteId | 278 | siteIds = GETCLASSURLPARAMETER.siteId |
| 279 | - if(siteIds.length == 0){ | 279 | + if (siteIds.length == 0) { |
| 280 | new MediaCreat().wrieLog("脚本录制,未配置siteId:------>" + siteIds) | 280 | new MediaCreat().wrieLog("脚本录制,未配置siteId:------>" + siteIds) |
| 281 | - res.send({code: "1",message:"未配置siteId",data:siteIds}); | 281 | + res.send({ code: "1", message: "未配置siteId", data: siteIds }); |
| 282 | return | 282 | return |
| 283 | } | 283 | } |
| 284 | let result = await new MediaCreat().allData() | 284 | let result = await new MediaCreat().allData() |
| @@ -300,12 +300,12 @@ router.get('/', async function (req, res, next) { | @@ -300,12 +300,12 @@ router.get('/', async function (req, res, next) { | ||
| 300 | return false | 300 | return false |
| 301 | } | 301 | } |
| 302 | } | 302 | } |
| 303 | - res.send({code: "0"}); | 303 | + res.send({ code: "0" }); |
| 304 | } else { | 304 | } else { |
| 305 | - res.send({code: "1", message: "无录制数据"}); | 305 | + res.send({ code: "1", message: "无录制数据" }); |
| 306 | } | 306 | } |
| 307 | - }else { | ||
| 308 | - res.send({code: "1", message: "无录制数据"}); | 307 | + } else { |
| 308 | + res.send({ code: "1", message: "无录制数据" }); | ||
| 309 | } | 309 | } |
| 310 | }); | 310 | }); |
| 311 | 311 | ||
| @@ -318,10 +318,10 @@ router.post('/recording', async function (req, res, next) { | @@ -318,10 +318,10 @@ router.post('/recording', async function (req, res, next) { | ||
| 318 | new MediaCreat().wrieLog("录制启动:------>") | 318 | new MediaCreat().wrieLog("录制启动:------>") |
| 319 | let fileConfig = new MediaCreat().getConfigFileJson() | 319 | let fileConfig = new MediaCreat().getConfigFileJson() |
| 320 | if (!fileConfig) return false | 320 | if (!fileConfig) return false |
| 321 | - let {classId, maxMedia} = req.body | 321 | + let { classId, maxMedia } = req.body |
| 322 | if (classid.length > 0) { | 322 | if (classid.length > 0) { |
| 323 | // 有正在录制中的课堂,禁止重复 | 323 | // 有正在录制中的课堂,禁止重复 |
| 324 | - res.send({code: "1", message: "有正在录制中的课堂", data: classid}); | 324 | + res.send({ code: "1", message: "有正在录制中的课堂", data: classid }); |
| 325 | return | 325 | return |
| 326 | } | 326 | } |
| 327 | if (classId && classId.length) { | 327 | if (classId && classId.length) { |
| @@ -338,9 +338,9 @@ router.post('/recording', async function (req, res, next) { | @@ -338,9 +338,9 @@ router.post('/recording', async function (req, res, next) { | ||
| 338 | return false | 338 | return false |
| 339 | } | 339 | } |
| 340 | } | 340 | } |
| 341 | - res.send({code: "0"}); | 341 | + res.send({ code: "0" }); |
| 342 | } else { | 342 | } else { |
| 343 | - res.send({code: "1", message: "无录制数据"}); | 343 | + res.send({ code: "1", message: "无录制数据" }); |
| 344 | } | 344 | } |
| 345 | 345 | ||
| 346 | }) | 346 | }) |
-
请 注册 或 登录 后发表评论