2021-04-27 16:26:22 +08:00
< template >
2021-10-25 17:16:40 +08:00
< el-dropdown trigger = "click" :size = "size" >
2021-04-27 16:26:22 +08:00
< button id = "more" :class = "triggerButtonClass" title = "more..." >
2021-10-15 11:55:29 +08:00
< i class = "nz-icon nz-icon-more2" > < / i >
2021-04-27 16:26:22 +08:00
< / button >
2021-10-29 12:02:34 +08:00
< el-dropdown-menu slot = "dropdown" class = "right-box-select-top right-public-box-dropdown-top" >
2021-08-25 10:39:26 +08:00
< el-dropdown-item v-if = "showLock" >
2021-05-14 17:51:02 +08:00
< div @click ="panelLock=!panelLock" id = "panel-lock" > < i : class = "{'nz-icon nz-icon-lock':panelLock,'nz-icon nz-icon-unlock':!panelLock}" > < / i > { { panelLock ? $t ( "overall.locked" ) : $t ( "overall.unlocked" ) } } < / div >
2021-05-13 19:02:23 +08:00
< / el-dropdown-item >
2021-05-19 23:17:24 +08:00
<!-- import 、 export之前的内容 -- >
2021-04-27 16:26:22 +08:00
< slot name = "before" > < / slot >
< el-dropdown-item v-if = "importUrl" >
< div id = "chart-import" @click ="showImportBox(1)" > < i class = "nz-icon nz-icon-upload" > < / i > { { $t ( 'overall.importExcel' ) } } < / div >
< / el-dropdown-item >
< el-dropdown-item v-if = "exportUrl" >
< div id = "chart-export" @click ="showImportBox(2)" > < i class = "nz-icon nz-icon-download1" > < / i > { { $t ( 'overall.exportExcel' ) } } < / div >
< / el-dropdown-item >
2021-05-19 23:17:24 +08:00
<!-- import 、 export之后的内容 -- >
2021-04-27 16:26:22 +08:00
< slot name = "after" > < / slot >
< / el-dropdown-menu >
2021-11-01 16:46:12 +08:00
< el-dialog :close-on-click-modal = "importBox.type!=3" destroy -on -close :show-close = "true" :title = "importBox.title" :visible.sync = "importBox.show" :width = "importBox.width" append -to -body class = "nz-dialog" @close ="closeDialog" >
2021-04-27 16:26:22 +08:00
< div v-if = "importBox.type == 1" >
< div class = "upload-body" >
< el-upload :id = "id+'-xlsx-input-file'" ref = "uploadExcel" :auto-upload = "false" :file-list = "importFileList" :on-change = "importChange" accept = ".xlsx,.xls" action = "" class = "upload-demo" drag >
< div slot = "tip" class = "el-upload__tip" > { { $t ( 'overall.importTip' ) } } < / div >
< i class = "nz-icon nz-icon-upload" > < / i >
< div class = "el-upload__text" > { { $t ( 'overall.dragFileTip' ) } } , { { $t ( 'overall.or' ) } } & nbsp ; < em > { { $t ( 'overall.clickUpload' ) } } < / em > < / div >
< / el-upload >
< / div >
< div slot = "footer" class = "footer" >
< div class = "el-message-box__btns" style = "text-align: right;" >
< button :id = "id+'-xlsx-import-template'" class = "el-button el-button--default el-button--small" @click ="downloadTemplate" >
< span > { { $t ( 'overall.template' ) } } < / span >
< / button >
< button :id = "id+'-xlsx-import-add'" :class = "{'nz-btn-disabled':prevent_opt.import}" :disabled = "prevent_opt.import" class = "nz-btn el-button el-button--default el-button--small" @click ="importExcel" >
< span > { { $t ( 'overall.importExcel' ) } } < / span >
< / button >
< button :id = "id+'-xlsx-import-esc'" class = "el-button el-button--default el-button--small" @click ="closeDialog" >
< span > { { $t ( 'overall.cancel' ) } } < / span >
< / button >
< / div >
< / div >
< / div >
< div v-if = "importBox.type == 2" >
2021-11-02 15:47:17 +08:00
< div class = "upload-body" style = "height: 200px" >
< div class = "export-box" >
< span class = "export-title" > Records < / span >
< el-radio-group v-model = "importBox.record" size="small" >
< el-radio-button :label = "item.value" v-for = "(item,index) in recordArr" :key="index" :disabled="item.value==='records'&&!deleteObjs.length" > {{ item.name }} < / el -radio -button >
< / el-radio-group >
< / div >
< div class = "export-box" >
< span class = "export-title" > File format < / span >
< el-radio-group v-model = "importBox.format" size="small" >
< el-radio-button :label = "item.value" v-for = "(item,index) in formatArr" :key="index" :disabled="item.value!==1" > {{ item.name }} < / el -radio -button >
< / el-radio-group >
< / div >
2021-04-27 16:26:22 +08:00
< / div >
< div slot = "footer" class = "footer" >
2021-11-02 15:47:17 +08:00
< div class = "el-message-box__btns" >
2021-11-17 11:12:06 +08:00
< button :id = "id+'-xlsx-import-export'" class = "nz-btn nz-btn-size-normal nz-btn-style-normal-new" @click ="exportData" >
2021-11-02 15:47:17 +08:00
< span style = "text-transform:Capitalize" > { { $t ( 'config.operationlog.operations.export' ) } } < / span >
< / button >
< button :id = "id+'-xlsx-import-close'" class = "nz-btn el-button el-button--default el-button--small" @click ="closeDialog" >
< span > { { $t ( 'overall.close' ) } } < / span >
< / button >
< / div >
2021-04-27 16:26:22 +08:00
< / div >
< / div >
< div v-if = "importBox.type==3" >
< div class = "upload-body result-body" >
2021-11-01 16:46:12 +08:00
< div v-if = "importResult&&importResult.failNum" >
< div class = "result-title-top" >
< div class = "" >
< i class = "nz-icon nz-icon-import-success" / >
< span > { { $t ( 'overall.result.successNum' , { successNum : importResult . successNum } ) } } < / span > < br / >
< / div >
< div class = "" >
< i class = "nz-icon nz-icon-import-failed" / >
< span > { { $t ( 'overall.result.failedNum' , { failedNum : importResult . failNum , total : importResult . totalNum } ) } } < / span >
< / div >
< / div >
< div >
< div v-if = "importResult&&importResult.failDetail" class="result-detail" >
< div style = "height: 100%; overflow: auto" >
< template v-for = "(item, index) in importResult.failDetail" >
< div :key = "index" class = "import-result-block" >
< div class = "import-result-item" >
< div class = "line-num" > { { $t ( 'overall.result.line' , [ item . lineNo ] ) } } < / div >
< div class = "line-content" :title = "item.errorMsg" > { { item . errorMsg } } < / div >
< / div >
2021-04-27 16:26:22 +08:00
< / div >
2021-11-01 16:46:12 +08:00
< / template >
< / div >
2021-04-27 16:26:22 +08:00
< / div >
< / div >
< / div >
2021-11-01 16:46:12 +08:00
< div v-else class = "result-success-box" >
< div >
< i class = "nz-icon nz-icon-import-success" / >
< / div >
< div class = "result-success-txt" > { { $t ( 'overall.result.successfully' ) } } < / div >
< div class = "result-success-txt" >
{ { $t ( 'overall.result.imported' ) } }
< span style = "color: #333333" v-if = "importResult" > {{ importResult.successNum }} < / span >
{ { $t ( 'overall.result.records' ) } }
< / div >
< / div >
2021-04-27 16:26:22 +08:00
< / div >
< div slot = "footer" class = "footer" >
< div class = "el-message-box__btns" >
2021-11-04 09:29:01 +08:00
< button :id = "id+'-xlsx-import-rollback'" class = "nz-btn nz-btn-size-normal nz-btn-style-error" @click ="rollbackImport" >
2021-04-27 16:26:22 +08:00
< span > { { $t ( 'overall.rollbackImport' ) } } < / span >
< / button >
2021-11-01 16:46:12 +08:00
< button :id = "id+'-xlsx-import-close'" class = "nz-btn el-button el-button--default el-button--small" @click ="closeDialog" >
< span > { { $t ( 'overall.close' ) } } < / span >
< / button >
2021-04-27 16:26:22 +08:00
< / div >
< / div >
< / div >
< / el-dialog >
< / el-dropdown >
< / template >
< script >
import axios from 'axios'
let timeout
export default {
name : 'topToolMoreOptions' ,
props : {
size : {
type : String ,
2021-08-25 10:39:26 +08:00
default : 'medium'
2021-04-27 16:26:22 +08:00
} ,
exportUrl : { type : String , default : '' } ,
params : { type : Object } ,
2021-06-17 15:01:13 +08:00
params2 : { type : Object } ,
2021-04-27 16:26:22 +08:00
exportFileName : { type : String } ,
importUrl : { type : String , default : '' } , // 为空时不显示导入按钮
link : { type : Object } , // 为空时不显示导出按钮
permissions : { type : Object } ,
showCur : { type : Boolean , default : true } ,
id : { type : String , default : 'export' } ,
triggerButtonClass : { // 触发下拉事件的按钮的class
type : String ,
default : 'top-tool-btn'
2021-05-13 19:02:23 +08:00
} ,
showLock : {
type : Boolean , default : false
2021-07-19 17:04:46 +08:00
} ,
paramsType : {
type : String ,
default : ''
2021-11-02 15:47:17 +08:00
} ,
deleteObjs : Array
2021-04-27 16:26:22 +08:00
} ,
2021-11-09 10:17:12 +08:00
computed : {
language ( ) { return this . $store . getters . getLanguage }
} ,
2021-04-27 16:26:22 +08:00
data ( ) {
return {
2021-11-02 15:47:17 +08:00
importBox : { show : false , title : this . $t ( 'overall.importExcel' ) , type : 1 , record : 'all' , format : 1 } ,
2021-04-27 16:26:22 +08:00
importFile : null ,
importFileList : [ ] ,
importResult : null ,
exportShow : false ,
2021-11-01 16:46:12 +08:00
panelLock : true ,
2021-11-02 15:47:17 +08:00
recordArr : [
{ name : this . $t ( 'overall.allData' ) , value : 'all' } ,
{ name : this . $t ( 'overall.selectRecords' ) , value : 'records' } ,
{ name : this . $t ( 'overall.current' ) , value : 'current' }
] ,
formatArr : [
{ name : 'XLSX' , value : 1 } ,
{ name : 'CSV' , value : 2 } ,
{ name : 'JSON' , value : 3 }
]
2021-04-27 16:26:22 +08:00
}
} ,
mounted ( ) {
2021-07-19 17:04:46 +08:00
// this.getParamsType()
2021-04-27 16:26:22 +08:00
} ,
methods : {
importChange ( file , fileList ) {
if ( fileList . length > 0 ) {
this . importFileList = [ fileList [ fileList . length - 1 ] ]
}
this . importFile = this . importFileList [ 0 ]
this . validateFile ( )
} ,
validateFile ( ) {
} ,
rollbackImport ( ) {
let url
2021-07-20 10:16:28 +08:00
if ( this . importUrl . indexOf ( '/asset/model' ) > - 1 ) {
url = '/asset/model/cancelImport'
} else if ( this . importUrl . indexOf ( 'asset' ) > - 1 ) {
2021-05-14 17:09:57 +08:00
url = '/asset/asset/cancelImport'
2021-04-27 16:26:22 +08:00
} else if ( this . importUrl . indexOf ( 'endpoint' ) > - 1 ) {
url = '/monitor/endpoint/cancelImport'
2021-08-03 15:32:22 +08:00
} else if ( this . importUrl . indexOf ( 'module' ) > - 1 ) {
url = '/monitor/module/cancelImport'
2021-04-27 16:26:22 +08:00
} else if ( this . importUrl . indexOf ( 'rule' ) > - 1 ) {
url = '/alert/rule/cancelImport'
} else if ( this . importUrl . indexOf ( 'panel' ) > - 1 ) {
2021-05-12 11:39:21 +08:00
url = 'visual/panel/cancelImport'
2021-04-27 16:26:22 +08:00
} else if ( this . importUrl . indexOf ( 'tmpl' ) > - 1 ) {
url = '/expression/tmpl/cancelImport'
2021-07-20 10:16:28 +08:00
} else if ( this . importUrl . indexOf ( 'dc/cabinet' ) > - 1 ) {
url = '/dc/cabinet/cancelImport'
} else if ( this . importUrl . indexOf ( 'dc' ) > - 1 ) {
url = '/dc/cancelImport'
2021-04-27 16:26:22 +08:00
}
this . $delete ( url + '?seq=' + this . importResult . seq ) . then ( response => {
if ( response . code == 200 ) {
2021-05-25 10:26:13 +08:00
const linkId = this . link ? this . link . id : ''
2021-04-27 16:26:22 +08:00
this . $message ( { duration : 2000 , type : 'success' , message : this . $t ( 'tip.saveSuccess' ) } )
2021-05-25 10:26:13 +08:00
this . $emit ( 'afterImport' , linkId )
2021-04-27 16:26:22 +08:00
} else {
this . $message . error ( response . msg )
}
this . closeDialog ( )
} )
} ,
importExcel ( ) {
if ( this . importFile && this . importFile . raw ) {
this . prevent _opt . import = true
const form = new FormData ( )
form . append ( 'excelFile' , this . importFile . raw )
if ( this . paramsType ) {
form . append ( 'type' , this . paramsType )
2021-05-21 23:10:15 +08:00
if ( this . paramsType === 'asset' || this . paramsType === 'endpoint' ) {
2021-04-27 16:26:22 +08:00
form . append ( 'linkId' , this . link ? this . link . id : '' )
}
}
2021-07-20 10:16:28 +08:00
if ( this . importUrl . indexOf ( 'dc/cabinet' ) > - 1 ) {
form . append ( 'dcIds' , this . params . dcIds )
}
2021-11-04 17:18:37 +08:00
// form.append('language', localStorage.getItem('nz-language') ? localStorage.getItem('nz-language') : 'en')
2021-04-27 16:26:22 +08:00
this . $post ( this . importUrl , form , { 'Content-Type' : 'multipart/form-data' } ) . then ( response => {
if ( response . code == 200 && response . msg == 'success' ) {
this . importResult = response . data
2021-05-25 10:26:13 +08:00
const linkId = this . link ? this . link . id : ''
this . $emit ( 'afterImport' , linkId )
2021-04-27 16:26:22 +08:00
this . importBox . type = 3
this . importBox . width = '600px'
} else {
this . $message . error ( response . msg )
}
this . prevent _opt . import = false
} )
} else {
this . $message . error ( this . $t ( 'tip.noImportFile' ) )
}
} ,
exportMenuHandler ( show ) {
if ( show ) {
clearTimeout ( timeout )
this . exportShow = true
} else {
timeout = setTimeout ( ( ) => {
this . exportShow = false
} , 700 )
}
} ,
closeDialog ( ) {
this . importBox . show = false
2021-12-20 11:05:41 +08:00
setTimeout ( ( ) => {
this . $nextTick ( ( ) => {
this . importResult = null
this . importFileList = [ ]
this . importFile = null
this . importBox . value = 1
this . importBox . record = 'all'
} )
} , 100 )
2021-04-27 16:26:22 +08:00
} ,
downloadTemplate ( ) {
const language = localStorage . getItem ( 'nz-language' ) || 'en' // 初始未选择默认 en 英文
const fileName = this . exportFileName + '-' + this . $t ( 'overall.template' ) + '-' + this . getTimeString ( ) + '.xlsx'
let url = null
2021-05-21 22:55:51 +08:00
const param = { language : language }
2021-07-20 10:16:28 +08:00
if ( this . importUrl . indexOf ( '/asset/model' ) > - 1 ) {
url = '/asset/model/template'
} else if ( this . importUrl . indexOf ( 'asset' ) > - 1 ) {
2021-05-14 17:09:57 +08:00
url = '/asset/asset/template'
2021-05-21 22:55:51 +08:00
param . type = 'asset'
2021-07-19 17:04:46 +08:00
} else if ( this . importUrl . indexOf ( 'panel' ) > - 1 ) {
2021-05-12 11:39:21 +08:00
url = 'visual/panel/template'
2021-07-19 17:04:46 +08:00
param . type = this . paramsType
} else if ( this . importUrl . indexOf ( 'endpoint' ) > - 1 ) {
2021-04-27 16:26:22 +08:00
url = '/monitor/endpoint/template'
2021-05-21 22:55:51 +08:00
param . type = 'endpoint'
2021-08-03 15:32:22 +08:00
} else if ( this . importUrl . indexOf ( 'module' ) > - 1 ) {
url = '/monitor/module/template'
param . type = 'module'
2021-04-27 16:26:22 +08:00
} else if ( this . importUrl . indexOf ( 'tmpl' ) > - 1 ) {
url = '/expression/tmpl/template'
2021-06-30 16:42:54 +08:00
} else if ( this . importUrl . indexOf ( 'alert' ) > - 1 ) {
url = '/alert/rule/template'
2021-07-20 10:16:28 +08:00
} else if ( this . importUrl . indexOf ( 'dc/cabinet' ) > - 1 ) {
url = '/dc/cabinet/template'
} else if ( this . importUrl . indexOf ( 'dc' ) > - 1 ) {
url = '/dc/template'
2021-04-27 16:26:22 +08:00
}
if ( ! url ) {
console . error ( 'no interface support' )
}
this . exportExcel ( url , param , fileName )
} ,
formatJson ( filterVal , jsonData ) {
return jsonData . map ( v => filterVal . map ( j => v [ j ] ) )
} ,
exportCur ( ) {
2021-05-18 10:12:47 +08:00
const params = JSON . parse ( JSON . stringify ( this . params ) )
2021-07-19 17:04:46 +08:00
if ( this . params2 ) {
Object . keys ( this . params2 ) . forEach ( key => {
if ( params [ key ] ) {
if ( params [ key ] . prototype . toString . call ( val ) === '[object Object]' ) {
Object . assign ( params [ key ] , this . params2 [ key ] )
} else if ( params [ key ] . prototype . toString . call ( val ) === '[object Array]' ) {
2021-06-17 15:01:13 +08:00
params [ key ] . concat ( this . params2 [ key ] )
}
} else {
params [ key ] = this . params2 [ key ]
}
} )
}
2021-05-13 15:26:25 +08:00
if ( this . exportUrl . indexOf ( 'panel' ) > - 1 ) {
2021-07-20 10:16:28 +08:00
if ( this . paramsType !== 'template' ) {
params . pageSize = - 1
}
2021-05-13 15:26:25 +08:00
delete params . start _time
delete params . end _time
delete params . id
delete params . searchName
}
2021-04-27 16:26:22 +08:00
params . language = localStorage . getItem ( 'nz-language' ) || 'en'
2021-11-02 15:47:17 +08:00
params . format = this . importBox . format
2021-11-04 17:00:58 +08:00
delete params . statistics
2021-04-27 16:26:22 +08:00
this . exportExcel ( this . exportUrl , params , this . exportFileName + '-' + this . getTimeString ( ) + '.xlsx' )
this . closeDialog ( )
} ,
exportAll ( ) {
const params = JSON . parse ( JSON . stringify ( this . params ) )
2021-07-19 17:04:46 +08:00
if ( this . params2 ) {
Object . keys ( this . params2 ) . forEach ( key => {
if ( params [ key ] ) {
if ( params [ key ] . prototype . toString . call ( val ) === '[object Object]' ) {
Object . assign ( params [ key ] , this . params2 [ key ] )
} else if ( params [ key ] . prototype . toString . call ( val ) === '[object Array]' ) {
2021-06-17 15:01:13 +08:00
params [ key ] . concat ( this . params2 [ key ] )
}
} else {
params [ key ] = this . params2 [ key ]
}
} )
}
2021-04-27 16:26:22 +08:00
params . pageSize = - 1
2021-05-13 15:26:25 +08:00
if ( this . exportUrl . indexOf ( 'panel' ) > - 1 ) {
delete params . start _time
delete params . end _time
delete params . id
delete params . searchName
}
2021-04-27 16:26:22 +08:00
if ( this . importUrl . indexOf ( 'panel' ) > - 1 ) {
delete params . panelId
}
// if (this.importUrl.indexOf('endpoint') > -1){
// delete params.moduleId
// }
params . language = localStorage . getItem ( 'nz-language' ) || 'en'
2021-11-02 15:47:17 +08:00
params . format = this . importBox . format
2021-11-04 17:00:58 +08:00
delete params . statistics
2021-04-27 16:26:22 +08:00
this . exportExcel ( this . exportUrl , params , this . exportFileName + '-' + this . getTimeString ( ) + '.xlsx' )
this . closeDialog ( )
} ,
2021-11-09 10:17:12 +08:00
exportRecords ( ) {
2021-11-02 15:47:17 +08:00
const params = JSON . parse ( JSON . stringify ( this . params ) )
if ( this . params2 ) {
Object . keys ( this . params2 ) . forEach ( key => {
if ( params [ key ] ) {
if ( params [ key ] . prototype . toString . call ( val ) === '[object Object]' ) {
Object . assign ( params [ key ] , this . params2 [ key ] )
} else if ( params [ key ] . prototype . toString . call ( val ) === '[object Array]' ) {
params [ key ] . concat ( this . params2 [ key ] )
}
} else {
params [ key ] = this . params2 [ key ]
}
} )
}
params . pageSize = - 1
if ( this . exportUrl . indexOf ( 'panel' ) > - 1 ) {
delete params . start _time
delete params . end _time
delete params . id
delete params . searchName
}
if ( this . importUrl . indexOf ( 'panel' ) > - 1 ) {
delete params . panelId
}
// if (this.importUrl.indexOf('endpoint') > -1){
// delete params.moduleId
// }
params . language = localStorage . getItem ( 'nz-language' ) || 'en'
params . format = this . importBox . format
params . ids = this . deleteObjs . map ( item => item . id ) . join ( ',' )
2021-11-04 17:00:58 +08:00
delete params . statistics
2021-11-02 15:47:17 +08:00
this . exportExcel ( this . exportUrl , params , this . exportFileName + '-' + this . getTimeString ( ) + '.xlsx' )
this . closeDialog ( )
} ,
exportData ( ) {
if ( this . importBox . record === 'all' ) {
this . exportAll ( )
} else if ( this . importBox . record === 'current' ) {
this . exportCur ( )
} else if ( this . importBox . record === 'records' ) {
this . exportRecords ( )
}
} ,
2021-04-27 16:26:22 +08:00
exportExcel ( url , params , fileName ) {
if ( this . paramsType ) {
params . type = this . paramsType
}
2021-05-18 10:12:47 +08:00
if ( params . from == 'asset' ) {
delete params . type
delete params . from
}
2021-04-27 16:26:22 +08:00
axios . get ( url , { responseType : 'blob' , params : params } ) . then ( res => {
if ( window . navigator . msSaveOrOpenBlob ) {
// 兼容ie11
const blobObject = new Blob ( [ res . data ] )
window . navigator . msSaveOrOpenBlob ( blobObject , fileName )
} else {
const url = URL . createObjectURL ( new Blob ( [ res . data ] ) )
const a = document . createElement ( 'a' )
document . body . appendChild ( a ) // 此处增加了将创建的添加到body当中
a . href = url
a . download = fileName
a . target = '_blank'
a . click ( )
a . remove ( ) // 将a标签移除
}
} , error => {
const $self = this
const reader = new FileReader ( )
reader . onload = function ( event ) {
const responseText = reader . result
const exception = JSON . parse ( responseText )
if ( exception . message ) {
$self . $message . error ( exception . message )
} else {
console . error ( error )
}
}
reader . readAsText ( error . response . data )
} )
} ,
showImportBox ( type ) {
this . importBox . show = true
this . importBox . type = type
if ( type == 2 && ( ! this . showCur ) ) {
this . exportCur ( )
return
}
if ( type == 1 ) { // import
this . importBox . title = this . $t ( 'overall.importExcel' )
this . importBox . width = '600px'
} else if ( type == 2 ) { // export
this . importBox . title = this . $t ( 'overall.exportExcel' )
2021-11-02 15:47:17 +08:00
this . importBox . width = '580px'
2021-04-27 16:26:22 +08:00
}
} ,
getTimeString ( ) {
const split = '-'
const date = new Date ( )
const year = date . getFullYear ( )
const month = this . formatNum ( date . getMonth ( ) + 1 )
const day = this . formatNum ( date . getDate ( ) )
const hours = this . formatNum ( date . getHours ( ) )
const minutes = this . formatNum ( date . getMinutes ( ) )
const seconds = this . formatNum ( date . getSeconds ( ) )
return year + split + month + split + day + ' ' + hours + split + minutes + split + seconds
} ,
formatNum ( num ) {
return num > 9 ? num : '0' + num
}
2021-05-13 19:02:23 +08:00
} ,
watch : {
panelLock : {
immediate : true ,
handler ( n ) {
this . $emit ( 'panelLockChange' , n )
}
}
2021-04-27 16:26:22 +08:00
}
}
< / script >