314 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			314 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="addHot">
 | |
|     <ai-detail>
 | |
|       <template slot="title">
 | |
|         <ai-title :title="isEdit?'编辑话题':'添加话题'" :isShowBack="true" :isShowBottomBorder="true"
 | |
|                   @onBackClick="$emit('goBack')"></ai-title>
 | |
|       </template>
 | |
|       <template slot="content">
 | |
|         <ai-card title="标题信息">
 | |
|           <template #content>
 | |
|             <el-form ref="baseForm" :model="baseForm" :rules="baseRules" label-width="80px" label-position="right">
 | |
|               <el-form-item label="话题标题" prop="title">
 | |
|                 <el-input v-model.trim="baseForm.title" placeholder="请输入..." size="small" show-word-limit
 | |
|                           :maxlength="100"></el-input>
 | |
|               </el-form-item>
 | |
|               <el-form-item label="封面图片" prop="thumbUrl">
 | |
|                 <ai-uploader :instance="instance" :limit="1" v-model="baseForm.thumbUrl" isShowTip></ai-uploader>
 | |
|               </el-form-item>
 | |
|               <el-form-item label="关键词" prop="keyWords">
 | |
|                 <el-tag
 | |
|                   :key="tag"
 | |
|                   v-for="tag in baseForm.keyWords"
 | |
|                   closable
 | |
|                   :disable-transitions="false"
 | |
|                   effect="plain"
 | |
|                   @close="handleClose(tag)">
 | |
|                   {{tag}}
 | |
|                 </el-tag>
 | |
|                 <el-input
 | |
|                   class="input-new-tag"
 | |
|                   v-if="inputVisible"
 | |
|                   v-model="inputValue"
 | |
|                   ref="saveTagInput"
 | |
|                   size="small"
 | |
|                   show-word-limit
 | |
|                   :maxlength="15"
 | |
|                   @keyup.enter.native="handleInputConfirm"
 | |
|                   @blur="handleInputConfirm"
 | |
|                 >
 | |
|                 </el-input>
 | |
|                 <el-button v-else class="button-new-tag" icon="iconfont iconAdd" size="small" @click="showInput">添加
 | |
|                 </el-button>
 | |
|               </el-form-item>
 | |
|             </el-form>
 | |
|           </template>
 | |
|         </ai-card>
 | |
|         <ai-card title="热点话题">
 | |
|           <template #content>
 | |
|             <div class="wrap" :class="{active:currentIndex==index}" v-for="(item,index) in topicForm" :key="index"
 | |
|                  @click="onClick(index)">
 | |
| <!--              <el-row type="flex" justify="space-between">-->
 | |
| <!--                <header class="header">热点话题</header>-->
 | |
| <!--              </el-row>-->
 | |
|               <el-form :ref="('topicForm'+ index)" :model="topicForm[index]" :rules="topicRules" label-width="80px"
 | |
|                        label-position="right">
 | |
|                 <el-form-item label="话题来源" prop="questionSource">
 | |
|                   <el-input v-model="topicForm[index].questionSource" placeholder="请输入..." size="small" show-word-limit
 | |
|                             :maxlength="50"></el-input>
 | |
|                 </el-form-item>
 | |
|                 <el-form-item label="话题描述" prop="question">
 | |
|                   <el-input v-model="topicForm[index].question" type="textarea" :rows="5" placeholder="请输入回复内容"
 | |
|                             size="small" show-word-limit :maxlength="500"></el-input>
 | |
|                 </el-form-item>
 | |
|                 <el-form-item label="回复来源" prop="answerSource">
 | |
|                   <el-input v-model="topicForm[index].answerSource" placeholder="请输入..." size="small" show-word-limit
 | |
|                             :maxlength="50"></el-input>
 | |
|                 </el-form-item>
 | |
|                 <el-form-item label="回复描述" prop="answer">
 | |
|                   <el-input v-model="topicForm[index].answer" type="textarea" :rows="5" placeholder="请输入回复内容"
 | |
|                             size="small" show-word-limit :maxlength="500"></el-input>
 | |
|                 </el-form-item>
 | |
|                 <el-form-item label="描述图片" prop="files">
 | |
|                   <ai-uploader :instance="instance" :limit="3" isShowTip
 | |
|                                v-model="topicForm[index]['files']"></ai-uploader>
 | |
|                 </el-form-item>
 | |
|               </el-form>
 | |
|             </div>
 | |
|           </template>
 | |
|         </ai-card>
 | |
|       </template>
 | |
|       <template slot="footer">
 | |
|         <el-button @click="$emit('goBack')">取消</el-button>
 | |
|         <el-button type="primary" @click="handleSubmit">提交</el-button>
 | |
|       </template>
 | |
|     </ai-detail>
 | |
|     <div class="options">
 | |
|       <el-button type="primary" size="small" icon="iconfont iconAdd" @click="add">添加话题</el-button>
 | |
|       <el-button type="danger" size="small" icon="iconfont iconDelete" @click="handDel" :disabled="topicForm.length==1">
 | |
|         删除话题
 | |
|       </el-button>
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| 
 | |
|   export default {
 | |
|     name: "addHot",
 | |
|     label: "添加话题",
 | |
|     props: {
 | |
|       instance: Function,
 | |
|       dict: Object,
 | |
|       permissions: Function,
 | |
|       areaId: String,
 | |
|       detail: Object
 | |
|     },
 | |
|     data() {
 | |
|       return {
 | |
|         baseForm: {
 | |
|           areaId: this.areaId,
 | |
|           title: "",
 | |
|           thumbUrl: [],
 | |
|           keyWords: [],
 | |
|         },
 | |
|         topicForm: [{
 | |
|           questionSource: "",
 | |
|           question: "",
 | |
|           answerSource: "",
 | |
|           answer: "",
 | |
|           files: [],
 | |
|         }],
 | |
|         inputVisible: false,
 | |
|         inputValue: '',
 | |
|         ids: [],
 | |
|         currentIndex: 0,
 | |
|       }
 | |
|     },
 | |
|     methods: {
 | |
|       onClick(index) {
 | |
|         this.currentIndex = index
 | |
|       },
 | |
|       handleSubmit() {
 | |
|         Promise.all([new Promise(resolve => {
 | |
|           this.$refs['baseForm'].validate(valid => {
 | |
|             if (valid) {
 | |
|               resolve()
 | |
|             }
 | |
|           })
 | |
|         }), new Promise(resolve => {
 | |
|           let result = []
 | |
|           this.topicForm.forEach((item, index) => {
 | |
|             this.$refs[('topicForm' + index)][0].validate(valid => result.push(valid))
 | |
|           })
 | |
|           result.every(e=>e) && resolve()
 | |
|         })]).then(() => {
 | |
|           this.instance.post(`/app/apphotsubject/addOrUpdate`, {
 | |
|             hotSubject: {
 | |
|               ...this.baseForm,
 | |
|               thumbUrl: this.baseForm.thumbUrl[0].url,
 | |
|               id: this.isEdit ? this.detail.id : null,
 | |
|               keyWords: this.baseForm.keyWords.join(",")
 | |
|             },
 | |
|             contents: this.topicForm,
 | |
|             deleteIds: this.ids,
 | |
|           }).then(res => {
 | |
|             if (res.code == 0) {
 | |
|               this.$message.success(this.isEdit ? "编辑成功" : "保存成功")
 | |
|               this.$emit("goBack")
 | |
|             }
 | |
|           })
 | |
|         })
 | |
|       },
 | |
|       add() {
 | |
|         this.topicForm.splice(this.currentIndex + 1, 0, {
 | |
|           questionSource: "",
 | |
|           question: "",
 | |
|           answerSource: "",
 | |
|           answer: "",
 | |
|           files: [],
 | |
|         })
 | |
|         this.currentIndex = this.topicForm.length - 1
 | |
|       },
 | |
|       handDel() {
 | |
|         this.$confirm("是否删除").then(() => {
 | |
|           this.topicForm[this.currentIndex] && this.ids.push(this.topicForm[this.currentIndex].id)
 | |
|           this.topicForm.splice(this.currentIndex, 1)
 | |
|           this.currentIndex = this.topicForm.length - 1
 | |
|         })
 | |
|       },
 | |
|       handleClose(tag) {
 | |
|         this.baseForm.keyWords.splice(this.baseForm.keyWords.indexOf(tag), 1);
 | |
|       },
 | |
| 
 | |
|       showInput() {
 | |
|         this.inputVisible = true;
 | |
|         this.$nextTick(_ => this.$refs.saveTagInput.$refs.input.focus());
 | |
|       },
 | |
| 
 | |
|       getDetail() {
 | |
|         this.instance.post(`/app/apphotsubject/detail`, null, {
 | |
|           params: {id: this.detail.id}
 | |
|         }).then(res => {
 | |
|           if (res && res.data) {
 | |
|             this.baseForm.areaId = res.data.areaId
 | |
|             this.baseForm.title = res.data.title
 | |
|             this.baseForm.thumbUrl.push({url: res.data.thumbUrl})
 | |
|             this.baseForm.keyWords = res.data.keyWords.split(",")
 | |
|             this.topicForm = res.data.contents
 | |
|           }
 | |
|         })
 | |
|       },
 | |
| 
 | |
|       handleInputConfirm() {
 | |
|         let inputValue = this.inputValue
 | |
|         if (inputValue) {
 | |
|           this.baseForm.keyWords.push(inputValue);
 | |
|         }
 | |
|         this.inputVisible = false;
 | |
|         this.inputValue = '';
 | |
|       }
 | |
|     },
 | |
|     computed: {
 | |
|       baseRules() {
 | |
|         return {
 | |
|           title: [{required: true, message: '请输入话题标题', trigger: 'blur'}],
 | |
|           thumbUrl: [{required: true, message: '请上传封面图片', trigger: 'change'}],
 | |
|           keyWords: [{required: true, message: '请输入关键词', trigger: 'blur'}],
 | |
|         }
 | |
|       },
 | |
|       topicRules() {
 | |
|         return {
 | |
|           // questionSource: [{required: true, message: '请输入话题来源', trigger: 'blur'}],
 | |
|           question: [{required: true, message: '请输入话题描述', trigger: 'blur'}],
 | |
|           // answerSource: [{required: true, message: '请输入回复来源', trigger: 'blur'}],
 | |
|           answer: [{required: true, message: '请输入回复描述', trigger: 'blur'}],
 | |
|           // files: [{required: true, message: '请上传描述图片', trigger: 'change'}],
 | |
|         }
 | |
|       },
 | |
|       isEdit() {
 | |
|         return !!this.detail.id;
 | |
|       }
 | |
|     },
 | |
|     created() {
 | |
|       if (this.isEdit) {
 | |
|         this.getDetail()
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
|   .addHot {
 | |
|     height: 100%;
 | |
|     overflow: hidden;
 | |
|     position: relative;
 | |
| 
 | |
|     .wrap {
 | |
|       background-color: #F5F6F9;
 | |
|       box-sizing: border-box;
 | |
|       padding: 16px;
 | |
| 
 | |
|       &:not(:last-child) {
 | |
|         margin-bottom: 20px;
 | |
|       }
 | |
| 
 | |
|       .header {
 | |
|         font-size: 16px;
 | |
|         color: #222222;
 | |
|         line-height: 24px;
 | |
|         font-weight: 700;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     .active {
 | |
|       background: #FFFFFF;
 | |
|       box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.05);
 | |
|     }
 | |
| 
 | |
|     .el-tag + .el-tag {
 | |
|       margin-left: 10px;
 | |
|     }
 | |
| 
 | |
|     ::v-deep .el-tag {
 | |
|       color: #222222;
 | |
|       border-color: #D0D4DC;
 | |
| 
 | |
|       & .el-icon-close {
 | |
|         color: #222222;
 | |
| 
 | |
|         &:hover {
 | |
|           background-color: transparent;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     .button-new-tag {
 | |
|       margin-left: 10px;
 | |
|       height: 32px;
 | |
|       line-height: 30px;
 | |
|       padding-top: 0;
 | |
|       padding-bottom: 0;
 | |
|     }
 | |
| 
 | |
|     .input-new-tag {
 | |
|       width: 90px;
 | |
|       margin-left: 10px;
 | |
|       vertical-align: bottom;
 | |
|     }
 | |
| 
 | |
|     .options {
 | |
|       position: fixed;
 | |
|       right: 6%;
 | |
|       top: 50%;
 | |
|       display: flex;
 | |
|       flex-direction: column;
 | |
| 
 | |
|       ::v-deep .el-button--danger {
 | |
|         margin-left: 0;
 | |
|         margin-top: 4px;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| </style>
 |