龚焕茏
2024-05-11 52af035632e198e8f0cb7f5154fee51994c475db
feat:新增问答模块
2个文件已修改
3个文件已添加
273 ■■■■■ 已修改文件
src/api/questionAnswer.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/feedback/list.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/questionAnswer/edit.vue 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/questionAnswer/list.vue 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/questionAnswer.js
New file
@@ -0,0 +1,10 @@
import { get, post } from '@/utils/request'
export default {
  pageList: query => post('/api/admin/questionAnswer/page', query),
  save: query => post('/api/admin/questionAnswer/save', query),
  update: query => post('/api/admin/questionAnswer/update', query),
  delete: id => post('/api/admin/questionAnswer/delete/' + id),
  query: id => post('/api/admin/questionAnswer/query/' + id),
  updateStatus: id => post('/api/admin/questionAnswer/updateStatus/' + id),
}
src/router.js
@@ -296,6 +296,31 @@
    ]
  },
  {
    path: '/questionAnswer',
    component: Layout,
    name: 'questionAnswerPage',
    meta: {
      title: '问答管理',
      icon: 'question'
    },
    alwaysShow: true,
    children: [
      {
        path: '/list',
        component: () => import('@/views/questionAnswer/list'),
        name: 'questionAnswerPage',
        meta: { title: '问答列表', noCache: true }
      },
      {
        path: '/edit',
        component: () => import('@/views/questionAnswer/edit'),
        name: 'questionAnswerEdit',
        meta: { title: '问答编辑', noCache: true, activeMenu: '/questionAnswer/list' },
        hidden: true
      }
    ]
  },
  {
    path: '/message',
    component: Layout,
    name: 'MessagePage',
src/views/feedback/list.vue
@@ -13,10 +13,10 @@
      <el-table-column label="操作" align="center" width="300px">
        <template slot-scope="{row}">
          <el-button size="mini" @click="showQuestion(row)" class="link-left">题目预览</el-button>
          <el-popconfirm title="确定已处理吗?" @confirm="hanldSettleFeedback(row)">
          <el-popconfirm title="确认处理" @confirm="hanldSettleFeedback(row)">
            <el-button slot="reference" v-if="!row.fix" size="mini" type="primary" class="link-left">确认处理</el-button>
          </el-popconfirm>
          <el-popconfirm title="确定要删除吗?" @confirm="hanldDeleteFeedback(row)">
          <el-popconfirm title="确认删除" @confirm="hanldDeleteFeedback(row)">
            <el-button slot="reference" size="mini" type="danger" class="link-left">删除</el-button>
          </el-popconfirm>
        </template>
src/views/questionAnswer/edit.vue
New file
@@ -0,0 +1,100 @@
<template>
  <div class="app-container">
    <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules">
      <el-form-item label="问题:"  prop="question">
        <el-input v-model="form.question"></el-input>
      </el-form-item>
      <el-form-item label="答案:"  prop="answer">
        <el-input v-model="form.answer"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm">提交</el-button>
        <el-button @click="resetForm">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>
<script>
import { mapGetters, mapState, mapActions } from 'vuex'
import questionAnswerApi from '@/api/questionAnswer'
export default {
  data () {
    return {
      form: {
        id: null,
        question: '',
        answer: ''
      },
      formLoading: false,
      rules: {
        question: [
          { required: true, message: '请输入问题', trigger: 'blur' }
        ],
        answer: [
          { required: true, message: '请输入答案', trigger: 'blur' }
        ]
      }
    }
  },
  created () {
    let id = this.$route.query.id
    let _this = this
    if (id && parseInt(id) !== 0) {
      _this.formLoading = true
      questionAnswerApi.query(id).then(re => {
        _this.form = re.response
        _this.formLoading = false
      })
    }
  },
  methods: {
    submitForm () {
      let _this = this
      this.$refs.form.validate((valid) => {
        if (valid) {
          this.formLoading = true
          questionAnswerApi.save(this.form).then(data => {
            if (data.code === 1) {
              _this.$message.success(data.message)
              _this.delCurrentView(_this).then(() => {
                _this.$router.push('/list')
              })
            } else {
              _this.$message.error(data.message)
              _this.formLoading = false
            }
          }).catch(e => {
            _this.formLoading = false
          })
        } else {
          return false
        }
      })
    },
    resetForm () {
      let lastId = this.form.id
      this.$refs['form'].resetFields()
      this.form = {
        id: null,
        question: '',
        answer: ''
      }
      this.form.id = lastId
    },
    ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
  },
  computed: {
    ...mapGetters('enumItem', [
      'enumFormat'
    ]),
    ...mapState('enumItem', {
      sexEnum: state => state.user.sexEnum,
      roleEnum: state => state.user.roleEnum,
      statusEnum: state => state.user.statusEnum
    })
  }
}
</script>
src/views/questionAnswer/list.vue
New file
@@ -0,0 +1,134 @@
<template>
  <div class="app-container">
    <el-form :model="queryParam" ref="queryForm" :inline="true">
      <el-form-item label="问答内容:">
        <el-input v-model="queryParam.question" clearable></el-input>
      </el-form-item>
      <el-form-item>
        <div style="display: flex">
          <el-button type="primary" @click="submitForm">查询</el-button>
          <router-link :to="{ path: '/edit' }" class="link-left">
            <el-button type="primary">添加</el-button>
          </router-link>
        </div>
      </el-form-item>
    </el-form>
    <el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%">
      <el-table-column prop="question" label="问题" />
      <el-table-column prop="answer" label="答案" />
      <el-table-column label="状态" prop="status" width="70px">
        <template slot-scope="{row}">
          <el-tag :type="row.status !== '启用' ? 'danger' : 'success'">
            {{ row.status }}
          </el-tag>
        </template>
      </el-table-column>
      <el-table-column width="270px" label="操作" align="center">
        <template slot-scope="{row}">
          <el-button size="mini" @click="changeStatus(row)" class="link-left">
            {{ row.status !== '启用' ? '启用' : '禁用' }}
          </el-button>
          <router-link :to="{ path: '/edit', query: { id: row.id } }" class="link-left">
            <el-button size="mini">编辑</el-button>
          </router-link>
          <el-popconfirm title="确认删除" @confirm="deleteUser(row)">
            <el-button slot="reference" size="mini" type="danger" class="link-left">删除</el-button>
          </el-popconfirm>
        </template>
      </el-table-column>
    </el-table>
    <pagination v-show="total > 0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize"
      @pagination="search" />
  </div>
</template>
<script>
import { mapGetters, mapState } from 'vuex'
import Pagination from '@/components/Pagination'
import questionAnswerApi from '@/api/questionAnswer'
export default {
  components: { Pagination },
  data() {
    return {
      queryParam: {
        question: '',
        role: 1,
        pageIndex: 1,
        pageSize: 10
      },
      listLoading: true,
      tableData: [],
      total: 0
    }
  },
  created() {
    this.search()
  },
  methods: {
    search() {
      this.listLoading = true
      questionAnswerApi.pageList(this.queryParam).then(data => {
        const re = data.response
        this.tableData = re.list
        this.total = re.total
        this.queryParam.pageIndex = re.pageNum
        this.listLoading = false
      })
    },
    changeStatus(row) {
      let _this = this
      questionAnswerApi.updateStatus(row.id).then(re => {
        if (re.code === 1) {
          _this.search();
          _this.$message.success(re.message)
        } else {
          _this.$message.error(re.message)
        }
      })
    },
    deleteUser(row) {
      questionAnswerApi.delete(row.id).then(re => {
        if (re.code === 1) {
          this.search()
          this.$message.success(re.message)
        } else {
          this.$message.error(re.message)
        }
      })
    },
    submitForm() {
      this.queryParam.pageIndex = 1
      this.search()
    },
    statusFormatter(status) {
      return this.enumFormat(this.statusEnum, status)
    },
    statusTagFormatter(status) {
      return this.enumFormat(this.statusTag, status)
    },
    statusBtnFormatter(status) {
      return this.enumFormat(this.statusBtn, status)
    }
  },
  computed: {
    ...mapGetters('enumItem', [
      'enumFormat'
    ]),
    ...mapState('enumItem', {
      sexEnum: state => state.user.sexEnum,
      statusEnum: state => state.user.statusEnum,
      statusTag: state => state.user.statusTag,
      statusBtn: state => state.user.statusBtn,
      levelEnum: state => state.user.levelEnum
    })
  }
}
</script>
<style lang="scss" scoped>
.upload-demo {
  margin-left: 5px;
}
</style>