info_pad.vue 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854
  1. <template>
  2. <div class="meeting">
  3. <div style="width: 81%;height: 100%;padding: 16px 8px 16px 16px;" class="display-cloumn">
  4. <div class="display-row display-between">
  5. <div class="display-row display-align-center">
  6. <el-image :src="logo" fit="contain" class="icon-18" />
  7. <div class="title">浪潮智屏投控-会议管理</div>
  8. </div>
  9. <div class="display-row display-align-center" @click="closePage">
  10. <el-image :src="logoExit" fit="contain" class="icon" />
  11. <div class="text-fontsize-12" style="margin-left: 4px;">退出会议</div>
  12. </div>
  13. </div>
  14. <div class="display-row display-align-center" style="margin-top: 20px;">
  15. <div class="text-fontsize-12" style="font-weight: bold;;">{{ form.title }}</div>
  16. <el-image :src="iconTime" fit="contaion" class="icon" style="margin-left: 15px;" />
  17. <div class="text-fontsize-12" style="margin-left: 4px;">时间:{{form.beginTime}} - {{form.endTime}}</div>
  18. </div>
  19. <div class="display-row display-between" style="margin-top: 15px;">
  20. <div class="display-row display-align-center">
  21. <el-image :src="iconAddress" fit="contaion" class="icon" />
  22. <div class="text-fontsize-12" style="margin-left: 4px;">地点:{{form.address}}</div>
  23. <el-image :src="iconHost" fit="contaion" class="icon" style="margin-left: 7px;" />
  24. <div class="text-fontsize-12" style="margin-left: 4px;">主持:{{form.host}}</div>
  25. <el-image :src="iconOrganization" fit="contaion" class="icon" style="margin-left: 7px;" />
  26. <div class="text-fontsize-12" style="margin-left: 4px;">发起组织:{{form.fromOrg}}</div>
  27. </div>
  28. <div v-if="selectedFileIndex>=0">
  29. <div class="text-fontsize-12 single-line" style="max-width :300px">{{meetTitle}}</div>
  30. </div>
  31. </div>
  32. <div class="display-row display-between" style="margin-top: 15px;">
  33. <div class="display-row display-align-center">
  34. <div class="text-fontsize-12">请选择会议设备</div>
  35. <el-select v-model="deviceId" placeholder="请选择会议设备" style="margin-left: 8px;width: 160px;"
  36. :popper-append-to-body="false" class="elselect">
  37. <el-option v-for="device in deviceList" :label="device.deviceName" :value="device.id" />
  38. </el-select>
  39. </div>
  40. <div class="display-row display-align-center">
  41. <div class="text-fontsize-12">缩放比例</div>
  42. <el-select v-model="scaleId" placeholder="请选择" style="margin-left: 2px;width: 70px;"
  43. :popper-append-to-body="false" @change="scaleChange" class="elselect">
  44. <el-option v-for="scale in scaleList" :label="scale.label" :value="scale.value" />
  45. </el-select>
  46. <div class="text-fontsize-12" style="margin-left: 5px;">移动距离</div>
  47. <el-select v-model="moveId" placeholder="请选择" style="margin-left: 2px;width: 70px;"
  48. :popper-append-to-body="false" class="elselect">
  49. <el-option v-for="move in moveList" :label="move.label" :value="move.value" />
  50. </el-select>
  51. <el-button class="btn no-active" style="margin-left: 5px;" @click="moveUp">上移</el-button>
  52. <el-button class="btn no-active" style="margin-left: 5px;" @click="moveDown">下移</el-button>
  53. <el-button class="btn no-active" style="margin-left: 5px;" @click="lastPage">上一页</el-button>
  54. <el-button class="btn no-active" style="margin-left: 5px;" @click="nextPage">下一页</el-button>
  55. </div>
  56. </div>
  57. <div class="screen_nocontent display-center" style="margin-top: 6px;height:70vh">
  58. <div v-if="fileType == 1 && null == pageSrc" class="display-cloumn display-center">
  59. <el-image :src="iconScreen" class="icon-40"></el-image>
  60. <div class="text-fontsize-12" style="margin-top: 8px;">此处展示投屏画面</div>
  61. </div>
  62. <div v-else-if="fileType == 2 && null == material" class="display-cloumn display-center">
  63. <el-image :src="iconScreen" class="icon-40"></el-image>
  64. <div class="text-fontsize-12" style="margin-top: 8px;">此处展示投屏画面</div>
  65. </div>
  66. <div v-else style="height:70vh;width:100%;overflow: hidden;" class="display-center">
  67. <iframe v-if="fileType == 2" :src="material" ref="iframe" style="width: 100%; height: 69vh;"></iframe>
  68. <el-image v-else :src="pageSrc.fileUrl" @load="handleImageLoad" style="width:auto" fit="contain"
  69. :style="{ height: imageHeight +'%',transform: 'translateY(' + imageOffset + 'px)'}" />
  70. </div>
  71. </div>
  72. </div>
  73. <div class="line-column"></div>
  74. <div style="width: 19%;height: 100%;padding: 10px 0">
  75. <!-- 会议资料 -->
  76. <div class="display-cloumn" style="height: 35%;padding-bottom: 5px;">
  77. <div class="display-row"
  78. style="display: flex;justify-content: space-between;align-items: center;margin: 0 8px;">
  79. <div class="display-row" style="display: flex;align-items: center;">
  80. <div class="text-fontsize-14">会议资料</div>
  81. <el-image :src="iconFresh" fit="contaion" class="icon" @click="getMeetingInfo()"
  82. style="margin-left: 8px;"></el-image>
  83. </div>
  84. <div class="display-row">
  85. <el-image :src="iconStartPlay" class="icon-40" @click="beginPlay()">开始播放</el-image>
  86. <el-image :src="iconStopPlay" class="icon-40" style="margin-left:10px" @click="endPlay()">结束播放</el-image>
  87. </div>
  88. </div>
  89. <div style="margin-top: 8px;overflow-y: auto" class="no-scrollbar">
  90. <div v-for="(item,index) in fileList" @click="selectFileItem(index)">
  91. <div class="fileItem text-fontsize-12 single-line" :class="{ 'is-selected': selectedFileIndex === index }">
  92. {{item.fileName}}
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. <div class="line" />
  98. <!-- 图片抓拍 -->
  99. <div class="display-cloumn" style="height: 23%;padding: 8px;">
  100. <div class="display-row" style="display: flex;justify-content: space-between;align-items: center;">
  101. <div class="display-row" style="display: flex;align-items: center;">
  102. <div class="text-fontsize-14">图片抓拍</div>
  103. <el-image :src="iconFresh" class="icon" style="margin-left: 8px;" @click="refreshPhoto" />
  104. </div>
  105. <el-button class="more" @click="dialogPhotoVisible = true">更多</el-button>
  106. </div>
  107. <div class="display-cloumn" style="margin-top:8px;height: 75%;">
  108. <div class="display-row" style="display: flex;justify-content: space-between;">
  109. <el-image v-if="firstPhoto !=null" style="width: 116px;height: 66px;" :src="firstPhoto.picPath"
  110. :preview-src-list="firstPhotoList" />
  111. <el-image v-else :src="imgEmpty" style="width: 116px;height: 66px;" />
  112. <div class="display-cloumn" style="display: flex;justify-content: space-between;">
  113. <el-image v-show="isPhotoing == true" :src="iconPhotoing" class="icon-40" style="margin-left: 8px;" />
  114. <el-image v-show="isPhotoing == false" :src="iconPhoto" class="icon-40" style="margin-left: 8px;"
  115. @click="takePhoto" />
  116. <el-image v-if="firstPhoto!=null" :src="iconDelete" class="icon-40" style="margin-left: 8px;"
  117. @click="deletePhoto([0])" />
  118. </div>
  119. </div>
  120. <div v-if="firstPhoto!=null" style="width: 116px;margin-top: 5px;" class="display-center text-fontsize-10">
  121. {{firstPhoto.createTime}}
  122. </div>
  123. <div v-else style="width: 116px;margin-top: 5px;" class="display-center text-fontsize-10">暂无图片</div>
  124. </div>
  125. </div>
  126. <div class="line" />
  127. <!-- 人脸签到 -->
  128. <div class="display-cloumn" style="height:24%;padding: 8px;">
  129. <div class="display-row" style="display: flex;justify-content: space-between;align-items: center;">
  130. <div class="display-row" style="display: flex;align-items: center;">
  131. <div class="text-fontsize-14">人脸签到</div>
  132. <el-image :src="iconFresh" class="icon" style="margin-left: 8px;" @click="refreshPhotoSign" />
  133. </div>
  134. <el-button class="more" @click="dialogFaceSignVisible = true">更多</el-button>
  135. </div>
  136. <div class="display-cloumn" style="margin-top:6px">
  137. <div class="display-row" style="display: flex;justify-content: space-between;">
  138. <div v-if="faceSignUrl && faceSignUrl.length>0" class="display-cloumn" style="width: 116px;">
  139. <el-image style="width: 116px;height: 66px;" :src="faceSignUrl" :preview-src-list="faceSignList" />
  140. <div style="width: 116px;margin-top: 5px;" class="display-center text-fontsize-10">
  141. {{faceSign.createTime}}
  142. </div>
  143. </div>
  144. <div v-else class="display-cloumn" style="width: 116px;">
  145. <el-image :src="imgEmpty" style="width: 116px;height: 66px;" />
  146. <div style="width: 116px;margin-top: 5px;" class="display-center text-fontsize-12">暂无图片
  147. </div>
  148. </div>
  149. <div class="display-cloumn">
  150. <el-image v-show="isPhotoing == true" :src="iconPhotoing" class="icon-40" style="margin-left: 8px;" />
  151. <el-image v-show="isPhotoing == false" :src="iconPhoto" class="icon-40" style="margin-left: 8px;"
  152. @click="photoSign" />
  153. </div>
  154. </div>
  155. <div v-if="faceSignUrl && faceSignUrl.length>0" class="display-row display-align-center" style="margin-top:4px">
  156. <div class="text-fontsize-10">本次</div>
  157. <div class="text-fontsize-10" style="color: #FFE59E;margin-top: 2px;">+{{faceSign.newAddNum}}</div>
  158. <progress :value="signedNum" :max="attendanceList.length" style="width:40px;margin-left:6px;margin-right:6px"></progress>
  159. <div class="text-fontsize-10" style="color: #FFE59E;margin-top: 3px;">{{signedNum}}</div>
  160. <div class="text-fontsize-10">/{{attendanceList.length}} 已签到</div>
  161. </div>
  162. </div>
  163. </div>
  164. <div class="line" />
  165. <!-- 会议纪要 -->
  166. <div class="display-cloumn" style="height:18%;padding: 8px;">
  167. <div class="display-row" style="display: flex;justify-content: space-between;align-items: center;">
  168. <div class="display-row" style="display: flex;align-items: center;">
  169. <div class="text-fontsize-14">会议纪要</div>
  170. <el-image :src="iconFresh" class="icon" style="margin-left: 8px;" />
  171. </div>
  172. <el-button class="more" @click="clickMeetMore()">更多</el-button>
  173. </div>
  174. <div class="display-row" style="margin-top: 5px;">
  175. <div style="width: 70%;overflow-y: auto;height: 65px;" class="no-scrollbar">
  176. <div v-for="(item, index) in audioList">
  177. <div class="text-fontsize-14 single-line" style="padding:10px 0 ;">{{item.fileName}}</div>
  178. </div>
  179. </div>
  180. <div v-if="timerRunning == false" class="display-cloumn display-center" style="width: 30%;">
  181. <el-image :src="iconStartRecord" class="icon-40" @click="startTimer" />
  182. <div class="text-fontsize-10" style="margin-top:4px ;">录音</div>
  183. </div>
  184. <div v-else class="display-cloumn display-center" style="width: 30%;">
  185. <el-image :src="iconStopRecord" class="icon-40" @click="pauseTimer" />
  186. <div class="text-fontsize-16" style="margin-top:12px ;">{{formatTime}}</div>
  187. </div>
  188. </div>
  189. </div>
  190. </div>
  191. <!-- 图片抓拍 -更多弹框 -->
  192. <el-dialog title="图片抓拍" :visible.sync="dialogPhotoVisible" center>
  193. <span>
  194. <div class="display-cloumn">
  195. <!-- <div class="line-grey" /> -->
  196. <div style="display: flex;flex-wrap: wrap;overflow: auto;margin-left:5px;">
  197. <div v-for="(item, index) in photoList" :key="index" class="imageDiv">
  198. <div class="display-cloumn" :style="{ backgroundColor: item.isSelected ? '#FFF3F3' : 'white' }">
  199. <div style="margin-left: 10px;">
  200. <input type="checkbox" align="left" :value="index" v-model="selectedItems" style="width:12px;height:12px">
  201. </div>
  202. <el-image style="width: 130px;height: 75px;margin: 3px" :src="item.picPath"
  203. :preview-src-list="photoPreviewList" />
  204. <div class="text-fontsize-10 display-center" style="margin-top:5px;color:#545454;width: 130px;">
  205. {{item.createTime}}
  206. </div>
  207. </div>
  208. </div>
  209. </div>
  210. </div>
  211. </span>
  212. <span slot="footer" class="display-row" style="display: flex;align-items: center;justify-content: space-between;">
  213. <div style="width:80px"></div>
  214. <div class="display-row display-center">
  215. <div class="display-cloumn display-center" style="margin-left:24px">
  216. <el-image v-if="isPhotoing == false" :src="iconPhotoGrey" class="icon-40" @click="takePhoto" />
  217. <el-image v-else :src="iconPhotoingGrey" class="icon-40" />
  218. <div v-if="isPhotoing == false" class="text-fontsize-10" style="margin-top: 5px;color: #545454;">拍照</div>
  219. <div v-else class="text-fontsize-10" style="margin-top: 5px;color: #545454;">拍照中</div>
  220. </div>
  221. <div class="display-cloumn display-center" style="margin-left:24px">
  222. <el-image :src="iconFreshGrey" class="icon-40" @click="refreshPhoto" />
  223. <div class="text-fontsize-10" style="margin-top: 5px;color: #545454;">刷新列表</div>
  224. </div>
  225. </div>
  226. <div>
  227. <el-button @click="dialogPhotoVisible = false">取 消</el-button>
  228. <el-button type="primary" @click="deleteDialogPhoto">删 除</el-button>
  229. </div>
  230. </span>
  231. </el-dialog>
  232. <!-- 人脸签到 - 更多弹框 -->
  233. <el-dialog title="人脸签到" :visible.sync="dialogFaceSignVisible" center>
  234. <div class="display-cloumn">
  235. <div class="line-grey" />
  236. <div class="display-row">
  237. <div class="display-cloumn" style="width: 37%;height: calc(75vh - 52px);padding: 8px 0px 12px 0px;">
  238. <div class="text-fontsize-12" style="color: #545454;margin-left: 10px;">人员列表</div>
  239. <div style="height: 95.5%;margin-top: 10px;">
  240. <el-table v-loading="loading" class="no-border" :data="attendanceList" height="100%" row-key="id">
  241. <el-table-column label="姓名" align="left" prop="memberName" width="65" label-class-name="custom-label-size" />
  242. <el-table-column label="出勤情况" align="left" prop="attendanceStatus" width="70" label-class-name="custom-label-size">
  243. <template slot-scope="scope">
  244. <div v-if="scope.row.attendanceStatus == 0" style="color:#F53F3F ;font-size:12px">未签到</div>
  245. <div v-else style="font-size:12px">已签到</div>
  246. </template>
  247. </el-table-column>
  248. <el-table-column label="签到时间" align="left" prop="signTime" label-class-name="custom-label-size" />
  249. </el-table>
  250. </div>
  251. </div>
  252. <div class="line-grey-column" />
  253. <div class="display-cloumn" style="width: 62%;height: calc(75vh - 52px);padding: 8px 16px 16px 16px;">
  254. <div class="text-fontsize-12" style="color: #545454;margin-bottom: 10px;">人脸签到</div>
  255. <el-image v-if="faceSignUrl && faceSignUrl.length>0" style="width: 100%;height:65%" :src="faceSignUrl" />
  256. <el-image v-else style="width: 100%;height:65%" :src="dialogimgEmpty"></el-image>
  257. <div class="display-row display-center" style="margin-top: 6px;">
  258. <div class="display-cloumn display-center">
  259. <el-image v-if="isPhotoing == false" :src="iconPhotoGrey" class="icon-40" @click="photoSign" />
  260. <el-image v-else :src="iconPhotoingGrey" class="icon-40" />
  261. <div v-if="isPhotoing == false" class="text-fontsize-10" style="margin-top: 2px;color: #545454;">拍照
  262. </div>
  263. <div v-else class="text-fontsize-10" style="margin-top: 2px;color: #545454;">拍照中</div>
  264. </div>
  265. <div class="display-cloumn display-center" style="margin-left:24px">
  266. <el-image :src="iconFreshGrey" class="icon-40" @click="refreshPhotoSign" />
  267. <div class="text-fontsize-10" style="margin-top: 5px;color: #545454;">刷新列表</div>
  268. </div>
  269. </div>
  270. <div class="display-row display-center" style="margin-top: 6px;">
  271. <div class="text-fontsize-10" style="color: #545454;">本次</div>
  272. <div v-if="faceSign.newAddNum" class="text-fontsize-10" style="color: #FF5455;margin-top:2px">+{{faceSign.newAddNum}}
  273. </div>
  274. <div v-else class="text-fontsize-10" style="color: #FF5455;margin-top:2px">+0</div>
  275. <el-progress :stroke-width="8" :percentage="percentage" :color="customColor" :show-text="false"
  276. style="height: 8px;width: 104px;margin-left: 16px;" :define-back-color="customColor2"></el-progress>
  277. <!-- <progress value="14" max="18" style="margin-left: 16px;" class="dialogprogress"></progress> -->
  278. <div class="text-fontsize-10" style="color: #FF5455;margin-left: 16px;margin-top:2px">{{signedNum}}</div>
  279. <div class="text-fontsize-10" style="color: #545454;">/{{attendanceList.length}} 已签到</div>
  280. </div>
  281. </div>
  282. </div>
  283. </div>
  284. </el-dialog>
  285. <!-- 会议纪要 - 更多弹框 -->
  286. <el-dialog title="会议纪要" :visible.sync="dialogMeetVisible" center>
  287. <div class="display-cloumn">
  288. <div class="line-grey" />
  289. <div class="display-row">
  290. <div class="display-cloumn" style="width: 43%;height: calc(75vh - 51px);padding: 8px 0px 12px 0px;">
  291. <div class="text-fontsize-12" style="color: #545454;margin-left:4px">会议录音</div>
  292. <div style="height: 93%;margin-top: 10px;" class="display-cloumn">
  293. <el-table v-loading="loading" class="no-border" :data="audioList" height="83%" row-key="id"
  294. @row-click="showAudioTxt" @selection-change="handleSelectionChange">
  295. <el-table-column label="序号" align="left" prop="sort" width="44" label-class-name="custom-label-size" />
  296. <el-table-column label="文件名称" align="left" prop="fileName" width="68" :show-overflow-tooltip="true" label-class-name="custom-label-size"/>
  297. <el-table-column label="文本准换" align="left" prop="isTranslate" width="68" label-class-name="custom-label-size">
  298. <template slot-scope="scope">
  299. <dict-tag :options="dict.type.sys_asr_status" :value="scope.row.isTranslate" />
  300. </template>
  301. </el-table-column>
  302. <el-table-column label="创建时间" align="left" prop="createTime" width="131" label-class-name="custom-label-size" />
  303. </el-table>
  304. <div style="height: 17%;margin-top:10px" class="display-row display-center">
  305. <div class="display-cloumn display-center">
  306. <el-image :src="iconFreshGrey" class="icon-40" @click="refreshAudio" />
  307. <div class="text-fontsize-10" style="color: #545454;margin-top: 5px;">刷新列表</div>
  308. </div>
  309. <div v-if="timerRunning == false" class="display-cloumn display-center" style="margin-left:32px">
  310. <el-image :src="iconStartRecordRed" class="icon-40" @click="startTimer" />
  311. <div class="text-fontsize-10" style="color: #545454;margin-top: 5px;">录音</div>
  312. </div>
  313. <div v-else class="display-cloumn display-center" style="margin-left:32px">
  314. <el-image :src="iconStopRecordRed" class="icon-40" @click="pauseTimer" />
  315. <div class="text-fontsize-10" style="color: #545454;margin-top: 5px;">{{ formatTime }}</div>
  316. </div>
  317. <div class="display-cloumn display-center" style="margin-left:32px">
  318. <el-image :src="iconYjsc" class="icon-40" @click="summaryGenerate" />
  319. <div class="text-fontsize-10" style="color: #545454;margin-top: 5px;">生成会议纪要</div>
  320. </div>
  321. </div>
  322. </div>
  323. </div>
  324. <div class="line-grey-column" />
  325. <div class="display-cloumn" style="width: 57%;height: calc(75vh - 51px);padding:8px 12px 12px 12px">
  326. <div class="text-fontsize-12" style="color: #545454;margin-bottom: 10px;">录音内容</div>
  327. <el-input resize="none" v-model="audioTxt" type="textarea"
  328. :readonly="audioReadOnly" :rows="16" placeholder="请输入内容" class="meet-input" />
  329. <div style="margin-top: 18px;display: flex;justify-content: center;align-items: center;">
  330. <el-button type="primary" @click="audioTxtEdit" style="font-size:12px">文本编辑</el-button>
  331. <el-button type="primary" @click="audioTxtSave" style="font-size:12px">文本保存</el-button>
  332. </div>
  333. </div>
  334. </div>
  335. </div>
  336. </el-dialog>
  337. </div>
  338. <!-- <div class="appNew-container">
  339. <el-card shadow="never" class="" style="">
  340. <div style="overflow: hidden">
  341. <div style="font-weight: bolder;float: left">
  342. {{ form.title }}
  343. </div>
  344. <div style="float: right">
  345. 请选择会议设备:
  346. <el-select v-model="deviceId" placeholder="请选择会议设备" style="">
  347. <el-option v-for="device in deviceList" :key="device.id" :label="device.deviceName"
  348. :value="device.id" />
  349. </el-select>
  350. </div>
  351. </div>
  352. </el-card>
  353. <el-card shadow="never" class="" style="">
  354. <el-tabs type="border-card" style="height: calc(100vh - 150px)">
  355. <el-tab-pane label="会议文件">
  356. <div style="display: flex;justify-content: center">
  357. <div style="width: 30%;">
  358. <el-table v-loading="loading" :data="fileList" height="calc(100vh - 220px)" @selection-change="handleSelectionChange">
  359. <el-table-column type="selection" width="55" align="center" />
  360. <el-table-column prop="fileName" label="文件名" :show-overflow-tooltip="true"/>
  361. </el-table>
  362. </div>
  363. <div style="width: 70%;border-left: 1px solid #e6e6e6;">
  364. <div v-if="null == pageSrc" style="height: calc(100vh - 300px);">
  365. <el-empty description=""></el-empty>
  366. </div>
  367. <div v-else style="height: calc(100vh - 300px);display: flex;justify-content: center;align-items: center;" >
  368. <el-image :src="pageSrc.fileUrl" style="height: 100%"/>
  369. </div>
  370. <div style="height: 10%;display: flex;justify-content: center;align-items: center;">
  371. <el-button type="primary" :disabled="single" @click="showFile">立即播放</el-button>
  372. <el-button type="primary" @click="lastPage">上一页</el-button>
  373. <el-button type="primary" @click="nextPage">下一页</el-button>
  374. <el-button type="warning" :disabled="single" @click="endShowFile">结束播放</el-button>
  375. </div>
  376. </div>
  377. </div>
  378. </el-tab-pane>
  379. <el-tab-pane label="资料链接">
  380. <div style="display: flex;justify-content: center">
  381. <div style="width: 30%;height: calc(100vh - 220px)">
  382. <div v-for="(item,index) in materialOptions">
  383. <div style="display: flex;flex-direction: column;justify-content: center;">
  384. <span>
  385. <span style="font-weight: bolder;">链接地址:</span>
  386. <span style="word-break: break-all;word-wrap: break-word">{{ item }}</span>
  387. </span>
  388. <span style="margin-right: 10px;margin-top: 10px;margin-bottom: 10px">
  389. <el-button type="primary" @click="showUrl(item)">开始播放</el-button>
  390. <el-button type="warning" @click="endShowUrl(item)">结束播放</el-button>
  391. </span>
  392. </div>
  393. </div>
  394. </div>
  395. <div v-if="material == null" style="width: 70%;border-left: 1px solid #e6e6e6;">
  396. <el-empty description=""></el-empty>
  397. </div>
  398. <div v-else style="width: 70%;border-left: 1px solid #e6e6e6;">
  399. <iframe :src="material" style="width: 100%;height: calc(100vh - 220px);border: 0;"></iframe>
  400. </div>
  401. </div>
  402. </el-tab-pane>
  403. <el-tab-pane label="图片抓拍">
  404. <div style="height: calc(100vh - 260px);display: flex;flex-wrap: wrap;overflow: auto">
  405. <div v-for="(item, index) in this.photoList" :key="index" class="imageDiv">
  406. <div>
  407. <el-image style="width: 320px;height: 180px;margin: 5px" :src="item"/>
  408. </div>
  409. <div style="margin: 5px;display: flex;justify-content: center;align-items: center;">
  410. <el-button type="warning" @click="deletePhoto(index)">删除图片</el-button>
  411. </div>
  412. </div>
  413. </div>
  414. <div style="margin-top: 5px;display: flex;justify-content: center;align-items: center;">
  415. <el-button @click="refreshPhoto" type="primary" >刷新</el-button>
  416. <el-button @click="takePhoto" type="primary" >拍照</el-button>
  417. <el-button @click="savePhoto" type="primary" >保存</el-button>
  418. </div>
  419. </el-tab-pane>
  420. <el-tab-pane label="人脸签到">
  421. <div style="display: flex;justify-content: center">
  422. <div style="width: 30%;height: calc(100vh - 220px)">
  423. <div style="font-size: medium;margin-bottom: 10px">人员列表</div>
  424. <div style="height: 85%;">
  425. <el-table v-loading="loading" :data="attendanceList" height="calc(100vh - 250px)" row-key="id">
  426. <el-table-column label="姓名" align="left" prop="memberName" />
  427. <el-table-column label="出勤情况" align="left" prop="attendanceStatus">
  428. <template slot-scope="scope">
  429. <dict-tag :options="dict.type.sys_attendance_type" :value="scope.row.attendanceStatus"/>
  430. </template>
  431. </el-table-column>
  432. <el-table-column label="签到时间" align="left" prop="signTime" />
  433. </el-table>
  434. </div>
  435. </div>
  436. <div style="width: 70%;border-left: 1px solid #e6e6e6;">
  437. <div style="font-size: medium;margin-bottom: 10px;margin-left: 20px">人脸签到</div>
  438. <div v-if="null == faceSignUrl" style="height: calc(100vh - 350px);">
  439. <el-empty description=""></el-empty>
  440. </div>
  441. <div v-else style="height: calc(100vh - 350px);display: flex;justify-content: center;align-items: center;" >
  442. <div style="width: 100%; height: calc(100vh - 350px)">
  443. <el-image style="width: 100%;height: 100%;margin: 5px" :src="faceSignUrl"/>
  444. </div>
  445. </div>
  446. <div style="height: 10%;display: flex;justify-content: center;align-items: center;">
  447. <el-button type="primary" @click="photoSign">拍照</el-button>
  448. <el-button type="primary" @click="refreshPhotoSign">刷新</el-button>
  449. </div>
  450. </div>
  451. </div>
  452. </el-tab-pane>
  453. <el-tab-pane label="会议纪要">
  454. <div style="display: flex;justify-content: center">
  455. <div style="width: 30%;height: calc(100vh - 220px)">
  456. <div style="font-size: medium;margin-bottom: 10px">会议录音</div>
  457. <div style="height: 85%;">
  458. <el-table v-loading="loading" :data="audioList" height="100%" row-key="id" @row-click="showAudioTxt" @selection-change="handleSelectionChange">
  459. <el-table-column label="序号" align="center" prop="sort" width="50" />
  460. <el-table-column label="文件名称" align="left" prop="fileName" :show-overflow-tooltip="true" />
  461. <el-table-column label="文本准换" align="center" prop="isTranslate" width="80" >
  462. <template slot-scope="scope">
  463. <dict-tag :options="dict.type.sys_asr_status" :value="scope.row.isTranslate"/>
  464. </template>
  465. </el-table-column>
  466. <el-table-column label="创建时间" align="left" prop="createTime" width="150" />
  467. </el-table>
  468. </div>
  469. <div style="height: 5%;display: flex;justify-content: center;align-items: center;font-weight: bolder;font-size: large">
  470. {{ formatTime }}
  471. </div>
  472. <div style="margin-top: 5px;display: flex;justify-content: center;align-items: center;">
  473. <el-button @click="startTimer" type="primary" :disabled="timerRunning">开始录音</el-button>
  474. <el-button @click="pauseTimer" type="warning" :disabled="!timerRunning">暂停录音</el-button>
  475. <el-button @click="refreshAudio" type="primary" >刷新列表</el-button>
  476. <el-button @click="summaryGenerate" type="primary" >一键生成</el-button>
  477. </div>
  478. </div>
  479. <div v-if="audioTxt == null" style="width: 70%;border-left: 1px solid #e6e6e6;">
  480. <div style="font-size: medium;margin-bottom: 10px;margin-left: 20px">录音内容</div>
  481. <el-empty description=""></el-empty>
  482. </div>
  483. <div v-else style="width: 70%;border-left: 1px solid #e6e6e6;">
  484. <div style="font-size: medium;margin-bottom: 10px;margin-left: 20px">录音内容</div>
  485. <el-input resize="none" v-model="audioTxt" style="margin-left: 10px" type="textarea" :readonly="audioReadOnly" :rows = "29" placeholder="请输入内容" />
  486. <div style="margin-top: 35px;display: flex;justify-content: center;align-items: center;">
  487. <el-button type="primary" @click="audioTxtEdit">文本编辑</el-button>
  488. <el-button type="primary" @click="audioTxtSave">文本保存</el-button>
  489. </div>
  490. </div>
  491. </div>
  492. </el-tab-pane>
  493. <el-tab-pane label="AI问答">
  494. <div style="display: flex;flex-direction: column; height: calc(100vh - 150px)">
  495. <el-input v-model="sourceWord" resize="none" type="textarea" :rows = "12" placeholder="请输入内容" />
  496. <div style="margin-top: 20px;display: flex;justify-content: center;align-items: center;">
  497. <el-button type="primary" @click="rsWord">提交问题</el-button>
  498. <el-button type="waring" @click="resetWord">文本重置</el-button>
  499. </div>
  500. <el-divider style="margin-top: 10px;margin-bottom: 10px"></el-divider>
  501. <el-input id="targetWord" resize="none" v-model="targetWord" type="textarea" :readonly="true" :rows = "14" placeholder="请输入内容" />
  502. <div style="margin-top: 20px;display: flex;flex-direction: column;justify-content: center;align-items: center;">
  503. <el-button type="primary" @click="copyWord">文本复制</el-button>
  504. </div>
  505. </div>
  506. </el-tab-pane>
  507. </el-tabs>
  508. </el-card>
  509. </div> -->
  510. </template>
  511. <script>
  512. import {
  513. getMeeting,
  514. getMeetingFileImage,
  515. updateMeeting
  516. } from "@/api/partywork/meeting";
  517. import {
  518. endAudio,
  519. endFilePlay,
  520. filePlay,
  521. startAudio,
  522. takePhoto,
  523. takePhotoSign,
  524. urlControl,
  525. imageMove,
  526. imageScale
  527. } from "@/api/partywork/remoteControl";
  528. import {
  529. getToken
  530. } from "@/utils/auth";
  531. import {
  532. getAudio,
  533. listAudio,
  534. summaryMeeting,
  535. updateAudioTxt
  536. } from "@/api/partywork/meeting_audio";
  537. import {
  538. listDevice
  539. } from "@/api/pc/device";
  540. import {
  541. listAttendance
  542. } from "@/api/partywork/attendance";
  543. import {
  544. photoSignRecord
  545. } from "@/api/partywork/face";
  546. import logoImg from '@/assets/logo/party.png'
  547. import logoExitImg from '@/assets/logo/icon_exit.png'
  548. import iconAddressImg from '@/assets/icons/icon_address.png'
  549. import iconHostImg from '@/assets/icons/icon_host.png'
  550. import iconOrganizationImg from '@/assets/icons/icon_organization.png'
  551. import iconTimeImg from '@/assets/icons/icon_time.png'
  552. import iconScreenImg from '@/assets/icons/icon_screen.png'
  553. import iconFreshImg from '@/assets/icons/icon_fresh.png'
  554. import iconFreshGreyImg from '@/assets/icons/icon_fresh_grey.png'
  555. import iconYjscImg from '@/assets/icons/icon_yjsc.png'
  556. import iconPhotoImg from '@/assets/icons/icon_photo.png'
  557. import iconPhotoingImg from '@/assets/icons/icon_photoing.png'
  558. import iconPhotoGreyImg from '@/assets/icons/icon_photo_grey.png'
  559. import iconPhotoingGreyImg from '@/assets/icons/icon_photoing_grey.png'
  560. import iconDeleteImg from '@/assets/icons/icon_delete.png'
  561. import iconStartRecordImg from '@/assets/icons/icon_startrecord.png'
  562. import iconStartRecordRedImg from '@/assets/icons/icon_startrecord_red.png'
  563. import iconStopRecordImg from '@/assets/icons/icon_stoprecord.png'
  564. import iconStopRecordRedImg from '@/assets/icons/icon_stoprecord_red.png'
  565. import imgEmptyImg from '@/assets/images/img_empty.png'
  566. import dialogimgEmptyImg from '@/assets/images/dialog_img_empty.png'
  567. import iconStartPlayImg from '@/assets/icons/btn_startplay.png'
  568. import iconStopPlayImg from '@/assets/icons/btn_stopplay.png'
  569. export default {
  570. dicts: ['sys_asr_status', 'sys_attendance_type'],
  571. data() {
  572. return {
  573. logo: logoImg,
  574. logoExit: logoExitImg,
  575. iconAddress: iconAddressImg,
  576. iconHost: iconHostImg,
  577. iconOrganization: iconOrganizationImg,
  578. iconTime: iconTimeImg,
  579. iconScreen: iconScreenImg,
  580. iconFresh: iconFreshImg,
  581. iconFreshGrey: iconFreshGreyImg,
  582. iconYjsc: iconYjscImg,
  583. iconPhoto: iconPhotoImg,
  584. iconPhotoing: iconPhotoingImg,
  585. iconPhotoGrey: iconPhotoGreyImg,
  586. iconPhotoingGrey: iconPhotoingGreyImg,
  587. iconDelete: iconDeleteImg,
  588. iconStartRecord: iconStartRecordImg,
  589. iconStopRecord: iconStopRecordImg,
  590. iconStartRecordRed: iconStartRecordRedImg,
  591. iconStopRecordRed: iconStopRecordRedImg,
  592. imgEmpty: imgEmptyImg,
  593. dialogimgEmpty: dialogimgEmptyImg,
  594. iconStartPlay: iconStartPlayImg,
  595. iconStopPlay: iconStopPlayImg,
  596. meetingId: null,
  597. form: {},
  598. fileList: [],
  599. imageList: [],
  600. // 遮罩层
  601. loading: true,
  602. ids: [],
  603. // 非单个禁用
  604. single: true,
  605. // 非多个禁用
  606. multiple: true,
  607. totalPage: 0,
  608. currentPage: 1,
  609. pageSrc: null,
  610. // 学习资料网站
  611. materialOptions: [],
  612. sourceWord: null,
  613. targetWord: null,
  614. websocket: null,
  615. material: null,
  616. timer: null, // 记录经过的时间秒数
  617. intervalId: null, // 定时器的ID
  618. timerRunning: false, // 状态标示,是否正在计时
  619. elapsed: 0, // 经过时间(毫秒)
  620. audioList: [],
  621. audioTxt: null,
  622. photoList: [],
  623. deviceList: [],
  624. deviceId: null,
  625. scaleId: 100,
  626. moveId: 20,
  627. audioReadOnly: true,
  628. audioId: null,
  629. attendanceList: [],
  630. signedNum: 0,
  631. faceSignUrl: null,
  632. faceSignList: [],
  633. scaleList: [{
  634. value: '25',
  635. label: '25%'
  636. }, {
  637. value: '50',
  638. label: '50%'
  639. }, {
  640. value: '75',
  641. label: '75%'
  642. }, {
  643. value: '100',
  644. label: '100%'
  645. }, {
  646. value: '125',
  647. label: '125%'
  648. }, {
  649. value: '150',
  650. label: '150%'
  651. }, {
  652. value: '175',
  653. label: '175%'
  654. }, {
  655. value: '200',
  656. label: '200%'
  657. }],
  658. moveList: [{
  659. value: '10',
  660. label: '10%'
  661. }, {
  662. value: '20',
  663. label: '20%'
  664. }, {
  665. value: '30',
  666. label: '30%'
  667. }, {
  668. value: '40',
  669. label: '40%'
  670. }, {
  671. value: '50',
  672. label: '50%'
  673. }, {
  674. value: '60',
  675. label: '60%'
  676. }, {
  677. value: '70',
  678. label: '70%'
  679. }, {
  680. value: '80',
  681. label: '80%'
  682. }, {
  683. value: '90',
  684. label: '90%'
  685. }, {
  686. value: '100',
  687. label: '100%'
  688. }],
  689. firstPhoto: null,
  690. firstPhotoList: [],
  691. selectedFileIndex: -1,
  692. fileType: 1,
  693. dialogPhotoVisible: false,
  694. selectedItems: [],
  695. dialogFaceSignVisible: false,
  696. customColor: '#FF5455',
  697. customColor2: 'rgba(0, 0, 0, 0.3)',
  698. percentage: 20,
  699. faceSign: {},
  700. dialogMeetVisible: false,
  701. isMeetPlay: false,
  702. imageHeight: 100,
  703. imageOffset: 0,
  704. imageHeightPx: 0,
  705. imageHeightPxChange: 0,
  706. meetTitle: '',
  707. isPhotoing: false
  708. }
  709. },
  710. watch: {
  711. selectedItems(newValue, oldValue) {
  712. // 当message变化时,会执行这里的代码
  713. console.log(`message changed from ${oldValue} to ${newValue}`);
  714. for (let j = 0; j < this.photoList.length; j++) {
  715. this.photoList[j].isSelected = false;
  716. }
  717. for (let i = 0; i < newValue.length; i++) {
  718. this.photoList[newValue[i]].isSelected = true;
  719. }
  720. }
  721. },
  722. // mounted:{
  723. // let checkboxes = document.getElementsByName("myCheckbox");
  724. // for (let i = 0; i < checkboxes.length; i++) {
  725. // console.log(checkboxes[i].checked); // 输出 true 或 false
  726. // }
  727. // },
  728. computed: {
  729. formatTime() {
  730. let remaining = this.elapsed;
  731. let milliseconds = remaining % 1000;
  732. remaining = Math.floor(remaining / 1000);
  733. let seconds = remaining % 60;
  734. remaining = Math.floor(remaining / 60);
  735. let minutes = remaining % 60;
  736. let hours = Math.floor(remaining / 60);
  737. return `${hours.toString().padStart(2, '0')}:${minutes
  738. .toString()
  739. .padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
  740. },
  741. },
  742. created() {
  743. this.getRouterParam();
  744. this.getMeetingInfo();
  745. this.socketConnect();
  746. this.refreshAudio();
  747. this.getDeviceList();
  748. this.getAttendanceList();
  749. },
  750. destroyed() {
  751. this.websocket.close();
  752. if (this.timerRunning) {
  753. this.pauseTimer();
  754. clearInterval(this.timer);
  755. }
  756. },
  757. methods: {
  758. closePage() {
  759. this.$router.back();
  760. },
  761. refreshPhotoSign() {
  762. let param = {
  763. meetingId: this.meetingId,
  764. }
  765. photoSignRecord(param).then(response => {
  766. let reqParam = JSON.parse(response.data.reqParam);
  767. console.log('reqParam:', response.data);
  768. this.faceSign = response.data;
  769. this.faceSignUrl = reqParam.url;
  770. // if (response.data.rspCode === "200") {
  771. // this.faceSignUrl = reqParam.url;
  772. // } else {
  773. // this.faceSignUrl = reqParam.url + ".1.png";
  774. // }
  775. this.faceSignList = [];
  776. this.faceSignList.push(this.faceSignUrl);
  777. this.getAttendanceList();
  778. });
  779. },
  780. photoSign() {
  781. if (!this.validDeviceId()) {
  782. return;
  783. }
  784. let param = {
  785. meetingId: this.meetingId,
  786. deviceId: this.deviceId
  787. }
  788. takePhotoSign(param).then(response => {
  789. this.$modal.msgSuccess("下发拍照成功,请刷新!");
  790. this.isPhotoing = true;
  791. setTimeout(() => {
  792. this.isPhotoing = false;
  793. }, 5000);
  794. //刷新人脸签到
  795. setTimeout(() => {
  796. this.refreshPhotoSign();
  797. }, 5000);
  798. });
  799. },
  800. getAttendanceList() {
  801. this.loading = true;
  802. let param = {
  803. meetingId: this.meetingId,
  804. pageNum: 1,
  805. pageSize: 200,
  806. type: 1
  807. }
  808. listAttendance(param).then(response => {
  809. this.attendanceList = response.rows;
  810. this.loading = false;
  811. console.log('attendanceList:', this.attendanceList);
  812. this.signedNum = 0;
  813. if (this.attendanceList != null && this.attendanceList.length > 0) {
  814. for (let i = 0; i < this.attendanceList.length; i++) {
  815. if (this.attendanceList[i].attendanceStatus == 1) {
  816. this.signedNum++;
  817. }
  818. }
  819. this.percentage = (this.signedNum / this.attendanceList.length) * 100;
  820. console.log('percentage:', this.percentage);
  821. }
  822. });
  823. },
  824. audioTxtEdit() {
  825. this.audioReadOnly = false;
  826. this.$message({
  827. message: '您现在可以对录音内容进行编辑',
  828. type: 'success'
  829. });
  830. },
  831. validDeviceId() {
  832. if (this.deviceId == null || this.deviceId === '') {
  833. this.$message({
  834. message: '请先选择会议设备',
  835. type: 'error'
  836. });
  837. return false;
  838. }
  839. return true;
  840. },
  841. getDeviceList() {
  842. let param = {
  843. pageSize: 100
  844. }
  845. listDevice(param).then(response => {
  846. this.deviceList = response.rows;
  847. this.deviceList.forEach(item => {
  848. let online = item.onlineStatus == "1" ? "在线" : "离线";
  849. item.deviceName = item.deviceName + "(" + online + ")";
  850. });
  851. })
  852. },
  853. summaryGenerate() {
  854. if (this.timerRunning) {
  855. this.$message({
  856. message: '请先暂停录音',
  857. type: 'warning'
  858. });
  859. } else {
  860. summaryMeeting(this.meetingId).then(response => {
  861. this.$message({
  862. message: response.msg,
  863. type: 'success'
  864. });
  865. });
  866. /*this.$modal.confirm('确认通过AI一键生成会议纪要?').then(function() {
  867. return summaryMeeting(this.meetingId);
  868. }).then(() => {
  869. this.$modal.msgSuccess("任务提交成功,请稍后刷新列表!");
  870. }).catch(() => {});*/
  871. }
  872. },
  873. savePhoto() {
  874. if (this.photoList && this.photoList.length > 0) {
  875. this.form.picsPath = '';
  876. for (let i = 0; i < this.photoList.length; i++) {
  877. if (i == 0) {
  878. this.form.picsPath = this.photoList[i].picPath;
  879. } else {
  880. this.form.picsPath = this.form.picsPath + "," + this.photoList[i].picPath
  881. }
  882. }
  883. } else {
  884. this.form.picsPath = '';
  885. }
  886. // this.form.picsPath = this.photoList.join(",");
  887. console.log('保存后的photoList:', this.photoList);
  888. console.log('保存后的picsPath:', this.form.picsPath);
  889. // this.form.imageList = this.photoList;
  890. // console.log('保存后的imageList:', this.form.imageList);
  891. updateMeeting(this.form).then(response => {
  892. if (this.photoList && this.photoList.length > 0) {
  893. this.firstPhoto = this.photoList[0];
  894. this.firstPhotoList = [];
  895. this.firstPhotoList.push(this.firstPhoto.picPath);
  896. this.photoPreviewList = [];
  897. for (let i = 0; i < this.photoList.length; i++) {
  898. this.photoPreviewList.push(this.photoList[i].picPath);
  899. }
  900. } else {
  901. this.firstPhoto = null;
  902. this.firstPhotoList = [];
  903. this.photoPreviewList = [];
  904. }
  905. this.selectedItems = [];
  906. this.$message({
  907. message: '删除成功',
  908. type: 'success'
  909. });
  910. });
  911. },
  912. refreshPhoto() {
  913. const id = this.meetingId;
  914. getMeeting(id).then(response => {
  915. // 会议照片集合
  916. this.selectedItems = [];
  917. if (response.data.imageList != null && response.data.imageList.length > 0) {
  918. this.photoList = response.data.imageList;
  919. console.log('photoList', this.photoList)
  920. if (this.photoList != null && this.photoList.length > 0) {
  921. this.firstPhoto = this.photoList[0];
  922. this.firstPhotoList = [];
  923. this.firstPhotoList.push(this.firstPhoto.picPath);
  924. this.photoPreviewList = [];
  925. for (let i = 0; i < this.photoList.length; i++) {
  926. this.photoPreviewList.push(this.photoList[i].picPath);
  927. }
  928. } else {
  929. this.firstPhoto = null;
  930. this.firstPhotoList = [];
  931. this.photoPreviewList = [];
  932. }
  933. }
  934. });
  935. },
  936. deletePhoto(index) {
  937. this.$modal.confirm('是否确认删除图片?').then(() => {
  938. // 用户点击确认后执行的代码
  939. console.log('删除前photoList:', this.photoList);
  940. let selectPhotoList = [];
  941. for (let i = 0; i < index.length; i++) {
  942. selectPhotoList.push(this.photoList[index[i]]);
  943. // this.photoList.splice(index[i], 1);
  944. // console.log('删除photoList:', this.photoList);
  945. }
  946. let newData = this.photoList.filter(
  947. (a) => !selectPhotoList.some((b) => a.id === b.id)
  948. )
  949. this.photoList = newData;
  950. console.log('新photoList:', this.photoList);
  951. this.savePhoto();
  952. // this.$modal.msgSuccess("删除成功");
  953. }).catch(() => {
  954. // 用户点击取消后执行的代码
  955. });
  956. },
  957. takePhoto() {
  958. if (!this.validDeviceId()) {
  959. return;
  960. }
  961. let id = this.meetingId;
  962. takePhoto(id, this.deviceId).then(response => {
  963. this.$message({
  964. message: '发送拍照指令成功',
  965. type: 'success'
  966. });
  967. this.isPhotoing = true;
  968. setTimeout(() => {
  969. this.isPhotoing = false;
  970. }, 5000);
  971. //刷新图片抓拍
  972. setTimeout(() => {
  973. this.refreshPhoto();
  974. }, 5000);
  975. });
  976. },
  977. showAudioTxt(row) {
  978. if (row.isTranslate == 0 || row.isTranslate == 2 || row.isTranslate == 3) {
  979. this.$message({
  980. message: '当前无文本内容可供查看,请稍后!',
  981. type: 'warning'
  982. });
  983. return;
  984. }
  985. let id = row.id;
  986. this.audioId = id;
  987. getAudio(id).then(response => {
  988. this.audioTxt = response.data.audioTxt;
  989. });
  990. },
  991. audioTxtSave() {
  992. this.audioReadOnly = true;
  993. let id = this.audioId;
  994. let audioTxt = this.audioTxt;
  995. let param = {
  996. id: id,
  997. audioTxt: audioTxt
  998. }
  999. updateAudioTxt(param).then(response => {
  1000. this.$message({
  1001. message: '文本内容保存成功!',
  1002. type: 'success'
  1003. });
  1004. this.showAudioTxt(param);
  1005. });
  1006. },
  1007. refreshAudio() {
  1008. let queryParam = {
  1009. meetingId: this.meetingId,
  1010. pageNum: 1,
  1011. pageSize: 100
  1012. };
  1013. this.loading = true;
  1014. listAudio(queryParam).then(response => {
  1015. this.audioList = response.rows;
  1016. console.log('audioList', this.audioList);
  1017. this.loading = false;
  1018. });
  1019. },
  1020. // 开始计时
  1021. startTimer() {
  1022. if (!this.validDeviceId()) {
  1023. return;
  1024. }
  1025. if (!this.timer) {
  1026. this.timerRunning = true;
  1027. this.timer = setInterval(() => {
  1028. this.elapsed += 10; // 我们每10毫秒更新一次时钟
  1029. }, 10);
  1030. startAudio(this.meetingId, this.deviceId).then(response => {
  1031. this.$message({
  1032. message: '开始录制成功',
  1033. type: 'success'
  1034. });
  1035. });
  1036. }
  1037. },
  1038. // 暂停计时
  1039. pauseTimer() {
  1040. if (!this.validDeviceId()) {
  1041. return;
  1042. }
  1043. this.timerRunning = false;
  1044. clearInterval(this.timer);
  1045. this.timer = null;
  1046. endAudio(this.meetingId, this.deviceId).then(response => {
  1047. this.$message({
  1048. message: '暂停录制成功',
  1049. type: 'success'
  1050. });
  1051. });
  1052. },
  1053. showUrl(url) {
  1054. // if (!this.validDeviceId()) {
  1055. // return;
  1056. // }
  1057. this.imageOffset = 0;
  1058. this.imageHeight = 100;
  1059. this.imageHeightPxChange = this.imageHeightPx;
  1060. this.scaleId = 100;
  1061. this.moveId = 20;
  1062. this.currentPage = 0;
  1063. this.material = url;
  1064. let param = {
  1065. material: url,
  1066. type: 1,
  1067. deviceId: this.deviceId,
  1068. meetingId: this.meetingId
  1069. };
  1070. urlControl(param).then(response => {
  1071. this.$message({
  1072. message: '播放成功',
  1073. type: 'success'
  1074. });
  1075. });
  1076. },
  1077. endShowUrl(url) {
  1078. if (!this.validDeviceId()) {
  1079. return;
  1080. }
  1081. this.material = null;
  1082. let param = {
  1083. material: url,
  1084. type: 2,
  1085. deviceId: this.deviceId
  1086. };
  1087. urlControl(param).then(response => {
  1088. this.$message({
  1089. message: '结束成功',
  1090. type: 'success'
  1091. });
  1092. });
  1093. },
  1094. copyWord() {
  1095. let textToCopy = document.getElementById("targetWord").value;
  1096. navigator.clipboard.writeText(textToCopy).then(function() {
  1097. }, function(err) {
  1098. console.error('无法复制文本:', err);
  1099. });
  1100. this.$message({
  1101. message: '文本复制成功',
  1102. type: 'success'
  1103. });
  1104. },
  1105. resetWord() {
  1106. this.sourceWord = "";
  1107. let inputElement = document.getElementById("targetWord");
  1108. inputElement.value = "";
  1109. },
  1110. getRouterParam() {
  1111. this.meetingId = this.$route.query.meetingId;
  1112. console.log(this.meetingId);
  1113. },
  1114. getMeetingInfo() {
  1115. const id = this.meetingId;
  1116. this.loading = true;
  1117. getMeeting(id).then(response => {
  1118. this.form = response.data;
  1119. console.log(this.form);
  1120. this.fileList = this.form.followList;
  1121. this.materialOptions = this.form.materialOptions;
  1122. console.log('fileList:', this.fileList);
  1123. this.loading = false;
  1124. // 会议照片集合
  1125. if (this.form.imageList != null && this.form.imageList.length > 0) {
  1126. this.photoList = this.form.imageList;
  1127. console.log('phtotList', this.photoList);
  1128. if (this.photoList != null && this.photoList.length > 0) {
  1129. this.firstPhoto = this.photoList[0];
  1130. this.firstPhotoList = [];
  1131. this.firstPhotoList.push(this.firstPhoto.picPath);
  1132. this.photoPreviewList = [];
  1133. for (let i = 0; i < this.photoList.length; i++) {
  1134. this.photoPreviewList.push(this.photoList[i].picPath);
  1135. }
  1136. } else {
  1137. this.firstPhoto = null;
  1138. this.firstPhotoList = [];
  1139. this.photoPreviewList = [];
  1140. }
  1141. console.log('firstPhoto', this.firstPhoto);
  1142. }
  1143. });
  1144. },
  1145. // 多选框选中数据
  1146. handleSelectionChange(selection) {
  1147. this.ids = selection.map(item => item.id)
  1148. this.single = selection.length !== 1
  1149. this.multiple = !selection.length
  1150. },
  1151. // 开始播放会议文件
  1152. showFile() {
  1153. const id = this.fileList[this.selectedFileIndex].id;
  1154. this.currentPage = 1;
  1155. getMeetingFileImage(id).then(response => {
  1156. this.imageList = response.data;
  1157. this.totalPage = this.imageList.length;
  1158. this.getPageSrc();
  1159. });
  1160. this.imageOffset = 0;
  1161. this.imageHeight = 100;
  1162. this.imageHeightPxChange = this.imageHeightPx;
  1163. this.scaleId = 100;
  1164. this.moveId = 20;
  1165. this.controlFilePlay(0);
  1166. },
  1167. getPageSrc() {
  1168. this.imageList.forEach((item, index) => {
  1169. if (index === this.currentPage - 1) {
  1170. this.pageSrc = item;
  1171. }
  1172. })
  1173. },
  1174. //缩放
  1175. scaleChange() {
  1176. // if (!this.validDeviceId()) {
  1177. // this.scaleId = null;
  1178. // return;
  1179. // }
  1180. if (this.totalPage == 0) {
  1181. this.$message({
  1182. message: '请先选择文件开始文件播放',
  1183. type: 'warning'
  1184. });
  1185. this.scaleId = 100;
  1186. return;
  1187. }
  1188. let param = {
  1189. meetingId: this.meetingId,
  1190. scale: this.scaleId,
  1191. deviceId: this.deviceId,
  1192. imageIndex: this.currentPage
  1193. }
  1194. imageScale(param).then(response => {
  1195. console.log('缩放:', response);
  1196. this.imageHeight = 100 * (this.scaleId / 100);
  1197. this.this.imageHeightPxChange = this.imageHeightPx * (this.scaleId / 100);
  1198. this.$message({
  1199. message: "缩放成功",
  1200. type: 'success'
  1201. });
  1202. });
  1203. },
  1204. //上移
  1205. moveUp() {
  1206. console.log('moveId', this.moveId);
  1207. if (!this.validDeviceId()) {
  1208. return;
  1209. }
  1210. if (this.fileType == 1) {
  1211. if (this.totalPage == 0) {
  1212. this.$message({
  1213. message: '请先选择文件开始文件播放',
  1214. type: 'warning'
  1215. });
  1216. return;
  1217. }
  1218. }
  1219. if (this.moveId == null) {
  1220. this.$message({
  1221. message: '请先选择移动距离',
  1222. type: 'warning'
  1223. });
  1224. return;
  1225. }
  1226. let param = {
  1227. direction: 1,
  1228. meetingId: this.meetingId,
  1229. distance: this.moveId,
  1230. deviceId: this.deviceId,
  1231. imageIndex: this.currentPage,
  1232. fileType: this.fileType
  1233. }
  1234. imageMove(param).then(response => {
  1235. console.log('上移:', response);
  1236. this.imageOffset = this.imageOffset - ((this.moveId / 100) * this.imageHeightPxChange);
  1237. this.$message({
  1238. message: '上移成功',
  1239. type: 'success'
  1240. });
  1241. });
  1242. },
  1243. //下移
  1244. moveDown() {
  1245. if (!this.validDeviceId()) {
  1246. return;
  1247. }
  1248. if (this.fileType == 1) {
  1249. if (this.totalPage == 0) {
  1250. this.$message({
  1251. message: '请先选择文件开始文件播放',
  1252. type: 'warning'
  1253. });
  1254. return;
  1255. }
  1256. }
  1257. if (this.moveId == null) {
  1258. this.$message({
  1259. message: '请先选择移动距离',
  1260. type: 'warning'
  1261. });
  1262. return;
  1263. }
  1264. let param = {
  1265. direction: 2,
  1266. meetingId: this.meetingId,
  1267. distance: this.moveId,
  1268. deviceId: this.deviceId,
  1269. imageIndex: this.currentPage,
  1270. fileType: this.fileType
  1271. }
  1272. imageMove(param).then(response => {
  1273. console.log('下移:', response);
  1274. this.imageOffset = this.imageOffset + (this.moveId / 100) * this.imageHeightPxChange;
  1275. this.$message({
  1276. message: '下移成功',
  1277. type: 'success'
  1278. });
  1279. });
  1280. },
  1281. // 上一页
  1282. lastPage() {
  1283. if (!this.validDeviceId()) {
  1284. return;
  1285. }
  1286. if (this.currentPage === 1) {
  1287. this.$message({
  1288. message: '已经是第一页',
  1289. type: 'warning'
  1290. });
  1291. } else {
  1292. this.currentPage--;
  1293. this.getPageSrc();
  1294. this.controlFilePlay(1);
  1295. }
  1296. },
  1297. controlFilePlay(isStart) {
  1298. const id = this.fileList[this.selectedFileIndex].id;
  1299. filePlay(id, this.currentPage, this.deviceId, isStart).then(response => {
  1300. this.$message({
  1301. message: response.msg,
  1302. type: 'success'
  1303. });
  1304. });
  1305. },
  1306. endFilePlay() {
  1307. const id = this.ids[0];
  1308. endFilePlay(id, this.deviceId).then(response => {
  1309. this.$message({
  1310. message: response.msg,
  1311. type: 'success'
  1312. });
  1313. });
  1314. },
  1315. // 下一页
  1316. nextPage() {
  1317. if (!this.validDeviceId()) {
  1318. return;
  1319. }
  1320. if (this.totalPage == 0) {
  1321. this.$message({
  1322. message: '请先选择文件开始文件播放',
  1323. type: 'warning'
  1324. });
  1325. return;
  1326. }
  1327. if (this.currentPage === this.totalPage) {
  1328. this.$message({
  1329. message: '已经是最后一页',
  1330. type: 'warning'
  1331. });
  1332. } else {
  1333. this.currentPage++;
  1334. this.getPageSrc();
  1335. this.controlFilePlay(1);
  1336. }
  1337. },
  1338. // 结束播放
  1339. endShowFile() {
  1340. if (!this.validDeviceId()) {
  1341. return;
  1342. }
  1343. this.endFilePlay();
  1344. this.currentPage = 0;
  1345. this.pageSrc = null;
  1346. this.imageList = [];
  1347. // this.fileList = [];
  1348. this.totalPage = 0;
  1349. this.currentPage = 1;
  1350. },
  1351. rsWord() {
  1352. if (this.sourceWord === null || this.sourceWord === '') {
  1353. this.$message({
  1354. message: '文本内容不能为空',
  1355. type: 'warning'
  1356. });
  1357. } else {
  1358. // 调用接口
  1359. /*let word = {
  1360. message : this.sourceWord
  1361. };
  1362. rsWord(word).then(response => {
  1363. this.targetWord = response.data.result;
  1364. });*/
  1365. let inputElement = document.getElementById("targetWord");
  1366. inputElement.value = "";
  1367. this.socketSend()
  1368. }
  1369. },
  1370. socketSend() {
  1371. let message = this.sourceWord;
  1372. this.websocket.send(message);
  1373. },
  1374. socketConnect() {
  1375. let socketUrl = "ws://117.73.13.40:8080/party-admin/ws/server/" + getToken();
  1376. this.websocket = new WebSocket(socketUrl);
  1377. this.websocket.onopen = function(event) {
  1378. console.log("连接成功");
  1379. };
  1380. this.websocket.onmessage = function(event) {
  1381. let message = event.data;
  1382. let decodedMessage = decodeURIComponent(message); // 将消息转换为UTF-8编码
  1383. let inputElement = document.getElementById("targetWord");
  1384. inputElement.value = inputElement.value + decodedMessage;
  1385. };
  1386. this.websocket.onclose = function(event) {
  1387. console.log("连接关闭");
  1388. };
  1389. this.websocket.onerror = function(event) {
  1390. console.log("链接错误");
  1391. };
  1392. },
  1393. //点击会议资料
  1394. selectFileItem(index) {
  1395. this.selectedFileIndex = index;
  1396. this.meetTitle = this.fileList[index].fileName;
  1397. },
  1398. //开始播放
  1399. beginPlay() {
  1400. if (!this.validDeviceId()) {
  1401. return;
  1402. }
  1403. if (this.selectedFileIndex < 0) {
  1404. this.$message({
  1405. message: '请先选择会议资料',
  1406. type: 'warning'
  1407. });
  1408. return;
  1409. }
  1410. if (this.fileList[this.selectedFileIndex].fileType == 1) {
  1411. this.fileType = 1;
  1412. this.showFile();
  1413. } else if (this.fileList[this.selectedFileIndex].fileType == 2) {
  1414. this.fileType = 2;
  1415. this.showUrl(this.fileList[this.selectedFileIndex].fileUrl);
  1416. }
  1417. this.isMeetPlay = true;
  1418. },
  1419. endPlay() {
  1420. if (this.fileList[this.selectedFileIndex].fileType == 1) {
  1421. this.fileType = 1;
  1422. this.endShowFile();
  1423. } else if (this.fileList[this.selectedFileIndex].fileType == 2) {
  1424. this.fileType = 2;
  1425. this.endShowUrl(this.fileList[this.selectedFileIndex].fileUrl);
  1426. }
  1427. this.isMeetPlay = false;
  1428. this.imageOffset = 0;
  1429. this.imageHeight = 100;
  1430. this.imageHeightPxChange = this.imageHeightPx;
  1431. this.scaleId = 100;
  1432. this.moveId = 20;
  1433. },
  1434. deleteDialogPhoto() {
  1435. console.log('selectedItems:', this.selectedItems);
  1436. console.log('删除前photoList:', this.photoList);
  1437. if (this.selectedItems != null && this.selectedItems.length > 0) {
  1438. this.deletePhoto(this.selectedItems);
  1439. } else {
  1440. this.$message({
  1441. message: '请先选择需要删除的图片',
  1442. type: 'warning'
  1443. });
  1444. }
  1445. },
  1446. handleImageLoad(event) {
  1447. this.imageHeightPx = event.target.offsetHeight;
  1448. this.imageHeightPxChange = this.imageHeightPx;
  1449. console.log('Image height:', this.imageHeightPx);
  1450. },
  1451. clickMeetMore() {
  1452. this.dialogMeetVisible = true;
  1453. this.refreshAudio();
  1454. }
  1455. }
  1456. }
  1457. </script>
  1458. <style>
  1459. .imageDiv {
  1460. /* margin-left: 40px;
  1461. margin-right: 30px;
  1462. margin-bottom: 10px; */
  1463. margin-left: 5px;
  1464. margin-rignt: 5px;
  1465. display: flex;
  1466. align-items: center;
  1467. margin-bottom: 10px;
  1468. }
  1469. .meeting {
  1470. width: 100%;
  1471. height: 100%;
  1472. background-image: url("../../../assets/images/bg_meeting_pad.png");
  1473. background-size: cover;
  1474. display: flex;
  1475. flex-direction: row;
  1476. }
  1477. .line-column {
  1478. height: 100%;
  1479. width: 0.5px;
  1480. background-color: #FFFFFF;
  1481. }
  1482. .title {
  1483. font-family: Microsoft YaHei;
  1484. font-size: 18px;
  1485. font-weight: bold;
  1486. line-height: 18px;
  1487. letter-spacing: -1px;
  1488. color: #FFFFFF;
  1489. margin-left: 8px;
  1490. }
  1491. .display-row {
  1492. display: flex;
  1493. flex-direction: row;
  1494. }
  1495. .display-cloumn {
  1496. display: flex;
  1497. flex-direction: column;
  1498. }
  1499. .display-between {
  1500. display: flex;
  1501. justify-content: space-between;
  1502. }
  1503. .display-center {
  1504. display: flex;
  1505. justify-content: center;
  1506. align-items: center;
  1507. }
  1508. .display-align-center {
  1509. display: flex;
  1510. align-items: center;
  1511. }
  1512. .text-fontsize-14 {
  1513. font-size: 14px;
  1514. font-weight: normal;
  1515. letter-spacing: 0.01em;
  1516. color: #FFFFFF;
  1517. }
  1518. .text-fontsize-12 {
  1519. font-size: 12px;
  1520. font-weight: normal;
  1521. letter-spacing: 0.01em;
  1522. color: #FFFFFF;
  1523. }
  1524. .text-fontsize-10 {
  1525. font-size: 10px;
  1526. font-weight: normal;
  1527. letter-spacing: 0.01em;
  1528. color: #FFFFFF;
  1529. }
  1530. .text-fontsize-16 {
  1531. font-size: 16px;
  1532. font-weight: normal;
  1533. letter-spacing: 0.01em;
  1534. color: #FFFFFF;
  1535. }
  1536. .text-fontsize-18 {
  1537. font-size: 18px;
  1538. font-weight: normal;
  1539. letter-spacing: 0.01em;
  1540. color: #FFFFFF;
  1541. }
  1542. .icon {
  1543. width: 13px;
  1544. height: 13px;
  1545. }
  1546. .icon-18 {
  1547. width: 18px;
  1548. height: 18px;
  1549. }
  1550. .icon-40 {
  1551. width: 28px;
  1552. height: 28px;
  1553. }
  1554. /* 如果你想要更改下拉菜单的背景色 */
  1555. .el-select .el-input__inner {
  1556. background-color: rgba(0, 0, 0, 0);
  1557. /* 你想要的背景色 */
  1558. border: 1px solid rgba(255, 255, 255, 0.85);
  1559. font-size: 14px;
  1560. font-weight: normal;
  1561. letter-spacing: 0px;
  1562. color: #FFFFFF;
  1563. }
  1564. .el-select .el-input__inner:focus {
  1565. border-color: rgba(255, 255, 255, 0.85) !important;
  1566. }
  1567. /* 下拉框*/
  1568. .el-select-dropdown {}
  1569. /* 修改el-select下拉菜单选项的文字颜色 */
  1570. .el-select-dropdown__item {
  1571. color: #000000;
  1572. /* 将#your-color-here替换为你想要的颜色代码 */
  1573. font-weight: normal;
  1574. font-size: 14px;
  1575. }
  1576. .el-select-dropdown__item.selected {
  1577. color: #CA0001;
  1578. font-weight: normal;
  1579. font-size: 14px;
  1580. }
  1581. .is-selected {
  1582. background: rgba(255, 255, 255, 0.15);
  1583. }
  1584. .btn {
  1585. background-color: transparent;
  1586. border-color: #FFFFFF;
  1587. color: #FFFFFF;
  1588. height: 28px;
  1589. padding: 8px;
  1590. font-size: 12px;
  1591. }
  1592. .screen_nocontent {
  1593. border: 1px dashed #FFFFFF;
  1594. }
  1595. .fileItem {
  1596. padding: 8px;
  1597. }
  1598. .single-line {
  1599. white-space: nowrap;
  1600. /* 保证文本不会换行 */
  1601. overflow: hidden;
  1602. /* 隐藏溢出的内容 */
  1603. text-overflow: ellipsis;
  1604. /* 添加省略号表示文本被截断 */
  1605. word-break:keep-all;
  1606. }
  1607. .line {
  1608. height: 0.5px;
  1609. width: 100%;
  1610. background-color: #FFFFFF;
  1611. }
  1612. .line-grey {
  1613. height: 1px;
  1614. width: 100%;
  1615. background-color: #E5E6EB;
  1616. }
  1617. .line-grey-column {
  1618. width: 1px;
  1619. height: calc(75vh - 52px);
  1620. background-color: #E5E6EB;
  1621. }
  1622. progress {
  1623. width: 82px;
  1624. height: 8px;
  1625. border-radius: 10px;
  1626. background-color: rgba(0, 0, 0, 0.3);
  1627. }
  1628. /* 已完成部分的样式 */
  1629. progress::-webkit-progress-value {
  1630. border-radius: 10px;
  1631. background: #FFE59E;
  1632. }
  1633. /* 未完成部分的样式 */
  1634. progress::-webkit-progress-bar {
  1635. border-radius: 10px;
  1636. background-color: rgba(0, 0, 0, 0.3);
  1637. }
  1638. .no-scrollbar::-webkit-scrollbar {
  1639. display: none;
  1640. /* 对于WebKit浏览器,如Chrome,Safari */
  1641. }
  1642. .no-scrollbar {
  1643. -ms-overflow-style: none;
  1644. /* 对于IE和Edge */
  1645. scrollbar-width: none;
  1646. /* 对于Firefox */
  1647. }
  1648. .el-dialog {
  1649. display: flex;
  1650. flex-direction: column;
  1651. margin: 0 !important;
  1652. position: absolute;
  1653. top: 45%;
  1654. left: 50%;
  1655. transform: translate(-50%, -50%);
  1656. height: 75vh;
  1657. width: 75vw;
  1658. max-width: calc(100% - 30px);
  1659. }
  1660. .el-dialog__header {
  1661. height: 50px;
  1662. /* 设置你想要的高度 */
  1663. }
  1664. .el-dialog .el-dialog__body {
  1665. flex: 1;
  1666. overflow: auto;
  1667. padding: 0px;
  1668. }
  1669. .el-dialog .el-dialog__title {
  1670. font-size: 14px; /* 修改为期望的大小 */
  1671. }
  1672. /* table th,
  1673. table td {
  1674. border-bottom: none !important;
  1675. } */
  1676. .no-border th,
  1677. .no-border td {
  1678. border-bottom: none !important;
  1679. }
  1680. .custom-text-color {
  1681. color: red;
  1682. }
  1683. .no-active.el-button:focus,
  1684. .no-active.el-button:hover,
  1685. .no-active.el-button:active {
  1686. background-color: transparent !important;
  1687. border-color: #FFFFFF !important;
  1688. color: #FFFFFF !important;
  1689. }
  1690. .playBtn.el-button:focus,
  1691. .playBtn.el-button:hover,
  1692. .playBtn.el-button:active {
  1693. background-color: #FFE59E !important;
  1694. color: #CA0001 !important;
  1695. }
  1696. .playBtn {
  1697. background: #FFE59E;
  1698. color: #CA0001;
  1699. padding: 5px;
  1700. }
  1701. .more {
  1702. color: #FFE59E;
  1703. background: transparent;
  1704. border-color: transparent;
  1705. padding: 0;
  1706. font-size: 12px;
  1707. }
  1708. .more.el-button:focus,
  1709. .more.el-button:hover,
  1710. .more.el-button:active {
  1711. background-color: transparent !important;
  1712. color: #FFE59E !important;
  1713. border-color: transparent !important;
  1714. }
  1715. .el-select .el-input__inner::placeholder {
  1716. color: #FFFFFF;
  1717. }
  1718. .elselect .el-input {
  1719. padding: 5px 0;
  1720. }
  1721. /* 修改el-select的内边距 */
  1722. .elselect .el-input .el-input__inner {
  1723. height: 28px;
  1724. padding-left: 2px;
  1725. font-size: 12px;
  1726. }
  1727. .custom-label-size {
  1728. font-size: 12px; /* 修改为你想要的字体大小 */
  1729. }
  1730. .el-table .cell {
  1731. font-size: 12px;
  1732. }
  1733. el-table__row>td {
  1734. border: none;
  1735. }
  1736. .el-table::before {
  1737. height: 0px;
  1738. }
  1739. .meet-input{
  1740. font-size:12px;
  1741. color: #545454;
  1742. }
  1743. /* Vue组件内的<style>标签或者单独的CSS文件 */
  1744. </style>