平安校园
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

788 行
19 KiB

  1. <template>
  2. <view class="warningBox">
  3. <!-- 头部背景 -->
  4. <view class="headerBox">
  5. <!-- <view class="">
  6. <image src="@/static/image/earlyWarning/back.png" mode="aspectFill"></image>
  7. </view> -->
  8. <view class="logo">
  9. <image :src="logo" mode="heightFix"></image>
  10. </view>
  11. <view class="logoTitle">
  12. {{title}}
  13. </view>
  14. </view>
  15. <view class="contentBox">
  16. <view class="warningInfo">
  17. <view class="searchBox">
  18. <view class="searchLine" @click="openSearch">
  19. <view class="searchLabels">
  20. <image v-show="isShowSearch==false" src="@/static/image/earlyWarning/screen.png" mode="">
  21. </image>
  22. <image v-show="isShowSearch" src="@/static/image/earlyWarning/screenActive.png" mode="">
  23. </image>
  24. <text class="labels">筛选</text>
  25. <view class="values">{{searchValue}}</view>
  26. </view>
  27. <view class="arrow">
  28. <image v-show="isShowSearch==false" src="@/static/image/earlyWarning/arrow1.png" mode="">
  29. </image>
  30. <image v-show="isShowSearch" src="@/static/image/earlyWarning/arrow2.png" mode=""></image>
  31. </view>
  32. </view>
  33. <view @click="isShowSearch=false" class="searchDialog" v-if="isShowSearch">
  34. <view class="content" @click.stop="isSelect">
  35. <u-row justify="space-between" gutter="10">
  36. <u-col span="7">
  37. <view class="demo-layout" @click="toOpen">
  38. <view class="left-layout">
  39. <text>{{searchForm.$alarmType || '预警类型'}}</text>
  40. </view>
  41. <view class="right-layout">
  42. <image style="width: 30rpx;height:30rpx;"
  43. src="@/static/image/earlyWarning/arrowRight.png" mode=""></image>
  44. </view>
  45. </view>
  46. </u-col>
  47. <u-col span="5">
  48. <view class="demo-layout" @click="toOpenSelect">
  49. <view class="left-layout">
  50. <text>{{searchForm.$warnHand || '处理状态'}}</text>
  51. </view>
  52. <view class="right-layout">
  53. <image style="width: 30rpx;height:30rpx;"
  54. src="@/static/image/earlyWarning/arrowRight.png" mode=""></image>
  55. </view>
  56. </view>
  57. </u-col>
  58. </u-row>
  59. <u-row style="margin-top:10px;" justify="space-between" gutter="10">
  60. <u-col span="12">
  61. <view class="demo-layout" @click="toOpenmanjor">
  62. <view class="left-layout">
  63. <text>{{searchForm.$cameraId || '预警摄像头'}}</text>
  64. </view>
  65. <view class="right-layout">
  66. <image style="width: 30rpx;height:30rpx;"
  67. src="@/static/image/earlyWarning/arrowRight.png" mode=""></image>
  68. </view>
  69. </view>
  70. </u-col>
  71. </u-row>
  72. <u-row style="margin-top:10px;" justify="space-between" gutter="10">
  73. <u-col span="12">
  74. <uni-datetime-picker v-model="searchForm.tick" type="datetimerange">
  75. <view class="demo-layout">
  76. <view class="startBox">
  77. {{searchForm.StartTick || '开始时间'}}
  78. </view>
  79. <text>至</text>
  80. <view class="endBox">
  81. {{searchForm.EndTick || '结束时间'}}
  82. </view>
  83. <view class="timeIcon">
  84. <image style="width: 30rpx;height:30rpx;"
  85. src="@/static/image/earlyWarning/calendar.png" mode=""></image>
  86. </view>
  87. </view>
  88. </uni-datetime-picker>
  89. </u-col>
  90. </u-row>
  91. <view class="btnBox">
  92. <view class="leftBtn" @click="clearform">
  93. 重置
  94. </view>
  95. <view class="rightBtn" @click="onsubmit">
  96. 确认
  97. </view>
  98. </view>
  99. </view>
  100. </view>
  101. </view>
  102. <view class="tableBox">
  103. <u-empty marginTop="100rpx" :show="warnList.length == 0&&status == 'nomore'" mode="list"
  104. text="暂无数据"></u-empty>
  105. <!-- <u-pull-refresh :refreshing="refreshing" @refresh="onRefresh"> -->
  106. <!-- <scroll-view class="scroll-view" scroll-y="true" refresher-enabled="true"
  107. @refresher-pull="onRefresh" @refresher-refresh="doRefresh" @refresher-restore="restore"
  108. @refresher-abort="abort"> -->
  109. <u-list :loading="isLoading" refresher-enabled :refresher-triggered="isTriggered"
  110. @refresher-pull="onRefresh" @scrolltolower="scrolltolower" style="height: calc(100% - 0rpx);">
  111. <u-list-item v-for="(item, index) in warnList" :key="index">
  112. <view class="liBox">
  113. <view class="headerCard">
  114. <view class="schoolName">
  115. 演示学校
  116. </view>
  117. <view class="statusBox" :class="[item.warnHand == 1?'handle':'nohandle']">
  118. {{item.warnHand == 1 ? '已处理' : '未处理'}}
  119. </view>
  120. </view>
  121. <view class="topCard">
  122. <view class="pic">
  123. <image :src="item.snapshotUrl" mode="aspectFill"
  124. @click="previewImage(item.snapshotUrl,index)"></image>
  125. </view>
  126. <view class="rightCard">
  127. <u-row>
  128. <u-col span="6">
  129. <view class="midContent">
  130. 姓名:--
  131. </view>
  132. </u-col>
  133. <u-col span="6">
  134. <view class="midContent">
  135. 系部:--
  136. </view>
  137. </u-col>
  138. </u-row>
  139. <u-row style="margin-top: 20rpx;">
  140. <u-col span="6">
  141. <view class="midContent">
  142. 专业:--
  143. </view>
  144. </u-col>
  145. <u-col span="6">
  146. <view class="midContent">
  147. 班级:{{item.personSetName || '--'}}
  148. </view>
  149. </u-col>
  150. </u-row>
  151. </view>
  152. </view>
  153. <view class="midCard">
  154. <view class="secondCard">
  155. <image style="width: 30rpx;height: 30rpx;"
  156. src="@/static/image/earlyWarning/warnType.png" mode=""></image>
  157. <view class="txt">
  158. 预警类型:{{item.alarmTypeDesc || '--'}}
  159. </view>
  160. </view>
  161. <view class="thirdCard">
  162. <image style="width: 30rpx;height: 30rpx;"
  163. src="@/static/image/earlyWarning/warnVideo.png" mode=""></image>
  164. <view class="txt">
  165. 预警摄像头:{{item.cameraName || '--'}}
  166. </view>
  167. </view>
  168. </view>
  169. <view class="btoCard">
  170. <view class="btoContent">
  171. 时间:{{item.tick}}
  172. </view>
  173. <view class="rightBox btoBox" @click="toDetail(item)">
  174. <view class="txt">
  175. 查看
  176. </view>
  177. </view>
  178. </view>
  179. </view>
  180. </u-list-item>
  181. <u-loadmore :status="status" />
  182. </u-list>
  183. <!-- </scroll-view> -->
  184. <!-- </u-pull-refresh> -->
  185. </view>
  186. <selectSearch ref="selectSearchBox" :cellVisible="false" v-model="searchForm.alarmType"
  187. :options="warnOption" :title.sync="searchForm.$alarmType" placeholder="预警类型"
  188. search-placeholder="预警类型" />
  189. <selectSearch ref="selectmanjorBox" :cellVisible="false" v-model="searchForm.cameraId"
  190. :options="[{value:'',label:'全部'},...allOptions.monitorList]" :title.sync="searchForm.$cameraId" placeholder="预警摄像头"
  191. search-placeholder="预警摄像头" />
  192. <selectRadio ref="selectRadioBox" :cellVisible="false" v-model="searchForm.warnHand"
  193. :options="handOption" :title.sync="searchForm.$warnHand" placeholder="处理状态" />
  194. </view>
  195. </view>
  196. </view>
  197. </template>
  198. <script>
  199. import selectRadio from "@/components/selectRadio.vue"
  200. import selectSearch from "@/components/selectSearch.vue"
  201. import {
  202. page, //获取列表
  203. warnType, //获取预警类型
  204. } from '@/api/warn/index.js'
  205. export default {
  206. components: {
  207. selectRadio,
  208. selectSearch
  209. },
  210. data() {
  211. return {
  212. title: '',
  213. logo: '',
  214. searchValue: '全部',
  215. isShowSearch: false,
  216. isTriggered: true,
  217. searchForm: {
  218. alarmType: '',
  219. $alarmType: '全部',
  220. warnHand: '',
  221. $warnHand: '',
  222. cameraId: '',
  223. $cameraId: '',
  224. tick: [],
  225. StartTick: '',
  226. EndTick: '',
  227. pageNum: 1,
  228. pageSize: 10
  229. },
  230. warnOption: [{
  231. label: '全部',
  232. value: ''
  233. }],
  234. creamaData: [],
  235. handOption: [{
  236. label: '已处理',
  237. value: 1
  238. },
  239. {
  240. label: '未处理',
  241. value: 0
  242. },
  243. ],
  244. warnList: [],
  245. isLoading: false,
  246. finished: false,
  247. refreshing: false,
  248. status: 'loadmore', //loading正在加载 loadmore加载更多 nomore没有更多了
  249. }
  250. },
  251. watch: {
  252. "searchForm.tick"() {
  253. console.log('日期时间:', this.searchForm.tick);
  254. if (this.searchForm.tick && this.searchForm.tick.length > 0) {
  255. this.searchForm.StartTick = this.searchForm.tick[0]
  256. this.searchForm.EndTick = this.searchForm.tick[1]
  257. }
  258. },
  259. },
  260. onLoad() {
  261. // console.log(this.sysInfo,111)
  262. // 获取logo和平台名称
  263. let titleObj = this.sysInfo.find(e=>e.configKey == 'SYS_NAME')
  264. if(titleObj)this.title = titleObj.configValue
  265. let logoObj = this.sysInfo.find(e=>e.configKey == 'SYS_LOGO')
  266. if(logoObj)this.logo = logoObj.configValue
  267. // 获取预警类型
  268. this.getWarnTypeList()
  269. // 隐藏导航栏
  270. this.loadmore()
  271. },
  272. onPullDownRefresh() {
  273. uni.stopPullDownRefresh()
  274. this.status = 'loadmore'
  275. this.searchForm.pageNum = 1;
  276. this.warnList = []
  277. this.loadmore()
  278. },
  279. methods: {
  280. selectChange(e) {
  281. console.log(e, 2323)
  282. },
  283. // 预览图片
  284. previewImage(url, index) {
  285. // 使用uni.previewImage API 进行图片预览
  286. uni.previewImage({
  287. current: index, // 当前显示图片索引
  288. urls: [url] // 需要预览的图片链接列表
  289. });
  290. },
  291. clearform() {
  292. this.searchForm = {
  293. alarmType: '',
  294. $alarmType: '全部',
  295. warnHand: '',
  296. $warnHand: '',
  297. cameraId: '',
  298. $cameraId: '',
  299. tick: [],
  300. StartTick: '',
  301. EndTick: '',
  302. pageNum: 1,
  303. pageSize: 10
  304. }
  305. // this.isShowSearch = false;
  306. },
  307. onsubmit() {
  308. let arr = []
  309. for (let key in this.searchForm) {
  310. if (['$alarmType','$cameraId', '$warnHand', 'StartTick', 'EndTick'].includes(key)) {
  311. if (Object.hasOwnProperty.call(this.searchForm, key) && this.searchForm[key]) {
  312. arr.push(this.searchForm[key])
  313. }
  314. }
  315. }
  316. this.searchValue = arr.join(',');
  317. this.isShowSearch = false;
  318. this.status = 'loadmore'
  319. this.searchForm.pageNum = 1;
  320. this.warnList = []
  321. this.loadmore()
  322. },
  323. // 获取预警类型
  324. getWarnTypeList() {
  325. warnType({}).then(res => {
  326. let {
  327. code,
  328. data
  329. } = res;
  330. if (code == 200) {
  331. let arr = data.map(item => {
  332. return {
  333. label: item.name,
  334. value: item.code
  335. };
  336. })
  337. this.warnOption = [...this.warnOption, ...arr]
  338. // this.warnOption.unshift({
  339. // label: '全部',
  340. // value: ''
  341. // })
  342. }
  343. });
  344. },
  345. // 获取摄像头
  346. // creamaData
  347. // 跳转详情页面
  348. toDetail(row) {
  349. uni.navigateTo({
  350. url: '/pages/earlyWarning/detail?id=' + row.id
  351. });
  352. },
  353. // 预警类型弹框筛选
  354. toOpen() {
  355. this.$refs.selectSearchBox.show = true;
  356. },
  357. // 预警摄像头弹框筛选
  358. toOpenmanjor() {
  359. this.$refs.selectmanjorBox.show = true;
  360. },
  361. // 处理情况筛选
  362. toOpenSelect() {
  363. this.$refs.selectRadioBox.show = true;
  364. },
  365. // 打开筛选框
  366. openSearch() {
  367. this.isShowSearch = !this.isShowSearch;
  368. },
  369. isSelect() {
  370. },
  371. scrolltolower() {
  372. if (this.status == 'loading' || this.status == 'nomore') {
  373. return;
  374. }
  375. this.searchForm.pageNum += 1;
  376. this.loadmore()
  377. },
  378. loadmore() {
  379. if (this.status != 'loadmore') return
  380. this.status = 'loading'
  381. this.isLoading = true;
  382. delete this.searchForm.tick
  383. page(this.searchForm).then(res => {
  384. if (res?.code === 200) {
  385. this.warnList = [...this.warnList, ...res?.data?.list];
  386. this.isLoading = false;
  387. // 获取到的总条数>=接口总条数
  388. if (this.warnList.length >= res.data.total) {
  389. this.status = 'nomore'
  390. } else {
  391. this.status = 'loadmore'
  392. }
  393. }
  394. })
  395. }
  396. }
  397. }
  398. </script>
  399. <style lang="scss" scoped>
  400. .warningBox {
  401. height: 100%;
  402. .headerBox {
  403. /*#ifdef H5*/
  404. height: 272rpx;
  405. background: url("@/static/image/earlyWarning/logoBack.png") no-repeat center center / cover;
  406. /*#endif*/
  407. /*#ifdef APP-PLUS || MP-ALIPAY || MP-WEIXIN*/
  408. height: 340rpx;
  409. background: url("@/static/image/earlyWarning/back.png") no-repeat center center / cover;
  410. /*#endif*/
  411. position: relative;
  412. image {
  413. width: 100%;
  414. height: 100%;
  415. }
  416. .logo {
  417. image {
  418. height: 46rpx;
  419. }
  420. image {
  421. height: 46rpx;
  422. }
  423. position: absolute;
  424. left: 36rpx;
  425. /*#ifdef H5*/
  426. top: 55rpx;
  427. /*#endif*/
  428. /*#ifdef APP-PLUS || MP-ALIPAY || MP-WEIXIN*/
  429. top: 110rpx;
  430. /*#endif*/
  431. }
  432. .logoTitle {
  433. position: absolute;
  434. left: 36rpx;
  435. /*#ifdef H5*/
  436. top: 150rpx;
  437. /*#endif*/
  438. /*#ifdef APP-PLUS || MP-ALIPAY || MP-WEIXIN*/
  439. top: 170rpx;
  440. /*#endif*/
  441. font-family: 'Alimama ShuHeiTi';
  442. font-weight: 700;
  443. color: #2388FF;
  444. font-size: 50rpx;
  445. letter-spacing: 6%;
  446. text-shadow: #fff 1px 0 0,#fff 0 1px 0,#fff -1px 0 0, #fff 0 -1px 0;
  447. }
  448. }
  449. .contentBox {
  450. /*#ifdef H5*/
  451. height: calc(100% - 303rpx);
  452. /*#endif*/
  453. /*#ifdef APP-PLUS || MP-ALIPAY || MP-WEIXIN*/
  454. height: calc(100% - 375rpx);
  455. /*#endif*/
  456. .warningInfo {
  457. width: 100%;
  458. height: 100%;
  459. background: #F6F8FA;
  460. .u-modal__title {
  461. color: #000000;
  462. }
  463. }
  464. .searchBox {
  465. // height: calc(100% - 360rpx);
  466. position: relative;
  467. .searchLine {
  468. height: 88rpx;
  469. display: flex;
  470. align-items: center;
  471. justify-content: space-between;
  472. padding: 0 15px;
  473. box-sizing: border-box;
  474. background: #fff;
  475. font-size: 28rpx;
  476. .searchLabels {
  477. display: flex;
  478. align-items: center;
  479. width: calc(100% - 34rpx);
  480. image {
  481. width: 40rpx;
  482. height: 40rpx;
  483. flex-shrink: 1;
  484. }
  485. .labels {
  486. width: 70rpx;
  487. display: block;
  488. color: #333333;
  489. margin-left: 10rpx;
  490. flex-shrink: 1;
  491. }
  492. .values {
  493. width: calc(100% - 40rpx - 50rpx);
  494. color: #2388FF;
  495. font-weight: 700;
  496. margin-left: 18rpx;
  497. overflow: hidden;
  498. word-wrap: break-word;
  499. white-space: pre-wrap;
  500. display: -webkit-box;
  501. -webkit-box-orient: vertical;
  502. -webkit-line-clamp: 1;
  503. }
  504. }
  505. .arrow {
  506. // text-align: right;
  507. // flex-shrink: 1;
  508. image {
  509. width: 34rpx;
  510. height: 34rpx;
  511. }
  512. }
  513. .leftSearchBox {
  514. display: flex;
  515. align-items: center;
  516. width: calc(100% - 40px);
  517. .searchLabel {
  518. flex-shrink: 1;
  519. color: #333333;
  520. width: 80px;
  521. }
  522. .searchValue {
  523. width: calc(100% - 60px);
  524. margin-left: 10px;
  525. color: #2388FF;
  526. overflow: hidden;
  527. word-wrap: break-word;
  528. white-space: pre-wrap;
  529. display: -webkit-box;
  530. -webkit-box-orient: vertical;
  531. -webkit-line-clamp: 1;
  532. }
  533. }
  534. }
  535. .searchDialog {
  536. position: absolute;
  537. z-index: 990;
  538. top: 89rpx;
  539. width: 100%;
  540. height: calc(100vh - 375rpx - 60rpx);
  541. font-size: 26rpx;
  542. background: rgba(0, 0, 0, 0.2);
  543. .content {
  544. background: #FFFFFF;
  545. padding: 15px;
  546. box-sizing: border-box;
  547. border-top: 1px solid rgba(0, 0, 0, 0.1);
  548. .demo-layout {
  549. height: 80rpx;
  550. border-radius: 8rpx;
  551. background: #F5F5F5;
  552. display: flex;
  553. justify-content: space-between;
  554. align-items: center;
  555. padding: 0 10px;
  556. box-sizing: border-box;
  557. .left-layout {
  558. color: #777777;
  559. }
  560. .right-layout {}
  561. .startBox {
  562. color: #777777;
  563. }
  564. text {
  565. color: #777777;
  566. }
  567. .endBox {
  568. color: #777777;
  569. }
  570. .timeIcon {}
  571. }
  572. }
  573. .btnBox {
  574. display: flex;
  575. align-items: center;
  576. margin-top: 15px;
  577. .leftBtn {
  578. width: 50%;
  579. height: 74rpx;
  580. line-height: 74rpx;
  581. border: 1px solid #ccc;
  582. border-radius: 12rpx;
  583. color: #333333;
  584. text-align: center;
  585. }
  586. .rightBtn {
  587. width: 50%;
  588. height: 74rpx;
  589. line-height: 74rpx;
  590. border: 1px solid #2388FF;
  591. border-radius: 12rpx;
  592. color: #fff;
  593. text-align: center;
  594. background: #2388FF;
  595. margin-left: 15rpx;
  596. }
  597. }
  598. }
  599. }
  600. .tableBox {
  601. height: 100%;
  602. padding: 30rpx;
  603. box-sizing: border-box;
  604. // height: 600px;
  605. padding-bottom: 30px;
  606. .liBox {
  607. background: #fff;
  608. padding: 0 30rpx;
  609. box-sizing: border-box;
  610. border-radius: 20rpx;
  611. margin-bottom: 30rpx;
  612. font-family: 'PingFang SC';
  613. .headerCard {
  614. display: flex;
  615. justify-content: space-between;
  616. align-items: center;
  617. padding: 24rpx 0;
  618. .schoolName {
  619. font-size: 32rpx;
  620. font-weight: 700;
  621. font-family: 'PingFang SC';
  622. color: #333333;
  623. overflow: hidden;
  624. word-wrap: break-word;
  625. white-space: pre-wrap;
  626. // font-size: 14px;
  627. display: -webkit-box;
  628. -webkit-box-orient: vertical;
  629. -webkit-line-clamp: 1;
  630. }
  631. .statusBox {
  632. width: 100rpx;
  633. flex-shrink: 1;
  634. text-align: center;
  635. font-size: 24rpx;
  636. border-radius: 8rpx;
  637. color: #fff;
  638. padding: 8rpx 12rpx;
  639. font-family: 'PingFang SC';
  640. }
  641. .handle {
  642. background: rgba(15, 175, 118, 0.1);
  643. color: #0FAF76;
  644. }
  645. .nohandle {
  646. background: rgba(239, 45, 45, 0.1);
  647. color: rgba(239, 45, 45, 1);
  648. }
  649. }
  650. .topCard {
  651. display: flex;
  652. border-top: 1px solid rgba(0, 0, 0, 0.1);
  653. align-items: center;
  654. padding: 20rpx 0;
  655. .pic {
  656. width: 120rpx;
  657. height: 120rpx;
  658. image {
  659. width: 120rpx;
  660. height: 120rpx;
  661. border-radius: 4px;
  662. }
  663. }
  664. .rightCard {
  665. margin-left: 20rpx;
  666. font-size: 26rpx;
  667. font-family: 'PingFang SC';
  668. width: calc(100% - 140rpx);
  669. }
  670. }
  671. .midCard {
  672. font-size: 26rpx;
  673. .secondCard,
  674. .thirdCard {
  675. display: flex;
  676. align-items: center;
  677. .txt {
  678. font-size: 26rpx;
  679. font-family: 'PingFang SC';
  680. margin-left: 10rpx;
  681. color: #333333;
  682. }
  683. }
  684. .thirdCard {
  685. margin-top: 18rpx;
  686. }
  687. }
  688. .btoCard {
  689. border-top: 1px solid rgba(0, 0, 0, 0.1);
  690. margin-top: 20rpx;
  691. padding: 20rpx 0;
  692. display: flex;
  693. justify-content: space-between;
  694. align-items: center;
  695. font-size: 26rpx;
  696. font-family: 'PingFang SC';
  697. .rightBox {
  698. .txt {
  699. width: 120rpx;
  700. height: 60rpx;
  701. line-height: 60rpx;
  702. font-family: 'PingFang SC';
  703. text-align: center;
  704. background: #2388FF;
  705. color: #fff;
  706. border-radius: 80rpx;
  707. }
  708. }
  709. }
  710. }
  711. }
  712. }
  713. }
  714. </style>