Browse Source

新增文章管理

chenyue 4 năm trước cách đây
mục cha
commit
9e14f342a9

+ 44 - 3
_web/src/api/homeApi.js

@ -101,7 +101,7 @@ const homeApi = {
  // 修改合作伙伴
  updatePartner (data) {
    return axios({
      url: '/zjxl/partner/updatePartner',
      url: '/zjxl/partner/updatePartenr',
      method: 'post',
      data: Qs.stringify(data)
    })
@ -109,7 +109,7 @@ const homeApi = {
  // 修改合作伙伴上下线状态
  updateIsLinePartner (data) {
    return axios({
      url: '/zjxl/partner/updateIsLine',
      url: '/zjxl/partner/updatePartner',
      method: 'post',
      data: Qs.stringify(data)
    })
@ -148,6 +148,47 @@ const homeApi = {
      },
      data: data
    })
  }
  },
  // 添加系统字典
  addSystemDict (data) {
    return axios({
      url: '/zjxl/systemDict/addSystemDict',
      method: 'post',
      data: Qs.stringify(data)
    })
  },
  // 查询系统管理字典
  findSystemDictById (parameter) {
    return axios({
      url: '/zjxl/systemDict/findSystemDictById',
      method: 'get',
      params: parameter
    })
  },
  // 修改系统字典
  updateSystemDict (data) {
    return axios({
      url: '/zjxl/systemDict/updateSystemDictInfo',
      method: 'post',
      data: Qs.stringify(data)
    })
  },
  // 修改是否上线
  updateIsLineSystemDict (data) {
    return axios({
      url: '/zjxl/systemDict/updateSystemDict',
      method: 'post',
      data: Qs.stringify(data)
    })
  },
  // 删除字典
  deleteSystemDict (data) {
    return axios({
      url: '/zjxl/systemDict/deleteSystemDict',
      method: 'post',
      data: Qs.stringify(data)
    })
  },
  systemTypeList: [{ code: 1, name: '产品与服务' }, { code: 2, name: '公司案例' }, { code: 3, name: '新闻中心' }, { code: 4, name: '关于我们' }]
}
export default homeApi

+ 59 - 9
_web/src/api/modular/system/contentControlApi.js

@ -1,4 +1,5 @@
import { axios } from '@/utils/request'
import Qs from 'qs'
/**
 * 编辑基本信息
@ -6,21 +7,29 @@ import { axios } from '@/utils/request'
 * @author yubaoshan
 * @date 2020/6/8 11:11
 */
export function addBasicInfo(parameter) {
export function addBasicInfo (data) {
    return axios({
        url: '/zjxl/basicInfo/addBasicInfo',
        method: 'post',
        params: parameter
        data: Qs.stringify(data)
    })
}
export function findBasicInfo (parameter) {
  return axios({
      url: '/zjxl/basicInfo/findBasicInfo',
      method: 'get',
      params: parameter
  })
}
/**
 * 查询文章管理列表
 *
 * @author yubaoshan
 * @date 2020/6/8 11:11
 */
export function findArticleContentById(parameter) {
export function findArticleContentById (parameter) {
    return axios({
        url: '/zjxl/zjxlArticleContent/findArticleContentById',
        method: 'get',
@ -34,13 +43,26 @@ export function findArticleContentById(parameter) {
 * @author yubaoshan
 * @date 2020/6/8 11:11
 */
export function addArticleContent(parameter) {
export function addArticleContent (data) {
    return axios({
        url: '/zjxl/zjxlArticleContent/addArticleContent',
        method: 'post',
        params: parameter
        data: Qs.stringify(data)
    })
}
/**
 * 修改文章
 *
 * @author yubaoshan
 * @date 2020/6/8 11:11
 */
export function updateArticleAllInfo (data) {
  return axios({
      url: '/zjxl/zjxlArticleContent/updateArticleAllInfo',
      method: 'post',
      data: Qs.stringify(data)
  })
}
/**
 * 修改是否上线
@ -48,11 +70,11 @@ export function addArticleContent(parameter) {
 * @author yubaoshan
 * @date 2020/6/8 11:11
 */
export function updateArticleContent(parameter) {
export function updateArticleContent (data) {
    return axios({
        url: '/zjxl/zjxlArticleContent/updateArticleContent',
        method: 'post',
        data: parameter
        data: Qs.stringify(data)
    })
}
@ -62,10 +84,38 @@ export function updateArticleContent(parameter) {
 * @author yubaoshan
 * @date 2020/6/8 11:11
 */
export function deleteArticleContent(parameter) {
export function deleteArticleContent (data) {
    return axios({
        url: '/zjxl/zjxlArticleContent/deleteArticleContent',
        method: 'post',
        data: parameter
        data: Qs.stringify(data)
    })
}
/**
 * 查询文章分类
 *
 * @author yubaoshan
 * @date 2020/6/8 11:11
 */
export function getSystemDictClassify (parameter) {
  return axios({
      url: '/zjxl/zjxlArticleContent/getLeftTabs',
      method: 'get',
      params: parameter
  })
}
/**
 * 查询文章子分类
 *
 * @author yubaoshan
 * @date 2020/6/8 11:11
 */
export function getSystemDictSubClassify (parameter) {
  return axios({
      url: '/zjxl/zjxlArticleContent/getArticleContentSubclassify',
      method: 'get',
      params: parameter
  })
}

+ 287 - 0
_web/src/components/quillEditorComponent.vue

@ -0,0 +1,287 @@
<template>
  <div class="quillEditorComponent">
    <quill-editor
      class="editor"
      ref="myTextEditor"
      v-model="currentcontent"
      :options="editorOption"
      @blur="onEditorBlur($event)"
      @focus="onEditorFocus($event)"
      @ready="onEditorReady($event)"
      @change="onEditorChange"
    ></quill-editor>
    <!-- 文件上传input 将它隐藏-->
    <a-upload
      style="display:none"
      :action="UploadUrl()"
      :show-file-list="false"
      :before-upload="newEditorbeforeupload"
      :customRequest="fileUpload"
      ref="uniqueId"
    >
    </a-upload>
  </div>
</template>
<script>
import { quillEditor } from 'vue-quill-editor'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
import homeApi from '@/api/homeApi'
import { setArticleContent, imgUrlDel, setImgUrl } from '@/utils/img'
export default {
  name: 'QuillEditorComponent',
  components: {
    quillEditor
  },
  props: [],
  data () {
    return {
      content: '',
      currentcontent: '',
      editorOption: {
        theme: 'snow',
        boundary: document.body,
        modules: {
          toolbar: [
            ['bold', 'italic', 'underline', 'strike'],
            ['blockquote', 'code-block'],
            [
              {
                header: 1
              },
              {
                header: 2
              }
            ],
            [
              {
                list: 'ordered'
              },
              {
                list: 'bullet'
              }
            ],
            [
              {
                script: 'sub'
              },
              {
                script: 'super'
              }
            ],
            [
              {
                indent: '-1'
              },
              {
                indent: '+1'
              }
            ],
            [
              {
                direction: 'rtl'
              }
            ],
            [
              {
                size: ['small', false, 'large', 'huge']
              }
            ],
            [
              {
                header: [1, 2, 3, 4, 5, 6, false]
              }
            ],
            [
              {
                color: []
              },
              {
                background: []
              }
            ],
            [
              {
                font: []
              }
            ],
            [
              {
                align: []
              }
            ],
            ['clean'],
            ['link', 'image', 'video']
          ]
        },
        placeholder: '请在这里开始输入...',
        readOnly: false
      }
    }
  },
  mounted () {
    var vm = this
    var imgHandler = async function (state) {
      if (state) {
        var fileInput = vm.$refs.uniqueId.$el.querySelector('input') // 隐藏的file元素
        fileInput.click() // 触发事件
      }
    }
    this.$refs.myTextEditor.quill.getModule('toolbar').addHandler('image', imgHandler)
  },
  computed: {
    editor () {
      return this.$refs.myTextEditor.quillEditor
    }
  },
  methods: {
    onEditorBlur (editor) {
      console.log('editor blur!', editor)
    },
    onEditorFocus (editor) {
      console.log('editor focus!', editor)
    },
    onEditorReady (editor) {
      // this.currentcontent=this.content
      console.log('editor ready!', editor)
    },
    initEditorContent (content) {
      this.content = setArticleContent(content)
      this.currentcontent = this.content
    },
    onEditorChange ({ editor, html, text }) {
      // console.log('editor change!', editor, html, text)
      this.currentcontent = html
      this.$emit('contentGet', html)
    },
    newEditorbeforeupload (file) {
      var $uptypes = ['image/jpg', 'image/png', 'image/jpeg']
      const isJPG = $uptypes.indexOf(file.type) > -1
      const isLt1M = file.size / 1024 / 1024 < 5
      if (!isJPG) {
        this.$message.error('上传头像图片只能是 JPG/PNG 格式!')
      }
      if (!isLt1M) {
        this.$message.error('上传头像图片大小不能超过 5MB!')
      }
      return isJPG && isLt1M
    },
    UploadUrl () {
      return (
         process.env.VUE_APP_API_BASE_URL + '/zjxl/banner/file'
      )
    },
    fileUpload (file) {
      const formData = new FormData()
      formData.append('file', file.file)
      homeApi.fileUpload(formData).then(res => {
        if (res.status === 10000) {
          var picUrl = setImgUrl(res.result.fullUri)
          var addImgRange = this.$refs.myTextEditor.quill.getSelection()
          this.$refs.myTextEditor.quill.insertEmbed(addImgRange != null ? addImgRange.index : 0, 'image', picUrl, res.result.fileName)
        } else {
          this.$message.error(res.msg)
        }
      })
    },
    imgUrlDel () {
      var content = imgUrlDel(this.currentcontent)
      return content
    }
  }
}
</script>
<style lang="less">
.quillEditorComponent {
  .editor {
    line-height: normal !important;
    height: 300px;
    width: 100%;
  }
  .ql-container {
    height: 70%;
  }
  .ql-toolbar.ql-snow {
    border: 1px solid #e1e1e1;
  }
  .ql-container.ql-snow {
    border: 1px solid #e1e1e1;
  }
  .ql-snow .ql-tooltip[data-mode='link']::before {
    content: '请输入链接地址:';
  }
  .ql-snow .ql-tooltip.ql-editing a.ql-action::after {
    border-right: 0px;
    content: '保存';
    padding-right: 0px;
  }
  .ql-snow .ql-tooltip[data-mode='video']::before {
    content: '请输入视频地址:';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label::before,
  .ql-snow .ql-picker.ql-size .ql-picker-item::before {
    content: '14px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='small']::before,
  .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='small']::before {
    content: '10px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='large']::before,
  .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='large']::before {
    content: '18px';
  }
  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='huge']::before,
  .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='huge']::before {
    content: '32px';
  }
  .ql-snow .ql-picker.ql-header .ql-picker-label::before,
  .ql-snow .ql-picker.ql-header .ql-picker-item::before {
    content: '文本';
  }
  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value='1']::before,
  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value='1']::before {
    content: '标题1';
  }
  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value='2']::before,
  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value='2']::before {
    content: '标题2';
  }
  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value='3']::before,
  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value='3']::before {
    content: '标题3';
  }
  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value='4']::before,
  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value='4']::before {
    content: '标题4';
  }
  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value='5']::before,
  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value='5']::before {
    content: '标题5';
  }
  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value='6']::before,
  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value='6']::before {
    content: '标题6';
  }
  .ql-snow .ql-picker.ql-font .ql-picker-label::before,
  .ql-snow .ql-picker.ql-font .ql-picker-item::before {
    content: '标准字体';
  }
  .ql-snow .ql-picker.ql-font .ql-picker-label[data-value='serif']::before,
  .ql-snow .ql-picker.ql-font .ql-picker-item[data-value='serif']::before {
    content: '衬线字体';
  }
  .ql-snow .ql-picker.ql-font .ql-picker-label[data-value='monospace']::before,
  .ql-snow .ql-picker.ql-font .ql-picker-item[data-value='monospace']::before {
    content: '等宽字体';
  }
}
</style>

+ 1 - 17
_web/src/components/upLoad.vue

@ -27,7 +27,6 @@
<script>
import homeApi from '@/api/homeApi'
import { setImgUrl } from '@/utils/img'
import { setTimeout } from 'timers'
const _ = require('lodash')
@ -89,25 +88,10 @@ export default {
          this.fileList.push(citem)
          this.$emit('uploadSuccess', { fileList: this.fileList })
        } else {
          this.$message.error(res.message)
          this.$message.error(res.msg)
        }
      })
    },
    handleChange ({ file, fileList }) {
      setTimeout(() => {
        this.fileList = []
        fileList.forEach((item) => {
          if (item.response.status === 10000) {
            const citem = item.response.result
            citem.url = citem.fullUrl
            this.fileList.push(citem)
          } else {
            this.$message.error(item.message)
          }
        })
        this.$emit('uploadSuccess', { fileList: this.fileList })
      }, 3000)
    },
    async handlePreview (file) {
      this.previewImage = file.url || file.preview
      this.previewVisible = true

+ 128 - 82
_web/src/views/constrolContent/articleContent.vue

@ -6,23 +6,23 @@
          <a-row :gutter="48">
            <a-col :md="8" :sm="32">
              <a-form-item label="标题">
                <a-input v-model="queryParam.searchValue" allow-clear placeholder="请输入标题、内容" />
                <a-input v-model="queryParam.articleContentTitle" allow-clear placeholder="请输入标题搜索" />
              </a-form-item>
            </a-col>
            <a-col :md="8" :sm="32">
              <a-form-item label="类型">
                <a-select v-model="queryParam.type" placeholder="请选择类型" allow-clear>
                <a-select v-model="queryParam.systemDictType" placeholder="请选择类型" allow-clear>
                  <a-select-option
                    v-for="(item,index) in typeDictTypeDropDown"
                    :key="index"
                    :value="item.code"
                  >{{ item.value }}</a-select-option>
                  >{{ item.name }}</a-select-option>
                </a-select>
              </a-form-item>
            </a-col>
            <a-col :md="8" :sm="32">
              <a-button type="primary" @click="$refs.table.refresh(true)">搜索</a-button>
              <a-button type="primary" style="margin-left: 8px" @click="$refs.detailsOplog.details()">新增</a-button>
              <a-button type="primary" style="margin-left: 8px" icon="plus" @click="$refs.detailsOplog.add()">新增</a-button>
            </a-col>
          </a-row>
        </a-form>
@ -34,46 +34,47 @@
          :loading="loading"
          :columns="columns"
          :data="loadData"
          :rowKey="(record) => record.sessionId"
          :rowKey="(record) => record.articleContentId"
        >
          <span slot="lastLoginAddress" slot-scope="text">
            <ellipsis :length="20" tooltip>{{ text }}</ellipsis>
          <span slot="articleContentTitle" slot-scope="text">
            <ellipsis :length="30" tooltip>{{ text }}</ellipsis>
          </span>
          <span slot="lastLoginBrowser" slot-scope="text">
            <ellipsis :length="20" tooltip>{{ text }}</ellipsis>
          <span slot="articleContentCover" slot-scope="src">
            <img :src="src | getImgUrl" width="60" height="45" @click="showPreviewImg(src)" style="cursor: pointer;"/>
          </span>
          <span slot="articleContentAbstract" slot-scope="text">
            <ellipsis :length="80" tooltip>{{ text }}</ellipsis>
          </span>
          <span slot="articleContentType" slot-scope="text">
            {{ typeFilter(text) }}
          </span>
          <span slot="action" slot-scope="text, record">
            <a-popconfirm
              v-if="hasPerm('sysOnlineUser:forceExist')"
              placement="topRight"
              title="是否确认下线该条目?"
              @confirm="() => forceExist(record)"
            >
              <a class="mr5">下线</a>
            <a-popconfirm placement="top" :title="record.articleContentIsLine===1? '是否确认下线该条目?':'是否确认上线该条目?'" @confirm="() => editjobStatusStatus(record.articleContentIsLine,record)">
              <a>{{ statusFilter(record.articleContentIsLine) }}</a>
            </a-popconfirm>
            <a class="mr5" @click="$refs.detailsOplog.details(record)">编辑</a>
            <a-popconfirm
              v-if="hasPerm('sysOnlineUser:forceExist')"
              placement="topRight"
              title="是否确认删除该条目?"
              @confirm="() => forceExist(record)"
            >
              <a class="mr5">删除</a>
            <a-divider type="vertical"/>
            <a v-if="hasPerm('articleContent:edit')" @click="$refs.detailsOplog.edit(record)">编辑</a>
            <a-divider type="vertical" v-if="hasPerm('articleContent:edit') && hasPerm('articleContent:delete')"/>
            <a-popconfirm v-if="hasPerm('articleContent:delete')" placement="topRight" title="是否确认删除该条目?" @confirm="() => articleContentDelete(record)">
              <a>删除</a>
            </a-popconfirm>
          </span>
        </s-table>
      </div>
      <details-oplog ref="detailsOplog" />
      <details-oplog ref="detailsOplog" @ok="handleOk"/>
      <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel" title="预览">
        <img alt="example" style="width: 100%" :src="previewImage" />
      </a-modal>
    </a-card>
  </div>
</template>
<script>
import { STable, Ellipsis } from '@/components'
import { sysDictTypeDropDown } from '@/api/modular/system/dictManage'
import homeApi from '@/api/homeApi'
import { setImgUrl } from '@/utils/img'
import {
  findArticleContentById,
  addArticleContent,
  updateArticleContent,
  deleteArticleContent
} from '@/api/modular/system/contentControlApi'
@ -88,73 +89,73 @@ export default {
  data () {
    return {
      // 查询参数
      queryParam: {},
      typeDictTypeDropDown: [],
      queryParam: { id: '', systemDictType: '', articleContentTitle: '' },
      typeDictTypeDropDown: homeApi.systemTypeList,
      // 表头
      columns: [
        {
          title: '序号',
          dataIndex: 'setIndex'
          dataIndex: 'dataIndex',
          customRender: (text, row, index) => {
            return index + 1
          },
          align: 'center',
          width: '90px'
        },
        {
          title: '标题',
          dataIndex: 'nickName'
          dataIndex: 'articleContentTitle',
          scopedSlots: { customRender: 'articleContentTitle' }
        },
        {
          title: '封面',
          dataIndex: 'lastLoginIp'
          dataIndex: 'articleContentCover',
          scopedSlots: { customRender: 'articleContentCover' },
          align: 'center',
          width: '150px'
        },
        {
          title: '摘要',
          dataIndex: 'lastLoginTime'
          dataIndex: 'articleContentAbstract',
          scopedSlots: { customRender: 'articleContentAbstract' }
        },
        {
          title: '内容类型',
          dataIndex: 'lastLoginAddress',
          scopedSlots: { customRender: 'lastLoginAddress' }
          dataIndex: 'articleContentType',
          scopedSlots: { customRender: 'articleContentType' },
          width: '120px'
        },
        {
          title: '分类',
          dataIndex: 'type'
          dataIndex: 'articleContentClassify'
        },
        {
          title: '子分类',
          dataIndex: 'childType'
          dataIndex: 'articleContentSubclassify'
        },
        {
          title: '排序',
          dataIndex: 'index'
          dataIndex: 'articleContentSort',
          align: 'center',
          width: '60px'
        }
      ],
      loading: true,
      loadData: parameter => {
        const params = {
          articleContentTitle: '',
          id: ''
        }
        return findArticleContentById(Object.assign(parameter, params)).then(res => {
          if (this.hasPerm('sysOnlineUser:list')) {
            if (res.data.length > 0) {
              const list = res.data.rows
              list.map((item, index) => {
                item.setIndex = index + 1
                return item
              })
            }
        return findArticleContentById(Object.assign(parameter, this.queryParam)).then((res) => {
          if (this.hasPerm('ArticleContent:list')) {
            return res.data
          } else {
            return new Promise((resolve, reject) => {
              return resolve()
            })
          }
        })
      },
      selectedRows: []
      selectedRows: [],
      statusDictTypeDropDown: [{ code: 0, name: '下线' }, { code: 1, name: '上线' }],
      previewVisible: false,
      previewImage: ''
    }
  },
  created () {
    this.sysDictTypeDropDown() // 先注释
    if (this.hasPerm('sysOnlineUser:forceExist')) {
    if (this.hasPerm('articleContent:edit') || this.hasPerm('articleContent:delete') || hasPerm('articleContent:start') || hasPerm('articleContent:stop')) {
      this.columns.push({
        title: '操作',
        width: '150px',
@ -163,40 +164,85 @@ export default {
      })
    }
  },
  filters: {
    getImgUrl (v) {
      return setImgUrl(v)
    }
  },
  methods: {
    forceExist (record) {
      const params = {
        id: '',
        isLine: 0 // 0是未上线,1是上线
    statusFilter (status) {
      const values = this.statusDictTypeDropDown.filter(item => item.code === status)
      if (values.length > 0) {
        return values[0].name
      } else {
        return '上线'
      }
    },
    typeFilter (status) {
      const values = this.typeDictTypeDropDown.filter(item => item.code === status)
      if (values.length > 0) {
        return values[0].name
      } else {
        return ''
      }
      updateArticleContent(params)
        .then(res => {
          if (res.success) {
            this.$message.success('强制下线成功')
            // 重新加载表格
            this.loadDataList()
    },
     /**
     * 启动停止
     */
    editjobStatusStatus (code, record) {
      if (code === 1) {
        updateArticleContent({ id: record.articleContentId, isLine: 0 }).then(res => {
          if (res.status === 200) {
            if (res.data) {
              this.$message.success('下线成功')
              this.$refs.table.refresh()
            } else {
              this.$message.error('下线失败')
            }
          } else {
            this.$message.error('强制下线失败:' + res.message)
            this.$message.error('下线失败:' + res.msg)
          }
        })
        .catch(err => {
          this.$message.error('强制下线错误:' + err.message)
      } else {
        updateArticleContent({ id: record.articleContentId, isLine: 1 }).then(res => {
          if (res.status === 200) {
            if (res.data) {
              this.$message.success('上线成功')
              this.$refs.table.refresh()
            } else {
              this.$message.error('上线失败')
            }
          } else {
            this.$message.error('上线失败:' + res.msg)
          }
        })
      }
    },
    sysDictTypeDropDown () {
      sysDictTypeDropDown({ code: 'notice_type' }).then(res => {
        this.typeDictTypeDropDown = res.data
    articleContentDelete (record) {
      deleteArticleContent({ id: record.articleContentId }).then((res) => {
        if (res.status === 200) {
          if (res.data) {
            this.$message.success('删除成功')
            this.$refs.table.refresh()
          } else {
            this.$message.error('删除失败')
          }
        } else {
          this.$message.error('删除失败:' + res.msg)
        }
      }).catch((err) => {
        this.$message.error('删除错误:' + err.message)
      })
    },
    addArticleContent () {
      addArticleContent({ code: 'notice_type' }).then(res => {
        this.typeDictTypeDropDown = res.data
      })
    handleOk () {
      this.$refs.table.refresh()
    },
    deleteArticleContent () {
      deleteArticleContent({ code: 'notice_type' }).then(res => {
        this.typeDictTypeDropDown = res.data
      })
    showPreviewImg (src) {
      this.previewImage = setImgUrl(src)
      this.previewVisible = true
    },
    handleCancel () {
      this.previewVisible = false
    }
  }
}

+ 287 - 70
_web/src/views/constrolContent/details.vue

@ -4,65 +4,156 @@
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    ok-text="保存"
    cancel-text="关闭"
    @ok="handleSubmit"
    @cancel="handleCancel"
    :maskClosable="false"
  >
    <a-form :form="form">
      <a-form-item label="销售咨询" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
      <a-form-item
        style="display: none;"
      >
        <a-input v-decorator="['id']" />
      </a-form-item>
      <a-form-item label="标题" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
        <a-input
          placeholder="请输入职位名称"
          v-decorator="['name', {rules: [{required: true, message: '请输入职位名称'}]}]"
          placeholder="请输入标题"
          v-decorator="['articleContentTitle', {rules: [{required: true, message: '请输入标题'}]}]"
        />
      </a-form-item>
      <a-form-item label="上传二维码" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
        <a-upload
          name="file"
          list-type="picture-card"
          class="avatar-uploader"
          :show-upload-list="false"
          action="http://192.168.131.126:8080/api/sysFileInfo/upload"
          :before-upload="beforeUpload"
          @change="handleChange"
      <a-form-item
        label="摘要"
        :labelCol="labelCol"
        :wrapperCol="wrapperCol"
        has-feedback
      >
        <a-textarea :rows="4" :maxLength="100" placeholder="请输入摘要" @input="abstractInput" v-decorator="['articleContentAbstract', {rules: [{required: true, message: '请输入摘要!'}]}]">
        </a-textarea>
        <div class="inputCount">({{ articleContentAbstract.length }}/100)</div>
      </a-form-item>
      <a-form-item
        label="封面"
        :labelCol="labelCol"
        :wrapperCol="wrapperCol"
        has-feedback
        :required="true"
      >
        <div>
          <upload-component
            ref="upLoadRef"
            :remarkTxt="remarkTxt"
            @uploadSuccess="uploadSuccess"
            v-decorator="[
              'articleContentCover',
              {
                trigger: 'change',
                rules: [{ validator: checkimageUrl }]
              },
            ]"
          ></upload-component>
        </div>
      </a-form-item>
      <a-form-item label="内容类型" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
        <a-select
          style="width: 100%"
          placeholder="请选择内容类型"
          v-decorator="['articleContentType', {rules: [{ required: true, message: '请选择内容类型' }]}]"
          @change="articleContentTypeChange"
        >
          <img v-if="imageUrl" :src="imageUrl" alt="avatar" />
          <div v-else>
            <a-icon :type="loading ? 'loading' : 'plus'" />
          </div>
        </a-upload>
        <div class="ant-upload-text">请上传250*250规格图像</div>
          <a-select-option
            v-for="(item,index) in typeList"
            :key="index"
            :value="item.code"
          >{{ item.name }}</a-select-option>
        </a-select>
      </a-form-item>
      <a-form-item label="销售咨询" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
        <a-input
          placeholder="请输入职位名称"
          v-decorator="['name', {rules: [{required: true, message: '请输入职位名称'}]}]"
        />
      <a-form-item label="分类" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
        <a-select
          style="width: 100%"
          placeholder="请选择分类"
          v-decorator="['articleContentClassify', {rules: [{ required: true, message: '请选择分类' }]}]"
          @change="articleContentClassifyChange"
        >
          <a-select-option
            v-for="(item,index) in classifyList"
            :key="index"
            :value="item.articleContentClassify"
          >{{ item.articleContentClassify }}</a-select-option>
        </a-select>
      </a-form-item>
      <a-form-item label="销售咨询" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
        <a-input
          placeholder="请输入职位名称"
          v-decorator="['name', {rules: [{required: true, message: '请输入职位名称'}]}]"
        />
      <a-form-item label="子分类" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
        <a-select
          style="width: 100%"
          placeholder="请选择子分类"
          v-decorator="['articleContentSubclassify', {rules: [{ required: true, message: '请选择子分类' }]}]"
        >
          <a-select-option
            v-for="(item,index) in subclassifyList"
            :key="index"
            :value="item.articleContentSubclassify"
          >{{ item.articleContentSubclassify }}</a-select-option>
        </a-select>
      </a-form-item>
      <a-form-item label="销售咨询" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
      <a-form-item
        :labelCol="labelCol"
        :wrapperCol="wrapperCol"
        label="内容"
        :hasFeedback="true"
        :required="true"
      >
        <quill-editor-component
          ref="editorRef"
          @contentGet="contentGet"
          v-decorator="[
            'articleContentContent',
            {
              trigger: 'change',
              rules: [{ required: true, message: '请输入文章内容' }]
            },
          ]"
        ></quill-editor-component>
      </a-form-item>
      <a-form-item
        :labelCol="labelCol"
        :wrapperCol="wrapperCol"
        label="排序"
        :hasFeedback="true"
        :required="true"
      >
        <a-input
          placeholder="请输入职位名称"
          v-decorator="['name', {rules: [{required: true, message: '请输入职位名称'}]}]"
          placeholder="请输入排序号"
          v-decorator="['articleContentSort', {rules: [{validator: checkSortIndex}]}]"
        />
      </a-form-item>
      <a-form-item label="是否上线" :labelCol="labelCol" :wrapperCol="wrapperCol" :required="true">
        <a-radio-group name="articleContentIsLine" v-decorator="['articleContentIsLine',{ initialValue: 1 }]">
          <a-radio :value="1">上线</a-radio>
          <a-radio :value="0">下线</a-radio>
        </a-radio-group>
      </a-form-item>
    </a-form>
  </a-modal>
</template>
<script>
function getBase64 (img, callback) {
  const reader = new FileReader()
  reader.addEventListener('load', () => callback(reader.result))
  reader.readAsDataURL(img)
}
import {
   addArticleContent,
   updateArticleAllInfo,
   getSystemDictClassify,
   getSystemDictSubClassify } from '@/api/modular/system/contentControlApi'
import quillEditorComponent from '@/components/quillEditorComponent'
import homeApi from '@/api/homeApi'
import uploadComponent from '@/components/upLoad'
export default {
  components: { uploadComponent, quillEditorComponent },
  data () {
    return {
      imageUrl: '',
      typeList: homeApi.systemTypeList,
      subclassifyList: [],
      classifyList: [],
      loading: false,
      labelCol: {
        xs: { span: 24 },
@ -74,51 +165,177 @@ export default {
      },
      visible: false,
      confirmLoading: false,
      form: this.$form.createForm(this)
      form: this.$form.createForm(this),
      articleContentType: '',
      articleContentClassify: '',
      articleContentAbstract: '',
      remarkTxt: '请上传1920×712规格图像'
    }
  },
  methods: {
    // 初始化方法
    details (record) {
    add (record) {
      this.visible = true
      // setTimeout(() => {
      //   this.form.setFieldsValue({
      //     message: record.message
      //   })
      // }, 100)
    },
    handleCancel () {
      this.form.resetFields()
      this.visible = false
      this.$nextTick(() => {
        this.$refs.upLoadRef.initData([])
        this.$refs.editorRef.initEditorContent('')
      })
    },
    // 上传图片
    handleChange (info) {
      if (info.file.status === 'uploading') {
        this.loading = true
        return
      }
      if (info.file.status === 'done') {
        // Get this url from response in real world.
        // 获取图片传参
        console.log(info.fileList[info.fileList.length - 1].response.data)
        getBase64(info.file.originFileObj, imageUrl => {
          this.imageUrl = imageUrl
          this.loading = false
    edit (record) {
      this.visible = true
      setTimeout(() => {
        this.form.resetFields()
        this.form.setFieldsValue(record)
        this.form.setFieldsValue({ 'id': record.articleContentId })
        this.$nextTick(() => {
          this.abstractInput()
          this.$refs.upLoadRef.initData([record.articleContentCover])
          this.$refs.editorRef.initEditorContent(record.articleContentContent)
        })
      }, 100)
    },
    articleContentTypeChange () {
      this.$nextTick(() => {
        this.articleContentType = this.form.getFieldValue('articleContentType')
        this.form.setFieldsValue({ 'articleContentClassify': '' })
        this.form.setFieldsValue({ 'articleContentSubclassify': '' })
        this.getSystemDictClassify()
      })
    },
    articleContentClassifyChange () {
      this.$nextTick(() => {
        this.articleContentClassify = this.form.getFieldValue('articleContentClassify')
        this.form.setFieldsValue({ 'articleContentSubclassify': '' })
        this.getSystemDictSubClassify()
      })
    },
    /**
     * 获取选择器下拉框数据(分类)
     */
    getSystemDictClassify () {
      getSystemDictClassify({ 'articleContentType': this.articleContentType }).then((res) => {
        this.formLoading = false
        if (res.status === 200) {
          this.classifyList = res.data
        } else {
          this.$message.error('获取文章列表数据失败')
        }
      })
    },
    /**
     * 获取选择器下拉框数据(子分类)
     */
    getSystemDictSubClassify () {
      getSystemDictSubClassify({ 'articleContentType': this.articleContentType, 'articleContentClassify': this.articleContentClassify }).then((res) => {
        this.formLoading = false
        if (res.status === 200) {
          this.subclassifyList = res.data
        } else {
          this.$message.error('获取文章列表数据失败')
        }
      })
    },
    abstractInput () {
      this.$nextTick(() => {
        this.articleContentAbstract = this.form.getFieldValue('articleContentAbstract')
      })
    },
    contentGet (content) {
      this.form.setFieldsValue({ 'articleContentContent': content })
    },
    uploadSuccess (avg) {
      if (avg.fileList[0]) {
        this.form.resetFields('articleContentCover')
        this.form.setFieldsValue({ 'articleContentCover': avg.fileList[0].uri })
      }
    },
    beforeUpload (file) {
      const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'
      if (!isJpgOrPng) {
        this.$message.error('You can only upload JPG file!')
    checkimageUrl (rule, value, callback) {
      if (value && value.length > 0) {
        callback()
        return
      }
      const isLt2M = file.size / 1024 / 1024 < 2
      if (!isLt2M) {
        this.$message.error('Image must smaller than 2MB!')
      var text = '请上传图片'
      callback(text)
    },
    handleSubmit () {
      const {
        form: { validateFields }
      } = this
      this.confirmLoading = true
      validateFields((errors, values) => {
        if (!errors) {
          values.articleContentSort = parseInt(values.articleContentSort)
          values.articleContentContent = this.$refs.editorRef.imgUrlDel()
          if (values.id) {
            delete values.articleContentId
            this.editReq(values)
          } else {
            delete values.id
            this.addReq(values)
          }
        } else {
          this.confirmLoading = false
        }
      })
    },
    addReq (values) {
      addArticleContent(values)
      .then(res => {
        if (res.status === 200) {
          this.$message.success('新增成功')
          this.visible = false
          this.confirmLoading = false
          this.$emit('ok', values)
          this.form.resetFields()
        } else {
          this.$message.error('新增失败:' + res.msg)
        }
      })
      .finally(res => {
        this.confirmLoading = false
      })
    },
    editReq (values) {
      updateArticleAllInfo(values)
      .then(res => {
        if (res.status === 200) {
          this.$message.success('编辑成功')
          this.visible = false
          this.confirmLoading = false
          this.$emit('ok', values)
          this.form.resetFields()
        } else {
          this.$message.error('编辑失败:' + res.msg)
        }
      })
      .finally(res => {
        this.confirmLoading = false
      })
    },
    handleCancel () {
      this.form.resetFields()
      this.visible = false
    },
    checkSortIndex (rule, value, callback) {
      var text = '请输入排序号!'
      if (!value) {
        callback(text)
      } else if (/(^[1-9]\d*$)/.test(value)) {
        callback()
      } else {
        text = '请输入数字'
        callback(text)
      }
      console.log(file)
      return isJpgOrPng && isLt2M
    }
  }
}
</script>
<style lang="less">
  .inputCount{
    position: absolute;
    right: 30px;
    bottom: -10px;
    color: #999;
  }
</style>

+ 147 - 0
_web/src/views/gwSystem/addClassifyDictForm.vue

@ -0,0 +1,147 @@
<template>
  <a-modal
    :title="modalTitle"
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    ok-text="保存"
    cancel-text="关闭"
    @ok="handleSubmit"
    @cancel="handleCancel"
    :maskClosable="false"
  >
    <a-spin :spinning="formLoading">
      <a-form :form="form">
        <a-form-item
          :required="true"
          label="所属类型"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          has-feedback
        >
          <a-select
            style="width: 100%"
            placeholder="请选择所属类型"
            v-decorator="['systemDictType', {rules: [{ required: true, message: '请选择所属类型!' }]}]"
          >
            <a-select-option
              v-for="(item,index) in typeList"
              :key="index"
              :value="item.code"
            >{{ item.name }}</a-select-option>
          </a-select>
        </a-form-item>
        <a-form-item label="分类名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input
            placeholder="请输入分类名称"
            v-decorator="['systemDictClassify', {rules: [{required: true, message: '请输入分类名称!'}]}]"
          />
        </a-form-item>
        <a-form-item label="子分类名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input
            placeholder="请输入子分类名称"
            v-decorator="['systemDictSubclassify', {rules: [{required: true, message: '请输入子分类名称!'}]}]"
          />
        </a-form-item>
        <a-form-item
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          label="排序"
          :hasFeedback="true"
          :required="true"
        >
          <a-input
            placeholder="请输入排序号"
            v-decorator="['systemDictSort', {rules: [{validator: checkSortIndex}]}]"
          />
        </a-form-item>
        <a-form-item label="是否上线" :labelCol="labelCol" :wrapperCol="wrapperCol" :required="true">
          <a-radio-group name="systemDictIsLine" v-decorator="['systemDictIsLine',{ initialValue: 1 }]">
            <a-radio :value="1">上线</a-radio>
            <a-radio :value="0">下线</a-radio>
          </a-radio-group>
        </a-form-item>
      </a-form>
    </a-spin>
  </a-modal>
</template>
<script>
import homeApi from '@/api/homeApi'
export default {
  data () {
    return {
      modalTitle: '新增类型字典',
      typeList: homeApi.systemTypeList,
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 15 }
      },
      visible: false,
      confirmLoading: false,
      formLoading: false,
      form: this.$form.createForm(this)
    }
  },
  mounted () {
  },
  methods: {
    // 初始化方法
    add (record) {
      this.visible = true
      // this.formLoading = true
      this.$nextTick(() => {
        this.form.setFieldsValue({ 'systemDictType': record.systemDictType })
      })
    },
    handleSubmit () {
      const {
        form: { validateFields }
      } = this
      this.confirmLoading = true
      validateFields((errors, values) => {
        if (!errors) {
          values.systemDictSort = parseInt(values.systemDictSort)
          homeApi.addSystemDict(values)
            .then(res => {
              if (res.status === 200) {
                this.$message.success('新增成功')
                this.visible = false
                this.confirmLoading = false
                this.$emit('ok', values)
                this.form.resetFields()
              } else {
                this.$message.error('新增失败:' + res.msg)
              }
            })
            .finally(res => {
              this.confirmLoading = false
            })
        } else {
          this.confirmLoading = false
        }
      })
    },
    handleCancel () {
      this.form.resetFields()
      this.visible = false
    },
    checkSortIndex (rule, value, callback) {
      var text = '请输入排序号!'
      if (!value) {
        callback(text)
      } else if (/(^[1-9]\d*$)/.test(value)) {
        callback()
      } else {
        text = '请输入数字'
        callback(text)
      }
    }
  }
}
</script>

+ 160 - 0
_web/src/views/gwSystem/editClassifyDictForm.vue

@ -0,0 +1,160 @@
<template>
  <a-modal
    :title="modalTitle"
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    ok-text="保存"
    cancel-text="关闭"
    @ok="handleSubmit"
    @cancel="handleCancel"
    :maskClosable="false"
  >
    <a-spin :spinning="formLoading">
      <a-form :form="form">
        <a-form-item
          style="display: none;"
        >
          <a-input v-decorator="['id']" />
        </a-form-item>
        <a-form-item
          :required="true"
          label="所属类型"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          has-feedback
        >
          <a-select
            style="width: 100%"
            placeholder="请选择所属类型"
            v-decorator="['systemDictType', {rules: [{ required: true, message: '请选择所属类型!' }]}]"
          >
            <a-select-option
              v-for="(item,index) in typeList"
              :key="index"
              :value="item.code"
            >{{ item.name }}</a-select-option>
          </a-select>
        </a-form-item>
        <a-form-item label="分类名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input
            placeholder="请输入分类名称"
            v-decorator="['systemDictClassify', {rules: [{required: true, message: '请输入分类名称!'}]}]"
          />
        </a-form-item>
        <a-form-item label="子分类名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input
            placeholder="请输入子分类名称"
            v-decorator="['systemDictSubclassify', {rules: [{required: true, message: '请输入子分类名称!'}]}]"
          />
        </a-form-item>
        <a-form-item
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          label="排序"
          :hasFeedback="true"
          :required="true"
        >
          <a-input
            placeholder="请输入排序号"
            v-decorator="['systemDictSort', {rules: [{validator: checkSortIndex}]}]"
          />
        </a-form-item>
        <a-form-item label="是否上线" :labelCol="labelCol" :wrapperCol="wrapperCol" :required="true">
          <a-radio-group name="systemDictIsLine" v-decorator="['systemDictIsLine',{ initialValue: 1 }]">
            <a-radio :value="1">上线</a-radio>
            <a-radio :value="0">下线</a-radio>
          </a-radio-group>
        </a-form-item>
      </a-form>
    </a-spin>
  </a-modal>
</template>
<script>
import homeApi from '@/api/homeApi'
export default {
  data () {
    return {
      modalTitle: '编辑类型字典',
      typeList: homeApi.systemTypeList,
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 15 }
      },
      visible: false,
      confirmLoading: false,
      formLoading: false,
      form: this.$form.createForm(this)
    }
  },
  mounted () {
  },
  methods: {
    // 初始化方法
    edit (record) {
      this.visible = true
      setTimeout(() => {
        this.form.setFieldsValue(
          {
            id: record.systemDictId,
            systemDictType: record.systemDictType,
            systemDictSubclassify: record.systemDictSubclassify,
            systemDictClassify: record.systemDictClassify,
            systemDictIsLine: record.systemDictIsLine,
            systemDictSort: record.systemDictSort
          }
        )
      }, 100)
    },
    handleSubmit () {
      const {
        form: { validateFields }
      } = this
      this.confirmLoading = true
      validateFields((errors, values) => {
        if (!errors) {
          values.systemDictSort = parseInt(values.systemDictSort)
          homeApi.updateSystemDict(values)
            .then(res => {
              if (res.status === 200) {
                this.$message.success('编辑成功')
                this.visible = false
                this.confirmLoading = false
                this.$emit('ok', values)
                this.form.resetFields()
              } else {
                this.$message.error('编辑失败:' + res.msg)
              }
            })
            .finally(res => {
              this.confirmLoading = false
            })
        } else {
          this.confirmLoading = false
        }
      })
    },
    handleCancel () {
      this.form.resetFields()
      this.visible = false
    },
    checkSortIndex (rule, value, callback) {
      var text = '请输入排序号!'
      if (!value) {
        callback(text)
      } else if (/(^[1-9]\d*$)/.test(value)) {
        callback()
      } else {
        text = '请输入数字'
        callback(text)
      }
    }
  }
}
</script>

+ 203 - 0
_web/src/views/gwSystem/indexClassifyDict.vue

@ -0,0 +1,203 @@
<template>
  <a-card :bordered="false">
    <div class="table-page-search-wrapper" v-if="hasPerm('classifyDistIndex:page')">
      <a-form layout="inline">
        <a-row :gutter="48">
          <a-col :md="16" :sm="20">
            <a-radio-group default-value="1" v-model="queryParam.systemDictType" button-style="solid" @change="$refs.table.refresh(true)">
              <a-radio-button v-for="(item,index) in typeList" :key="index" :value="item.code">
                {{ item.name }}
              </a-radio-button>
            </a-radio-group>
          </a-col>
          <a-col :md="8" :sm="4">
            <a-button type="primary" style="margin-left: 8px" v-if="hasPerm('classifyDistIndex:add')" icon="plus" @click="$refs.addForm.add({'systemDictType': queryParam.systemDictType})">新增</a-button>
          </a-col>
        </a-row>
      </a-form>
    </div>
    <s-table
      ref="table"
      size="default"
      :columns="columns"
      :data="loadData"
      :alert="true"
      :rowKey="(record) => record.systemDictId"
    >
      <span slot="systemDictType" slot-scope="text">
        {{ typeFilter(text) }}
      </span>
      <span slot="action" slot-scope="text, record">
        <a-popconfirm placement="top" :title="record.systemDictIsLine===1? '是否确认下线该条目?':'是否确认上线该条目?'" @confirm="() => editjobStatusStatus(record.systemDictIsLine,record)">
          <a>{{ statusFilter(record.systemDictIsLine) }}</a>
        </a-popconfirm>
        <a-divider type="vertical"/>
        <a v-if="hasPerm('classifyDistIndex:edit')" @click="$refs.editForm.edit(record)">编辑</a>
        <a-divider type="vertical" v-if="hasPerm('classifyDistIndex:edit') && hasPerm('classifyDistIndex:delete')"/>
        <a-popconfirm v-if="hasPerm('classifyDistIndex:delete')" placement="topRight" title="是否确认删除该条目?" @confirm="() => classifyDistIndexDelete(record)">
          <a>删除</a>
        </a-popconfirm>
      </span>
    </s-table>
    <add-form ref="addForm" @ok="handleOk" />
    <edit-form ref="editForm" @ok="handleOk" />
  </a-card>
</template>
<script>
  import { STable, Ellipsis } from '@/components'
  import homeApi from '@/api/homeApi'
  import addForm from './addClassifyDictForm'
  import editForm from './editClassifyDictForm'
  export default {
    name: 'ClassifyDistIndex',
    components: {
      STable,
      Ellipsis,
      addForm,
      editForm
    },
    data () {
      return {
        typeList: homeApi.systemTypeList,
        // 查询参数
        queryParam: { id: '', systemDictType: 1 },
        // 表头
        columns: [
          {
            title: '序号',
            dataIndex: 'dataIndex',
            customRender: (text, row, index) => {
              return index + 1
            },
            align: 'center',
            width: '90px'
          },
          {
            title: '所属类别',
            dataIndex: 'systemDictType',
            scopedSlots: { customRender: 'systemDictType' }
          },
          {
            title: '分类',
            dataIndex: 'systemDictClassify',
            scopedSlots: { customRender: 'systemDictClassify' }
          },
          {
            title: '子分类',
            dataIndex: 'systemDictSubclassify',
            scopedSlots: { customRender: 'systemDictSubclassify' }
          },
          {
            title: '排序',
            dataIndex: 'systemDictSort',
            align: 'center'
          }
        ],
        // 加载数据方法 必须为 Promise 对象
        loadData: parameter => {
          return homeApi.findSystemDictById(Object.assign(parameter, this.queryParam)).then((res) => {
            return res.data
          })
        },
        selectedRowKeys: [],
        selectedRows: [],
        statusDictTypeDropDown: [{ code: 0, name: '下线' }, { code: 1, name: '上线' }]
      }
    },
    created () {
      if (this.hasPerm('classifyDistIndex:edit') || this.hasPerm('classifyDistIndex:delete') || hasPerm('classifyDistIndex:start') || hasPerm('classifyDistIndex:stop')) {
        this.columns.push({
          title: '操作',
          dataIndex: 'action',
          align: 'center',
          scopedSlots: { customRender: 'action' }
        })
      }
    },
    methods: {
      statusFilter (status) {
        const values = this.statusDictTypeDropDown.filter(item => item.code === status)
        if (values.length > 0) {
          return values[0].name
        } else {
          return '上线'
        }
      },
      typeFilter (status) {
        const values = this.typeList.filter(item => item.code === status)
        if (values.length > 0) {
          return values[0].name
        } else {
          return ''
        }
      },
      /**
       * 启动停止
       */
      editjobStatusStatus (code, record) {
        if (code === 1) {
          homeApi.updateIsLineSystemDict({ id: record.systemDictId, isLine: 0 }).then(res => {
            if (res.status === 200) {
              if (res.data) {
                this.$message.success('下线成功')
                this.$refs.table.refresh()
              } else {
                this.$message.error('下线失败')
              }
            } else {
              this.$message.error('下线失败:' + res.msg)
            }
          })
        } else {
          homeApi.updateIsLineSystemDict({ id: record.systemDictId, isLine: 1 }).then(res => {
            if (res.status === 200) {
              if (res.data) {
                this.$message.success('上线成功')
                this.$refs.table.refresh()
              } else {
                this.$message.error('上线失败')
              }
            } else {
              this.$message.error('上线失败:' + res.msg)
            }
          })
        }
      },
      classifyDistIndexDelete (record) {
        homeApi.deleteSystemDict({ id: record.systemDictId }).then((res) => {
          if (res.status === 200) {
            if (res.data) {
              this.$message.success('删除成功')
              this.$refs.table.refresh()
            } else {
              this.$message.error('删除失败')
            }
          } else {
            this.$message.error('删除失败:' + res.msg)
          }
        }).catch((err) => {
          this.$message.error('删除错误:' + err.message)
        })
      },
      toggleAdvanced () {
        this.advanced = !this.advanced
      },
      handleOk () {
        this.$refs.table.refresh()
      },
      onSelectChange (selectedRowKeys, selectedRows) {
        this.selectedRowKeys = selectedRowKeys
        this.selectedRows = selectedRows
      }
    }
  }
</script>
<style lang="less">
  .table-operator {
    margin-bottom: 18px;
  }
  button {
    margin-right: 8px;
  }
</style>

+ 1 - 1
_web/src/views/homeManager/addBannerForm.vue

@ -173,7 +173,7 @@ export default {
                this.$emit('ok', values)
                this.form.resetFields()
              } else {
                this.$message.error('新增失败:' + res.message)
                this.$message.error('新增失败:' + res.msg)
              }
            })
            .finally(res => {

+ 2 - 2
_web/src/views/homeManager/addCompanyCaseForm.vue

@ -153,7 +153,7 @@ export default {
     * 获取选择器下拉框数据
     */
    getActionClass () {
      homeApi.findArticleAll().then((res) => {
      homeApi.findArticleAll({ 'articleContentType': 2 }).then((res) => {
        this.formLoading = false
        if (res.status === 200) {
          this.actionClassData = res.data
@ -185,7 +185,7 @@ export default {
                this.$emit('ok', values)
                this.form.resetFields()
              } else {
                this.$message.error('新增失败:' + res.message)
                this.$message.error('新增失败:' + res.msg)
              }
            })
            .finally(res => {

+ 1 - 1
_web/src/views/homeManager/addPartnerForm.vue

@ -111,7 +111,7 @@ export default {
                this.$emit('ok', values)
                this.form.resetFields()
              } else {
                this.$message.error('新增失败:' + res.message)
                this.$message.error('新增失败:' + res.msg)
              }
            })
            .finally(res => {

+ 69 - 82
_web/src/views/homeManager/baseInfoData.vue

@ -2,60 +2,50 @@
  <a-card :bordered="false">
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
        <a-form-item
          style="display: none;"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          has-feedback
        >
          <a-input v-decorator="['id']" />
        </a-form-item>
        <a-form-item label="销售咨询" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input
            placeholder="请输入职位名称"
            v-decorator="['name', {rules: [{required: false, message: '请输入职位名称'}]}]"
            placeholder="请输入咨询电话"
            v-decorator="['basicInfoTel', {rules: [{required: true, message: '请输入咨询电话'}]}]"
          />
        </a-form-item>
        <a-form-item label="公司地址" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input
            placeholder="请输入公司地址"
            v-decorator="['code', {rules: [{required: false, message: '请输入公司地址'}]}]"
            v-decorator="['basicInfoAddress', {rules: [{required: true, message: '请输入公司地址'}]}]"
          />
        </a-form-item>
        <a-form-item label="企业邮箱" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input
            placeholder="请输入企业邮箱"
            v-decorator="['code', {rules: [{required: false, message: '请输入企业邮箱'}]}]"
            v-decorator="['basicInfoEmail', {rules: [{type: 'email', message: '请输入正确的企业邮箱'}, {required: true, message: '请输入企业邮箱'}]}]"
          />
        </a-form-item>
        <a-form-item label="备案信息" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input
            placeholder="请输入备案信息"
            v-decorator="['code', {rules: [{required: false, message: '请输入备案信息'}]}]"
            v-decorator="['basicInfoRecord', {rules: [{required: true, message: '请输入备案信息'}]}]"
          />
        </a-form-item>
        <a-form-item label="上传二维码" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-upload
            name="file"
            list-type="picture-card"
            class="avatar-uploader"
            :show-upload-list="false"
            action="http://192.168.131.126:8080/api/sysFileInfo/upload"
            :before-upload="beforeUpload"
            @change="handleChange"
          >
            <img v-if="imageUrl" :src="imageUrl" alt="avatar" />
            <div v-else>
              <a-icon :type="loading ? 'loading' : 'plus'" />
            </div>
          </a-upload>
          <div class="ant-upload-text">请上传250*250规格图像</div>
        <a-form-item label="上传二维码" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback :required="true">
          <div>
            <upload-component
              ref="upLoadRef"
              :remarkTxt="remarkTxt"
              @uploadSuccess="uploadSuccess"
              v-decorator="[
                'basicInfoQrcode',
                {
                  trigger: 'change',
                  rules: [{ validator: checkimageUrl }]
                },
              ]"
            ></upload-component>
          </div>
        </a-form-item>
        <div style="text-align:center;">
          <a-button type="primary">编辑</a-button>
          <a-button type="primary" @click="handleSubmit">编辑</a-button>
        </div>
      </a-form>
    </a-spin>
@ -63,13 +53,11 @@
</template>
<script>
import { sysPosEdit } from '@/api/modular/system/posManage'
function getBase64 (img, callback) {
  const reader = new FileReader()
  reader.addEventListener('load', () => callback(reader.result))
  reader.readAsDataURL(img)
}
import { addBasicInfo, findBasicInfo } from '@/api/modular/system/contentControlApi'
import uploadComponent from '@/components/upLoad'
export default {
  components: { uploadComponent },
  data () {
    return {
      loading: false,
@ -82,26 +70,42 @@ export default {
        xs: { span: 24 },
        sm: { span: 15 }
      },
      visible: false,
      confirmLoading: false,
      form: this.$form.createForm(this)
      form: this.$form.createForm(this),
      remarkTxt: '请上传200x200规格图像'
    }
  },
  mounted () {
    this.initData()
  },
  methods: {
    // 初始化方法
    edit (record) {
      this.visible = true
        setTimeout(() => {
          this.form.setFieldsValue(
            {
              id: record.id,
              name: record.name,
              code: record.code,
              sort: record.sort,
              remark: record.remark
            }
          )
        }, 100)
    initData () {
      findBasicInfo().then(res => {
        if (res.status === 200) {
          var record = res.data[0]
          if (record) {
            this.form.setFieldsValue(
              {
                basicInfoAddress: record.basicInfoAddress,
                basicInfoEmail: record.basicInfoEmail,
                basicInfoQrcode: record.basicInfoQrcode,
                basicInfoRecord: record.basicInfoRecord,
                basicInfoTel: record.basicInfoTel
              }
            )
            this.$nextTick(() => {
              this.$refs.upLoadRef.initData([record.basicInfoQrcode])
            })
          } else {
            this.$nextTick(() => {
              this.$refs.upLoadRef.initData([])
            })
          }
        } else {
          this.$message.error(res.msg)
        }
      })
    },
    handleSubmit () {
@ -111,16 +115,13 @@ export default {
      this.confirmLoading = true
      validateFields((errors, values) => {
        if (!errors) {
          sysPosEdit(values)
          addBasicInfo(values)
            .then(res => {
              if (res.success) {
              if (res.status === 200) {
                this.$message.success('编辑成功')
                this.visible = false
                this.confirmLoading = false
                this.$emit('ok', values)
                this.form.resetFields()
              } else {
                this.$message.error('编辑失败:' + res.message)
                this.$message.error('编辑失败:' + res.msg)
              }
            })
            .finally(res => {
@ -135,33 +136,19 @@ export default {
      this.form.resetFields()
      this.visible = false
    },
    // 上传图片
    handleChange (info) {
      if (info.file.status === 'uploading') {
        this.loading = true
        return
      }
      if (info.file.status === 'done') {
        // Get this url from response in real world.
        // 获取图片传参
        console.log(info.fileList[info.fileList.length - 1].response.data)
        getBase64(info.file.originFileObj, imageUrl => {
          this.imageUrl = imageUrl
          this.loading = false
        })
    uploadSuccess (avg) {
      if (avg.fileList[0]) {
        this.form.resetFields('basicInfoQrcode')
        this.form.setFieldsValue({ 'basicInfoQrcode': avg.fileList[0].uri })
      }
    },
    beforeUpload (file) {
      const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'
      if (!isJpgOrPng) {
        this.$message.error('You can only upload JPG file!')
      }
      const isLt2M = file.size / 1024 / 1024 < 2
      if (!isLt2M) {
        this.$message.error('Image must smaller than 2MB!')
    checkimageUrl (rule, value, callback) {
      if (value && value.length > 0) {
        callback()
        return
      }
      console.log(file)
      return isJpgOrPng && isLt2M
      var text = '请上传二维码'
      callback(text)
    }
  }
}

+ 1 - 1
_web/src/views/homeManager/editBannerForm.vue

@ -188,7 +188,7 @@ import { checkUrl } from '@/utils/util'
                this.$emit('ok', values)
                this.form.resetFields()
              } else {
                this.$message.error('编辑失败:' + res.message)
                this.$message.error('编辑失败:' + res.msg)
              }
            }).finally((res) => {
              this.confirmLoading = false

+ 3 - 2
_web/src/views/homeManager/editCompanyCaseForm.vue

@ -179,7 +179,7 @@ export default {
     * 获取选择器下拉框数据
     */
    getActionClass () {
      homeApi.findArticleAll().then((res) => {
      homeApi.findArticleAll({ 'articleContentType': 2 }).then((res) => {
        this.formLoading = false
        if (res.status === 200) {
          this.actionClassData = res.data
@ -202,6 +202,7 @@ export default {
        if (!errors) {
          values.companySort = parseInt(values.companySort)
          values.companyJumpUrl = values.companyAssociatedCase
          values.companyTestBannerId = 1 // 测试用字段
          homeApi.updateCompanyCase(values)
            .then(res => {
              if (res.status === 200) {
@ -211,7 +212,7 @@ export default {
                this.$emit('ok', values)
                this.form.resetFields()
              } else {
                this.$message.error('编辑失败:' + res.message)
                this.$message.error('编辑失败:' + res.msg)
              }
            })
            .finally(res => {

+ 1 - 1
_web/src/views/homeManager/editPartnerForm.vue

@ -130,7 +130,7 @@ export default {
                this.$emit('ok', values)
                this.form.resetFields()
              } else {
                this.$message.error('编辑失败:' + res.message)
                this.$message.error('编辑失败:' + res.msg)
              }
            })
            .finally(res => {

+ 2 - 2
_web/src/views/homeManager/indexBanner.vue

@ -184,7 +184,7 @@
                this.$message.error('下线失败')
              }
            } else {
              this.$message.error('下线失败:' + res.message)
              this.$message.error('下线失败:' + res.msg)
            }
          })
        } else {
@ -197,7 +197,7 @@
                this.$message.error('上线失败')
              }
            } else {
              this.$message.error('上线失败:' + res.message)
              this.$message.error('上线失败:' + res.msg)
            }
          })
        }

+ 3 - 3
_web/src/views/homeManager/indexCompanyCase.vue

@ -188,7 +188,7 @@
                this.$message.error('下线失败')
              }
            } else {
              this.$message.error('下线失败:' + res.message)
              this.$message.error('下线失败:' + res.msg)
            }
          })
        } else {
@ -201,7 +201,7 @@
                this.$message.error('上线失败')
              }
            } else {
              this.$message.error('上线失败:' + res.message)
              this.$message.error('上线失败:' + res.msg)
            }
          })
        }
@ -216,7 +216,7 @@
              this.$message.error('删除失败')
            }
          } else {
            this.$message.error('删除失败:' + res.message)
            this.$message.error('删除失败:' + res.msg)
          }
        }).catch((err) => {
          this.$message.error('删除错误:' + err.message)

+ 6 - 6
_web/src/views/homeManager/indexPartner.vue

@ -137,7 +137,7 @@
       */
      editjobStatusStatus (code, record) {
        if (code === 1) {
          homeApi.updateIsLinePartner({ id: record.partnerId, isLine: false }).then(res => {
          homeApi.updateIsLinePartner({ id: record.partnerId, isLine: 0 }).then(res => {
            if (res.status === 200) {
              if (res.data) {
                this.$message.success('下线成功')
@ -146,11 +146,11 @@
                this.$message.error('下线失败')
              }
            } else {
              this.$message.error('下线失败:' + res.message)
              this.$message.error('下线失败:' + res.msg)
            }
          })
        } else if (code === 2) {
          homeApi.updateIsLinePartner({ id: record.partnerId, isLine: true }).then(res => {
        } else {
          homeApi.updateIsLinePartner({ id: record.partnerId, isLine: 1 }).then(res => {
            if (res.status === 200) {
              if (res.data) {
                this.$message.success('上线成功')
@ -159,7 +159,7 @@
                this.$message.error('上线失败')
              }
            } else {
              this.$message.error('上线失败:' + res.message)
              this.$message.error('上线失败:' + res.msg)
            }
          })
        }
@ -174,7 +174,7 @@
              this.$message.error('删除失败')
            }
          } else {
            this.$message.error('删除失败:' + res.message)
            this.$message.error('删除失败:' + res.msg)
          }
        }).catch((err) => {
          this.$message.error('删除错误:' + err.message)