【类 型】:feat

【原  因】:添加公告模块
【过  程】:
【影  响】:

# 类型 包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
This commit is contained in:
air 2025-06-24 21:59:37 +08:00
parent 2ef12fc312
commit 0f0c18bd35
7 changed files with 86 additions and 88 deletions

View File

@ -437,7 +437,7 @@ const routes = [
} }
}, },
{ {
path: '/message/index', path: '/message/pub',
component: () => import('@/views/layout/components/main/message/pub'), component: () => import('@/views/layout/components/main/message/pub'),
meta: { meta: {
title: '发布公告', title: '发布公告',

View File

@ -6,6 +6,7 @@ import settings from './modules/settings'
import user from './modules/user' import user from './modules/user'
import api from '@/utils/api' import api from '@/utils/api'
import { Message, MessageBox, Notification } from 'element-ui' import { Message, MessageBox, Notification } from 'element-ui'
import { parseTime } from '@/utils/index'
// 把vuex作为插件引入到Vue示例中 ps:注册 // 把vuex作为插件引入到Vue示例中 ps:注册
Vue.use(Vuex) Vue.use(Vuex)
@ -1143,6 +1144,7 @@ const store = new Vuex.Store({
} }
return res return res
}, },
/** /**
* @description: 异步获取管理员消息列表 成功获取之后 弹出通知框 显示列表 * @description: 异步获取管理员消息列表 成功获取之后 弹出通知框 显示列表
*/ */
@ -1153,14 +1155,24 @@ const store = new Vuex.Store({
const list = res.data.messageList || [] const list = res.data.messageList || []
commit('setMessageList', list) commit('setMessageList', list)
// 每条通知之间延迟 800ms显示时间为 8000ms // 弹出通知
list.forEach((item, index) => { list.forEach((item, index) => {
const formattedTime = parseTime(item.add_time, '{m}-{d} {h}:{i}')
const sender = item.admin_uname || '管理员'
setTimeout(() => { setTimeout(() => {
Notification({ Notification({
title: item.tit || '通知', title: item.tit || '通知',
message: item.message || '', message: `
duration: 8000, // 显示时间 8 秒 <div>
type: 'info' // 可选类型: success / warning / error / info <div>${item.message || ''}</div>
<div style="display: flex; justify-content: flex-end;">
<div style="color: #aaa;">BY. ${sender} ${formattedTime}</span>
</div>
</div>
`,
duration: 8000,
dangerouslyUseHTMLString: true // 启用 HTML 格式
}) })
}, index * 800) }, index * 800)
}) })

View File

@ -9,6 +9,7 @@ const defaultModuleVisibilityMap = {
site: true, site: true,
shop: true, shop: true,
admin: true, admin: true,
message: true,
category: true, category: true,
broadcast: true, broadcast: true,
order: true, order: true,

View File

@ -162,6 +162,15 @@ export async function pubMessage (tit, message, idArr, endTime) {
return res return res
} }
/**
* @description 获取全部公告列表不限制过期无admin_id限制
* @returns {Promise} 返回接口响应对象
*/
export async function getAllMessageList () {
const res = await api.get('getAllMessageList', 'Admin')
return res
}
/** /**
* @abstract 获取指定飞机组的飞行数据按时间范围 * @abstract 获取指定飞机组的飞行数据按时间范围
* @param {Array} idArr 飞机ID数组 * @param {Array} idArr 飞机ID数组

View File

@ -14,7 +14,7 @@
</el-button-group> </el-button-group>
<!-- 管理员列表 --> <!-- 管理员列表 -->
<el-table class="w-100" ref="myTable" <el-table class="w-100" ref="myTable"
:data="adminListArr.slice((currentPage - 1) * pageSize, currentPage * pageSize)" border tooltip-effect="dark"> :data="adminListArr.slice((currentPage - 1) * pageSize, currentPage * pageSize)" border tooltip-effect="dark" @selection-change="handleSelectionChange">
<el-table-column align="center" type="selection" width="40"> <el-table-column align="center" type="selection" width="40">
</el-table-column> </el-table-column>
<el-table-column align="center" prop="id" label="id" width="50"> <el-table-column align="center" prop="id" label="id" width="50">

View File

@ -56,6 +56,7 @@ export default {
{ value: 'planes', label: '无人机' }, { value: 'planes', label: '无人机' },
{ value: 'shop', label: '商铺管理' }, { value: 'shop', label: '商铺管理' },
{ value: 'admin', label: '账户列表' }, { value: 'admin', label: '账户列表' },
{ value: 'message', label: '公告管理' },
{ value: 'category', label: '分类管理' }, { value: 'category', label: '分类管理' },
{ value: 'product', label: '商品管理' }, { value: 'product', label: '商品管理' },
{ value: 'broadcast', label: '广告管理' }, { value: 'broadcast', label: '广告管理' },

View File

@ -2,58 +2,69 @@
<div class="app-container"> <div class="app-container">
<!-- 组合按钮 --> <!-- 组合按钮 -->
<el-button-group class="m-b-20 m-r-20"> <el-button-group class="m-b-20 m-r-20">
<el-button type="primary" icon="el-icon-plus" @click="$router.replace('/admin/add')">添加</el-button>
<el-button type="danger" icon="el-icon-delete" @click="deleteAdmin(countSelIdArr($refs.myTable.selection))">删除 <el-button type="danger" icon="el-icon-delete" @click="deleteAdmin(countSelIdArr($refs.myTable.selection))">删除
</el-button> </el-button>
<el-button type="warning" icon="el-icon-edit" @click="toEditPage()">编辑</el-button> <el-button type="warning" icon="el-icon-edit" @click="toEditPage()">编辑</el-button>
<el-button type="success" icon="el-icon-microphone" @click="toMessagePage(countSelIdArr($refs.myTable.selection))">发布公告</el-button>
</el-button-group> </el-button-group>
<!-- 用户select选项 --> <!-- 用户select选项 -->
<el-button-group class="m-b-20"> <el-button-group class="m-b-20">
<SelectionShopId v-model="form.shop_id" :allSel="true" /> <SelectionShopId v-model="form.shop_id" :allSel="true" />
</el-button-group> </el-button-group>
<!-- 管理员列表 -->
<!-- 公告列表 -->
<el-table class="w-100" ref="myTable" <el-table class="w-100" ref="myTable"
:data="adminListArr.slice((currentPage - 1) * pageSize, currentPage * pageSize)" border tooltip-effect="dark"> :data="messageListArr.slice((currentPage - 1) * pageSize, currentPage * pageSize)" border tooltip-effect="dark">
<el-table-column align="center" type="selection" width="40"> <!-- 多选框 -->
</el-table-column> <el-table-column type="selection" width="55" />
<el-table-column align="center" prop="id" label="id" width="50">
</el-table-column> <!-- 公告标题 -->
<el-table-column prop="name" label="账户名" width="150" min-width="150"> <el-table-column prop="tit" label="标题" min-width="120" show-overflow-tooltip />
</el-table-column>
<el-table-column prop="uname" label="昵称" min-width="150"> <!-- 公告内容 -->
</el-table-column> <el-table-column prop="message" label="内容" min-width="200" show-overflow-tooltip />
<el-table-column label="最后登录时间" width="140" min-width="120">
<!-- 添加人 -->
<el-table-column prop="admin_uname" label="发布人" min-width="100" />
<!-- 接收人 -->
<el-table-column prop="by_admin_uname" label="接收人" min-width="100" />
<!-- 添加时间 -->
<el-table-column prop="add_time" label="发布时间" min-width="150">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.lasttime | parseTime('{y}-{m}-{d} {h}:{i}') }} {{ parseTime(scope.row.add_time) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="注册时间" width="100" min-width="80">
<!-- 结束时间 -->
<el-table-column prop="end_time" label="截止时间" min-width="150">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.addtime | parseTime('{y}-{m}-{d}') }} {{ parseTime(scope.row.end_time) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="controler" label="操作" width="350" min-width="350">
<template slot-scope="scope"> <!-- 操作 -->
<el-table-column label="操作" width="220" fixed="right">
<el-button-group> <el-button-group>
<el-button type="warning" icon="el-icon-edit" <el-button type="warning" icon="el-icon-edit"
@click="$router.replace(`/admin/edit/${scope.row.id}`)">编辑</el-button> @click="$router.replace(`/admin/edit/${scope.row.id}`)">编辑</el-button>
<el-button type="danger" icon="el-icon-delete" @click="deleteAdmin([scope.row.id])">删除</el-button> <el-button type="danger" icon="el-icon-delete" @click="deleteAdmin([scope.row.id])">删除</el-button>
<el-button type="success" icon="el-icon-microphone" @click="toMessagePage([scope.row.id])">发布公告</el-button>
</el-button-group> </el-button-group>
</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 分页 --> <!-- 分页 -->
<el-pagination class="m-t-20" layout="prev, pager, next" :current-page.sync="currentPage" :page-size="pageSize" <el-pagination class="m-t-20" layout="prev, pager, next" :current-page.sync="currentPage" :page-size="pageSize"
:total="adminListArr.length"> :total="messageListArr.length">
</el-pagination> </el-pagination>
</div> </div>
</template> </template>
<script> <script>
import { parseTime, countSelIdArr } from '@/utils' import { parseTime, countSelIdArr } from '@/utils'
import SelectionShopId from '@/components/SelectionShopId' import SelectionShopId from '@/components/SelectionShopId'
import { getAllMessageList } from '@/utils/api/table'
export default { export default {
name: 'Admin', name: 'Admin',
@ -63,81 +74,45 @@ export default {
currentPage: 1, // currentPage: 1, //
form: { form: {
shop_id: '' shop_id: ''
} },
messageList: []
} }
}, },
components: { components: {
SelectionShopId SelectionShopId
}, },
computed: { computed: {
adminList () { //
return this.$store.state.adminList messageListArr () {
},
/**
* @description: 过滤掉 不对应客户的 飞机列表
* @return: 飞机列表
*/
adminListArr () {
if (this.form.shop_id !== '') { if (this.form.shop_id !== '') {
return this.adminList.filter((item) => item.shop_id === this.form.shop_id) return this.messageList.filter((item) => item.shop_id === this.form.shop_id)
} else { } else {
return this.adminList return this.messageList
} }
} }
}, },
methods: {
countSelIdArr,
/**
* @description: 跳转到编辑页面
*/
toEditPage () {
const selId = this.countSelIdArr(this.$refs.myTable.selection)
switch (selId.length) {
case 0:
this.$message.error('请选择一条需要编辑的记录')
break
case 1:
this.$router.push('/admin/edit/' + selId['0'])
break
default:
this.$message.error('只能选择一条记录')
}
},
/**
* @description: 跳转到发布公告页面
*/
toMessagePage (selIdArr) {
if (selIdArr.length === 0) {
this.$message.error('请选择至少一个用户')
} else {
this.$store.commit('app/setToMessageIdArr', selIdArr)//
this.$router.push('/admin/message/')
}
},
/**
* @description: 删除用户
*/
deleteAdmin (idArr) {
this.$store.dispatch('fetchDelAdmin', idArr)
}
},
watch: {
},
created () { created () {
this.getAllMessageList()
},
methods: {
parseTime,
//
async getAllMessageList () {
const res = await getAllMessageList()
if (res.data.status === 1) {
this.messageList = res.data.messageList
} else {
this.$message.error(res.msg)
}
}
}, },
filters: { filters: {
parseTime,
countSelIdArr countSelIdArr
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/styles/theme.scss"; @import "@/styles/theme.scss";
.el-tag {
i {
vertical-align: middle
}
}
</style> </style>