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.
mall-admin/src/views/sms/subject/index.vue

528 lines
27 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="app-container">
<!-- el-card组件作为筛选搜索区域的容器设置阴影效果为"never"即无阴影 -->
<el-card class="filter-container" shadow="never">
<div>
<!-- 使用el-icon-search图标用于表示搜索相关的视觉元素 -->
<i class="el-icon-search"></i>
<!-- 显示"筛选搜索"的文字提示 -->
<span>筛选搜索</span>
<!-- el-button按钮组件样式设置为右浮动按钮类型为"primary"主要按钮样式通常为主题色等突出显示点击时调用handleSearchList方法按钮大小为"small" -->
<el-button
style="float:right"
type="primary"
@click="handleSearchList()"
size="small">
查询搜索
</el-button>
<!-- el-button按钮组件样式设置为右浮动且距离右边距15px点击时调用handleResetSearch方法按钮大小为"small"用于重置相关操作 -->
<el-button
style="float:right;margin-right: 15px"
@click="handleResetSearch()"
size="small">
重置
</el-button>
</div>
<div style="margin-top: 15px">
<!-- el-form表单组件设置为行内表单形式绑定的数据模型是listQuery表单尺寸为"small"标签宽度为140px -->
<el-form :inline="true" :model="listQuery" size="small" label-width="140px">
<!-- el-form-item表单项目组件用于输入框的包裹此处对应的标签文本为"专题名称:" -->
<el-form-item label="专题名称:">
<!-- el-input输入框组件双向绑定数据到listQuery.subjectName设置输入框的类名为"input-width"有相应的占位提示文字 -->
<el-input v-model="listQuery.subjectName" class="input-width" placeholder="专题名称"></el-input>
</el-form-item>
<!-- el-form-item表单项目组件用于下拉选择框的包裹对应的标签文本为"推荐状态:" -->
<el-form-item label="推荐状态:">
<!-- el-select下拉选择框组件双向绑定数据到listQuery.recommendStatus有相应的占位提示文字可清空选择设置类名为"input-width" -->
<el-select v-model="listQuery.recommendStatus" placeholder="全部" clearable class="input-width">
<!-- 通过v-for循环遍历recommendOptions数组生成el-option下拉选项每个选项根据item中的属性设置相应的键、显示标签和值 -->
<el-option v-for="item in recommendOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-form>
</div>
</el-card>
<!-- el-card组件作为操作相关区域的容器设置阴影效果为"never",即无阴影 -->
<el-card class="operate-container" shadow="never">
<!-- 使用el-icon-tickets图标用于表示相关操作的视觉元素 -->
<i class="el-icon-tickets"></i>
<!-- 显示"数据列表"的文字提示 -->
<span>数据列表</span>
<!-- el-button按钮组件按钮尺寸为"mini"点击时调用handleSelectSubject方法按钮样式类名为"btn-add",用于选择专题操作 -->
<el-button size="mini" class="btn-add" @click="handleSelectSubject()">选择专题</el-button>
</el-card>
<!-- 作为表格显示区域的容器 -->
<div class="table-container">
<!-- el-table表格组件引用了ref为"newSubjectTable"绑定的数据为list设置宽度为100%监听行选择变化事件绑定加载状态到listLoading变量显示表格边框 -->
<el-table ref="newSubjectTable"
:data="list"
style="width: 100%;"
@selection-change="handleSelectionChange"
v-loading="listLoading" border>
<!-- el-table-column表格列组件设置列类型为"selection"用于行选择的复选框列宽度为60px内容居中对齐 -->
<el-table-column type="selection" width="60" align="center"></el-table-column>
<!-- el-table-column表格列组件对应的标签为"编号"宽度为120px内容居中对齐通过插槽作用域展示对应行数据中的id属性 -->
<el-table-column label="编号" width="120" align="center">
<template slot-scope="scope">{{scope.row.id}}</template>
</el-table-column>
<!-- el-table-column表格列组件对应的标签为"专题名称"内容居中对齐通过插槽作用域展示对应行数据中的subjectName属性 -->
<el-table-column label="专题名称" align="center">
<template slot-scope="scope">{{scope.row.subjectName}}</template>
</el-table-column>
<!-- el-table-column表格列组件对应的标签为"是否推荐"宽度为200px内容居中对齐内部包含一个el-switch开关组件用于切换推荐状态绑定相应的事件和值 -->
<el-table-column label="是否推荐" width="200" align="center">
<template slot-scope="scope">
<el-switch
@change="handleRecommendStatusStatusChange(scope.$index, scope.row)"
:active-value="1"
:inactive-value="0"
v-model="scope.row.recommendStatus">
</el-switch>
</template>
</el-table-column>
<!-- el-table-column表格列组件对应的标签为"排序"宽度为160px内容居中对齐通过插槽作用域展示对应行数据中的sort属性 -->
<el-table-column label="排序" width="160" align="center">
<template slot-scope="scope">{{scope.row.sort}}</template>
</el-table-column>
<!-- el-table-column表格列组件对应的标签为"状态"宽度为160px内容居中对齐通过过滤器formatRecommendStatus对推荐状态数据进行格式化展示 -->
<el-table-column label="状态" width="160" align="center">
<template slot-scope="scope">{{scope.row.recommendStatus | formatRecommendStatus}}</template>
</el-table-column>
<!-- el-table-column表格列组件对应的标签为"操作"宽度为180px内容居中对齐内部包含两个el-button按钮组件分别用于设置排序和删除操作绑定对应的点击事件 -->
<el-table-column label="操作" width="180" align="center">
<template slot-scope="scope">
<el-button size="mini"
type="text"
@click="handleEditSort(scope.$index, scope.row)">设置排序
</el-button>
<el-button size="mini"
type="text"
@click="handleDelete(scope.$index, scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 作为批量操作区域的容器 -->
<div class="batch-operate-container">
<!-- el-select下拉选择框组件尺寸为"small"双向绑定数据到operateType有相应的占位提示文字 -->
<el-select
size="small"
v-model="operateType" placeholder="批量操作">
<!-- 通过v-for循环遍历operates数组生成el-option下拉选项每个选项根据item中的属性设置相应的键、显示标签和值 -->
<el-option
v-for="item in operates"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<!-- el-button按钮组件距离左边距20px样式类名为"search-button"点击时调用handleBatchOperate方法按钮类型为"primary"(主要按钮样式),按钮尺寸为"small",用于确定批量操作 -->
<el-button
style="margin-left: 20px"
class="search-button"
@click="handleBatchOperate()"
type="primary"
size="small">
确定
</el-button>
</div>
<!-- 作为分页区域的容器 -->
<div class="pagination-container">
<!-- el-pagination分页组件设置背景色监听页面尺寸变化和当前页变化事件设置分页布局样式绑定每页显示数量、可选的每页显示数量数组、当前页码以及总数据量等相关属性 -->
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes,prev, pager, next,jumper"
:page-size="listQuery.pageSize"
:page-sizes="[5,10,15]"
:current-page.sync="listQuery.pageNum"
:total="total">
</el-pagination>
</div>
<!-- el-dialog对话框组件标题为"选择专题"对话框显示状态双向绑定到selectDialogVisible变量宽度设置为50% -->
<el-dialog title="选择专题" :visible.sync="selectDialogVisible" width="50%">
<!-- el-input输入框组件双向绑定数据到dialogData.listQuery.keyword设置宽度底边距以及尺寸等样式属性有相应的占位提示文字内部包含一个用于搜索操作的el-button按钮 -->
<el-input v-model="dialogData.listQuery.keyword"
style="width: 250px;margin-bottom: 20px"
size="small"
placeholder="专题名称搜索">
<el-button slot="append" icon="el-icon-search" @click="handleSelectSearch()"></el-button>
</el-input>
<!-- el-table表格组件绑定的数据为dialogData.list监听行选择变化事件显示表格边框 -->
<el-table :data="dialogData.list"
@selection-change="handleDialogSelectionChange" border>
<!-- el-table-column表格列组件设置列类型为"selection"用于行选择的复选框列宽度为60px内容居中对齐 -->
<el-table-column type="selection" width="60" align="center"></el-table-column>
<!-- el-table-column表格列组件对应的标签为"专题名称"内容居中对齐通过插槽作用域展示对应行数据中的title属性 -->
<el-table-column label="专题名称" align="center">
<template slot-scope="scope">{{scope.row.title}}</template>
</el-table-column>
<!-- el-table-column表格列组件对应的标签为"所属分类"宽度为160px内容居中对齐通过插槽作用域展示对应行数据中的categoryName属性 -->
<el-table-column label="所属分类" width="160" align="center">
<template slot-scope="scope">{{scope.row.categoryName}}</template>
</el-table-column>
<!-- el-table-column表格列组件对应的标签为"添加时间"宽度为160px内容居中对齐通过过滤器formatTime对时间数据进行格式化展示 -->
<el-table-column label="添加时间" width="160" align="center">
<template slot-scope="scope">{{scope.row.createTime | formatTime}}</template>
</el-table-column>
</el-table>
<div class="pagination-container">
<!-- el-pagination分页组件设置背景色监听对话框内页面尺寸变化和当前页变化事件设置分页布局样式绑定对话框内每页显示数量、当前页码以及总数据量等相关属性 -->
<el-pagination
background
@size-change="handleDialogSizeChange"
@current-change="handleDialogCurrentChange"
layout="prev, pager, next"
:current-page.sync="dialogData.listQuery.pageNum"
:page-size="dialogData.listQuery.pageSize"
:page-sizes="[5,10,15]"
:total="dialogData.total">
</el-pagination>
</div>
<div style="clear: both;"></div>
<div slot="footer">
<!-- el-button按钮组件按钮尺寸为"small"点击时关闭对话框设置selectDialogVisible为false -->
<el-button size="small" @click="selectDialogVisible = false">取 消</el-button>
<!-- el-button按钮组件按钮尺寸为"small",按钮类型为"primary"主要按钮样式点击时调用handleSelectDialogConfirm方法用于确定操作 -->
<el-button size="small" type="primary" @click="handleSelectDialogConfirm()">确 定</el-button>
</div>
</el-dialog>
<!-- el-dialog对话框组件标题为"设置排序"对话框显示状态双向绑定到sortDialogVisible变量宽度设置为40% -->
<el-dialog title="设置排序"
:visible.sync="sortDialogVisible"
width="40%">
<!-- el-form表单组件绑定的数据模型是sortDialogData标签宽度为150px -->
<el-form :model="sortDialogData"
label-width="150px">
<!-- el-form-item表单项目组件对应的标签为"排序:"内部包含一个el-input输入框组件用于输入排序相关的值设置输入框宽度 -->
<el-form-item label="排序:">
<el-input v-model="sortDialogData.sort" style="width: 200px"></el-input>
</el-form-item>
</el-form>
<span slot="footer">
<!-- el-button按钮组件点击时关闭对话框设置sortDialogVisible为false按钮尺寸为"small" -->
<el-button @click="sortDialogVisible = false" size="small">取 消</el-button>
<!-- el-button按钮组件按钮类型为"primary"主要按钮样式点击时调用handleUpdateSort方法按钮尺寸为"small",用于确定排序设置操作 -->
<el-button type="primary" @click="handleUpdateSort" size="small"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
// 从'@/api/homeSubject'模块中导入多个函数,用于获取列表、更新推荐状态、删除主题、创建主题以及更新主题排序等操作
import {fetchList,updateRecommendStatus,deleteHomeSubject,createHomeSubject,updateHomeSubjectSort} from '@/api/homeSubject';
// 从'@/api/subject'模块中导入fetchList函数并将其重命名为fetchSubjectList用于获取相关主题列表
import {fetchList as fetchSubjectList} from '@/api/subject';
// 从'@/utils/date'模块中导入formatDate函数用于格式化日期
import {formatDate} from '@/utils/date';
// 定义默认的列表查询参数对象,包含页码、每页数量、专题名称、推荐状态等初始值
const defaultListQuery = {
pageNum: 1,
pageSize: 5,
subjectName: null,
recommendStatus: null
};
// 定义默认的推荐状态选项数组,每个元素包含显示标签和对应的值,用于下拉选择等场景
const defaultRecommendOptions = [
{
label: '未推荐',
value: 0
},
{
label: '推荐中',
value: 1
}
];
export default {
name: 'homeSubjectList',
data() {
return {
// 用于存储当前列表查询的参数初始化为defaultListQuery的副本方便后续修改和重置
listQuery: Object.assign({}, defaultListQuery),
// 存储推荐状态的选项列表初始化为defaultRecommendOptions的副本
recommendOptions: Object.assign({}, defaultRecommendOptions),
// 用于存储获取到的列表数据初始值为null后续会赋值为实际数据
list: null,
// 用于存储列表数据的总条数初始值为null获取数据后更新
total: null,
// 用于标识列表数据是否正在加载的布尔值true表示正在加载初始为false
listLoading: false,
// 存储当前多选的记录数据,初始为空数组,在表格行多选操作时更新
multipleSelection: [],
// 定义批量操作的选项数组,每个元素包含操作的显示标签和对应的值,如设为推荐、取消推荐、删除等
operates: [
{
label: "设为推荐",
value: 0
},
{
label: "取消推荐",
value: 1
},
{
label: "删除",
value: 2
}
],
// 用于存储当前选择的批量操作类型初始值为null用户选择后更新
operateType: null,
// 控制选择专题对话框是否显示的布尔值初始为false点击相关按钮时设置为true来显示对话框
selectDialogVisible: false,
// 存储对话框相关的数据对象,包含列表数据、总条数、多选记录以及列表查询参数等
dialogData: {
list: null,
total: null,
multipleSelection: [],
listQuery: {
keyword: null,
pageNum: 1,
pageSize: 5
}
},
// 控制设置排序对话框是否显示的布尔值初始为false点击相关按钮时设置为true来显示对话框
sortDialogVisible: false,
// 存储设置排序对话框相关的数据对象包含排序值和对应的记录id等
sortDialogData: { sort: 0, id: null }
}
},
created() {
// 在组件创建时调用getList方法用于获取初始的列表数据
this.getList();
},
filters: {
// 过滤器函数用于格式化推荐状态值将数字状态转换为对应的文字描述1转换为"推荐中",其他为"未推荐"
formatRecommendStatus(status) {
if (status === 1) {
return '推荐中';
} else {
return '未推荐';
}
},
// 过滤器函数,用于格式化时间数据,如果时间为空则返回"N/A",否则按照指定格式进行格式化
formatTime(time) {
if (time == null || time === '') {
return 'N/A';
}
let date = new Date(time);
return formatDate(date, 'yyyy-MM-dd hh:mm:ss')
},
},
methods: {
// 处理重置搜索的方法将列表查询参数重置为默认值defaultListQuery的副本
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery);
},
// 处理查询搜索的方法先将页码重置为1然后调用getList方法获取符合查询条件的列表数据
handleSearchList() {
this.listQuery.pageNum = 1;
this.getList();
},
// 处理表格行选择变化的方法更新multipleSelection数组使其存储当前选中的行数据
handleSelectionChange(val) {
this.multipleSelection = val;
},
// 处理每页显示数量变化的方法重置页码为1更新每页显示数量为传入的值然后调用getList方法重新获取列表数据
handleSizeChange(val) {
this.listQuery.pageNum = 1;
this.listQuery.pageSize = val;
this.getList();
},
// 处理当前页码变化的方法更新列表查询参数中的页码为传入的值然后调用getList方法获取对应页码的数据
handleCurrentChange(val) {
this.listQuery.pageNum = val;
this.getList();
},
// 处理推荐状态开关变化的方法调用updateRecommendStatusStatus方法传入当前行的id和推荐状态值用于更新推荐状态
handleRecommendStatusStatusChange(index, row) {
this.updateRecommendStatusStatus(row.id, row.recommendStatus);
},
// 处理删除操作的方法调用deleteSubject方法传入要删除记录的id用于删除对应的主题数据
handleDelete(index, row) {
this.deleteSubject(row.id);
},
// 处理批量操作的方法
// 调用相应的方法处理选中的记录;如果未选择操作类型则提示用户选择类型
handleBatchOperate() {
if (this.multipleSelection < 1) { //首先判断是否选择了记录,如果没有则提示用户选择;
this.$message({
message: '请选择一条记录',
type: 'warning',
duration: 1000
});
return;
}
let ids = []; //然后根据选择的操作类型(设为推荐、取消推荐、删除)
for (let i = 0; i < this.multipleSelection.length; i++) {
ids.push(this.multipleSelection[i].id);
}
if (this.operateType === 0) {
//设为推荐
this.updateRecommendStatusStatus(ids, 1);
} else if (this.operateType === 1) {
//取消推荐
this.updateRecommendStatusStatus(ids, 0);
} else if (this.operateType === 2) {
//删除
this.deleteSubject(ids);
} else {
this.$message({
message: '请选择批量操作类型',
type: 'warning',
duration: 1000
});
}
},
// 处理选择专题操作的方法,将选择专题对话框设置为显示状态,清空对话框中的搜索关键词
handleSelectSubject() {
this.selectDialogVisible = true;
this.dialogData.listQuery.keyword = null;
this.getDialogList();//然后调用getDialogList方法获取对话框中的列表数据
},
// 处理对话框内搜索操作的方法
handleSelectSearch() {
this.getDialogList(); //调用getDialogList方法获取符合搜索条件的对话框中的列表数据
},
// 处理对话框内每页显示数量变化的方法
handleDialogSizeChange(val) {
this.dialogData.listQuery.pageNum = 1; //重置对话框列表查询参数中的页码为1更新每页显示数量为传入的值
this.dialogData.listQuery.pageSize = val;
this.getDialogList(); //然后调用getDialogList方法重新获取列表数据
},
// 处理对话框内当前页码变化的方法,更新对话框列表查询参数中的页码为传入的值
handleDialogCurrentChange(val) {
this.dialogData.listQuery.pageNum = val;
this.getDialogList(); //然后调用getDialogList方法获取对应页码的数据
},
// 处理对话框内行选择变化的方法,更新对话框中存储多选记录的数组,使其存储当前选中的行数据
handleDialogSelectionChange(val) {
this.dialogData.multipleSelection = val;
},
// 处理对话框确认操作的方法,首先判断是否选择了记录,如果没有则提示用户选择;然后将选中的记录整理成特定格式的数组,
handleSelectDialogConfirm() {
if (this.dialogData.multipleSelection < 1) {
this.$message({
message: '请选择一条记录',
type: 'warning',
duration: 1000
});
return;
}
let selectSubjects = [];
for (let i = 0; i < this.dialogData.multipleSelection.length; i++) {
selectSubjects.push({
subjectId: this.dialogData.multipleSelection[i].id,
subjectName: this.dialogData.multipleSelection[i].title
});
}
this.$confirm('使用要进行添加操作?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
createHomeSubject(selectSubjects).then(response => { //// 弹出确认框让用户确认添加操作确认后调用createHomeSubject方法创建主题数据操作成功后关闭对话框、清空多选记录并更新列表数据同时显示成功提示信息
this.selectDialogVisible = false;
this.dialogData.multipleSelection = [];
this.getList();
this.$message({
type: 'success',
message: '添加成功!'
});
});
});
},
// 处理编辑排序操作的方法,将设置排序对话框设置为显示状态
handleEditSort(index, row) {
this.sortDialogVisible = true;
this.sortDialogData.sort = row.sort;
this.sortDialogData.id = row.id; //将当前行的排序值和id赋值给对话框对应的数据对象用于展示和后续更新操作
},
// 处理更新排序的方法,弹出确认框让用户确认修改排序操作
handleUpdateSort() {
this.$confirm('是否要修改排序?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
updateHomeSubjectSort(this.sortDialogData).then(response => { //确认后调用updateHomeSubjectSort方法更新排序数据
this.sortDialogVisible = false;
this.getList();
this.$message({
type: 'success',
message: '删除成功!' //确认后调用updateHomeSubjectSort方法更新排序数据
});
});
})
},
// 获取列表数据的方法
getList() {
this.listLoading = true; //先将列表加载状态设置为true表示正在加载数据
fetchList(this.listQuery).then(response => { //然后调用fetchList函数获取数据
this.listLoading = false; //并将加载状态设置为false表示数据加载完成
this.list = response.data.list; //// 获取成功后更新列表数据和总条数
this.total = response.data.total;
})
},
// 更新推荐状态的方法
updateRecommendStatusStatus(ids, status) {
this.$confirm('是否要修改推荐状态?', '提示', { //先弹出确认框让用户确认是否修改推荐状态
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = new URLSearchParams(); //确认后构建URLSear的chParams对象传递要更新记录id和目标推荐状态值
params.append("ids", ids);
params.append("finalRecommendStatus", status);
updateRecommendStatus(params).then(response => { //// 调用updateRecommendStatus函数进行更新操作
this.getList();
this.$message({
type: 'success',
message: '修改成功!' //操作成功后更新列表数据并显示成功提示信息;
});
});
}).catch(() => {
this.$message({
type: 'success',
message: '已取消操作!' //如果取消操作则显示已取消操作的提示信息并更新列表数据
});
this.getList();
});
},
// 删除主题的方法
deleteSubject(ids) {
this.$confirm('是否要删除该推荐?', '提示', { //弹出确认框让用户确认是否删除主题数据
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = new URLSearchParams(); //确认后构建URLSearchParams对象传递要删除的记录id
params.append("ids", ids);
deleteHomeSubject(params).then(response => { //// 调用deleteHomeSubject函数进行删除操作
this.getList();
this.$message({
type: 'success',
message: '删除成功!' //操作成功后更新列表数据并显示成功提示信息
});
});
})
},
// 获取对话框列表数据的方法
getDialogList() {
fetchSubjectList(this.dialogData.listQuery).then(response => { //调用fetchSubjectList函数传入对话框的列表查询参数
this.dialogData.list = response.data.list; //获取成功后更新对话框中的列表数据和总条数
this.dialogData.total = response.data.total;
})
}
}
}
</script>
<style></style>