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.
WeChat/src/views/modules/wx/msg-reply-rule.vue

205 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<!-- 整个模块的容器类用于包裹后续的表单表格分页等组件 -->
<div class="mod-config">
<!-- 内联表单绑定了dataForm数据模型监听回车键native修饰符表示监听原生的键盘事件按下时调用getDataList方法 -->
<el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()">
<!-- 匹配关键词输入框所在的表单项 -->
<el-form-item>
<!-- 使用el-input组件实现输入框双向绑定dataForm.matchValue有占位提示文字且可清空输入内容 -->
<el-input v-model="dataForm.matchValue" placeholder="匹配关键词" clearable></el-input>
</el-form-item>
<!-- 操作按钮所在的表单项 -->
<el-form-item>
<!-- 查询按钮点击时调用getDataList方法获取符合条件的数据列表 -->
<el-button @click="getDataList()">查询</el-button>
<!-- 新增按钮根据权限调用isAuth方法判断决定是否显示类型为主要按钮点击时调用addOrUpdateHandle方法 -->
<el-button v-if="isAuth('wx:msgreplyrule:save')" type="primary" @click="addOrUpdateHandle()">新增</el-button>
<!-- 批量删除按钮根据权限决定是否显示类型为危险按钮点击时调用deleteHandle方法当没有选中的数据项时禁用按钮 -->
<el-button v-if="isAuth('wx:msgreplyrule:delete')" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0">批量删除</el-button>
</el-form-item>
</el-form>
<!-- el-table组件用于展示数据列表绑定了dataList数据显示边框可展开行type="expand"),加载数据时显示加载提示,监听选择项变化事件 -->
<el-table :data="dataList" border type="expand" v-loading="dataListLoading" @selection-change="selectionChangeHandle" style="width: 100%;">
<!-- 展开列,通过插槽定义展开内容,这里展示了更多规则相关详细信息的表单 -->
<el-table-column type="expand">
<template slot-scope="props">
<el-form label-position="left" inline class="demo-table-expand">
<!-- 作用范围信息展示的表单项根据数据项中的appid值判断显示“当前公众号”或“全部公众号” -->
<el-form-item label="作用范围">
<span>{{ props.row.appid? '当前公众号' : '全部公众号' }}</span>
</el-form-item>
<!-- 精确匹配信息展示的表单项根据数据项中的exactMatch值判断显示“是”或“否” -->
<el-form-item label="精确匹配">
<span>{{ props.row.exactMatch? '是' : '否' }}</span>
</el-form-item>
<!-- 是否有效信息展示的表单项根据数据项中的status值判断显示“是”或“否” -->
<el-form-item label="是否有效">
<span>{{ props.row.status? '是' : '否' }}</span>
</el-form-item>
<!-- 备注说明信息展示的表单项直接显示数据项中的desc值 -->
<el-form-item label="备注说明">
<span>{{ props.row.desc }}</span>
</el-form-item>
<!-- 生效时间信息展示的表单项直接显示数据项中的effectTimeStart值 -->
<el-form-item label="生效时间">
<span>{{ props.row.effectTimeStart }}</span>
</el-form-item>
<!-- 失效时间信息展示的表单项直接显示数据项中的effectTimeEnd值 -->
<el-form-item label="失效时间">
<span>{{ props.row.effectTimeEnd }}</span>
</el-form-item>
</el-form>
</template>
</el-table-column>
<!-- 选择列,用于多选操作,设置了表头和内容的对齐方式以及宽度 -->
<el-table-column type="selection" header-align="center" align="center" width="50">
</el-table-column>
<!-- 规则名称列对应dataList中数据项的ruleName属性显示溢出提示设置了表头和内容的对齐方式以及列标题 -->
<el-table-column prop="ruleName" header-align="center" align="center" show-overflow-tooltip label="规则名称">
</el-table-column>
<!-- 匹配关键词列对应dataList中数据项的matchValue属性显示溢出提示设置了表头和内容的对齐方式以及列标题 -->
<el-table-column prop="matchValue" header-align="center" align="center" show-overflow-tooltip label="匹配关键词">
</el-table-column>
<!-- 消息类型列对应dataList中数据项的replyType属性使用formatter函数格式化显示内容设置了表头和内容的对齐方式以及列标题 -->
<el-table-column prop="replyType" header-align="center" align="center" :formatter="replyTypeFormat" label="消息类型">
</el-table-column>
<!-- 回复内容列对应dataList中数据项的replyContent属性显示溢出提示设置了表头和内容的对齐方式以及列标题 -->
<el-table-column prop="replyContent" header-align="center" align="center" show-overflow-tooltip label="回复内容">
</el-table-column>
<!-- 操作列,固定在右侧,设置了表头和内容的对齐方式、宽度以及列标题,通过插槽定义了修改和删除按钮 -->
<el-table-column fixed="right" header-align="center" align="center" width="150" label="操作">
<template slot-scope="scope">
<el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.ruleId)">修改</el-button>
<el-button type="text" size="small" @click="deleteHandle(scope.row.ruleId)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件,绑定了相关的分页事件和属性,用于切换每页显示数量、当前页码等操作 -->
<el-pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" :current-page="pageIndex" :page-sizes="[10, 20, 50, 100]" :page-size="pageSize" :total="totalCount" layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 新增/修改组件通过属性和事件与父组件进行交互根据addOrUpdateVisible的值决定是否显示 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
</div>
</template>
<script>
// 引入新增/修改组件,用于实现规则的新增或修改功能相关交互逻辑
import AddOrUpdate from './msg-reply-rule-add-or-update'
// 引入Vuex的mapState辅助函数用于将Vuex中的状态映射到组件的计算属性中
import { mapState } from 'vuex'
export default {
components: {
AddOrUpdate
},
data() {
return {
dataForm: {
matchValue: ''
},
dataList: [],
pageIndex: 1,
pageSize: 10,
totalCount: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false
}
},
computed: mapState({
// 从Vuex的state中获取message模块下的KefuMsgType状态映射到组件的计算属性中用于消息类型列的格式化显示操作
KefuMsgType: state => state.message.KefuMsgType
}),
activated() {
// 当组件被激活例如路由切换到对应页面等情况调用getDataList方法获取数据列表用于展示初始数据
this.getDataList()
},
methods: {
// 获取数据列表的方法
getDataList() {
// 设置正在加载数据的状态为true
this.dataListLoading = true
// 发起HTTP请求获取消息回复规则的数据列表对请求的URL和参数进行了装饰处理可能是统一处理请求相关的配置
this.$http({
url: this.$http.adornUrl('/manage/msgReplyRule/list'),
method: 'get',
params: this.$http.adornParams({
'page': this.pageIndex,
'limit': this.pageSize,
'matchValue': this.dataForm.matchValue
})
}).then(({ data }) => {
// 根据返回数据的状态码判断是否请求成功
if (data && data.code === 200) {
// 如果成功,更新数据列表和总记录数
this.dataList = data.page.list
this.totalCount = data.page.totalCount
} else {
// 如果失败,清空数据列表和总记录数
this.dataList = []
this.totalCount = 0
}
// 请求完成后设置正在加载数据的状态为false
this.dataListLoading = false
})
},
// 每页数量改变时的处理方法更新每页显示数量将当前页码重置为1然后重新获取数据列表
sizeChangeHandle(val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
// 当前页码改变时的处理方法,更新当前页码,然后重新获取数据列表
currentChangeHandle(val) {
this.pageIndex = val
this.getDataList()
},
// 处理表格中选择项变化的方法,更新选中的数据项列表
selectionChangeHandle(val) {
this.dataListSelections = val
},
// 新增/修改操作的方法,设置新增/修改组件的显示状态为true并在DOM更新后初始化新增/修改组件传入规则的id可为空表示新增
addOrUpdateHandle(id) {
this.addOrUpdateVisible = true
this.$nextTick(() => {
this.$refs.addOrUpdate.init(id)
})
},
// 删除操作的方法根据传入的id判断是单个删除还是批量删除弹出确认框让用户确认操作后发起HTTP删除请求
deleteHandle(id) {
// 如果传入了id表示单个删除将其放入数组否则使用选中的数据项的ruleId数组进行批量删除
var ids = id? [id] : this.dataListSelections.map(item => item.ruleId)
this.$confirm(`确定对[id=${ids.join(',')}]进行[${id? '删除' : '批量删除'}]操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// 发起HTTP请求进行删除操作对请求的数据进行了装饰处理
this.$http({
url: this.$http.adornUrl('/manage/msgReplyRule/delete'),
method: 'post',
data: this.$http.adornData(ids, false)
}).then(({ data }) => {
// 根据返回数据判断删除操作是否成功
if (data && data.code === 200) {
// 如果成功,弹出成功提示信息,并在提示框关闭后重新获取数据列表
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => this.getDataList()
})
} else {
// 如果失败,弹出错误提示信息
this.$message.error(data.msg)
}
})
})
},
// 消息类型格式化的方法根据数据项中的消息类型值从KefuMsgType对象中获取对应的显示名称并返回
replyTypeFormat(row, column, cellValue) {
return this.KefuMsgType[cellValue];
}
}
}
</script>