123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <template>
  2. <div style="padding: 20px">
  3. <h2 style="text-align: center">
  4. 游戏题目{{ questionId ? "编辑" : "添加" }}
  5. </h2>
  6. <el-form ref="form" :rules="rules" :model="form" label-width="90px">
  7. <el-form-item label="题目:" prop="title">
  8. <el-input v-model="form.title" placeholder="请输入实例名(必填)">
  9. <el-select slot="prepend" v-model="form.optType" style="width:100px" placeholder="请选择">
  10. <el-option label="单选题" value="1" />
  11. <el-option label="多选题" value="2" />
  12. <el-option label="判断题" value="3" />
  13. </el-select>
  14. </el-input>
  15. </el-form-item>
  16. <el-form-item v-if="questionId!==undefined && resultMode === 'examination'" label="正确选项:">
  17. <!-- <el-input v-model="form.option"></el-input> -->
  18. <!-- filterable可搜索 multiple可多选 default-first-option回车可选-->
  19. <el-select
  20. v-model="form.rightAnswer"
  21. style="width:100%"
  22. multiple
  23. filterable
  24. default-first-option
  25. placeholder="请选择"
  26. >
  27. <el-option
  28. v-for="item in rightList"
  29. :key="item"
  30. :label="item"
  31. :value="item"
  32. />
  33. </el-select>
  34. </el-form-item>
  35. <el-form-item style="text-align:center">
  36. <el-button type="primary" @click="onSubmit('form')">确定</el-button>
  37. <el-button @click="$router.go(-1)">返回</el-button>
  38. </el-form-item>
  39. <el-form-item v-if="questionId!==undefined" label="答案:">
  40. <el-button type="primary" @click="onAddAnswer">添加答案</el-button>
  41. </el-form-item>
  42. </el-form>
  43. <ul style="list-style-type: none;margin:10px 0 10px -2px">
  44. <li v-for="answer in answerList" :key="answer.answerId" class="answerli">
  45. <div style="flex:1;width: 100%;overflow: hidden;display: flex;" @click="handleEdit(answer)">
  46. <span style="width:45px">{{ answer.option }}</span>
  47. <span style="flex:1">{{ answer.content }}</span>
  48. </div>
  49. <el-popconfirm
  50. style="width:15px"
  51. icon="el-icon-info"
  52. icon-color="red"
  53. title="确定删除这个答案吗?"
  54. @onConfirm="handleDelete(answer)"
  55. >
  56. <el-button slot="reference" type="text" class="deleteQuestion" style="color:red">×</el-button>
  57. </el-popconfirm>
  58. </li>
  59. </ul>
  60. <QuestionDrawer
  61. :dialog="dialog"
  62. :question-id="questionId"
  63. :answer-id="answerId"
  64. :game-id="gameId"
  65. :resultMode="resultMode"
  66. @handleCloseDrawer="handleCloseDrawer"
  67. @handleEditDrawer="handleEditDrawer"
  68. />
  69. </div>
  70. </template>
  71. <script>
  72. import { saveQuestion, UpdateQuestion, getQuestionDetail } from '@/api/question'
  73. import { getAnswerList, deleteAnswer } from '@/api/answer'
  74. import QuestionDrawer from '@/components/Question/drawer.vue'
  75. export default {
  76. components: {
  77. QuestionDrawer
  78. },
  79. props: {
  80. gameId: String,
  81. questionId: String,
  82. resultMode: String
  83. },
  84. data() {
  85. return {
  86. rules: {
  87. title: [{ required: true, message: '请输入游戏名称', trigger: 'blur' }]
  88. },
  89. form: {
  90. title: undefined,
  91. optType: undefined,
  92. rightAnswer: undefined,
  93. gameId: undefined,
  94. questionId: undefined
  95. },
  96. // 答案列表(包括选项 内容 特征词列表)
  97. answerList: [],
  98. answerId: undefined,
  99. // 正确答案数据源
  100. rightList: [],
  101. dialog: false
  102. }
  103. },
  104. watch: {
  105. // 用于点击左边改变右边的页面
  106. questionId: function() {
  107. if (this.questionId) {
  108. this.rightList = []
  109. getQuestionDetail(this.questionId).then((res) => {
  110. this.form = res.data
  111. this.form.rightAnswer = res.data.rightAnswer?.split(',')
  112. })
  113. this.handleAnswerList()
  114. } else {
  115. this.form = {
  116. title: undefined,
  117. optType: undefined,
  118. gameId: undefined,
  119. rightAnswer: undefined,
  120. questionId: undefined
  121. }
  122. this.answerList = []
  123. this.rightList = []
  124. }
  125. }
  126. },
  127. methods: {
  128. // 添加答案
  129. onAddAnswer() {
  130. this.dialog = true
  131. this.answerId = undefined
  132. },
  133. // 编辑答案
  134. handleEdit(val) {
  135. this.dialog = true
  136. this.answerId = val.answerId
  137. },
  138. // 删除答案
  139. handleDelete(val) {
  140. deleteAnswer(val.answerId).then((res) => {
  141. this.$message('删除答案成功')
  142. this.handleAnswerList()
  143. })
  144. },
  145. // 关闭答案抽屉
  146. handleCloseDrawer() {
  147. this.dialog = false
  148. this.answerId = undefined
  149. },
  150. // 编辑答案抽屉成功重新查询列表
  151. handleEditDrawer(val) {
  152. this.handleCloseDrawer()
  153. this.handleAnswerList()
  154. },
  155. // 查询当前问题答案列表
  156. handleAnswerList() {
  157. getAnswerList({ questionId: this.questionId }).then((res) => {
  158. this.answerList = res.data.records
  159. // 给正确答按下拉菜单数据源赋值
  160. const list = []
  161. this.answerList.map(item => {
  162. list.push(item.option)
  163. })
  164. this.rightList = list
  165. })
  166. },
  167. // 转换特征数组数据格式
  168. handleToString(list) {
  169. const nameList = []
  170. list?.map(item => {
  171. nameList.push(item.name)
  172. })
  173. return nameList.toString()
  174. },
  175. onSubmit(form) {
  176. this.$refs[form].validate((valid) => {
  177. if (valid) {
  178. if (this.form.optType) {
  179. const data = { ...this.form }
  180. data.gameId = this.gameId
  181. if (this.questionId) {
  182. if (data.rightAnswer) {
  183. data.rightAnswer = data.rightAnswer.toString()
  184. }
  185. UpdateQuestion(data, this.questionId).then((res) => {
  186. this.$message('修改问题成功')
  187. // 告诉父页面实例表需要刷新并且关闭当前组件
  188. this.$emit('handleRefreshQuestion', true)
  189. })
  190. } else {
  191. saveQuestion(data).then((res) => {
  192. this.$message('添加问题成功')
  193. // 告诉父页面实例表需要刷新并且关闭当前组件
  194. this.$emit('handleRefreshQuestion', true)
  195. this.$emit('handleEditQuestion', res.data.questionId)
  196. })
  197. }
  198. } else {
  199. this.$message('请选择题型')
  200. }
  201. } else {
  202. return false
  203. }
  204. })
  205. }
  206. }
  207. }
  208. </script>
  209. <style lang="scss">
  210. .answerli {
  211. width: 100%;
  212. overflow: hidden;
  213. display: flex;
  214. line-height:40px;
  215. background-color: white;
  216. .deleteQuestion{
  217. display: none;
  218. }
  219. }
  220. .answerli:hover {
  221. background-color: rgb(230, 247, 255);
  222. }
  223. .answerli:hover .deleteQuestion{
  224. display: block
  225. }
  226. </style>