【前端】智能库房综合管理系统前端项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

487 lines
16 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. <template>
  2. <div>
  3. <div class="head-container">
  4. <el-button class="iconfont icon-fabu-fanbai" size="mini" @click="handleSend">发布</el-button>
  5. <el-button icon="el-icon-edit" size="mini" :disabled="!(selections.length === 1)" @click="handleEdit">修改</el-button>
  6. <el-button icon="el-icon-delete" size="mini" :disabled="!selections.length" @click="handleDel">删除</el-button>
  7. </div>
  8. <div class="app-container container-wrap">
  9. <span class="right-top-line" />
  10. <span class="left-bottom-line" />
  11. <!--表格渲染-->
  12. <!-- :cell-class-name="cell"
  13. @selection-change="selectionChangeHandler"
  14. -->
  15. <el-table
  16. ref="table"
  17. :data="tableData"
  18. style="width: 100%;"
  19. height="calc(100vh - 294px)"
  20. @row-click="clickRowHandler"
  21. @selection-change="selectionChangeHandler"
  22. >
  23. <el-table-column type="selection" width="55" align="center" />
  24. <el-table-column type="index" label="序号" width="100" align="center" />
  25. <el-table-column prop="noticeContent" :show-overflow-tooltip="true" label="通知内容" min-width="200" align="center" />
  26. <el-table-column prop="noticeType" label="消息类型" align="center" min-width="150" />
  27. <el-table-column prop="pushTo" label="推送对象" align="center" min-width="150" />
  28. <el-table-column prop="update_by" label="推送人" align="center" min-width="150" />
  29. <el-table-column prop="create_time" label="推送时间" align="center" min-width="180">
  30. <template slot-scope="scope">
  31. <div>{{ scope.row.create_time | parseTime }}</div>
  32. </template>
  33. </el-table-column>
  34. <!-- <el-table-column prop="bindState" label="绑定状态" align="center">
  35. <template slot-scope="scope">
  36. <span class="clear" style="width:76px">{{ scope.row.bindState }}</span>
  37. </template>
  38. </el-table-column> -->
  39. </el-table>
  40. <!-- <pagination /> -->
  41. <el-pagination
  42. :page-size.sync="page.size"
  43. :total="page.total"
  44. :current-page.sync="page.page"
  45. style="margin-top: 8px;"
  46. layout="total, prev, pager, next, sizes"
  47. @size-change="sizeChangeHandler($event)"
  48. @current-change="pageChangeHandler"
  49. />
  50. <!-- 发布 -->
  51. <el-dialog append-to-body :close-on-click-modal="false" :visible.sync="sendVisible" title="发布通知" @close="handleClose">
  52. <span class="dialog-right-top" />
  53. <span class="dialog-left-bottom" />
  54. <div class="setting-dialog">
  55. <el-form ref="formDom" :rules="rules" :model="sendForm" size="small" label-width="80px" style="margin-left:85px">
  56. <el-form-item label="消息类型" prop="msgType" class="down-select">
  57. <el-select v-model="sendForm.msgType" placeholder="请选择" style="width:315px">
  58. <el-option
  59. v-for="item in msgTypeOptions"
  60. :key="item.name"
  61. :label="item.label"
  62. :value="item.value"
  63. :disabled="item.disabled"
  64. />
  65. </el-select>
  66. </el-form-item>
  67. <el-form-item label="发布内容" prop="notification" style="margin-bottom:8px">
  68. <textarea v-model="sendForm.notification" cols="38" rows="6" />
  69. </el-form-item>
  70. <el-form-item label="推送对象" prop="">
  71. <el-radio-group v-model="pushObj" @change="pushObjChange">
  72. <el-radio label="用户">用户</el-radio>
  73. <el-radio label="设备">设备</el-radio>
  74. </el-radio-group>
  75. </el-form-item>
  76. <el-form-item label="选择对象" prop="paramName">
  77. <el-select ref="selectBox" v-model="selectOptions" multiple :collapse-tags="showTags" clearable placeholder="请选择" style="width:315px" @change="changeSelect">
  78. <!-- <el-option key="全选" label="全选" value="全选" /> -->
  79. <el-option v-for="item in sendObjOptions" :key="item.value" :label="item.label" :value="item.value" />
  80. </el-select>
  81. </el-form-item>
  82. </el-form>
  83. <div slot="footer" class="dialog-footer">
  84. <el-button type="primary" @click="handleSave">保存</el-button>
  85. </div>
  86. </div>
  87. </el-dialog>
  88. <!-- 删除 -->
  89. <el-dialog :visible.sync="delVisible" title="提示" @close="handleClose">
  90. <span class="dialog-right-top" />
  91. <span class="dialog-left-bottom" />
  92. <div class="setting-dialog">
  93. <p class="delMsg">确定删除所选消息吗</p>
  94. <div slot="footer" class="dialog-footer">
  95. <el-button type="primary" @click="handleDelConfirm">确定</el-button>
  96. </div>
  97. </div>
  98. </el-dialog>
  99. </div>
  100. </div>
  101. </template>
  102. <script>
  103. import { presenter, crud } from '@crud/crud'
  104. // import pagination from '@crud/Pagination'
  105. import { getAllDev, getAllUser, getNoticeList } from '@/api/system/logs'
  106. export default {
  107. name: 'NotifyManage',
  108. // components: { pagination },
  109. mixins: [presenter(), crud()],
  110. // cruds() {
  111. // return CRUD({
  112. // url: '/api/notice/list'
  113. // // optShow: {
  114. // // add: false,
  115. // // edit: false,
  116. // // del: false,
  117. // // download: true
  118. // // }
  119. // })
  120. // },
  121. data() {
  122. return {
  123. tableData: [],
  124. selections: [],
  125. sendVisible: false,
  126. delVisible: false,
  127. sendForm: {
  128. msgType: 1,
  129. notification: '',
  130. pushObj: '用户',
  131. sendObj: ['全选']
  132. },
  133. pushObj: '用户',
  134. checked: '',
  135. msgTypeOptions: [
  136. { value: 1, label: '系统通知' }
  137. // { value: 2, label: '报警消息', disabled: true },
  138. // { value: 3, label: '借还消息', disabled: true },
  139. // { value: 4, label: '下载消息', disabled: true }
  140. ],
  141. userOptions: [
  142. // { value: 0, label: '全部用户' },
  143. // { value: 1, label: '部门名称 - 张三' },
  144. // { value: 2, label: '部门名称 - 李四' },
  145. // { value: 3, label: '部门名称 - 王五' },
  146. // { value: 4, label: '部门名称 - 张三' },
  147. // { value: 5, label: '部门名称 - 李四' },
  148. // { value: 6, label: '部门名称 - 王五' },
  149. // { value: 7, label: '部门名称 - 王五' }
  150. ],
  151. devOptions: [
  152. // { value: 0, label: '全部设备' },
  153. // { value: 1, label: '设备1' },
  154. // { value: 2, label: '设备2' },
  155. // { value: 3, label: '设备3' }
  156. ],
  157. selectOptions: [],
  158. oldSelect: null,
  159. showTags: true,
  160. rules: {
  161. msgType: [
  162. { required: true, message: '请选择类型', trigger: 'blur' }
  163. ],
  164. notification: [
  165. { required: true, message: '请填写内容', trigger: 'blur' }
  166. ],
  167. pushObj: [
  168. { required: true, message: '请选择推送对象', trigger: 'blur' }
  169. ]
  170. },
  171. allUser: null,
  172. allDev: null,
  173. page: {
  174. total: 0,
  175. size: 10,
  176. page: 1
  177. }
  178. }
  179. },
  180. computed: {
  181. sendObjOptions() {
  182. if (this.pushObj === '用户') {
  183. return this.userOptions
  184. } else {
  185. return this.devOptions
  186. }
  187. }
  188. },
  189. async created() {
  190. await this.getUser()
  191. await this.getDev()
  192. this.getTableData()
  193. },
  194. methods: {
  195. getParams() {
  196. const params = {
  197. page: null,
  198. size: null
  199. }
  200. params.page = this.page.page - 1
  201. params.size = this.page.size
  202. return params
  203. },
  204. getTableData() {
  205. getNoticeList(this.getParams()).then(res => { // 获取列表
  206. console.log(res, 'res')
  207. const table = res.content
  208. this.page.total = res.totalElements
  209. table.forEach(item => {
  210. item.pushTo = null
  211. if (item.noticeDevices.length > 0) { // 推送对象为设备
  212. if (item.noticeDevices.length === this.devOptions.length - 1) {
  213. item.pushTo = '全部设备'
  214. } else {
  215. // let push
  216. item.pushTo = item.noticeDevices.map(i => {
  217. let dev = null
  218. this.devOptions.forEach(val => {
  219. if (val.value === i.deviceInfoId) {
  220. dev = val.label
  221. }
  222. })
  223. return dev
  224. })
  225. }
  226. } else if (item.noticeUsers.length > 0) { // 推送对象为用户
  227. // pushArr = item.noticeDevices
  228. if (item.noticeUsers.length === this.devOptions.length - 1) {
  229. item.pushTo = '全部用户'
  230. } else {
  231. // let push
  232. item.pushTo = item.noticeUsers.map(i => {
  233. let user = null
  234. this.userOptions.forEach(val => {
  235. if (val.value === i.userId) {
  236. user = val.label
  237. }
  238. })
  239. return user
  240. })
  241. }
  242. }
  243. })
  244. console.log(table, 'table')
  245. this.tableData = table
  246. })
  247. },
  248. // 获取用户
  249. async getUser() {
  250. await getAllUser().then(res => {
  251. console.log(res, '用户')
  252. const arr0 = [{ value: 0, label: '全部用户' }]
  253. const arr = res.map(item => {
  254. const val = item.id
  255. const lab = item.dept.name + '-' + item.username
  256. const obj = {
  257. value: val,
  258. label: lab
  259. }
  260. return obj
  261. })
  262. this.userOptions = arr0.concat(arr)
  263. console.log(this.userOptions, '---用户')
  264. })
  265. },
  266. // 获取设备
  267. async getDev() {
  268. await getAllDev().then(res => {
  269. console.log(res, '设备')
  270. const arr0 = [{ value: 0, label: '全部设备' }]
  271. const arr = res.map(item => {
  272. const val = item.id
  273. const lab = item.deviceName
  274. const obj = {
  275. value: val,
  276. label: lab
  277. }
  278. return obj
  279. })
  280. this.devOptions = arr0.concat(arr)
  281. console.log(this.devOptions, '---设备')
  282. })
  283. },
  284. // 每页条数改变
  285. sizeChangeHandler(e) {
  286. this.loading = true
  287. this.page.size = e
  288. this.page.page = 1
  289. this.getTableData(this.getParams())
  290. this.loading = false
  291. },
  292. // 当前页改变
  293. pageChangeHandler(e) {
  294. this.loading = true
  295. this.page.page = e
  296. this.params.page = e - 1
  297. this.getTableData(this.getParams())
  298. this.loading = false
  299. },
  300. clickRowHandler(row) {
  301. // this.$refs.table.clearSelection()
  302. this.$refs.table.toggleRowSelection(row) // 单选选中
  303. },
  304. selectionChangeHandler(val) {
  305. this.selections = val
  306. },
  307. // 发布
  308. handleSend() {
  309. this.defaultSelAll()
  310. this.sendVisible = true
  311. },
  312. handleEdit() {
  313. this.sendForm.notification = this.selections[0].notification
  314. this.sendVisible = true
  315. },
  316. // 保存
  317. handleSave() {
  318. this.$refs.formDom.validate((valid) => {
  319. if (valid) {
  320. // noticeCreate(params).then(res => {
  321. // if (res === SUCCESS) {
  322. // this.sendVisible = false
  323. // this.$refs.formDom.resetFields()
  324. // this.$refs.formDom.clearValidate()
  325. // }
  326. // })
  327. this.sendVisible = false
  328. this.$refs.formDom.resetFields()
  329. this.$refs.formDom.clearValidate()
  330. } else {
  331. return false
  332. }
  333. })
  334. },
  335. handleClose() {
  336. this.$refs.formDom.resetFields()
  337. this.$refs.formDom.clearValidate()
  338. },
  339. // 删除
  340. handleDel() {
  341. this.delVisible = true
  342. },
  343. // 删除确认
  344. handleDelConfirm() {
  345. this.delVisible = false
  346. },
  347. // 选择器 推送对象
  348. handelChange(val) {
  349. if (val.length === this.sendObjOptions.length) {
  350. this.checked = true
  351. } else {
  352. this.checked = false
  353. }
  354. },
  355. // selectAll(val) {
  356. // this.sendForm.sendObj = []
  357. // if (val) {
  358. // this.sendForm.sendObj = this.sendObjOptions.map(item => item.value)
  359. // } else {
  360. // this.sendForm.sendObj = []
  361. // }
  362. // // console.log(this.sendForm.sendObj)
  363. // },
  364. // el-select 选中值发生变化时触发,val为目前选中的值
  365. // 默认全选
  366. defaultSelAll() {
  367. this.selectOptions = this.sendObjOptions.map(item => { return item.value })
  368. this.oldSelect = this.selectOptions
  369. this.showTags = true
  370. },
  371. changeSelect(val) {
  372. if (val[val.length - 1] === 0) { // 选中全选
  373. this.defaultSelAll()
  374. this.$refs.selectBox.$el.querySelector('.el-input__inner').style.height = '34px'
  375. } else {
  376. const arr1 = this.oldSelect.filter(item => item !== 0)
  377. const arr2 = val.filter(item => item !== 0)
  378. if (arr1.length === arr2.length) { // 取消全选
  379. this.selectOptions = []
  380. } else if (arr1.length < arr2.length && arr2.length === this.sendObjOptions.length - 1) {
  381. this.defaultSelAll() // 除全选时都选中 此时加入全选
  382. this.$refs.selectBox.$el.querySelector('.el-input__inner').style.height = '34px'
  383. } else {
  384. this.selectOptions = this.selectOptions.filter(item => item !== 0) // 取消其他选项时 去除全选
  385. this.showTags = false
  386. }
  387. this.oldSelect = this.selectOptions
  388. }
  389. // 最后选中得值
  390. // var endSelectVal = val[val.length - 1]
  391. // // showTags配合 collapse-tags 属性来
  392. // if (!val.includes('全选') && val.length === this.sendObjOptions.length) {
  393. // // 当前选中得值不包含“全选”,且其他项全选中
  394. // this.showTags = true
  395. // val.unshift('全选')
  396. // this.$refs.selectBox.$el.querySelector('.el-input__inner').style.height = '34px'
  397. // } else if (val.includes('全选') && val.length === 1) {
  398. // // 当前选中得值是“全选”时
  399. // this.showTags = true
  400. // this.sendObjOptions.map(item => {
  401. // val.push(item.value)
  402. // })
  403. // } else if (val.includes('全选') && val.length - 1 < this.sendObjOptions.length && endSelectVal === '全选') {
  404. // // 当前选中得值是其他项,未全部选完,而最后选中得是“全选”时
  405. // val = []
  406. // this.sendObjOptions.map(item => {
  407. // val.push(item.value)
  408. // })
  409. // val.unshift('全选')
  410. // this.showTags = true
  411. // this.$refs.selectBox.$el.querySelector('.el-input__inner').style.height = '34px'
  412. // } else if (val.includes('全选') && val.length - 1 < this.sendObjOptions.length) {
  413. // // 当前选中得值是其他项,未全部选完时
  414. // this.showTags = false
  415. // val = val.filter(item => {
  416. // return item !== '全选'
  417. // })
  418. // }
  419. // this.selectOptions = val // 赋值给select绑定得
  420. },
  421. pushObjChange(val) {
  422. if (val) {
  423. // this.selectOptions = []
  424. // this.showTags = false
  425. this.defaultSelAll()
  426. this.showTags = true
  427. }
  428. }
  429. }
  430. }
  431. </script>
  432. <style lang="scss" scoped>
  433. @import '~@/assets/styles/lend-manage.scss';
  434. .head-container{
  435. padding-bottom: 0;
  436. }
  437. .container-wrap{
  438. min-height: calc(100vh - 242px)
  439. }
  440. textarea{
  441. background-color: #021941;
  442. border: 1px solid #339CFF;
  443. border-radius: 3px;
  444. &:focus{
  445. outline: none;
  446. }
  447. caret-color: #fff;
  448. color: #fff;
  449. padding: 10px 12px;
  450. font-size: 14px;
  451. }
  452. ::v-deep .el-radio-group{
  453. width: 315px;
  454. height: 32px;
  455. border: 1px solid #339CFF;
  456. border-radius: 3px;
  457. padding-left: 14px;
  458. display: flex;
  459. label{
  460. display: flex;
  461. align-items: center;
  462. margin-right: 50px;
  463. span{
  464. color: #3A99FD;
  465. margin-left: 10px;
  466. }
  467. }
  468. }
  469. .el-checkbox{
  470. display: flex;
  471. justify-content: right;
  472. align-items: center;
  473. padding-right: 20px;
  474. }
  475. .delMsg{
  476. color: #fff;
  477. font-size: 16px;
  478. }
  479. ::v-deep .el-form-item__error{
  480. top: 93%;
  481. }
  482. </style>