ComplexChoices.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. <template>
  2. <div class="filter-bar">
  3. <!-- 所选院系 -->
  4. <div class="filter-group">
  5. <span class="filter-group-title">所选院系:</span>
  6. <!-- <a-radio-group v-model:value="selectedDept" >
  7. <a-radio-button v-for="dept in selectedDepts" :key="dept" :value="dept">{{ dept }}</a-radio-button>
  8. </a-radio-group> -->
  9. <div style="display: flex; flex-direction: column">
  10. <MyRadioButtonGroup
  11. ref="Dept"
  12. v-show="selectedDepts.length > 0"
  13. v-model="selectedDept"
  14. @change="handleSelectedDept"
  15. >
  16. <MyRadioButtonOffOut
  17. v-for="(item, index) in selectedDepts"
  18. :key="index"
  19. :value="index"
  20. :label="item.name"
  21. :index="index"
  22. ></MyRadioButtonOffOut>
  23. </MyRadioButtonGroup>
  24. <div style="height: 10px"></div>
  25. <MyRadioButtonGroup
  26. ref="Big"
  27. v-show="selectedDeptBigs.length > 0"
  28. v-model="selectedDeptBig"
  29. @change="handleSelectedCourses"
  30. >
  31. <MyRadioButton
  32. v-for="(item, index) in selectedDeptBigs"
  33. :key="index"
  34. :value="index"
  35. :label="item.name"
  36. :index="index"
  37. ></MyRadioButton>
  38. </MyRadioButtonGroup>
  39. <div style="height: 10px"></div>
  40. <MyRadioButtonGroup
  41. ref="Smail"
  42. v-show="selectedDeptSmails.length > 0"
  43. v-model="selectedDeptSmail"
  44. @change="handleSelectedSmails"
  45. >
  46. <MyRadioButton
  47. v-for="(item, index) in selectedDeptSmails"
  48. :key="index"
  49. :value="index"
  50. :label="item.name"
  51. :index="index"
  52. ></MyRadioButton>
  53. </MyRadioButtonGroup>
  54. </div>
  55. </div>
  56. <div style="height: 10px"></div>
  57. <div class="line"></div>
  58. <div style="height: 10px"></div>
  59. <!-- 所属课程 -->
  60. <!-- <div class="filter-group">
  61. <span class="filter-group-title">所选课程:</span>
  62. <MyRadioButtonGroup ref="Course" v-model="selectedCourse" @change="handleSelectedCourses1">
  63. <MyRadioButton
  64. v-for="(item, index) in selectedCourses"
  65. :key="index"
  66. :value="item"
  67. :label="item"
  68. :index="index"
  69. ></MyRadioButton>
  70. </MyRadioButtonGroup>
  71. </div>
  72. <div style="height: 10px"></div>
  73. <div class="line"></div>
  74. <div style="height: 10px"></div> -->
  75. <!-- 课程类型和课件格式(联动单选) -->
  76. <div class="filter-group">
  77. <span class="filter-group-title">资源类型:</span>
  78. <!-- <a-radio-group v-model:value="selectedType" @change="handleTypeChange">
  79. <a-radio-button v-for="dept in selectedTypes" :key="dept" :value="dept">{{ dept }}</a-radio-button>
  80. </a-radio-group> -->
  81. <div style="display: flex; flex-direction: column">
  82. <MyRadioButtonGroup
  83. ref="TypeBig"
  84. v-show="selectedTypesBig.length > 0"
  85. v-model="selectedTypeBig"
  86. @change="handleTypeChangeBig"
  87. >
  88. <MyRadioButton
  89. v-for="(item, index) in selectedTypesBig"
  90. :key="index"
  91. :value="index"
  92. :label="item.name"
  93. :index="index"
  94. ></MyRadioButton>
  95. </MyRadioButtonGroup>
  96. <MyRadioButtonGroup
  97. ref="Type"
  98. v-show="selectedTypes.length > 0"
  99. v-model="selectedType"
  100. @change="handleTypeChange"
  101. >
  102. <MyRadioButton
  103. v-for="(item, index) in selectedTypes"
  104. :key="index"
  105. :value="index"
  106. :label="item.name"
  107. :index="index"
  108. ></MyRadioButton>
  109. </MyRadioButtonGroup>
  110. </div>
  111. </div>
  112. <div style="height: 10px"></div>
  113. <div class="line"></div>
  114. <div style="height: 10px"></div>
  115. <div class="filter-group">
  116. <span class="filter-group-title">课件格式:</span>
  117. <!-- <a-radio-group v-model:value="selectedFormat" @change="handleFormatChange">
  118. <a-radio-button v-for="dept in selectedFormats" :key="dept" :value="dept">{{ dept }}</a-radio-button>
  119. </a-radio-group> -->
  120. <MyRadioButtonGroup ref="Format" v-model="selectedFormat" @change="handleFormatChange">
  121. <MyRadioButton
  122. v-for="(item, index) in selectedFormats"
  123. :key="item"
  124. :value="index"
  125. :label="item.fileExtendName"
  126. :index="index"
  127. ></MyRadioButton>
  128. </MyRadioButtonGroup>
  129. </div>
  130. <div style="height: 10px"></div>
  131. <div class="line"></div>
  132. <div style="height: 10px"></div>
  133. <!-- 已选条件 -->
  134. <div class="filter-group">
  135. <span class="filter-group-title">已选条件:</span>
  136. <div style="display: flex; align-items: center; margin-top: 7px">
  137. <a-tag
  138. v-for="(tag, index) in selectedTagKeys"
  139. style="display: flex; justify-content: center; align-items: center"
  140. :key="index"
  141. closable
  142. @close="handleTagClose(tag, index)"
  143. >
  144. {{ tag.name }}
  145. </a-tag>
  146. <span v-if="selectedTagKeys.length > 0" class="clean" @click="handleTagCloseAll">清除筛选</span>
  147. </div>
  148. </div>
  149. </div>
  150. </template>
  151. <script setup>
  152. import { ref, computed } from 'vue'
  153. import MyRadioButtonGroup from '../components/MyRadioButtonGroup.vue'
  154. import MyRadioButton from '../components/MyRadioButton.vue'
  155. import MyRadioButtonOffOut from '../components/MyRadioButtonOffOut.vue'
  156. import collegeApi from '@/api/college'
  157. import EventBus from '@/utils/EventBus'
  158. import {
  159. addViewCount,
  160. detail,
  161. add,
  162. cancel,
  163. queryList,
  164. resourcecentreDetail,
  165. getShareLink,
  166. getQueryTreeAll,
  167. getAllListFileFormat
  168. } from '@/api/portal'
  169. import orgApi from '@/api/resourceType/resourceType'
  170. const selectedDept = ref('')
  171. const selectedDeptBig = ref('')
  172. const selectedDeptSmail = ref('')
  173. const selectedCourse = ref('')
  174. const selectedTypeBig = ref('')
  175. const selectedType = ref('')
  176. const selectedFormat = ref('')
  177. const Dept = ref(null)
  178. const Big = ref(null)
  179. const Smail = ref(null)
  180. const Course = ref(null)
  181. const TypeBig = ref(null)
  182. const Type = ref(null)
  183. const Format = ref(null)
  184. const selectedTags = ref([])
  185. const selectedTagKeys = ref([])
  186. const selectedDepts = ref([])
  187. const selectedDeptBigs = ref([])
  188. const selectedDeptBigsList = ref([])
  189. const selectedDeptSmailsList = ref([])
  190. const selectedDeptSmails = ref([])
  191. const selectedCourses = ref([
  192. '全部',
  193. '初级飞行训练',
  194. '高级飞行训练',
  195. '实弹训练',
  196. '低空战术飞行',
  197. '跨区转场训练',
  198. '空气动力学',
  199. '航空气象学',
  200. '航空电子设备',
  201. '飞机结构与系统',
  202. '空军作战指挥',
  203. '战场态势感知',
  204. '模拟对抗训练',
  205. '军队政治工作',
  206. '军事理论',
  207. '战斗精神培育',
  208. '机型改装训练',
  209. '应急程序训练'
  210. ])
  211. const selectedTypesBig = ref([])
  212. const selectedTypes = ref([])
  213. const selectedFormats = ref([])
  214. const selectedTypesBigList = ref([])
  215. const selectedTypesList = ref([])
  216. const handleSelectedDept = (e) => {
  217. if (e == 0) {
  218. selectedDeptBigs.value = []
  219. } else {
  220. selectedDeptBigs.value = selectedDeptBigsList.value[e]
  221. }
  222. console.log('handleSelectedDept', e)
  223. selectedDeptSmails.value = []
  224. if (selectedDeptBigs.value.length > 0) {
  225. Big.value.setClean(-1)
  226. }
  227. selectedDeptBig.value = -1
  228. selectedDeptSmail.value = -1
  229. updateSelectedTags()
  230. }
  231. const handleSelectedCourses = (e) => {
  232. if (e == 0) {
  233. selectedDeptSmails.value = []
  234. } else {
  235. selectedDeptSmails.value = selectedDeptSmailsList.value[e - 1]
  236. }
  237. console.log('handleSelectedCourses', e, selectedDeptSmails.value)
  238. if (selectedDeptSmails.value.length > 0) {
  239. Smail.value.setClean(-1)
  240. }
  241. // selectedDeptSmails.value = selectedDeptSmailsList.value[e]
  242. selectedDeptSmail.value = -1
  243. updateSelectedTags()
  244. }
  245. const handleSelectedSmails = (e) => {
  246. // if (e == 0) {
  247. // selectedDeptSmails.value = []
  248. // } else {
  249. // selectedDeptSmails.value = selectedDeptSmailsList.value[e]
  250. // }
  251. // selectedDeptSmails.value = selectedDeptSmailsList.value[e]
  252. updateSelectedTags()
  253. }
  254. // 处理课程类型选择变化
  255. const handleTypeChangeBig = (e) => {
  256. if (e == 0) {
  257. selectedTypes.value = []
  258. } else {
  259. selectedTypes.value = selectedTypesBigList.value[e]
  260. }
  261. console.log('handleTypeChangeBig', e, selectedTypes.value)
  262. if (selectedTypes.value.length > 0) {
  263. Type.value.setClean(-1)
  264. }
  265. selectedType.value = -1
  266. // selectedDeptSmails.value = selectedDeptSmailsList.value[e]
  267. // updateSelectedTags()
  268. // selectedFormat.value = undefined // 选择课程类型时,重置课件格式
  269. updateSelectedTags()
  270. }
  271. const handleTypeChange = (e) => {
  272. console.log('handleTypeChange', ' e ', e, selectedTypes.value)
  273. // selectedFormat.value = undefined // 选择课程类型时,重置课件格式
  274. // updateSelectedTags()
  275. updateSelectedTags()
  276. }
  277. // 处理课件格式选择变化
  278. const handleFormatChange = (e) => {
  279. // selectedType.value = undefined // 选择课件格式时,重置课程类型
  280. updateSelectedTags()
  281. }
  282. // 更新已选条件
  283. const updateSelectedTags = () => {
  284. selectedTags.value = []
  285. selectedTagKeys.value = []
  286. let queryData = {}
  287. // selectedTags.value = [
  288. // ...(selectedDept.value !== '全部' ? { key: 'Dept', list: [selectedDept.value] } : []),
  289. // ...(selectedCourse.value !== '全部' ? { key: 'Course', list: [selectedCourse.value] } : []),
  290. // ...(selectedType.value !== '全部' ? { key: 'Type', list: [selectedType.value] } : []),
  291. // ...(selectedFormat.value !== '全部' ? { key: 'Format', list: [selectedFormat.value] } : [])
  292. // ]
  293. console.log('筛选条件第一个', selectedDept.value, selectedDepts.value)
  294. console.log('筛选条件第二个', selectedDeptBig.value, selectedDeptBigs.value)
  295. console.log('筛选条件第三个', selectedDeptSmail.value, selectedDeptSmails.value)
  296. if (
  297. selectedDept.value !== undefined &&
  298. selectedDept.value !== '' &&
  299. selectedDept.value > 0 &&
  300. selectedDepts.value.length > 0
  301. ) {
  302. if (selectedDepts.value[selectedDept.value]) {
  303. selectedTags.value.push(...[selectedDepts.value[selectedDept.value].fileExtendName])
  304. selectedTagKeys.value.push({
  305. listType: 0,
  306. key: 'collegeId',
  307. index: selectedDept.value,
  308. name: selectedDepts.value[selectedDept.value].name,
  309. id: selectedDepts.value[selectedDept.value].id
  310. })
  311. queryData['collegeId'] = selectedDepts.value[selectedDept.value].id
  312. }
  313. }
  314. if (
  315. selectedDeptBig.value !== undefined &&
  316. selectedDeptBig.value !== '' &&
  317. selectedDeptBig.value > 0 &&
  318. selectedDeptBigs.value.length > 0
  319. ) {
  320. if (selectedDeptBigs.value[selectedDeptBig.value]) {
  321. selectedTags.value.push(...[selectedDeptBigs.value[selectedDeptBig.value].name])
  322. selectedTagKeys.value.push({
  323. listType: 1,
  324. key: 'collegeTwoId',
  325. index: selectedDeptBig.value,
  326. name: selectedDeptBigs.value[selectedDeptBig.value].name,
  327. id: selectedDeptBigs.value[selectedDeptBig.value].id
  328. })
  329. queryData['collegeTwoId'] = selectedDeptBigs.value[selectedDeptBig.value].id
  330. }
  331. }
  332. console.log('selectedDeptSmail', selectedDeptSmail.value, selectedDeptSmails.value)
  333. if (
  334. selectedDeptSmail.value !== undefined &&
  335. selectedDeptSmail.value !== '' &&
  336. selectedDeptSmail.value > 0 &&
  337. selectedDeptSmails.value.length > 0
  338. ) {
  339. if (selectedDeptSmails.value[selectedDeptSmail.value]) {
  340. selectedTags.value.push(...[selectedDeptSmails.value[selectedDeptSmail.value].name])
  341. selectedTagKeys.value.push({
  342. listType: 2,
  343. key: 'collegeThreeId',
  344. index: selectedDeptSmail.value - 1,
  345. name: selectedDeptSmails.value[selectedDeptSmail.value].name,
  346. id: selectedDeptSmails.value[selectedDeptSmail.value].id
  347. })
  348. queryData['collegeThreeId'] = selectedDeptSmails.value[selectedDeptSmail.value].id
  349. }
  350. }
  351. if (
  352. selectedTypeBig.value !== undefined &&
  353. selectedTypeBig.value !== '' &&
  354. selectedTypeBig.value > 0 &&
  355. selectedTypesBig.value.length > 0
  356. ) {
  357. if (selectedTypesBig.value[selectedTypeBig.value]) {
  358. selectedTags.value.push(...[selectedTypesBig.value[selectedTypeBig.value].name])
  359. selectedTagKeys.value.push({
  360. listType: 3,
  361. key: 'resourceType',
  362. index: selectedTypeBig.value,
  363. name: selectedTypesBig.value[selectedTypeBig.value].name,
  364. id: selectedTypesBig.value[selectedTypeBig.value].id
  365. })
  366. queryData['resourceType'] = selectedTypesBig.value[selectedTypeBig.value].id
  367. }
  368. }
  369. if (
  370. selectedType.value !== undefined &&
  371. selectedType.value !== '' &&
  372. selectedType.value > 0 &&
  373. selectedTypes.value.length > 0
  374. ) {
  375. if (selectedTypes.value[selectedType.value]) {
  376. selectedTags.value.push(...[selectedTypes.value[selectedType.value].name])
  377. selectedTagKeys.value.push({
  378. listType: 4,
  379. key: 'resourceTwoType',
  380. index: selectedType.value,
  381. name: selectedTypes.value[selectedType.value].name,
  382. id: selectedTypes.value[selectedType.value].id
  383. })
  384. queryData['resourceTwoType'] = selectedTypes.value[selectedType.value].id
  385. }
  386. }
  387. if (
  388. selectedFormat.value !== undefined &&
  389. selectedFormat.value !== '' &&
  390. selectedFormat.value > 0 &&
  391. selectedFormats.value.length > 0
  392. ) {
  393. if (selectedFormats.value[selectedFormat.value]) {
  394. selectedTags.value.push(...[selectedFormats.value[selectedFormat.value].fileExtendName])
  395. selectedTagKeys.value.push({
  396. listType: 5,
  397. key: 'suffix',
  398. index: selectedFormat.value,
  399. name: selectedFormats.value[selectedFormat.value].fileExtendName,
  400. id: selectedFormats.value[selectedFormat.value].id
  401. })
  402. queryData['suffix'] = selectedFormats.value[selectedFormat.value].fileExtendName
  403. }
  404. }
  405. // if (selectedCourse.value !== '全部') {
  406. // selectedTags.value.push(...[selectedCourse.value])
  407. // selectedTagKeys.value.push('Course')
  408. // }
  409. // if (selectedType.value !== '全部') {
  410. // selectedTags.value.push(...[selectedType.value])
  411. // selectedTagKeys.value.push('Type')
  412. // }
  413. // if (selectedFormat.value !== '全部') {
  414. // selectedTags.value.push(...[selectedFormat.value])
  415. // selectedTagKeys.value.push('Format')
  416. // }
  417. console.log('筛选条件', selectedTags.value, selectedTagKeys.value)
  418. EventBus.emit('upLoadList', queryData)
  419. }
  420. // 删除已选条件
  421. const handleTagClose = (tag, index) => {
  422. // if (tag === selectedDept.value) {
  423. // selectedDept.value = '全部'
  424. // } else if (tag === selectedCourse.value) {
  425. // selectedCourse.value = '全部'
  426. // } else if (tag === selectedType.value) {
  427. // selectedType.value = '全部'
  428. // } else if (tag === selectedFormat.value) {
  429. // selectedFormat.value = '全部'
  430. // }
  431. if (tag.key == 'suffix') {
  432. Format.value.setClean(-1)
  433. selectedFormat.value = -1
  434. }
  435. if (tag.key == 'resourceTwoType') {
  436. Type.value.setClean(-1)
  437. selectedType.value = -1
  438. }
  439. if (tag.key == 'resourceType') {
  440. Type.value.setClean(-1)
  441. selectedType.value = -1
  442. TypeBig.value.setClean(-1)
  443. selectedTypeBig.value = -1
  444. }
  445. if (tag.key == 'collegeThreeId') {
  446. Smail.value.setClean(-1)
  447. selectedDeptSmail.value = -1
  448. }
  449. if (tag.key == 'collegeTwoId') {
  450. Smail.value.setClean(-1)
  451. selectedDeptSmail.value = -1
  452. Big.value.setClean(-1)
  453. selectedDeptBig.value = -1
  454. }
  455. if (tag.key == 'collegeId') {
  456. Smail.value.setClean(-1)
  457. selectedDeptSmail.value = -1
  458. Big.value.setClean(-1)
  459. selectedDeptBig.value = -1
  460. Dept.value.setClean(-1)
  461. selectedDept.value = -1
  462. }
  463. console.log('要删除的东西', tag)
  464. updateSelectedTags()
  465. }
  466. const handleTagCloseAll = () => {
  467. // if (tag === selectedDept.value) {
  468. // selectedDept.value = '全部'
  469. // } else if (tag === selectedCourse.value) {
  470. // selectedCourse.value = '全部'
  471. // } else if (tag === selectedType.value) {
  472. // selectedType.value = '全部'
  473. // } else if (tag === selectedFormat.value) {
  474. // selectedFormat.value = '全部'
  475. // }
  476. Format.value.setClean(-1)
  477. selectedFormat.value = -1
  478. Type.value.setClean(-1)
  479. selectedType.value = -1
  480. Type.value.setClean(-1)
  481. selectedType.value = -1
  482. TypeBig.value.setClean(-1)
  483. selectedTypeBig.value = -1
  484. Smail.value.setClean(-1)
  485. selectedDeptSmail.value = -1
  486. Smail.value.setClean(-1)
  487. selectedDeptSmail.value = -1
  488. Big.value.setClean(-1)
  489. selectedDeptBig.value = -1
  490. Smail.value.setClean(-1)
  491. selectedDeptSmail.value = -1
  492. Big.value.setClean(-1)
  493. selectedDeptBig.value = -1
  494. Dept.value.setClean(-1)
  495. selectedDept.value = -1
  496. // console.log('要删除的东西', tag)
  497. updateSelectedTags()
  498. }
  499. const handleClean = () => {
  500. selectedTags.value = []
  501. selectedDept.value = '全部'
  502. selectedCourse.value = '全部'
  503. selectedType.value = '全部'
  504. selectedFormat.value = '全部'
  505. selectedDeptBigs.value = []
  506. // Dept.value.setClean('全部')
  507. // Big.value.setClean(selectedDeptBigs.value[0])
  508. // Smail.value.setClean(selectedDeptSmails.value[0])
  509. // Course.value.setClean('全部')
  510. // Type.value.setClean('全部')
  511. // Format.value.setClean('全部')
  512. collegeApi.treeAll().then((data) => {
  513. selectedDepts.value = data
  514. selectedDepts.value.forEach((item) => {
  515. selectedDeptBigsList.value.push(item.children)
  516. if (item.children) {
  517. item.children.forEach((item) => {
  518. if (item.children) {
  519. selectedDeptSmailsList.value.push(item.children)
  520. }
  521. })
  522. }
  523. })
  524. console.log('看看最小的', selectedDeptSmailsList.value)
  525. // Dept.value.setClean(0)
  526. // handleSelectedDept(0)
  527. // handleSelectedCourses(0)
  528. })
  529. getQueryTreeAll().then((data) => {
  530. selectedTypesBig.value = data.data
  531. selectedTypesBig.value.forEach((item) => {
  532. selectedTypesBigList.value.push(item.children)
  533. if (item.children) {
  534. item.children.forEach((item) => {
  535. if (item.children) {
  536. selectedTypesList.value.push(item.children)
  537. }
  538. })
  539. }
  540. })
  541. })
  542. getAllListFileFormat().then((data) => {
  543. selectedFormats.value = data.data
  544. })
  545. // selectedDepts.value.unshift({ name: '全部' })
  546. // selectedDeptBigsList.value.unshift({ name: '全部' })
  547. // selectedDeptSmailsList.value.unshift({ name: '全部' })
  548. // console.log('看看呢', selectedDepts.value)
  549. // updateSelectedTags()
  550. }
  551. onMounted(() => {
  552. // 初始化已选条件
  553. handleClean()
  554. })
  555. </script>
  556. <style scoped>
  557. .filter-bar {
  558. border: 1px solid #00000011; /* 灰色细边框 */
  559. padding-left: 20px;
  560. padding-right: 20px;
  561. padding-top: 5px;
  562. padding-bottom: 20px;
  563. }
  564. .filter-group {
  565. display: flex;
  566. }
  567. .filter-group-title {
  568. color: rgba(0, 0, 0, 0.521);
  569. font-size: 12px;
  570. min-width: 80px;
  571. margin-top: 10px;
  572. }
  573. .line {
  574. width: 100%;
  575. height: 0.25px;
  576. background-color: #00000013;
  577. }
  578. .clean {
  579. color: rgb(133, 183, 224);
  580. cursor: pointer;
  581. }
  582. </style>