addQuestionList.tsx 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. import Pagination from '@/components/pagination'
  2. import SaveForm from '@/components/save-form'
  3. import { lessonType } from '@/views/knowledge-manage/knowledgeTypeData'
  4. import {
  5. DataTableColumn,
  6. NButton,
  7. NCascader,
  8. NDataTable,
  9. NFormItem,
  10. NInput,
  11. NSelect,
  12. NSpace
  13. } from 'naive-ui'
  14. import { computed, defineComponent, onMounted, reactive, ref } from 'vue'
  15. import {
  16. examinationKnowledgePointCategoryPage,
  17. examinationQuestionPage,
  18. examinationQuestionPageAndAnswer
  19. } from '../../api'
  20. import styles from '../index.module.less'
  21. import { difficultyCoefficients, questionTypeCode } from '../question-bank'
  22. export default defineComponent({
  23. name: 'add-question-list',
  24. emits: ['select'],
  25. props: {
  26. selectList: {
  27. type: Array,
  28. default: () => []
  29. }
  30. },
  31. setup(props, { emit }) {
  32. const saveForm = ref()
  33. const checkList = computed(() => {
  34. const list = props.selectList?.map((n: any) => n.id) || []
  35. return list
  36. })
  37. const data = reactive({
  38. pagination: {
  39. page: 1,
  40. rows: 10,
  41. total: 0
  42. },
  43. loading: false,
  44. list: [] as any,
  45. categorys: [] as any,
  46. selectList: [] as any
  47. })
  48. const searchForm = reactive({
  49. score: null, //分值
  50. difficultyCoefficient: null, //难度
  51. questionTypeCode: null, //题目类型,可用值:RADIO,CHECKBOX,PLAY,SORT,LINK
  52. keyword: null, // 题目名称、编号
  53. categoryId: null, // 考点编号
  54. courseTypeCode: null //
  55. })
  56. const columns = (): DataTableColumn[] => {
  57. return [
  58. {
  59. type: 'selection',
  60. disabled: (row: any) => {
  61. return checkList.value.includes(row.id)
  62. }
  63. },
  64. {
  65. title: '题目名称',
  66. key: 'name',
  67. width: 230,
  68. render(row: any) {
  69. return (
  70. <div>
  71. <div>{row.name}</div>
  72. <div>编号:{row.id}</div>
  73. </div>
  74. )
  75. }
  76. },
  77. {
  78. title: '题目类型',
  79. key: 'questionTypeCode',
  80. render(row: any) {
  81. return questionTypeCode[row.questionTypeCode]
  82. }
  83. },
  84. {
  85. title: '考点',
  86. key: 'examinationKnowledgePointCategoryName'
  87. },
  88. {
  89. title: '难度',
  90. key: 'difficultyCoefficient',
  91. render(row: any) {
  92. const rowName =
  93. difficultyCoefficients.find(
  94. (n: any) => n.value?.toLocaleUpperCase() === row.difficultyCoefficient
  95. )?.label || row.difficultyCoefficient
  96. row.difficultyCoefficientName = rowName
  97. return rowName
  98. }
  99. },
  100. {
  101. title: '分值',
  102. key: 'totalScore'
  103. }
  104. ]
  105. }
  106. // 获取数据
  107. const getList = async () => {
  108. data.loading = true
  109. try {
  110. const res: any = await examinationQuestionPageAndAnswer({
  111. page: data.pagination.page,
  112. rows: data.pagination.rows,
  113. ...searchForm
  114. })
  115. if (Array.isArray(res?.data?.rows)) {
  116. data.list = res.data.rows
  117. data.pagination.total = res.data.total
  118. }
  119. } catch (error) {}
  120. data.loading = false
  121. }
  122. // 获取考点类型
  123. const getType = async () => {
  124. try {
  125. const res: any = await examinationKnowledgePointCategoryPage({
  126. page: 1,
  127. rows: 1000
  128. })
  129. if (Array.isArray(res?.data?.rows)) {
  130. data.categorys = formatList(res.data.rows)
  131. }
  132. } catch (error) {}
  133. }
  134. const formatList = (item: any) => {
  135. item.forEach((child: any) => {
  136. if (child.children && child.children.length) {
  137. formatList(child.children)
  138. } else {
  139. child.children = null
  140. }
  141. })
  142. return item
  143. }
  144. const onSubmit = () => {
  145. data.pagination.page = 1
  146. getList()
  147. }
  148. onMounted(() => {
  149. getType()
  150. getList()
  151. })
  152. return () => (
  153. <div class={styles.questionBank}>
  154. <SaveForm
  155. ref={saveForm}
  156. style={{ 'box-shadow': 'none', marginBottom: 0, paddingTop: 0 }}
  157. label-width=""
  158. model={searchForm}
  159. onSubmit={onSubmit}
  160. onSetModel={(val: any) => Object.assign(searchForm, val)}
  161. saveKey="add-question-list-key"
  162. >
  163. <NFormItem path="keyword" label="关键字">
  164. <NInput
  165. placeholder="请输入题目名称/编号"
  166. v-model:value={searchForm.keyword}
  167. onKeydown={(e) => {
  168. if (e.code === 'Enter') {
  169. onSubmit()
  170. }
  171. }}
  172. clearable
  173. />
  174. </NFormItem>
  175. <NFormItem path="score" label="分值">
  176. <NInput
  177. placeholder="请输入分值"
  178. v-model:value={searchForm.score}
  179. onKeydown={(e) => {
  180. if (e.code === 'Enter') {
  181. onSubmit()
  182. }
  183. }}
  184. clearable
  185. />
  186. </NFormItem>
  187. <NFormItem path="questionTypeCode" label="题目类型">
  188. <NSelect
  189. placeholder="请选择题目类型"
  190. v-model:value={searchForm.questionTypeCode}
  191. options={Object.keys(questionTypeCode).map((key: string) => ({
  192. label: questionTypeCode[key],
  193. value: key
  194. }))}
  195. clearable
  196. />
  197. </NFormItem>
  198. {/* <NFormItem path="courseTypeCode" label='课程类型'>
  199. <NSelect
  200. placeholder="请选择课程类型"
  201. clearable
  202. v-model:value={searchForm.courseTypeCode}
  203. options={lessonType}
  204. />
  205. </NFormItem> */}
  206. <NFormItem path="categoryId" label="考点">
  207. <NCascader
  208. placeholder="请选择考点"
  209. v-model:value={searchForm.categoryId}
  210. options={data.categorys}
  211. checkStrategy="child"
  212. childrenField="children"
  213. expandTrigger="hover"
  214. valueField="categoryId"
  215. labelField="name"
  216. clearable
  217. />
  218. </NFormItem>
  219. <NFormItem path="difficultyCoefficient" label="难度">
  220. <NSelect
  221. placeholder="请选择难度"
  222. clearable
  223. v-model:value={searchForm.difficultyCoefficient}
  224. options={difficultyCoefficients}
  225. />
  226. </NFormItem>
  227. <NFormItem>
  228. <NSpace>
  229. <NButton type="primary" onClick={() => saveForm.value?.submit()}>
  230. 搜索
  231. </NButton>
  232. <NButton type="default" onClick={() => saveForm.value?.reset()}>
  233. 重置
  234. </NButton>
  235. </NSpace>
  236. </NFormItem>
  237. </SaveForm>
  238. <NDataTable
  239. loading={data.loading}
  240. maxHeight="60vh"
  241. columns={columns()}
  242. data={data.list}
  243. row-key={(row: any) => row.id}
  244. defaultCheckedRowKeys={checkList.value}
  245. v-model:checkedRowKeys={data.selectList}
  246. ></NDataTable>
  247. <NSpace justify="space-between" align="center" style={{ padding: '8px 0' }}>
  248. <Pagination
  249. style={{ margin: 0 }}
  250. v-model:page={data.pagination.page}
  251. v-model:pageSize={data.pagination.rows}
  252. v-model:pageTotal={data.pagination.total}
  253. onList={getList}
  254. sync
  255. saveKey="add-question-list-page-key"
  256. ></Pagination>
  257. <NSpace>
  258. <NButton onClick={() => emit('select')}>取消</NButton>
  259. <NButton
  260. type="primary"
  261. onClick={() => {
  262. const list = data.list
  263. .map((n: any) => (data.selectList.includes(n.id) ? n : null))
  264. .filter(Boolean)
  265. console.log("🚀 ~ list", list)
  266. emit('select', list)
  267. }}
  268. >
  269. 确定
  270. </NButton>
  271. </NSpace>
  272. </NSpace>
  273. </div>
  274. )
  275. }
  276. })