index.vue 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131
  1. <template>
  2. <div>
  3. <!-- 应急广播标题 -->
  4. <el-row>
  5. <div class="tag">应急广播</div>
  6. </el-row>
  7. <!-- 顶部卡片区域 -->
  8. <el-row :gutter="20">
  9. <!-- 设备在线数量区域 -->
  10. <el-col :span="6">
  11. <el-card class="box_card">
  12. <div slot="header">
  13. <span>设备在线数量/台</span>
  14. <el-button
  15. style="float: right; padding: 3px 0"
  16. type="text"
  17. @click="dialogFormVisible_broadcast = true"
  18. >编辑</el-button>
  19. </div>
  20. <el-row>
  21. <el-col
  22. :span="10"
  23. :offset="2"
  24. >
  25. <img src="../../assets/shebei.svg">
  26. </el-col>
  27. <el-col
  28. :span="8"
  29. :offset="4"
  30. >
  31. <div class="card_info">{{numOfDevice}}</div>
  32. </el-col>
  33. </el-row>
  34. </el-card>
  35. </el-col>
  36. <!-- 播发时间区域 -->
  37. <el-col :span="6">
  38. <el-card class="box_card">
  39. <div slot="header">
  40. <span>播发时间段</span>
  41. <el-button
  42. style="float: right; padding: 3px 0"
  43. type="text"
  44. @click="dialogFormVisible_broadcast2 = true"
  45. >编辑</el-button>
  46. </div>
  47. <el-row>
  48. <el-col
  49. :span="10"
  50. :offset="1"
  51. >
  52. <img src="../../assets/naozhong.svg">
  53. </el-col>
  54. <el-col
  55. :span="12"
  56. :offset="1"
  57. class="font_size"
  58. v-if="broadcastTime.length!=0"
  59. >
  60. <el-row>{{broadcastTime[0].substring(0,5)}}-{{broadcastTime[1].substring(0,5)}} </el-row>
  61. <el-row>{{broadcastTime2[0].substring(0,5)}}-{{broadcastTime2[1].substring(0,5)}}</el-row>
  62. <el-row>{{broadcastTime3[0].substring(0,5)}}-{{broadcastTime3[1].substring(0,5)}}</el-row>
  63. </el-col>
  64. </el-row>
  65. </el-card>
  66. </el-col>
  67. <!-- 累计时长区域 -->
  68. <el-col :span="6">
  69. <el-card class="box_card">
  70. <div slot="header">
  71. <span>累计时长/h</span>
  72. <el-button
  73. style="float: right; padding: 3px 0"
  74. type="text"
  75. @click="dialogFormVisible_broadcast3 = true"
  76. >编辑</el-button>
  77. </div>
  78. <el-row>
  79. <el-col
  80. :span="10"
  81. :offset="2"
  82. >
  83. <img src="../../assets/shizhong.svg">
  84. </el-col>
  85. <el-col
  86. :span="8"
  87. :offset="4"
  88. >
  89. <div class="card_info">{{broadcastDuration}}</div>
  90. </el-col>
  91. </el-row>
  92. </el-card>
  93. </el-col>
  94. <!-- 累计播发区域 -->
  95. <el-col :span="6">
  96. <el-card class="box_card">
  97. <div slot="header">
  98. <span>累计播发/条</span>
  99. <!-- <el-button
  100. style="float: right; padding: 3px 0"
  101. type="text"
  102. >编辑</el-button> -->
  103. </div>
  104. <el-row>
  105. <el-col
  106. :span="10"
  107. :offset="2"
  108. >
  109. <img src="../../assets/shalou.svg">
  110. </el-col>
  111. <el-col
  112. :span="8"
  113. :offset="4"
  114. >
  115. <div class="card_info">{{totalCount}}</div>
  116. </el-col>
  117. </el-row>
  118. </el-card>
  119. </el-col>
  120. </el-row>
  121. <div style="margin: 10px 0;"></div>
  122. <!-- 播发统计标题区域 -->
  123. <el-row>
  124. <el-col
  125. :span="4"
  126. class="tag"
  127. >播发统计</el-col>
  128. <el-col
  129. :span="3"
  130. :offset="14"
  131. class="tag_min"
  132. >累计播发{{totalCount}}条</el-col>
  133. <el-col
  134. :span="3"
  135. class="tag_min"
  136. >播放时长{{broadcastDuration}}小时</el-col>
  137. </el-row>
  138. <div style="margin: 10px 0;"></div>
  139. <!--添加按钮 和搜索框 -->
  140. <el-row>
  141. <el-col :span="4">
  142. <el-button
  143. type="primary"
  144. size="mini"
  145. @click="dialogFormVisible = true;form = {}"
  146. >添加广播</el-button>
  147. </el-col>
  148. <el-col :span="5">
  149. <el-input
  150. suffix-icon="el-icon-search"
  151. size="small"
  152. clearable
  153. placeholder="请输入播发标题关键词"
  154. v-model="searchValue"
  155. @blur="handleSearch"
  156. @clear="hangleDelete"
  157. >
  158. </el-input>
  159. </el-col>
  160. </el-row>
  161. <div style="margin: 10px 0;"></div>
  162. <!-- 表格区域 -->
  163. <el-row>
  164. <el-table
  165. :data="tableData"
  166. style="width: 100%;font-size: 14px;"
  167. highlight-current-row
  168. height="300"
  169. >
  170. <el-table-column
  171. prop="address"
  172. label="播发地点"
  173. align="center"
  174. width="120"
  175. show-overflow-tooltip
  176. >
  177. </el-table-column>
  178. <el-table-column
  179. prop="broadcastType"
  180. label="广播类型"
  181. align="center"
  182. width="150"
  183. >
  184. </el-table-column>
  185. <el-table-column
  186. prop="messageType"
  187. label="消息类型"
  188. align="center"
  189. width="150"
  190. >
  191. </el-table-column>
  192. <el-table-column
  193. prop="playTime"
  194. label="播出时间"
  195. align="center"
  196. width="160"
  197. >
  198. </el-table-column>
  199. <el-table-column
  200. prop="title"
  201. label="播发标题"
  202. align="center"
  203. width="150"
  204. show-overflow-tooltip
  205. >
  206. </el-table-column>
  207. <el-table-column
  208. label="播发内容"
  209. align="center"
  210. show-overflow-tooltip
  211. >
  212. <template slot-scope="{ row }">
  213. <div
  214. class="content_style"
  215. v-html="row.content"
  216. ></div>
  217. </template>
  218. </el-table-column>
  219. <el-table-column
  220. label="操作"
  221. align="center"
  222. width="150"
  223. >
  224. <template slot-scope="{ row }">
  225. <el-button
  226. type="warning"
  227. size="mini"
  228. @click="amendBroadcast(row)"
  229. >修改</el-button>
  230. <el-button
  231. type="danger"
  232. size="mini"
  233. @click="deleteBroadcast(row.id)"
  234. >删除</el-button>
  235. </template>
  236. </el-table-column>
  237. </el-table>
  238. </el-row>
  239. <div style="margin: 28px 0;"></div>
  240. <!-- 分页器 -->
  241. <el-row>
  242. <div class="pagination_smoke">
  243. <el-pagination
  244. background
  245. layout="total,prev, pager, next"
  246. :total="totalCount"
  247. :page-size="pageSize"
  248. :current-page.sync="curPage"
  249. @current-change="changeCurPage"
  250. >
  251. </el-pagination>
  252. </div>
  253. </el-row>
  254. <!-- 修改设备在线数量弹窗 -->
  255. <el-dialog
  256. title="修改设备在线数量"
  257. :visible.sync="dialogFormVisible_broadcast"
  258. center
  259. style="width:80%"
  260. >
  261. <el-form>
  262. <el-form-item
  263. label="设备在线数量:"
  264. label-width="100px"
  265. >
  266. <el-input v-model="numOfDevice"></el-input>
  267. </el-form-item>
  268. </el-form>
  269. <div
  270. slot="footer"
  271. class="dialog-footer"
  272. >
  273. <el-button
  274. type="primary"
  275. @click="amendNumOfDevice"
  276. >确 定</el-button>
  277. <el-button @click="dialogFormVisible_broadcast = false">取 消</el-button>
  278. </div>
  279. </el-dialog>
  280. <!-- 修改播发时间弹窗 -->
  281. <el-dialog
  282. title="修改播发时间"
  283. :visible.sync="dialogFormVisible_broadcast2"
  284. center
  285. style="width:80%"
  286. >
  287. <el-form>
  288. <el-form-item
  289. label="播发时间段-1:"
  290. label-width="100px"
  291. >
  292. <el-time-picker
  293. is-range
  294. range-separator="至"
  295. start-placeholder="开始时间"
  296. end-placeholder="结束时间"
  297. value-format="HH:mm:ss"
  298. v-model="broadcastTime"
  299. >
  300. </el-time-picker>
  301. </el-form-item>
  302. <el-form-item
  303. label="播发时间段-2:"
  304. label-width="100px"
  305. >
  306. <el-time-picker
  307. is-range
  308. range-separator="至"
  309. start-placeholder="开始时间"
  310. end-placeholder="结束时间"
  311. value-format="HH:mm:ss"
  312. v-model="broadcastTime2"
  313. >
  314. </el-time-picker>
  315. </el-form-item>
  316. <el-form-item
  317. label="播发时间段-3:"
  318. label-width="100px"
  319. >
  320. <el-time-picker
  321. is-range
  322. range-separator="至"
  323. start-placeholder="开始时间"
  324. end-placeholder="结束时间"
  325. value-format="HH:mm:ss"
  326. v-model="broadcastTime3"
  327. >
  328. </el-time-picker>
  329. </el-form-item>
  330. </el-form>
  331. <div
  332. slot="footer"
  333. class="dialog-footer"
  334. >
  335. <el-button
  336. type="primary"
  337. @click="amendNumOfDevice"
  338. >确 定</el-button>
  339. <el-button @click="dialogFormVisible_broadcast2 = false">取 消</el-button>
  340. </div>
  341. </el-dialog>
  342. <!-- 修改累计时长弹窗 -->
  343. <el-dialog
  344. title="修改累计时长"
  345. :visible.sync="dialogFormVisible_broadcast3"
  346. center
  347. style="width:80%"
  348. >
  349. <el-form>
  350. <el-form-item
  351. label="累计时长:"
  352. label-width="100px"
  353. >
  354. <el-input v-model="broadcastDuration"></el-input>
  355. </el-form-item>
  356. </el-form>
  357. <div
  358. slot="footer"
  359. class="dialog-footer"
  360. >
  361. <el-button
  362. type="primary"
  363. @click="amendNumOfDevice"
  364. >确 定</el-button>
  365. <el-button @click="dialogFormVisible_broadcast3 = false">取 消</el-button>
  366. </div>
  367. </el-dialog>
  368. <!-- 添加广播弹窗 -->
  369. <el-dialog
  370. title="添加广播"
  371. :visible.sync="dialogFormVisible"
  372. center
  373. top="5vh"
  374. >
  375. <el-form
  376. :model="form"
  377. :rules="rules"
  378. ref="form"
  379. label-width="80px"
  380. >
  381. <el-form-item
  382. label="播出时间"
  383. prop="playTime"
  384. >
  385. <el-date-picker
  386. v-model="form.playTime"
  387. value-format="yyyy-MM-dd HH:mm:ss"
  388. type="datetime"
  389. placeholder="选择日期"
  390. >
  391. </el-date-picker>
  392. </el-form-item>
  393. <el-form-item
  394. label="播发地点"
  395. prop="address"
  396. >
  397. <el-input v-model="form.address"></el-input>
  398. </el-form-item>
  399. <el-form-item
  400. label="广播类型"
  401. prop="broadcastType"
  402. >
  403. <el-input v-model="form.broadcastType"></el-input>
  404. </el-form-item>
  405. <el-form-item
  406. label="消息类型"
  407. prop="messageType"
  408. >
  409. <el-input v-model="form.messageType"></el-input>
  410. </el-form-item>
  411. <el-form-item
  412. label="播发标题"
  413. prop="title"
  414. >
  415. <el-input v-model="form.title"></el-input>
  416. </el-form-item>
  417. <el-form-item
  418. label="播发音频"
  419. prop="extraFileShowUrl"
  420. >
  421. <el-upload
  422. class="upload-demo"
  423. action="#"
  424. :auto-upload="false"
  425. :show-file-list="false"
  426. :on-change="uploadSuccessVoice2"
  427. >
  428. <el-button
  429. size="small"
  430. type="primary"
  431. >点击上传
  432. </el-button>
  433. <div class="avatar">
  434. <div v-if="form.extraFile">{{form.extraFile}}</div>
  435. <audio
  436. controls="controls"
  437. v-if="form.extraFileShowUrl"
  438. :src="form.extraFileShowUrl+form.extraFile"
  439. ></audio>
  440. </div>
  441. <div
  442. slot="tip"
  443. class="el-upload__tip"
  444. >只能上传mp3文件,且不超过30M</div>
  445. </el-upload>
  446. </el-form-item>
  447. <el-form-item
  448. label="播发内容"
  449. prop="content"
  450. >
  451. <!-- 上传组件辅助-->
  452. <el-upload
  453. class="avatar-uploader-editor-voice"
  454. action="#"
  455. :auto-upload="false"
  456. :show-file-list="false"
  457. :on-change="uploadSuccessVoice"
  458. > </el-upload>
  459. <quill-editor
  460. v-model="form.content"
  461. ref="myQuillEditor"
  462. style="height: 100px;margin-top: -22px;"
  463. :options="editorOption"
  464. >
  465. <div
  466. id="toolbar"
  467. slot="toolbar"
  468. >
  469. <button
  470. class="ql-bold"
  471. title="加粗"
  472. >Bold</button>
  473. <button
  474. class="ql-italic"
  475. title="斜体"
  476. >Italic</button>
  477. <button
  478. class="ql-underline"
  479. title="下划线"
  480. >underline</button>
  481. <button
  482. class="ql-strike"
  483. title="删除线"
  484. >strike</button>
  485. <button
  486. class="ql-clean"
  487. title="清除字体样式"
  488. ></button>
  489. </div>
  490. </quill-editor>
  491. </el-form-item>
  492. </el-form>
  493. <div
  494. slot="footer"
  495. class="dialog-footer"
  496. >
  497. <el-button
  498. type="primary"
  499. @click="addBroadcast('form')"
  500. >确 定</el-button>
  501. <el-button @click="dialogFormVisible = false">取 消</el-button>
  502. </div>
  503. </el-dialog>
  504. <!-- 修改广播弹窗 -->
  505. <el-dialog
  506. title="修改广播"
  507. :visible.sync="dialogFormVisible2"
  508. center
  509. top="3vh"
  510. >
  511. <el-form
  512. :model="form"
  513. :rules="rules"
  514. ref="form2"
  515. label-width="80px"
  516. >
  517. <el-form-item
  518. label="播出时间"
  519. prop="playTime"
  520. >
  521. <el-date-picker
  522. v-model="form.playTime"
  523. type="date"
  524. placeholder="选择日期"
  525. >
  526. </el-date-picker>
  527. </el-form-item>
  528. <el-form-item
  529. label="播发地点"
  530. prop="address"
  531. >
  532. <el-input v-model="form.address"></el-input>
  533. </el-form-item>
  534. <el-form-item
  535. label="广播类型"
  536. prop="broadcastType"
  537. >
  538. <el-input v-model="form.broadcastType"></el-input>
  539. </el-form-item>
  540. <el-form-item
  541. label="消息类型"
  542. prop="messageType"
  543. >
  544. <el-input v-model="form.messageType"></el-input>
  545. </el-form-item>
  546. <el-form-item
  547. label="播发标题"
  548. prop="title"
  549. >
  550. <el-input v-model="form.title"></el-input>
  551. </el-form-item>
  552. <el-form-item
  553. label="播发音频"
  554. prop="extraFileShowUrl"
  555. >
  556. <el-upload
  557. class="upload-demo"
  558. action="#"
  559. :auto-upload="false"
  560. :show-file-list="false"
  561. :on-change="uploadSuccessVoice2"
  562. >
  563. <el-button
  564. size="small"
  565. type="primary"
  566. >点击上传
  567. </el-button>
  568. <div class="avatar">
  569. <div v-if="form.extraFile">{{form.extraFile}}</div>
  570. <audio
  571. controls="controls"
  572. v-if="form.extraFileShowUrl"
  573. :src="form.extraFileShowUrl+form.extraFile"
  574. ></audio>
  575. </div>
  576. <div
  577. slot="tip"
  578. class="el-upload__tip"
  579. >只能上传mp3文件,且不超过30M</div>
  580. </el-upload>
  581. </el-form-item>
  582. <el-form-item
  583. label="播发内容"
  584. prop="content"
  585. >
  586. <!-- 上传组件辅助-->
  587. <el-upload
  588. class="avatar-uploader-editor-voice"
  589. action="#"
  590. :auto-upload="false"
  591. :show-file-list="false"
  592. :on-change="uploadSuccessVoice"
  593. > </el-upload>
  594. <quill-editor
  595. v-model="form.content"
  596. ref="myQuillEditor"
  597. style="height: 100px;margin-top: -22px;"
  598. :options="editorOption"
  599. >
  600. <div
  601. id="toolbar"
  602. slot="toolbar"
  603. >
  604. <button
  605. class="ql-bold"
  606. title="加粗"
  607. >Bold</button>
  608. <button
  609. class="ql-italic"
  610. title="斜体"
  611. >Italic</button>
  612. <button
  613. class="ql-underline"
  614. title="下划线"
  615. >underline</button>
  616. <button
  617. class="ql-strike"
  618. title="删除线"
  619. >strike</button>
  620. <button
  621. class="ql-clean"
  622. title="清除字体样式"
  623. ></button>
  624. <!-- <button
  625. class="ql-audio"
  626. title="上传音频"
  627. ><i class="el-icon-microphone"></i></button> -->
  628. </div>
  629. </quill-editor>
  630. </el-form-item>
  631. </el-form>
  632. <div
  633. slot="footer"
  634. class="dialog-footer"
  635. >
  636. <el-button
  637. type="primary"
  638. @click="hangdleAmendBroadcast('form2')"
  639. >确 定</el-button>
  640. <el-button @click="dialogFormVisible2 = false">取 消</el-button>
  641. </div>
  642. </el-dialog>
  643. </div>
  644. </template>
  645. <script>
  646. // 引入富文本编辑框和样式
  647. import { quillEditor, Quill } from "vue-quill-editor";
  648. import "quill/dist/quill.core.css";
  649. import "quill/dist/quill.snow.css";
  650. import "quill/dist/quill.bubble.css";
  651. // 自定义字体大小
  652. let Size = Quill.import("attributors/style/size");
  653. Size.whitelist = ["10px", "12px", "14px", "16px", "18px", "20px", "30px"];
  654. Quill.register(Size, true);
  655. // 自定义字体类型
  656. var fonts = [
  657. "SimSun",
  658. "SimHei",
  659. "Microsoft-YaHei",
  660. "KaiTi",
  661. "FangSong",
  662. "Arial",
  663. "Times-New-Roman",
  664. "sans-serif",
  665. "宋体",
  666. "黑体",
  667. ];
  668. var Font = Quill.import("formats/font");
  669. Font.whitelist = fonts;
  670. Quill.register(Font, true);
  671. //音频标签插入 (样式保持宽度100%)
  672. import Audio from "./audio.js";
  673. Quill.register(Audio, true);
  674. export default {
  675. name: "broadcastContent",
  676. components: { quillEditor },
  677. data() {
  678. return {
  679. id: "", // 设备id
  680. numOfDevice: "", // 设备在线数量
  681. rateOfInline: "", // 设备在线率
  682. numOfBroadcasts: "", // 广播数目
  683. broadcastDuration: "", // 累计播放时长
  684. broadcastTime: [], // 播发时间段
  685. broadcastTime2: [], // 播发时间段2
  686. broadcastTime3: [], // 播发时间段3
  687. tableData: [], // 广播列表
  688. dialogFormVisible: false, //添加弹窗控制
  689. dialogFormVisible2: false, //修改弹窗控制
  690. dialogFormVisible_broadcast: false, //修改设备在线数量弹窗控制
  691. dialogFormVisible_broadcast2: false, //修改播发时间弹窗控制
  692. dialogFormVisible_broadcast3: false, //修改累计时长弹窗控制
  693. searchValue: "", //搜索框绑定数据
  694. form: {
  695. content: "", //内容
  696. address: "", //地点
  697. broadcastType: "", //广播类型
  698. messageType: "", //消息类型
  699. playTime: "", //播发时间
  700. title: "", //广播概括
  701. extraFileShowUrl: "", //广播音频
  702. extraFile: "", //广播音频名称
  703. },
  704. // 验证规则
  705. rules: {
  706. content: [{ required: true, message: "请输入内容", trigger: "blur" }],
  707. address: [{ required: true, message: "请输入地点", trigger: "blur" }],
  708. broadcastType: [
  709. { required: true, message: "请输入广播类型", trigger: "blur" },
  710. ],
  711. messageType: [
  712. { required: true, message: "请输入消息类型", trigger: "blur" },
  713. ],
  714. title: [{ required: true, message: "请输入消息类型", trigger: "blur" }],
  715. playTime: [
  716. { required: true, message: "请选择播发时间", trigger: "change" },
  717. ],
  718. extraFileShowUrl: [
  719. { required: true, message: "请选择播发音频", trigger: "change" },
  720. ],
  721. },
  722. curPage: 1, // 当前页
  723. pageSize: 4, // 每页记录数
  724. totalCount: null, // 总条数
  725. // 富文本自定义
  726. editorOption: {
  727. placeholder: "请输入内容",
  728. theme: "snow",
  729. modules: {
  730. toolbar: {
  731. container: "#toolbar",
  732. handlers: {
  733. audio: function (value) {
  734. if (value) {
  735. // 触发input框选择音频文件
  736. document
  737. .querySelector(".avatar-uploader-editor-voice input")
  738. .click();
  739. } else {
  740. this.quill.format("audio", false);
  741. }
  742. },
  743. },
  744. },
  745. },
  746. },
  747. };
  748. },
  749. mounted() {
  750. this.getData();
  751. this.getBroadcastInfo();
  752. },
  753. methods: {
  754. // 获取广播播发记录列表
  755. async getData() {
  756. let params = {
  757. curPage: this.curPage,
  758. pageSize: this.pageSize,
  759. title: this.searchValue,
  760. };
  761. let res = await this.$axios({
  762. url: "/diseaseRight/broadcast/record/page",
  763. method: "get",
  764. params,
  765. });
  766. // console.log(res);
  767. if (res.data.success) {
  768. this.tableData = res.data.data.recordPage.list;
  769. this.totalCount = res.data.data.recordPage.totalCount;
  770. } else {
  771. this.$message.error("获取广播列表失败");
  772. }
  773. },
  774. // 获取应急广播调度统计信息
  775. async getBroadcastInfo() {
  776. let res = await this.$axios.get(
  777. "/diseaseRight/broadcast/statistics/info"
  778. );
  779. // console.log(res);
  780. if (res.data.success) {
  781. this.numOfDevice = res.data.data.numOfDevice;
  782. this.numOfBroadcasts = res.data.data.numOfBroadcasts;
  783. this.broadcastDuration = res.data.data.broadcastDuration;
  784. this.id = res.data.data.id;
  785. this.rateOfInline = res.data.data.rateOfInline;
  786. this.broadcastTime = [];
  787. this.broadcastTime2 = [];
  788. this.broadcastTime3 = [];
  789. res.data.data.broadcastTime.split(",").forEach((element, index) => {
  790. if (index == 0 || index == 1) {
  791. this.broadcastTime.push(element);
  792. } else if (index == 2 || index == 3) {
  793. this.broadcastTime2.push(element);
  794. } else if (index == 4 || index == 5) {
  795. this.broadcastTime3.push(element);
  796. }
  797. });
  798. } else {
  799. this.$message.error("获取应急广播调度统计信息失败");
  800. }
  801. },
  802. // 添加广播
  803. addBroadcast(formName) {
  804. this.$refs[formName].validate(async (valid) => {
  805. if (valid) {
  806. this.dialogFormVisible = false;
  807. let res = await this.$axios({
  808. method: "post",
  809. url: "/diseaseRight/broadcast/record/add",
  810. headers: {
  811. "Admin-Token": sessionStorage.getItem("token"),
  812. },
  813. data: this.form,
  814. });
  815. // console.log(res);
  816. if (res.data.success) {
  817. this.getData();
  818. this.$message.success("添加成功!");
  819. } else {
  820. this.$message.error("添加失败!");
  821. }
  822. } else {
  823. console.log("提交失败!!");
  824. return false;
  825. }
  826. });
  827. },
  828. // 修改广播
  829. amendBroadcast(row) {
  830. // console.log(row);
  831. this.dialogFormVisible2 = true;
  832. this.form = { ...row };
  833. },
  834. // 修改广播请求
  835. hangdleAmendBroadcast(formName) {
  836. this.$refs[formName].validate(async (valid) => {
  837. if (valid) {
  838. this.dialogFormVisible2 = false;
  839. let res = await this.$axios({
  840. method: "POST",
  841. url: "/diseaseRight/broadcast/record/update",
  842. headers: {
  843. "Admin-Token": sessionStorage.getItem("token"),
  844. },
  845. data: this.form,
  846. });
  847. // console.log(res);
  848. if (res.data.success) {
  849. this.$message.success("修改成功!");
  850. } else {
  851. this.$message.error("修改失败!");
  852. }
  853. this.getData();
  854. } else {
  855. console.log("提交失败!!");
  856. return false;
  857. }
  858. });
  859. },
  860. // 删除广播
  861. deleteBroadcast(id) {
  862. this.$confirm("确定删除吗?", "提示", {
  863. cancelButtonText: "取消",
  864. confirmButtonText: "确定",
  865. type: "warning",
  866. })
  867. .then(async () => {
  868. let res = await this.$axios({
  869. method: "delete",
  870. url: "/diseaseRight/broadcast/record/delete",
  871. headers: {
  872. "Admin-Token": sessionStorage.getItem("token"),
  873. },
  874. data: [id],
  875. });
  876. // console.log(res);
  877. if (res.data.success) {
  878. this.$message.success("删除成功");
  879. let totalPage = Math.ceil((this.totalCount - 1) / this.pageSize);
  880. let currentPage =
  881. this.curPage > totalPage ? totalPage : this.curPage;
  882. this.curPage = currentPage < 1 ? 1 : currentPage;
  883. this.getData();
  884. } else {
  885. this.$message.error("删除失败!");
  886. }
  887. })
  888. .catch(() => {
  889. this.$message.info("已取消");
  890. });
  891. },
  892. // 换页逻辑
  893. changeCurPage(val) {
  894. this.curPage = val;
  895. this.getData();
  896. },
  897. // 修改应急广播信息
  898. async amendNumOfDevice() {
  899. this.dialogFormVisible_broadcast = false;
  900. this.dialogFormVisible_broadcast2 = false;
  901. this.dialogFormVisible_broadcast3 = false;
  902. let data = {
  903. id: this.id,
  904. numOfDevice: this.numOfDevice,
  905. rateOfInline: this.rateOfInline,
  906. numOfBroadcasts: this.numOfBroadcasts,
  907. broadcastDuration: this.broadcastDuration,
  908. broadcastTime:
  909. this.broadcastTime +
  910. "," +
  911. this.broadcastTime2 +
  912. "," +
  913. this.broadcastTime3,
  914. };
  915. let res = await this.$axios({
  916. url: "/diseaseRight/broadcast/statistics/update",
  917. method: "put",
  918. data,
  919. headers: {
  920. "Admin-Token": sessionStorage.getItem("token"),
  921. },
  922. });
  923. // console.log(res);
  924. if (res.data.success) {
  925. this.$message.success("修改成功!");
  926. } else {
  927. this.$message.error("修改失败!");
  928. }
  929. this.getBroadcastInfo();
  930. },
  931. // 搜索框搜索请求
  932. handleSearch() {
  933. this.curPage = 1;
  934. this.getData();
  935. },
  936. // 搜索框清空请求
  937. hangleDelete() {
  938. this.curPage = 1;
  939. this.getData();
  940. },
  941. //上传音频 处理很重要
  942. async uploadSuccessVoice(file) {
  943. // 上传前限制文件大小
  944. const isMp3 = file.raw.type === "audio/mpeg";
  945. const isLt30M = file.size / 1024 / 1024 < 30;
  946. if (!isMp3 || !isLt30M) {
  947. this.$message.error("上传音频只能是 Mp3 格式,且不能超过 30MB!");
  948. } else {
  949. let quill = this.$refs.myQuillEditor.quill;
  950. let formData = new FormData();
  951. formData.append("file", file.raw);
  952. let res = await this.$axios({
  953. url: "/diseaseRight/file/imageUpload",
  954. method: "post",
  955. data: formData,
  956. headers: {
  957. "Admin-Token": sessionStorage.getItem("token"),
  958. },
  959. });
  960. // console.log(res);
  961. if (res.data.success) {
  962. this.$message.success("音频插入成功");
  963. // 获取光标所在位置
  964. let length = quill.getSelection().index;
  965. let BlockEmbed = Quill.import("blots/block/embed");
  966. class AudioBlot extends BlockEmbed {
  967. static create(value) {
  968. let node = super.create();
  969. node.setAttribute("src", res.data.data.showUrl); //设置audio的src属性
  970. node.setAttribute("controls", true); //设置audio的controls,否则他将不会显示
  971. node.setAttribute("controlsList", "nodownload"); //设置audio的下载功能为不能下载
  972. node.setAttribute("id", "voice"); //设置一个id
  973. return node;
  974. }
  975. }
  976. AudioBlot.blotName = "audio";
  977. AudioBlot.tagName = "audio"; //自定义的标签为audio
  978. Quill.register(AudioBlot);
  979. // insertEmbed(index: Number(插入的位置), type: String(标签类型), value: any(参数,将传入到create的方法中去), source: String = 'api')
  980. quill.insertEmbed(length, "audio", res.data.data.showUrl);
  981. quill.setSelection(length + 1); //光标位置向后移动一位
  982. } else {
  983. this.$message.error("音频插入失败");
  984. }
  985. }
  986. },
  987. async uploadSuccessVoice2(file) {
  988. const loading = this.$loading({
  989. lock: true,
  990. text: "上传中",
  991. spinner: "el-icon-loading",
  992. background: "rgba(0, 0, 0, 0.7)",
  993. });
  994. // 上传前限制文件大小
  995. const isMp3 = file.raw.type === "audio/mpeg";
  996. const isLt30M = file.size / 1024 / 1024 < 30;
  997. if (!isMp3 || !isLt30M) {
  998. loading.close();
  999. this.$message.error("上传音频只能是 Mp3 格式,且不能超过 30MB!");
  1000. } else {
  1001. let formData = new FormData();
  1002. formData.append("file", file.raw);
  1003. let res = await this.$axios({
  1004. url: "/diseaseRight/file/imageUpload",
  1005. method: "post",
  1006. data: formData,
  1007. headers: {
  1008. "Admin-Token": sessionStorage.getItem("token"),
  1009. },
  1010. });
  1011. // console.log(res);
  1012. if (res.data.success) {
  1013. // 响应式添加image的值
  1014. this.$set(this.form, "extraFileShowUrl", res.data.data.showUrl);
  1015. this.$set(this.form, "extraFile", res.data.data.imageName);
  1016. this.$message.success("音频上传成功");
  1017. } else {
  1018. this.$message.error("音频上传失败");
  1019. }
  1020. loading.close();
  1021. }
  1022. },
  1023. },
  1024. };
  1025. </script>
  1026. <style scoped>
  1027. @import url("font.css");
  1028. .tag {
  1029. font-size: 24px;
  1030. font-family: Microsoft YaHei-3970(82674968);
  1031. font-weight: bold;
  1032. color: #000000;
  1033. line-height: 40px;
  1034. }
  1035. .tag_min {
  1036. font-size: 16px;
  1037. font-family: Microsoft YaHei-3970(82674968);
  1038. font-weight: bold;
  1039. color: #000000;
  1040. line-height: 40px;
  1041. }
  1042. .box_card {
  1043. margin-top: 5px;
  1044. height: 160px;
  1045. }
  1046. .el-card__header {
  1047. padding: 10px 20px;
  1048. }
  1049. .font_size {
  1050. margin-top: 2px;
  1051. font-size: 15px;
  1052. font-weight: bold;
  1053. color: #707070;
  1054. }
  1055. .card_info {
  1056. margin-top: 18px;
  1057. font-size: 20px;
  1058. font-weight: bold;
  1059. color: #707070;
  1060. }
  1061. .content_style {
  1062. width: 340px;
  1063. height: 24px;
  1064. }
  1065. .pagination_smoke {
  1066. text-align: center;
  1067. }
  1068. .avatar-uploader-editor-voice {
  1069. display: inline-block;
  1070. }
  1071. .avatar {
  1072. margin-top: 5px;
  1073. width: 200px;
  1074. height: 12px;
  1075. display: block;
  1076. }
  1077. </style>