news.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. <template>
  2. <div class="content-box">
  3. <div class="left">
  4. <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
  5. <span class="cameratxt">消息通知</span>
  6. </div>
  7. <div class="middle">
  8. <div class="filter">
  9. <div class="condition">
  10. <span>创建时间 : </span>
  11. <el-date-picker
  12. v-model="searchInput.createTime"
  13. type="date"
  14. placeholder="请选择时间"
  15. format="YYYY-MM-DD"
  16. value-format="YYYY-MM-DD"
  17. />
  18. </div>
  19. <div class="condition">
  20. <span>状态 : </span>
  21. <el-select
  22. style="width: 120px"
  23. v-model="searchInput.state"
  24. class="m-2"
  25. placeholder="请选择状态"
  26. >
  27. <el-option label="全部" value="2" />
  28. <el-option label="已读" value="1" />
  29. <el-option label="未读" value="0" />
  30. </el-select>
  31. </div>
  32. <el-button
  33. style="margin-left: 20px"
  34. color="rgba(61, 81, 232, 1)"
  35. type="primary"
  36. class="search"
  37. @click="searchBtn"
  38. ><el-icon><Search /></el-icon> <span>搜索</span></el-button
  39. >
  40. </div>
  41. <!-- 按钮列表 -->
  42. <div class="gongneng">
  43. <el-button type="primary" color="rgba(61, 81, 232, 1)" @click="reset"
  44. ><el-icon><RefreshRight /></el-icon><span>刷新</span></el-button
  45. >
  46. <el-button type="danger" @click="allLook" color="rgba(61, 81, 232, 1)">
  47. <img
  48. src="@/assets/read.png"
  49. style="width: 14px; height: 14px; margin-right: 4px"
  50. alt=""
  51. />
  52. <span>一键已读</span></el-button
  53. >
  54. </div>
  55. <!-- 编辑/新增摄像头IP -->
  56. <el-dialog
  57. v-model="centerDialogVisible"
  58. :title="dialongTitle"
  59. width="40%"
  60. align-center
  61. :before-close="editClose"
  62. >
  63. <el-form
  64. ref="ruleFormRef"
  65. :model="ruleForm"
  66. :rules="rules"
  67. label-width="120px"
  68. class="demo-ruleForm"
  69. :size="formSize"
  70. status-icon
  71. >
  72. <el-form-item label="厂商" prop="count">
  73. <el-input v-model="ruleForm.count" placeholder="请输入厂商" />
  74. </el-form-item>
  75. <el-form-item label="IP地址" prop="name">
  76. <el-input v-model="ruleForm.name" placeholder="请输入IP地址" />
  77. </el-form-item>
  78. <el-form-item label="状态" prop="region">
  79. <el-select v-model="ruleForm.region" placeholder="请选择状态">
  80. <el-option label="在线" value="1" />
  81. <el-option label="离线" value="0" />
  82. </el-select>
  83. </el-form-item>
  84. <el-form-item
  85. label="创建人"
  86. prop="username"
  87. v-show="dialongTitle == '新增摄像头IP'"
  88. >
  89. <el-input
  90. v-model="ruleForm.username"
  91. placeholder="请输入创建人姓名"
  92. />
  93. </el-form-item>
  94. <el-form-item label="摄像头密码" prop="pass">
  95. <el-input v-model="ruleForm.pass" placeholder="请输入摄像头密码" />
  96. </el-form-item>
  97. <el-form-item
  98. label="最后更新人"
  99. prop="username"
  100. v-show="dialongTitle == '修改摄像头IP'"
  101. >
  102. <el-input
  103. v-model="ruleForm.username"
  104. placeholder="请输入更新人姓名"
  105. />
  106. </el-form-item>
  107. <el-form-item label="设备型号" prop="date1">
  108. <el-input v-model="ruleForm.date1" placeholder="请输入设备型号" />
  109. </el-form-item>
  110. <el-form-item label="协议" prop="types">
  111. <el-input
  112. v-model="ruleForm.types"
  113. placeholder="请输入协议"
  114. ></el-input>
  115. </el-form-item>
  116. <el-form-item label="安装位置" prop="date2">
  117. <el-input v-model="ruleForm.date2" placeholder="请输入安装位置" />
  118. </el-form-item>
  119. <el-form-item label="摄像机编码" prop="resource">
  120. <el-input
  121. v-model="ruleForm.resource"
  122. placeholder="请输入摄像机编码"
  123. >
  124. </el-input>
  125. </el-form-item>
  126. <el-form-item label="备注" prop="desc">
  127. <el-input
  128. v-model="ruleForm.desc"
  129. type="textarea"
  130. placeholder="请输入备注"
  131. />
  132. </el-form-item>
  133. <el-form-item>
  134. <el-button type="primary" @click="submitForm(ruleFormRef)">
  135. 确定
  136. </el-button>
  137. <el-button @click="resetForm(ruleFormRef)">重置</el-button>
  138. </el-form-item>
  139. </el-form>
  140. </el-dialog>
  141. </div>
  142. <div class="footer">
  143. <el-table
  144. :row-class-name="tableRowClassName"
  145. :data="tableData.list"
  146. @selection-change="handleSelectionChange"
  147. style="width: 100%"
  148. :header-cell-style="{
  149. background: 'rgba(240, 243, 247, 1)',
  150. height: '50px',
  151. border: 0,
  152. }"
  153. >
  154. <!-- <el-table-column align="center" type="selection" width="80" /> -->
  155. <el-table-column
  156. align="center"
  157. prop="create_time"
  158. label="创建时间"
  159. width="250"
  160. />
  161. <el-table-column align="center" prop="message" label="消息" />
  162. <el-table-column align="center" prop="state" label="状态" width="200">
  163. <template #default="scope">
  164. <div v-if="scope.row.state == 1">已读</div>
  165. <div v-else-if="scope.row.state == 0" style="color: red">未读</div>
  166. </template> </el-table-column
  167. >>
  168. <el-table-column align="center" label="操作" width="220">
  169. <template #default="scope">
  170. <el-button link type="primary" @click="look(scope.row)"
  171. ><div class="look">查看</div></el-button
  172. >
  173. </template>
  174. </el-table-column>
  175. </el-table>
  176. </div>
  177. <!-- 分页组件 -->
  178. <el-pagination
  179. background
  180. :current-page="currentPage"
  181. :page-size="pageSize"
  182. layout="total, prev, pager, next, jumper"
  183. :total="total"
  184. @update:current-page="handleCurrentChange"
  185. />
  186. </div>
  187. </template>
  188. <script setup>
  189. import { ref, reactive, nextTick, onBeforeMount, onUnmounted } from "vue";
  190. import { useRouter } from "vue-router";
  191. import { ElMessage, ElMessageBox } from "element-plus";
  192. import vidiconsApi from "@/api/vidicons.js";
  193. import { dayjs } from "element-plus";
  194. import lodash from "lodash";
  195. import axios from "axios";
  196. import { useStore } from "vuex";
  197. const store = useStore();
  198. const api = ref("");
  199. const router = useRouter();
  200. // 表格数据
  201. const tableData = reactive({ list: [] });
  202. const activeIndex = ref(); // 默认跳转路由
  203. const dialongTitle = ref(""); // 弹窗标题
  204. const searchInput = reactive({
  205. state: "全部",
  206. createTime: "",
  207. }); // 搜索按钮数据
  208. 5;
  209. const currentPage = ref(1); // 当前页
  210. const pageSize = ref(10);
  211. const total = ref(10); // 当前总数
  212. const selectData = reactive({ list: [] }); // 多选框选择的数据
  213. const centerDialogVisible = ref(false); // 控制新增或修改弹窗开关
  214. const videoDialogVisible = ref(false); // 控制播放弹窗开关
  215. const urlLink = ref(); // 输出链接
  216. // 表单数据
  217. const formSize = ref("default");
  218. const ruleFormRef = ref();
  219. const ruleForm = reactive({
  220. name: "",
  221. region: "",
  222. count: "",
  223. date1: "",
  224. date2: "",
  225. types: [],
  226. resource: "",
  227. desc: "",
  228. username: "",
  229. pass: "",
  230. id: "",
  231. });
  232. // 表单验证
  233. const rules = reactive({
  234. region: [
  235. {
  236. required: true,
  237. message: "状态不能为空",
  238. trigger: "blur",
  239. },
  240. ],
  241. name: [
  242. { required: true, message: "IP地址不能为空", trigger: "blur" },
  243. // { min: 3, max: 5, message: "Length should be 3 to 5", trigger: "blur" },
  244. ],
  245. count: [
  246. {
  247. required: true,
  248. message: "厂商不能为空",
  249. trigger: "blur",
  250. },
  251. ],
  252. date1: [
  253. {
  254. required: true,
  255. message: "设备型号不能为空",
  256. trigger: "blur",
  257. },
  258. ],
  259. date2: [
  260. {
  261. required: true,
  262. message: "安装位置不能为空",
  263. trigger: "blur",
  264. },
  265. ],
  266. types: [
  267. {
  268. required: true,
  269. message: "协议不能为空",
  270. trigger: "blur",
  271. },
  272. ],
  273. username: [
  274. {
  275. required: true,
  276. message: "更新人员姓名不能为空",
  277. trigger: "blur",
  278. },
  279. ],
  280. pass: [
  281. {
  282. required: true,
  283. message: "密码不能为空",
  284. trigger: "blur",
  285. },
  286. ],
  287. resource: [
  288. {
  289. required: true,
  290. message: "摄像机编码不能为空",
  291. trigger: "blur",
  292. },
  293. ],
  294. // desc: [{ required: true, message: "Please input activity form", trigger: "blur" }],
  295. });
  296. // 获取摄像头列表
  297. const getList = async () => {
  298. let data = new FormData();
  299. console.log(searchInput.state === 0);
  300. data.set("create_time", searchInput.createTime);
  301. if (searchInput.state == 2 || searchInput.state == "全部") {
  302. } else {
  303. data.set("state", searchInput.state);
  304. }
  305. data.set("page", currentPage.value);
  306. data.set("rows", pageSize.value); //前面的key记得对应!
  307. let res = await axios({
  308. method: "post",
  309. url: api.value + "/carBook/userqueryMes.action",
  310. headers: {
  311. token: sessionStorage.getItem("token"),
  312. },
  313. data: data,
  314. });
  315. console.log(res);
  316. if (res.status == 200) {
  317. tableData.list = res.data.rows;
  318. if (res.data.currentPage) {
  319. currentPage.value = res.data.currentPage;
  320. } else {
  321. currentPage.value = 1;
  322. }
  323. if (tableData.list) {
  324. let newsArr = tableData.list.filter((item) => {
  325. return item.state == 0;
  326. });
  327. console.log(newsArr.length);
  328. sessionStorage.setItem("newsNum", newsArr.length);
  329. } else {
  330. sessionStorage.setItem("newsNum", 0);
  331. }
  332. total.value = res.data.total;
  333. } else {
  334. tableData.list = res.data.rows;
  335. currentPage.value = 1;
  336. total.value = res.data.total;
  337. ElMessage({
  338. type: "error",
  339. showClose: true,
  340. message: res.data.message,
  341. center: true,
  342. });
  343. if (res.data.message == "token错误") {
  344. router.push({
  345. path: `/login`,
  346. });
  347. }
  348. }
  349. };
  350. // 刷新
  351. const reset = async () => {
  352. searchInput.state = "全部";
  353. searchInput.createTime = "";
  354. let data = new FormData();
  355. console.log(searchInput.state === 0);
  356. data.set("page", currentPage.value);
  357. data.set("rows", pageSize.value); //前面的key记得对应!
  358. let res = await axios({
  359. method: "post",
  360. url: api.value + "/carBook/userqueryMes.action",
  361. headers: {
  362. token: sessionStorage.getItem("token"),
  363. },
  364. data: data,
  365. });
  366. console.log(res);
  367. if (res.status == 200) {
  368. tableData.list = res.data.rows;
  369. if (res.data.currentPage) {
  370. currentPage.value = res.data.currentPage;
  371. } else {
  372. currentPage.value = 1;
  373. }
  374. if (tableData.list) {
  375. let newsArr = tableData.list.filter((item) => {
  376. return item.state == 0;
  377. });
  378. console.log(newsArr.length);
  379. sessionStorage.setItem("newsNum", newsArr.length);
  380. } else {
  381. sessionStorage.setItem("newsNum", 0);
  382. }
  383. total.value = res.data.total;
  384. } else {
  385. tableData.list = res.data.rows;
  386. currentPage.value = 1;
  387. total.value = res.data.total;
  388. ElMessage({
  389. type: "error",
  390. showClose: true,
  391. message: res.data.message,
  392. center: true,
  393. });
  394. if (res.data.message == "token错误") {
  395. router.push({
  396. path: `/login`,
  397. });
  398. }
  399. }
  400. };
  401. // 路由
  402. const handleSelect = (key, keyPath) => {};
  403. // 搜索功能
  404. const searchBtn = lodash.debounce(async () => {
  405. getList();
  406. }, 300);
  407. // 查看按钮
  408. const look = async (row) => {
  409. let data = new FormData();
  410. data.set("id", row.id);
  411. let res = await axios({
  412. method: "post",
  413. url: api.value + "/carBook/userupdateMesState.action",
  414. headers: {
  415. token: sessionStorage.getItem("token"),
  416. },
  417. data: data,
  418. });
  419. console.log(res);
  420. if (res.status == 200) {
  421. } else {
  422. ElMessage({
  423. type: "error",
  424. showClose: true,
  425. message: res.data.message,
  426. center: true,
  427. });
  428. }
  429. };
  430. // 查看按钮
  431. const allLook = async (row) => {
  432. let data = new FormData();
  433. let res = await axios({
  434. method: "post",
  435. url: api.value + "/carBook/userupdateAllMesState.action",
  436. headers: {
  437. token: sessionStorage.getItem("token"),
  438. },
  439. data: data,
  440. });
  441. console.log(res);
  442. if (res.status == 200) {
  443. } else {
  444. ElMessage({
  445. type: "error",
  446. showClose: true,
  447. message: res.data.message,
  448. center: true,
  449. });
  450. }
  451. };
  452. // 多选框功能
  453. const handleSelectionChange = (val) => {
  454. console.log(val);
  455. selectData.list = val;
  456. };
  457. // 表格斑马纹颜色修改
  458. const tableRowClassName = ({ row, rowIndex }) => {
  459. if (rowIndex % 2 === 0) {
  460. return "even";
  461. } else if (rowIndex % 2 !== 0) {
  462. return "odd";
  463. }
  464. return "";
  465. };
  466. // 分页
  467. const handleCurrentChange = (value) => {};
  468. onBeforeMount(() => {
  469. api.value = store.state.user.api;
  470. getList();
  471. });
  472. onUnmounted(() => {
  473. // document.removeEventListener("keyup", Enters);
  474. });
  475. </script>
  476. <style scoped lang="scss">
  477. .content-box {
  478. width: 97.5%;
  479. height: 89%;
  480. margin: 20px auto;
  481. background-color: #fff;
  482. color: #fff;
  483. display: flex;
  484. flex-direction: column;
  485. .left {
  486. // width: calc(100wh - 40px);
  487. display: flex;
  488. align-items: center;
  489. height: 60px;
  490. margin: 0 30px;
  491. border-bottom: 1px solid #ccc;
  492. color: #000;
  493. font-size: 18px;
  494. font-weight: 600;
  495. .camera {
  496. margin-right: 15px;
  497. color: #4392f7;
  498. }
  499. }
  500. .middle {
  501. width: 96%;
  502. margin: 0 auto;
  503. color: #000;
  504. // border-bottom: 1px solid rgb(231, 231, 231);
  505. .filter {
  506. display: flex;
  507. flex-wrap: wrap;
  508. align-items: center;
  509. margin: 10px 0 0 0;
  510. .condition {
  511. display: flex;
  512. align-items: center;
  513. margin: 10px 30px 10px 0;
  514. span {
  515. margin: 0 10px 0 0;
  516. }
  517. }
  518. }
  519. .gongneng {
  520. margin: 10px 0;
  521. }
  522. :deep(.cont) {
  523. width: 60%;
  524. margin: 20px auto;
  525. }
  526. :deep(.download) {
  527. display: flex;
  528. align-items: center;
  529. margin: 10px;
  530. }
  531. :deep(.download span) {
  532. font-size: 16px;
  533. margin-left: 20px;
  534. }
  535. :deep(.cont .el-button) {
  536. margin-left: 60px;
  537. margin-bottom: 30px;
  538. }
  539. :deep(.cont .accomplish) {
  540. width: 100%;
  541. display: flex;
  542. justify-content: center;
  543. }
  544. :deep(.cont .accomplish .el-button) {
  545. width: 50%;
  546. margin: 0;
  547. }
  548. }
  549. .footer {
  550. width: 96%;
  551. height: 550px;
  552. margin: 10px auto 30px;
  553. .el-table--fit {
  554. height: 100%;
  555. :deep(.el-table__header-wrapper) {
  556. background-color: #000;
  557. }
  558. :deep(.el-table__row) {
  559. height: 50px;
  560. }
  561. :deep(.el-table__row td) {
  562. padding: 0;
  563. border: 0;
  564. }
  565. .el-button--primary {
  566. margin-left: 5px;
  567. }
  568. :deep(.el-table__body .even) {
  569. background-color: #fff;
  570. }
  571. :deep(.el-table__body .odd) {
  572. background-color: rgba(240, 243, 247, 1);
  573. }
  574. :deep(.look) {
  575. padding: 5px 14px;
  576. border-radius: 45px;
  577. border: 0.74px solid rgba(30, 125, 251, 1);
  578. }
  579. }
  580. }
  581. .el-pagination {
  582. // width: 1600px;
  583. width: 96%;
  584. margin: 0 auto 18px;
  585. justify-content: flex-end;
  586. :deep(.el-pagination__total) {
  587. color: #000;
  588. }
  589. :deep(.el-pagination__goto) {
  590. color: #000;
  591. }
  592. :deep(.el-pagination__classifier) {
  593. color: #000;
  594. }
  595. :deep(.el-input__wrapper) {
  596. border: 1px solid rgba(0, 0, 0, 1);
  597. border-radius: 5px;
  598. box-shadow: none;
  599. }
  600. :deep(.el-pager li) {
  601. margin: 0 5px;
  602. border: 1px solid rgba(0, 0, 0, 1);
  603. border-radius: 5px;
  604. background-color: transparent;
  605. }
  606. :deep(.el-pager li.is-active) {
  607. background-color: rgba(30, 125, 251, 1);
  608. }
  609. :deep(.btn-prev) {
  610. margin-right: 5px;
  611. border: 1px solid rgba(0, 0, 0, 1);
  612. border-radius: 5px;
  613. background-color: transparent;
  614. }
  615. :deep(.btn-next) {
  616. margin-left: 5px;
  617. border: 1px solid rgba(0, 0, 0, 1);
  618. border-radius: 5px;
  619. background-color: transparent;
  620. }
  621. }
  622. }
  623. .el-input {
  624. width: 192px;
  625. }
  626. </style>