|
|
<template> <div class="app-container"> <el-card class="box-card"> <el-row :gutter="20"> <!--部门数据--> <el-col :span="3" :xs="24"> <div class="head-container"> <el-input v-model="deptName" placeholder="请输入分类名称" clearable size="small" prefix-icon="el-icon-search" style="margin-bottom: 20px" :default-expand-all="false" /> </div> <div class="head-container"> <el-tree ref="tree" :data="categoryOptions" highlight-current :props="defaultProps" :expand-on-click-node="false" :filter-node-method="filterNode" @node-click="handleNodeClick" /> </div> </el-col> <!--用户数据--> <el-col :span="20" :xs="24"> <el-form ref="queryForm" :model="listQuery" :inline="true" label-width="68px" > <el-form-item label="文章标题" prop="title"> <el-input v-model="listQuery.title" placeholder="请输入文章标题" clearable size="small" style="width: 160px" @keyup.enter.native="getList" /> </el-form-item> <el-form-item label="文章标签" prop="label_name"> <el-input v-model="listQuery.label_name" placeholder="请输入文章标签" clearable size="small" style="width: 160px" @keyup.enter.native="getList" /> </el-form-item> <el-form-item label="状态" prop="is_offline"> <el-select v-model="listQuery.is_offline" placeholder="文章状态" clearable size="small" style="width: 160px" > <el-option v-for="dict in statusOptions" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="getList" >搜索</el-button > </el-form-item> </el-form> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleCreate" >新增</el-button > </el-col> </el-row> <el-table v-loading="listLoading" :data="list" border fit highlight-current-row style="width: 100%" > <el-table-column label="ID" prop="id" align="center"> <template slot-scope="{ row }"> <span>{{ row.article_id }}</span> </template> </el-table-column> <el-table-column label="分类" align="center"> <template slot-scope="{ row }"> <span>{{ row.category_id | getCateName(categoriesJson) }}</span> </template> </el-table-column> <el-table-column label="标题" align="center"> <template slot-scope="{ row }"> <span>{{ row.title }}</span> </template> </el-table-column> <el-table-column label="封面图" align="center"> <template slot-scope="{ row }"> <img :src="row.img" height="100" /> </template> </el-table-column> <el-table-column label="外链" align="center"> <template slot-scope="{ row }"> <span>{{ row.url }}</span> </template> </el-table-column> <el-table-column label="文章状态" align="center"> <template slot-scope="{ row }"> <div> <el-switch style="display: block" v-model="row.is_offline" active-color="#409EFF" inactive-color="#ff4949" :active-value="2" :inactive-value="1" @change="changeSwitch($event, row)" > </el-switch> </div> </template> </el-table-column> <el-table-column label="标签详情"> <template slot-scope="{ row }"> <span>{{ row.label_name | getTagDetail }}</span> </template> </el-table-column> <el-table-column label="创建时间" align="center"> <template slot-scope="{ row }"> <span>{{ row.create_time }}</span> </template> </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > <template slot-scope="scope"> <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" >修改</el-button > <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" >删除</el-button > </template> </el-table-column> </el-table> <pagination v-show="total > 0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" /> </el-col> </el-row> </el-card>
<!-- 添加或修改分类对话框 --> <el-drawer ref="drawer" :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" direction="rtl" custom-class="demo-drawer" size="950px" > <div class="demo-drawer__content" v-if="dialogFormVisible"> <el-form ref="dataForm" :model="temp" label-position="left" label-width="70px" style > <el-form-item label="类型"> <treeselect v-model="temp.category_id" :options="categoryOptions" :normalizer="normalizer" :show-count="true" :disabled="dialogStatus == 'create'" placeholder="选择分类" /> </el-form-item> <template v-if="tagData.length"> <el-form-item :label="item.label" v-for="(item, index) in tagData" :key="index" > <el-select v-model="chooseTagData[index]" multiple placeholder="请选择" style="width: 100%" > <el-option v-for="(sItem, sIndex) in item.value" :key="sIndex" :label="sItem" :value="sItem" ></el-option> </el-select> </el-form-item> </template> <el-form-item label="标题" prop="title"> <el-input v-model="temp.title" /> </el-form-item> <el-form-item label="作者" prop="title"> <el-input v-model="temp.author" placeholder="请上传视频时填写作者" /> </el-form-item> <el-form-item label="日期" prop="time"> <el-date-picker v-model="temp.time" value-format="yyyy-MM-dd HH:mm:ss" type="date" placeholder="选择日期" ></el-date-picker> </el-form-item> <el-form-item label="外链" prop="url"> <el-input v-model="temp.url" /> </el-form-item> <el-form-item label="描述" prop="description"> <el-input type="textarea" v-model="temp.description" /> </el-form-item> <el-form-item label="状态"> <el-radio-group v-model="temp.is_offline" @change="changeRadio"> <el-radio :label="2">上线</el-radio> <el-radio :label="1">下线</el-radio> </el-radio-group> </el-form-item> <el-form-item label="封面" prop="img" required> <img v-if="temp.img" :src="temp.img" class="el-upload el-upload--picture-card" style="float: left; width: auto" /> <el-upload ref="sys_app_logo" :on-success="uploadSuccess" :on-error="uploadError" :action="uploadAction" style="float: left" list-type="picture-card" :show-file-list="false" :before-upload="validationImages" > <i class="el-icon-plus" /> </el-upload> <div v-if="validation === false" style="padding-left: 10px; color: red" > 提示:宽高{{ dislabelSize.width }}x{{ dislabelSize.height }} </div> </el-form-item> <el-form-item prop="file" label="上传脚本"> <el-upload class="upload-demo" :action="uploadAction" :limit="1" :on-exceed="handleFileExceed" :onSuccess="uploadFileSuccess" :file-list="temp.script_url ? [JSON.parse(temp.script_url)] : []" > <el-button size="small" type="primary">点击上传</el-button> <!-- <div slot="tip" class="el-upload__tip"> 只能上传jpg/png文件,且不超过500kb </div>--> </el-upload> </el-form-item> <el-form-item label="视频时长" prop="video_time"> <el-time-picker v-model="temp.video_time" value-format="HH:mm:ss" type="time" placeholder="选择时间" ></el-time-picker> </el-form-item> <el-form-item label="内容" class="editor-box"> <vue-ueditor-wrap v-model="temp.content" :config="ueditorConfig" :destroy="true" v-if="dialogFormVisible" /> </el-form-item> </el-form> <div class="demo-drawer__footer"> <el-button type="primary" @click="submitForm">确 定</el-button> <el-button @click="dialogFormVisible = false">取 消</el-button> </div> </div> </el-drawer> </div> </template>
<script> import { validPhone, isEmpty } from "@/utils/validate"; import { fetchList, createArticle, updateArticle, delArticle, fetchArticleDetails, } from "@/api/article"; import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
import VueUeditorWrap from "vue-ueditor-wrap"; import { listCategory } from "@/api/category"; import Treeselect from "@riophae/vue-treeselect"; import "@riophae/vue-treeselect/dist/vue-treeselect.css"; import { log } from "console";
export default { name: "articleIndex", components: { Pagination, Treeselect, VueUeditorWrap }, data() { return { deptName: "", defaultProps: { children: "children", label: "category_name", }, // 状态数据字典
statusOptions: [ { value: "", label: "全部" }, { value: 2, label: "上线" }, { value: 1, label: "下线" }, ], categoryOptionsLeft: undefined, tableKey: 0, list: null, total: 0, listLoading: true, listQuery: { page: 1, limit: 20, is_offline: "", title: "", label_name: "", category_id: undefined, author: "", //作者
}, // accountRules: {
// phone: [{ required: true, trigger: 'blur', validator: RulePhone }],
// wam_name: [{ required: true, trigger: 'blur', validator: RuleEmpty }]
// },
ueditorConfig: { UEDITOR_HOME_URL: "/UEditor/", serverUrl: process.env.VUE_APP_BASE_API + "/files/baiduUp", initialFrameHeight: 300, scaleEnabled: true, }, uploadAction: process.env.VUE_APP_BASE_API + "/files/uploadFile", temp: { id: undefined, category_id: undefined, title: "", time: "", img: "", script_url: "", content: "", description: "", video_time: "", is_offline: 2, }, dialogFullscreen: true, dialogFormVisible: false, dialogStatus: "", textMap: { update: "编辑", create: "添加", }, rules: { title: [ { required: true, message: "title is required", trigger: "blur" }, ], }, categoryOptions: [], // categoriesJson:[],
downloadLoading: false, // tagData:[],
chooseTagData: [], // 是否允许上传
validation: true, // 正确的图片宽高
dislabelSize: {}, }; }, mounted() { this.getList(); this.getTreeselect(); }, computed: { categoriesJson() { var res = this.handleCategory(this.categoryOptions); return res; }, tagData() { let matchData = null; this.categoriesJson.forEach((item) => { if (item.id == this.temp.category_id) { matchData = item.label_name; } }); return matchData ? JSON.parse(matchData) : []; }, }, watch: { dialogFormVisible(newVal) { if (newVal === false) { this.validation = true; } }, tagData(newVal) { console.log("tagDAta"); console.log(newVal); if (!newVal.length) { this.chooseTagData = []; } }, chooseTagData(newVal) { console.log("chooseTagData"); console.log(newVal); }, // 根据名称筛选部门树
deptName(val) { this.$refs.tree.filter(val); }, }, filters: { getCateName(id, categoriesJson) { for (var i = 0; i < categoriesJson.length; i++) { if (id == categoriesJson[i].id) { return categoriesJson[i].name; } } }, getTagDetail(data) { if (!data) { return; } let str = ""; data = JSON.parse(data); data.forEach((item) => { if (item.value.length) { str += `${item.label}:${item.value.join("、")};`; } }); return str; }, }, methods: { changeRadio(e) { this.temp.is_offline = Number(e); }, // 文章开关发生变化
changeSwitch(e, item) { item.is_offline = Number(e); updateArticle(item).then((r) => { this.$message({ type: "success", message: `${e == 2 ? "通知:文章上线成功" : "通知:文章下线成功"}`, }); }); }, // 验证图片宽高
async validationImages(file) { let res = await this.$getImgWidth(file, this.temp.category_id); this.validation = res.validation; this.dislabelSize = res; return res.validation; }, // 节点单击事件
handleNodeClick(data) { this.listQuery.category_id = data.id; this.getList(); }, handleCategory(array) { var res = []; array.forEach((item, index) => { let obj = {}; obj.id = item.category_id; obj.name = item.category_name; obj.label_name = item.label_name; res.push(obj); if (item.children) { res.push(...this.handleCategory(item.children)); } }); return res; }, // 筛选节点
filterNode(value, data) { if (!value) return true; return data.category_name.indexOf(value) !== -1; }, getList() { this.listLoading = true; fetchList(this.listQuery).then((response) => { console.log(response); this.list = response.data.list; this.total = response.data.count; // Just to simulate the time of the request
setTimeout(() => { this.listLoading = false; }, 1.5 * 1000); }); }, handleFilter() { this.listQuery.page = 1; this.getList(); }, handleModifyStatus(row, status) { this.$message({ message: "操作Success", type: "success", }); row.status = status; }, resetTemp() { this.temp = { id: undefined, category_id: undefined, title: "", time: "", img: "", is_offline: 2, script_url: "", content: "", description: "", video_time: "", }; }, submitForm() { let matchData = [...this.tagData]; this.chooseTagData.forEach((item, index) => { matchData[index]["value"] = item; }); this.temp.label_name = JSON.stringify(matchData); if (this.dialogStatus == "create") { this.createData(); } else if (this.dialogStatus == "update") { this.updateData(); } }, handleCreate() { this.resetTemp(); this.temp.category_id = this.listQuery.category_id; this.dialogStatus = "create"; this.dialogFormVisible = true; this.$nextTick(() => { this.$refs["dataForm"].clearValidate(); }); }, createData() { // this.$refs['dataForm'].validate((valid) => {
// if (valid) {
createArticle(this.temp).then(() => { this.dialogFormVisible = false; this.$message({ message: "添加成功", type: "success", duration: 2 * 1000, }); this.getList(); }); // }
// })
}, handleUpdate(row) { let article_id = row.article_id; this.dialogStatus = "update"; this.resetTemp(); this.dialogFormVisible = true; fetchArticleDetails({ article_id }).then((res) => { if (!res.data.is_offline) { res.data.is_offline = 2; } this.temp = res.data; if (this.temp.label_name) { let data = JSON.parse(this.temp.label_name); data.forEach((item, index) => { this.chooseTagData[index] = item.value; }); }
this.$nextTick(() => { this.$refs["dataForm"].clearValidate(); }); }); }, updateData() { // this.$refs['dataForm'].validate((valid) => {
// if (valid) {
updateArticle(this.temp).then(() => { this.dialogFormVisible = false; this.$message({ message: "更新成功", type: "success", duration: 2 * 1000, });
this.getList(); }); // }
// })
}, handleDelete({ title, article_id }) { this.$confirm('是否确认删除名称为"' + title + '"的数据项?', "警告", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", }) .then(function () { console.log("del"); return delArticle({ article_id }); }) .then((response) => { if (response.code === 200) { this.$message({ message: "删除分类成功", type: "success", duration: 2 * 1000, }); this.open = false; this.getList(); } else { this.$message({ message: "删除分类失败", type: "error", duration: 2 * 1000, }); } }) .catch(function () {}); }, uploadSuccess(response, file) { if (response.state == "SUCCESS" && this.validation) { this.temp.img = response.url; } // const uid = file.uid;
// const objKeyArr = Object.keys(this.listObj);
// for (let i = 0, len = objKeyArr.length; i < len; i++) {
// if (this.listObj[objKeyArr[i]].uid === uid) {
// this.listObj[objKeyArr[i]].url = this.config.qiniuHost + response.key;
// this.listObj[objKeyArr[i]].hasSuccess = true;
// return;
// }
// }
}, uploadFileSuccess(response, file) { let obj = {}; obj.name = response.original; obj.url = response.url; this.temp.script_url = JSON.stringify(obj); }, handleFileExceed(files, fileList) { this.$message.warning("只允许上传一个脚本"); }, uploadRemove(file) { const uid = file.uid; const objKeyArr = Object.keys(this.listObj); for (let i = 0, len = objKeyArr.length; i < len; i++) { if (this.listObj[objKeyArr[i]].uid === uid) { delete this.listObj[objKeyArr[i]]; return; } } }, uploadError(err) { this.$alert(err, "发生错误", { confirmButtonText: "确定", callback: (action) => {}, }); }, /** 查询分类下拉树结构 */ getTreeselect() { listCategory().then((response) => { this.categoryOptions = []; this.categoryOptions.push(...response.data); }); }, /** 转换分类数据结构 */ normalizer(node) { if (node.children && !node.children.length) { delete node.children; } return { id: node.category_id, label: node.category_name, children: node.children, }; }, // 选择类别,获取对应的标签数据
chooseCategory(node) { this.tagData = node.label_name ? JSON.parse(node.label_name) : []; }, }, }; </script> <style lang="scss" scoped> .app-container { .filter-container { margin-left: 5px; margin-bottom: 6px; } ::v-deep .el-drawer__body { padding: 20px; } .editor-box { ::v-deep .el-form-item__content { line-height: 20px; } } } </style>
|