index.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. <template>
  2. <view class="content">
  3. <view class="title">
  4. 阶段
  5. </view>
  6. <view>
  7. <view
  8. v-for="(item, index) in schoolTypeList"
  9. @click="selectSchoolType(item)"
  10. :key="index"
  11. :class="{title_name: true, 'on': item.code === selectSchoolTypeId}">
  12. {{item.value}}
  13. </view>
  14. </view>
  15. <view class="title">
  16. 年级
  17. </view>
  18. <view>
  19. <view
  20. v-for="(item, index) in gradeTypeList"
  21. @click="selectGradeType(item)"
  22. :class="{title_name: true, 'on': item.code === selectGradeTypeId}"
  23. :key="index" class="title_name">
  24. {{item.value}}
  25. </view>
  26. </view>
  27. <view class="title">
  28. 科目
  29. </view>
  30. <view>
  31. <view
  32. v-if="subjectList && subjectList.length > 0"
  33. v-for="(item, index) in subjectList"
  34. :class="{title_name: true, 'on': item.id === selectSubjectId}"
  35. @click="selectSubject(item)"
  36. :key="index" >
  37. {{item.name}}
  38. </view>
  39. <view style="line-height: 100px; text-align: center;color: red">{{errorMsg}}</view>
  40. </view>
  41. <view class="title">
  42. 知识点
  43. </view>
  44. <view>
  45. <!-- :check-strictly="true" -->
  46. <ly-tree
  47. :tree-data="languagePointsList"
  48. :ready="ready"
  49. @check-change="handleCheckChange"
  50. :show-checkbox="true"
  51. node-key="value"
  52. :props="props"
  53. :emptyText="emptyText"
  54. ref="languagePointsTree"
  55. @node-expand="handleNodeExpand"
  56. @node-click="handleNodeClick">
  57. </ly-tree>
  58. </view>
  59. <view class="title">
  60. 已选中测试知识点
  61. </view>
  62. <view style="margin-top: 10upx;">
  63. <uni-tag
  64. v-for="(item, index) in selectLanguagePointsNameArray"
  65. :key="index"
  66. :text="item.label"></uni-tag>
  67. </view>
  68. <view class="ai_btn">
  69. <button
  70. @click="clearSelectValue"
  71. class="ai_btn_item"
  72. type="warn">取消</button>
  73. <button
  74. type="primary"
  75. @click="createCtPaper"
  76. class="ai_btn_item">确定</button>
  77. </view>
  78. </view>
  79. </template>
  80. <script>
  81. import {getQueryString} from '../../utils/common.js'
  82. import LyTree from '@/components/ly-tree/ly-tree.vue'
  83. import uniTag from "@/components/uni-tag/uni-tag.vue"
  84. //import { mapGetters, mapState } from 'vuex'
  85. export default {
  86. components: {LyTree, uniTag},
  87. data() {
  88. return {
  89. props: {
  90. label(data, node) {
  91. return node.data.label
  92. },
  93. children: 'children'
  94. },
  95. errorMsg: '',
  96. treeData: [],
  97. selectSubjectId: 0,
  98. selectSchoolTypeId: 0,
  99. selectGradeTypeId: 0,
  100. ready: false, // 这里用于自主控制loading加载状态,避免异步正在加载数据的空档显示“暂无数据”
  101. subjectList: [],
  102. emptyText: '',
  103. selectLanguagePointsNameArray: [],
  104. languagePointsList: [],
  105. schoolTypeList: [],
  106. gradeTypeList: [],
  107. selectLanguagePointsList: [], //选中的知识点集合
  108. languagePointsList: []
  109. }
  110. },
  111. onLoad(params) {
  112. // 获取二维码链接参数
  113. let paramValue = getQueryString('schoolId')
  114. if (paramValue) {
  115. let fromSchoolId = parseInt(paramValue)
  116. this.$store.commit('paper/updateFromSchoolId', fromSchoolId)
  117. }
  118. this.getData()
  119. },
  120. watch: {
  121. 'subjectList' (val) {
  122. if (val.length > 0) {
  123. this.errorMsg = ''
  124. }
  125. },
  126. 'languagePointsList' (val) {
  127. if (val.length > 0) {
  128. this.emptyText = ''
  129. }
  130. }
  131. },
  132. methods: {
  133. selectSchoolType (item) {
  134. this.selectSchoolTypeId = item.code
  135. this.selectGradeTypeId = 0
  136. this.selectSubjectId = 0
  137. this.languagePointsList = []
  138. this.selectLanguagePointsList = []
  139. this.gradeTypeList = []
  140. let params = {schoolTypeValue: item.code}
  141. this.$httpApi.get('/front/dict/getGradeTypeListBySchoolTypeValue', params)
  142. .then(response => {
  143. if (response.code === 1) {
  144. this.gradeTypeList = response.data
  145. }
  146. })
  147. },
  148. selectGradeType (item) {
  149. this.selectGradeTypeId = item.code
  150. this.selectSubjectId = 0
  151. this.languagePointsList = []
  152. this.subjectList = []
  153. this.selectLanguagePointsList = []
  154. let params = {gradeType: item.code}
  155. this.$httpApi.get('/front/subject/getListByGradeType', params)
  156. .then(response => {
  157. if (response.code === 1) {
  158. this.subjectList = response.data
  159. }
  160. })
  161. },
  162. selectSubject (subject) {
  163. this.selectSubjectId = subject.id
  164. this.selectLanguagePointsNameArray = []
  165. this.loadLanguagePointsList()
  166. },
  167. // 清除form 表单数据
  168. clearSelectValue () {
  169. this.selectSchoolTypeId = 0
  170. this.selectGradeTypeId = 0
  171. this.selectSubjectId = 0
  172. this.$refs.languagePointsTree.setCheckedKeys([]);
  173. },
  174. getData () {
  175. this.$httpApi.get('/front/aiCt/getCtSelectValue', {})
  176. .then(res => {
  177. let result = res.data
  178. this.schoolTypeList = result.schoolTypeList
  179. this.gradeTypeList = result.gradeTypeList
  180. this.selectSchoolTypeId = result.selectSchoolTypeId
  181. this.selectGradeTypeId = result.selectGradeTypeId
  182. this.subjectList = result.subjectList
  183. if (this.subjectList.length === 0) {
  184. this.errorMsg = '暂无该年级学习科目'
  185. }
  186. this.selectSubjectId = result.selectSubjectId
  187. this.loadLanguagePointsList()
  188. })
  189. },
  190. // 加载科目知识点
  191. loadLanguagePointsList () {
  192. let params = {
  193. gradeType: this.selectGradeTypeId,
  194. subjectId: this.selectSubjectId
  195. }
  196. this.$httpApi.get('/front/languagePoints', params)
  197. .then(response => {
  198. this.languagePointsList = response.data
  199. this.ready = true
  200. console.log(this.languagePointsList)
  201. if (!this.languagePointsList) {
  202. this.emptyText = '暂无该科目知识点'
  203. } else {
  204. this.emptyText = ''
  205. }
  206. })
  207. },
  208. createCtPaper () {
  209. if (this.selectGradeTypeId === 0) {
  210. uni.showToast({
  211. icon: 'none',
  212. title: '请选择年级'
  213. })
  214. return false
  215. }
  216. if (this.selectSubjectId === 0) {
  217. uni.showToast({
  218. icon: 'none',
  219. title: '请选择科目'
  220. });
  221. return false
  222. }
  223. // 获取所有选择子节点 知识点
  224. let checkedNodes = this.$refs.languagePointsTree.getCheckedNodes()
  225. this.selectLanguagePointsList = []
  226. for (let i = 0; i < checkedNodes.length; i++) {
  227. this.selectLanguagePointsList.push(checkedNodes[i].value)
  228. }
  229. // console.log("this.selectLanguagePointsList: " + this.selectLanguagePointsList)
  230. if (this.selectLanguagePointsList.length === 0) {
  231. uni.showToast({
  232. icon: 'none',
  233. title: '请至少选择一个知识点'
  234. });
  235. return false
  236. }
  237. this.generatePaper()
  238. },
  239. generatePaper () {
  240. uni.showLoading({
  241. title: '正在加载试卷试题...'
  242. })
  243. let form = {
  244. subjectId: this.selectSubjectId,
  245. schoolType: this.selectSchoolTypeId,
  246. gradeType: this.selectGradeTypeId,
  247. languagePointsList: this.selectLanguagePointsList
  248. }
  249. this.$httpApi.post('/front/aiCt/createAiCtPaper', form)
  250. .then(response => {
  251. if (response.code === 1) {
  252. let paperInfo = response.data
  253. paperInfo.languagePointsList = this.selectLanguagePointsList
  254. this.$store.commit('paper/updatePaperInfo', paperInfo)
  255. uni.hideLoading()
  256. uni.navigateTo({
  257. url: 'exam'
  258. })
  259. } else {
  260. uni.showToast({
  261. icon: 'none',
  262. title: response.message
  263. })
  264. }
  265. })
  266. },
  267. handleCheckChange(data, checked) {
  268. if (data.checked) {
  269. this.selectLanguagePointsNameArray.push({
  270. id: data.data.value,
  271. label: data.data.label
  272. })
  273. } else {
  274. for(let i in this.selectLanguagePointsNameArray) {
  275. let item = this.selectLanguagePointsNameArray[i]
  276. if (item.id === data.data.value) {
  277. this.selectLanguagePointsNameArray.splice(i, 1)
  278. }
  279. }
  280. }
  281. // console.log(data, checked, indeterminate);
  282. },
  283. // uni-app中emit触发的方法只能接受一个参数,所以会回传一个对象,打印对象即可见到其中的内容
  284. handleNodeClick(obj) {
  285. console.log('handleNodeClick', JSON.stringify(obj));
  286. },
  287. handleNodeExpand(obj) {
  288. console.log('handleNodeExpand', JSON.stringify(obj));
  289. }
  290. }
  291. }
  292. </script>
  293. <style lang="scss">
  294. .uni-tag {
  295. height: 119upx;
  296. margin: 10upx;
  297. }
  298. .content {
  299. padding: 10px;
  300. margin: 2%;
  301. width: 90%;
  302. height: 90%;
  303. display: flex;
  304. flex-direction: column;
  305. .on {
  306. background: #409eff;
  307. color: #fff;
  308. border: 1px solid #409eff;
  309. }
  310. .on:hover {
  311. background: #409eff;
  312. color: #fff;
  313. border: 1px solid #409eff;
  314. }
  315. }
  316. .ly-tree-node__label {
  317. font-size: 16px !important;
  318. }
  319. .title {
  320. font-size: 22px;
  321. font-weight: bold;
  322. }
  323. .title_name {
  324. border-radius: 120rpx;
  325. cursor: pointer;
  326. color: #cacaca;
  327. margin: 15px 5px 10px 12px;
  328. padding: 8px;
  329. display: block;
  330. min-width: 70px;
  331. line-height: 40px;
  332. float: left;
  333. text-align: center;
  334. border: 1px solid #d0d0d0;
  335. }
  336. .ai_btn {
  337. display: inline-block;
  338. float: right;
  339. line-height: 40px;
  340. position: relative;
  341. left: 10%;
  342. }
  343. .ai_btn_item {
  344. width: 100px;
  345. float: left;
  346. line-height: 50px;
  347. margin-left: 20px;
  348. margin-top: 20px;
  349. }
  350. </style>