From 52af035632e198e8f0cb7f5154fee51994c475db Mon Sep 17 00:00:00 2001
From: 龚焕茏 <2842157468@qq.com>
Date: 星期六, 11 五月 2024 16:57:55 +0800
Subject: [PATCH] feat:新增问答模块

---
 src/views/feedback/list.vue       |    4 
 src/views/questionAnswer/edit.vue |  100 ++++++++++++++++++++
 src/api/questionAnswer.js         |   10 ++
 src/views/questionAnswer/list.vue |  134 ++++++++++++++++++++++++++
 src/router.js                     |   25 +++++
 5 files changed, 271 insertions(+), 2 deletions(-)

diff --git a/src/api/questionAnswer.js b/src/api/questionAnswer.js
new file mode 100644
index 0000000..66980af
--- /dev/null
+++ b/src/api/questionAnswer.js
@@ -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),
+}
diff --git a/src/router.js b/src/router.js
index 31f917f..c2ee1eb 100644
--- a/src/router.js
+++ b/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',
diff --git a/src/views/feedback/list.vue b/src/views/feedback/list.vue
index 780d652..4455709 100644
--- a/src/views/feedback/list.vue
+++ b/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>
diff --git a/src/views/questionAnswer/edit.vue b/src/views/questionAnswer/edit.vue
new file mode 100644
index 0000000..222ffd2
--- /dev/null
+++ b/src/views/questionAnswer/edit.vue
@@ -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>
diff --git a/src/views/questionAnswer/list.vue b/src/views/questionAnswer/list.vue
new file mode 100644
index 0000000..0544d88
--- /dev/null
+++ b/src/views/questionAnswer/list.vue
@@ -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>

--
Gitblit v1.8.0