|
@@ -0,0 +1,309 @@
|
|
|
+<template>
|
|
|
+ <div class="box">
|
|
|
+ <el-card class="box-card">
|
|
|
+ <div slot="header" class="clearfix">
|
|
|
+ <span>期刊目录</span>
|
|
|
+ <el-button style="float: right; padding: 3px 0" type="text" @click="addcatalogue">添加期刊</el-button>
|
|
|
+ </div>
|
|
|
+ <div class="main">
|
|
|
+ <naf-grid class="grid" ref="grid" @edit="filtereEdit" @delete="filterDelete" :data="catalogueList" :meta="filed" :total="Total" @query="filterQuery"></naf-grid>
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+ <el-card class="box-dj" v-if="visibleSync">
|
|
|
+ <div slot="header" class="clearfix">
|
|
|
+ <span>{{ isNew ? '修改期刊' : '添加期刊' }}</span>
|
|
|
+ <span class="close" @click="close">x</span>
|
|
|
+ </div>
|
|
|
+ <div class="main">
|
|
|
+ <naf-form ref="ruleForm" @save="formSave" :meta="formfiled" :rules="formrules" :data="formdata" :close="true" @close="close">
|
|
|
+ <template v-slot:field="{ form, item }">
|
|
|
+ <!-- 选择日期 -->
|
|
|
+ <el-date-picker
|
|
|
+ value-format="yyyy-MM-dd"
|
|
|
+ v-model="form[item.name]"
|
|
|
+ v-if="item.name == 'date'"
|
|
|
+ type="date"
|
|
|
+ placeholder="选择日期">
|
|
|
+ </el-date-picker>
|
|
|
+ <!-- 绑定栏目 -->
|
|
|
+ <el-select multiple v-if="item.name == 'bind'" v-model="form[item.name]" placeholder="请选择绑定栏目">
|
|
|
+ <el-option
|
|
|
+ v-for="item in columnList"
|
|
|
+ :key="item._id"
|
|
|
+ :label="item.name"
|
|
|
+ :value="item.code">
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ <!-- 附件上传 -->
|
|
|
+ <el-upload
|
|
|
+ v-if="item.name == 'url'"
|
|
|
+ :headers="myHeaders"
|
|
|
+ class="upload-demo"
|
|
|
+ action="/api/files/upload"
|
|
|
+ :on-success="handleAnnexSuccess"
|
|
|
+ :data="{ type: 'pdf' }"
|
|
|
+ :on-remove="handleRemove"
|
|
|
+ :before-upload="beforeFilesUpload"
|
|
|
+ :limit="1"
|
|
|
+ :on-exceed="handleExceed"
|
|
|
+ :file-list="fileList">
|
|
|
+ <el-button size="small" type="primary">PDF上传</el-button>
|
|
|
+ </el-upload>
|
|
|
+ </template>
|
|
|
+ </naf-form>
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+<script>
|
|
|
+import nafGrid from '@naf/data/tables/naf-grid'
|
|
|
+import nafForm from '@naf/data/form'
|
|
|
+import { createNamespacedHelpers } from 'vuex'
|
|
|
+const { mapState, mapActions } = createNamespacedHelpers('journal')
|
|
|
+const { mapState: columnmapState, mapActions: columnmapActions } = createNamespacedHelpers('column')
|
|
|
+const token = sessionStorage.getItem('token')
|
|
|
+export default {
|
|
|
+ components: {
|
|
|
+ nafGrid,
|
|
|
+ nafForm
|
|
|
+ },
|
|
|
+ data () {
|
|
|
+ return {
|
|
|
+ isNew: false,
|
|
|
+ isClear: false,
|
|
|
+ info: {},
|
|
|
+ lookUser: false,
|
|
|
+ fileList: [],
|
|
|
+ myHeaders: { Authorization: `Bearer ${token}` },
|
|
|
+ title: '',
|
|
|
+ visibleSync: false,
|
|
|
+ filed: [
|
|
|
+ { name: 'name', title: '标题', filter: true },
|
|
|
+ { name: 'date', title: '时间' },
|
|
|
+ { name: 'url', title: '文件路径' }
|
|
|
+ ],
|
|
|
+ formdata: {},
|
|
|
+ formfiled: [
|
|
|
+ { name: 'name', title: '标题' },
|
|
|
+ { name: 'describe', title: '描述' },
|
|
|
+ { name: 'status', title: '状态', formatter: 'journalStatus' },
|
|
|
+ { name: 'date', title: '时间', slots: 'field' },
|
|
|
+ { name: 'bind', title: '绑定栏目', slots: 'field' },
|
|
|
+ { name: 'url', title: 'PDF上传', slots: 'field' }
|
|
|
+ ],
|
|
|
+ formrules: {
|
|
|
+ name: [
|
|
|
+ { required: true, message: '请输入标题', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ describe: [
|
|
|
+ { required: true, message: '请输入描述', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ status: [
|
|
|
+ { required: true, message: '请选择状态', trigger: 'chage' }
|
|
|
+ ],
|
|
|
+ date: [
|
|
|
+ { required: true, message: '请输入时间', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ column: [
|
|
|
+ { required: true, message: '请输选择栏目', trigger: 'chage' }
|
|
|
+ ],
|
|
|
+ bind: [
|
|
|
+ { required: true, message: '请输选择栏目', trigger: 'chage' }
|
|
|
+ ],
|
|
|
+ url: [
|
|
|
+ { required: true, message: '请输选择PDF', trigger: 'chage' }
|
|
|
+ ],
|
|
|
+ content: [
|
|
|
+ { required: true, message: '请输输入内容', trigger: 'blur' }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ operation: [
|
|
|
+ { name: 'user', label: '读者', icon: 'el-icon-user' },
|
|
|
+ { name: 'edit', label: '修改', icon: 'el-icon-edit' },
|
|
|
+ { name: 'delete', label: '删除', icon: 'el-icon-delete' }
|
|
|
+ ],
|
|
|
+ userfiled: [
|
|
|
+ { name: 'name', label: '名称' },
|
|
|
+ { name: 'phone', label: '手机号' }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ ...mapState(['catalogueList', 'Total', 'journalList', 'userList', 'userTotal']),
|
|
|
+ ...columnmapState(['columnList'])
|
|
|
+ },
|
|
|
+ async created () {
|
|
|
+ await this.columnQuery({ paging: { page: 0, size: 100 } })
|
|
|
+ await this.filterQuery()
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ ...mapActions(['catalogueQuery', 'catalogueCreate', 'catalogueUpdate', 'catalogueDelete', 'catalogueFetch', 'journalQuery', 'userQuery']),
|
|
|
+ ...columnmapActions(['columnQuery']),
|
|
|
+ // 关闭弹窗
|
|
|
+ close () {
|
|
|
+ this.visibleSync = false
|
|
|
+ this.fileList = []
|
|
|
+ },
|
|
|
+ // 添加
|
|
|
+ addcatalogue () {
|
|
|
+ this.formdata = {}
|
|
|
+ this.title = '添加期刊'
|
|
|
+ this.visibleSync = true
|
|
|
+ this.isNew = false
|
|
|
+ },
|
|
|
+ // 修改
|
|
|
+ async filtereEdit (e) {
|
|
|
+ this.formdata = e
|
|
|
+ this.fileList.push({ name: e.filename, url: e.url })
|
|
|
+ this.title = '修改期刊'
|
|
|
+ this.visibleSync = true
|
|
|
+ this.isNew = true
|
|
|
+ },
|
|
|
+ // 删除
|
|
|
+ async filterDelete (e) {
|
|
|
+ this.$confirm('请确认删除', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning'
|
|
|
+ }).then(async () => {
|
|
|
+ const res = await this.catalogueDelete({ id: e?._id })
|
|
|
+ // eslint-disable-next-line eqeqeq
|
|
|
+ if (res.errcode == 0) {
|
|
|
+ this.$message.success('操作成功')
|
|
|
+ this.filterQuery()
|
|
|
+ this.$refs.grid.resetpage(-1)
|
|
|
+ }
|
|
|
+ }).catch((err) => {
|
|
|
+ console.log(err)
|
|
|
+ this.$message({
|
|
|
+ type: 'info',
|
|
|
+ message: '已取消删除'
|
|
|
+ })
|
|
|
+ })
|
|
|
+ },
|
|
|
+ // 查询
|
|
|
+ async filterQuery ({ filter = {}, paging = { page: 0, size: 10 } } = {}) {
|
|
|
+ await this.catalogueQuery({ filter, paging })
|
|
|
+ },
|
|
|
+ // 表单保存
|
|
|
+ async formSave (e) {
|
|
|
+ console.log(e, 'eee')
|
|
|
+ let res
|
|
|
+ if (this.isNew) {
|
|
|
+ // 修改
|
|
|
+ res = await this.catalogueUpdate(e)
|
|
|
+ } else {
|
|
|
+ // 添加
|
|
|
+ res = await this.catalogueCreate(e)
|
|
|
+ }
|
|
|
+ // eslint-disable-next-line eqeqeq
|
|
|
+ if (res.errcode == 0) {
|
|
|
+ this.$message.success('操作成功')
|
|
|
+ this.filterQuery()
|
|
|
+ this.$refs.grid.resetpage(-1)
|
|
|
+ this.visibleSync = false
|
|
|
+ this.fileList = []
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 富文本改变
|
|
|
+ editChage (e) {
|
|
|
+ this.$refs.formData.setForm('content', e)
|
|
|
+ },
|
|
|
+ // 附件上传
|
|
|
+ handleAnnexSuccess (res, file) {
|
|
|
+ this.$refs.ruleForm.formChage('filename', res.data.name)
|
|
|
+ this.$refs.ruleForm.formChage('url', res.data.path)
|
|
|
+ this.fileList.push({ name: res.data.name, url: res.data.path })
|
|
|
+ },
|
|
|
+ // 删除附件列表
|
|
|
+ handleRemove (file, fileList) {
|
|
|
+ this.$refs.ruleForm.formChage('filename', null)
|
|
|
+ this.$refs.ruleForm.formChage('url', null)
|
|
|
+ delete this.fileList[0]
|
|
|
+ },
|
|
|
+ beforeFilesUpload (file) {
|
|
|
+ const isType = file.type === 'application/pdf'
|
|
|
+ // const isLt2M = file.size / 1024 / 1024 < 5
|
|
|
+ if (!isType) {
|
|
|
+ this.$message.error('请上传正确格式')
|
|
|
+ }
|
|
|
+ // if (!isLt2M) {
|
|
|
+ // this.$message.error('上传图片大小不能超过 5MB!')
|
|
|
+ // }
|
|
|
+ return isType
|
|
|
+ },
|
|
|
+ // 文件超出个数限制时的钩子
|
|
|
+ handleExceed (files, fileList) {
|
|
|
+ this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+<style lang="less" scoped>
|
|
|
+.box {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ position: relative;
|
|
|
+ .box-card {
|
|
|
+ height: 100%;
|
|
|
+ .el-card__body {
|
|
|
+ height: 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+.el-upload {
|
|
|
+ border: 1px dashed #d9d9d9;
|
|
|
+ border-radius: 6px;
|
|
|
+ cursor: pointer;
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+.el-upload:hover {
|
|
|
+ border-color: #409EFF;
|
|
|
+}
|
|
|
+.clearfix {
|
|
|
+ position: relative;
|
|
|
+ .close {
|
|
|
+ position: absolute;
|
|
|
+ right: 10px;
|
|
|
+ top: 0;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+}
|
|
|
+.box-dj {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ top: 0;
|
|
|
+ z-index: 999;
|
|
|
+ /deep/ .el-card__body {
|
|
|
+ height: 90%;
|
|
|
+ overflow-y: auto;
|
|
|
+ width: 100%;
|
|
|
+ .main {
|
|
|
+ width: 60%;
|
|
|
+ margin: 0 auto;
|
|
|
+ margin-bottom: 4em;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+.avatar-uploader {
|
|
|
+ border: 1px dashed #d9d9d9;
|
|
|
+ border-radius: 6px;
|
|
|
+ cursor: pointer;
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+.avatar-uploader .el-upload:hover {
|
|
|
+ border-color: #409EFF;
|
|
|
+}
|
|
|
+.avatar-uploader-icon {
|
|
|
+ font-size: 28px;
|
|
|
+ color: #8c939d;
|
|
|
+ width: 150px;
|
|
|
+ height: 150px;
|
|
|
+ line-height: 150px;
|
|
|
+ text-align: center;
|
|
|
+}
|
|
|
+</style>
|