粒子研究院后台前端
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.
 
 
 
 

532 lines
16 KiB

<template>
<div class="page">
<p class="page-name mb">新增栏目</p>
<el-form :model="form" :rules="rules" class="input-form model" label-width="120px">
<div class="item-line">
<el-form-item prop="columnName" label="栏目名称">
<el-input
placeholder="请输入栏目名称"
v-model.trim="form.columnName"
clearable
maxlength="15"
@change="nameChange"
></el-input>
</el-form-item>
<el-form-item prop="fatherId" label="设置上级">
<el-cascader
v-model="form.fatherId"
:options="columns"
:props="columnProps"
clearable></el-cascader>
</el-form-item>
</div>
<div class="item-line">
<el-form-item prop="typeId" label="栏目类型">
<el-select v-model="form.typeId" @change="typeChange">
<el-option
v-for="item in types"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="pageSize" label="分页条数">
<el-input-number v-model="form.pageSize" :min="0" class="auto"></el-input-number>
</el-form-item>
<el-form-item prop="menuVisible" label="导航菜单可见">
<el-switch
v-model="form.menuVisible"
:active-value="0"
:inactive-value="1">
</el-switch>
</el-form-item>
</div>
<div class="line"></div>
<template v-if="form.typeId === 1 || form.typeId === 4">
<el-form-item prop="columnBanner" label="栏目banner">
<el-upload
class="avatar-uploader avatar-uploader-lg"
accept=".jpg,.png,.jpeg,.gif"
:before-upload="beforeUpload"
:on-remove="handleRemove"
:on-error="uploadError"
:on-success="uploadSuccess"
:limit="1"
:on-exceed="handleExceed"
:show-file-list="false"
:action="this.api.upload"
:data="{
quote: form.columnName,
site: '粒子研究院中文站点',
uploader: userName
}"
>
<img v-if="form.columnBanner" :src="form.columnBanner" class="avatar">
<div class="uploader-default" v-else>
<img class="plus" src="@/assets/img/plus.png" alt="">
<p>点击上传</p>
</div>
<div slot="tip" class="el-upload__tip">
<p>请上传1920x500PX,1M以内的jpg,bmp,png格式</p>
</div>
</el-upload>
</el-form-item>
<el-form-item prop="templateId" label="栏目模板">
<el-select v-model="form.templateId">
<el-option
v-for="item in templates"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="listStyleId" label="列表样式">
<ul class="styles">
<li>
<div class="review">
<img src="@/assets/img/list1.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="1">图片列表</el-radio>
</li>
<li>
<div class="review">
<img src="@/assets/img/list2.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="2">新闻列表</el-radio>
</li>
<li>
<div class="review">
<img src="@/assets/img/list2.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="3">出版物列表</el-radio>
</li>
</ul>
</el-form-item>
<el-form-item prop="detailStyle" label="详情样式">
<ul class="styles">
<li>
<div class="review">
<img src="@/assets/img/article1.png" alt="">
</div>
<el-radio v-model="form.detailStyle" :label="1">视频详情</el-radio>
</li>
<li>
<div class="review">
<img src="@/assets/img/article2.png" alt="">
</div>
<el-radio v-model="form.detailStyle" :label="2">富文本</el-radio>
</li>
<li>
<div class="review">
<img src="@/assets/img/article3.png" alt="">
</div>
<el-radio v-model="form.detailStyle" :label="3">链接</el-radio>
</li>
</ul>
</el-form-item>
</template>
<template v-if="form.typeId === 2">
<el-form-item prop="connectionType" label="连接类型">
<el-radio-group v-model="form.connectionType">
<el-radio :label="1">站内链接</el-radio>
<el-radio :label="2">站外链接</el-radio>
<el-radio :label="3">其他站点链接</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-show="form.connectionType === 1" label="站内链接">
<el-cascader
v-model="links"
:options="columns"
:props="columnProps"
clearable></el-cascader>
</el-form-item>
<el-form-item v-show="form.connectionType === 2" prop="linkAddress" label="站外链接">
<el-input
placeholder="请输入站外链接"
v-model.trim="form.linkAddress"
clearable
></el-input>
</el-form-item>
<template v-if="form.connectionType === 3">
<el-form-item prop="siteSelection" label="站点选择">
<el-select v-model="form.siteSelection">
<el-option
v-for="item in sites"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="栏目">
<el-cascader
:options="links"
:props="{ checkStrictly: true }"
clearable></el-cascader>
</el-form-item>
</template>
<el-form-item prop="isOpen" label="新窗口打开">
<el-switch
v-model="form.isOpen"
:active-value="1"
:inactive-value="0">
</el-switch>
</el-form-item>
</template>
<template v-if="form.typeId === 3">
<el-form-item prop="templateId" label="栏目模板">
<el-select v-model="form.templateId">
<el-option
v-for="item in templates"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="listStyleId" label="列表样式">
<ul class="styles">
<li>
<div class="review">
<img src="@/assets/img/list1.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="1">图片列表</el-radio>
</li>
<li>
<div class="review">
<img src="@/assets/img/list2.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="2">新闻列表</el-radio>
</li>
<li>
<div class="review">
<img src="@/assets/img/list2.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="3">出版物列表</el-radio>
</li>
</ul>
</el-form-item>
</template>
<el-form-item v-show="form.typeId === 4" prop="showWithDetails" label="只有一篇文章时,以详情方式展示">
<el-switch
v-model="form.showWithDetails"
:active-value="1"
:inactive-value="0">
</el-switch>
</el-form-item>
</el-form>
<div class="btns">
<el-button type="primary" @click="submit">确定</el-button>
<el-button @click="$router.back()">取消</el-button>
</div>
</div>
</template>
<script>
import util from "@/libs/util";
import ColumnConst from '@/const/column'
import { mapState } from 'vuex'
export default {
data() {
return {
siteId: this.$store.state.content.site.id,
isEdit: this.$route.query.type === 'edit',
nameRepeat: false,
types: ColumnConst.types,
templates: ColumnConst.templates,
sites: ColumnConst.sites,
columns: [],
columnProps: {
checkStrictly: true,
value: 'id',
label: 'columnName'
},
links: [],
form: {
siteId: this.$store.state.content.site.id,
id: this.$route.query.id || '',
founderId: +this.$store.state.user.userId,
editorId: +this.$store.state.user.userId,
fatherId: +this.$route.query.id || 0,
level: this.$route.query.level || 1,
columnName: '',
typeId: 1,
pageSize: 10,
menuVisible: 0,
columnBanner: '',
templateId: 1,
listStyleId: 1,
detailStyle: 1,
connectionType: 1,
linkAddress : '',
showWithDetails: 0,
siteSelection: 1,
status: 1,
sort: 1,
isOpen: 1
},
rules: {
columnName: [
{ required: true, message: '请输入栏目名称', trigger: 'blur' }
],
typeId: [
{ required: true, message: '请选择栏目类型', trigger: 'change' }
],
pageSize: [
{ required: true, message: '请输入分页条数', trigger: 'blur' }
],
templateId: [
{ required: true, message: '请输入栏目名称', trigger: 'blur' }
],
listStyleId: [
{ required: true, message: '请选择栏目模板', trigger: 'change' }
],
detailStyle: [
{ required: true, message: '请选择详情样式', trigger: 'change' }
],
connectionType: [
{ required: true, message: '请选择连接类型', trigger: 'blur' }
],
},
submiting: false, // 新增编辑防抖标识
updateTime: 0
};
},
computed: {
...mapState('user', [
'userName'
])
},
mounted() {
this.$store.commit('user/SET_CRUMBS', [
{
name: '站点管理',
route: '/site'
},
{
name: '内容管理'
},
{
name: '栏目管理',
route: '/column'
},
{
name: this.$route.query.type === 'edit' ? '编辑' : '新增'
}
])
this.getList()
this.isEdit && this.getData()
},
watch: {
// 监听信息是否有更改,有的话页面离开的时候要询问是否要保存
form: {
handler(val){
this.updateTime++
},
deep:true
},
},
methods: {
// 获取栏目列表
getList() {
this.$post(this.api.listWithTree, {
siteId: this.siteId,
columnName: '',
templateId: '',
typeId : '',
}).then(({ data }) => {
this.columns = data
}).catch(err => {})
},
// 获取详情
getData() {
this.$post(`${this.api.findColumn}?id=${this.form.id}`).then(({ data }) => {
this.form = data
}).catch(err => {})
},
// 赋值上级
setFatherId() {
},
// 栏目名称判重
nameChange(){
const { columnName, level, id } = this.form
if (columnName && columnName !== this.originalName) {
this.$post(this.api.sameLevelJudgment, {
siteId: this.siteId,
columnName,
level: +level,
id: +id || ''
}).then(res => {
this.nameRepeat = false
}).catch(res => {
this.nameRepeat = true
})
}else{
this.nameRepeat = false
}
},
// 栏目类型回调
typeChange(val) {
},
// 导入前的钩子
beforeUpload(file) {
const { size, name } = file
const ext = name.substring(name.lastIndexOf('.') + 1)
if (!util.isImg(ext)) {
this.$message.error('请上传图片!')
return false
}
if (size / 1024 / 1024 > 1) {
this.$message.error('请上传1M以内的图片!')
return false
}
},
uploadError(err, file, fileList) {
this.$message({
message: "上传出错,请重试!",
type: "error",
center: true
})
},
handleExceed(files, fileList) {
util.errorMsg(`当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!`);
},
handleRemove(file, fileList) {
this.form.columnBanner = ''
},
uploadSuccess(res) {
this.form.columnBanner = res.data.url
},
// 预览
preview() {
},
// 提交
submit() {
if (this.submiting) return false
const { form } = this
if (!form.columnName) return util.errorMsg('请填写栏目名称')
if (this.nameRepeat) return util.errorMsg('同级下已存在重复栏目!')
if (!form.pageSize) return util.errorMsg('请填写分页条数')
if (typeof form.fatherId === 'object') form.fatherId = form.fatherId[form.fatherId.length - 1]
if (form.typeId === 2 && form.connectionType !== 2) {
const { links } = this
if (!links.length && form.connectionType === 1) return util.errorMsg('请选择站内链接')
if (!links.length && form.connectionType === 3) return util.errorMsg('请选择栏目')
form.linkAddress = links.join()
}
this.submiting = true
if (this.isEdit) {
delete form.children
form.editorId = +this.$store.state.user.userId
this.$post(this.api.updateColumn, form).then(res => {
util.successMsg("修改成功")
this.$router.back()
}).catch(err => {
this.submiting = false
})
} else {
this.$post(this.api.saveColumn, form).then(res => {
util.successMsg("创建成功")
this.$router.back()
}).catch(err => {
this.submiting = false
})
}
}
}
};
</script>
<style lang="scss" scoped>
$upload-width: 220px;
$upload-height: 102px;
$upload-lg-height: 102px;
/deep/ .avatar-uploader {
.el-upload {
position: relative;
width: $upload-width;
height: $upload-height;
border: 1px solid #DCDEE0;
border-radius: 2px;
cursor: pointer;
overflow: hidden;
.uploader-default {
display: flex;
height: $upload-height;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
background: #FAFAFA;
p {
margin-top: 10px;
font-size: 14px;
color: #333;
line-height: 20px;
}
}
}
&.avatar-uploader-lg {
.el-upload {
width: 100%;
max-width: 820px;
height: $upload-lg-height;
.uploader-default {
height: $upload-lg-height;
}
}
}
.avatar {
display: block;
width: $upload-width;
height: $upload-height;
}
.avatar-lg {
display: block;
width: 100%;
height: $upload-lg-height;
}
.el-upload__tip {
margin-top: 0;
p {
font-size: 12px;
color: #333;
}
}
}
.style-wrap {
display: flex;
margin-top: 10px;
.label {
margin-right: 30px;
}
}
.styles {
display: inline-flex;
li {
margin-right: 20px;
text-align: center;
&:hover .review {
border-color: #2962FF;
}
}
.review {
display: flex;
justify-content: center;
align-items: center;
width: 170px;
height: 112px;
margin-bottom: 10px;
border: 1px solid #DCDEE0;
border-radius: 2px;
}
}
/deep/.input-form .auto .el-input {
width: 119px;
}
</style>