ComplexChoices.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  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 ref="Dept" v-model="selectedDept" @change="handleSelectedDept">
  11. <MyRadioButtonOffOut
  12. v-for="(item, index) in selectedDepts"
  13. :key="index"
  14. :value="index"
  15. :label="item.name"
  16. :index="index"
  17. ></MyRadioButtonOffOut>
  18. </MyRadioButtonGroup>
  19. <div style="height: 10px"></div>
  20. <MyRadioButtonGroup ref="Big" v-model="selectedDeptBig" @change="handleSelectedCourses">
  21. <MyRadioButton
  22. v-for="(item, index) in selectedDeptBigs"
  23. :key="index"
  24. :value="index"
  25. :label="item.name"
  26. :index="index"
  27. ></MyRadioButton>
  28. </MyRadioButtonGroup>
  29. <div style="height: 10px"></div>
  30. <MyRadioButtonGroup ref="Smail" v-model="selectedDeptSmail" @change="handleSelectedCourses">
  31. <MyRadioButton
  32. v-for="(item, index) in selectedDeptSmails"
  33. :key="index"
  34. :value="index"
  35. :label="item.name"
  36. :index="index"
  37. ></MyRadioButton>
  38. </MyRadioButtonGroup>
  39. </div>
  40. </div>
  41. <div style="height: 10px"></div>
  42. <div class="line"></div>
  43. <div style="height: 10px"></div>
  44. <!-- 所属课程 -->
  45. <div class="filter-group">
  46. <span class="filter-group-title">所选课程:</span>
  47. <!-- <a-radio-group v-model:value="selectedCourse" @change="handleSelectedCourses">
  48. <a-radio-button v-for="dept in selectedCourses" :key="dept" :value="dept">{{ dept }}</a-radio-button>
  49. 其他课程选项
  50. </a-radio-group> -->
  51. <MyRadioButtonGroup ref="Course" v-model="selectedCourse" @change="handleSelectedCourses">
  52. <MyRadioButton
  53. v-for="(item, index) in selectedCourses"
  54. :key="index"
  55. :value="item"
  56. :label="item"
  57. :index="index"
  58. ></MyRadioButton>
  59. </MyRadioButtonGroup>
  60. </div>
  61. <div style="height: 10px"></div>
  62. <div class="line"></div>
  63. <div style="height: 10px"></div>
  64. <!-- 课程类型和课件格式(联动单选) -->
  65. <div class="filter-group">
  66. <span class="filter-group-title">课程类型:</span>
  67. <!-- <a-radio-group v-model:value="selectedType" @change="handleTypeChange">
  68. <a-radio-button v-for="dept in selectedTypes" :key="dept" :value="dept">{{ dept }}</a-radio-button>
  69. </a-radio-group> -->
  70. <MyRadioButtonGroup ref="Type" v-model="selectedType" @change="handleTypeChange">
  71. <MyRadioButton
  72. v-for="(item, index) in selectedTypes"
  73. :key="index"
  74. :value="item"
  75. :label="item"
  76. :index="index"
  77. ></MyRadioButton>
  78. </MyRadioButtonGroup>
  79. </div>
  80. <div style="height: 10px"></div>
  81. <div class="line"></div>
  82. <div style="height: 10px"></div>
  83. <div class="filter-group">
  84. <span class="filter-group-title">课件格式:</span>
  85. <!-- <a-radio-group v-model:value="selectedFormat" @change="handleFormatChange">
  86. <a-radio-button v-for="dept in selectedFormats" :key="dept" :value="dept">{{ dept }}</a-radio-button>
  87. </a-radio-group> -->
  88. <MyRadioButtonGroup ref="Format" v-model="selectedFormat" @change="handleFormatChange">
  89. <MyRadioButton
  90. v-for="(item, index) in selectedFormats"
  91. :key="item"
  92. :value="item"
  93. :label="item"
  94. :index="index"
  95. ></MyRadioButton>
  96. </MyRadioButtonGroup>
  97. </div>
  98. <div style="height: 10px"></div>
  99. <div class="line"></div>
  100. <div style="height: 10px"></div>
  101. <!-- 已选条件 -->
  102. <div class="filter-group">
  103. <span class="filter-group-title">已选条件:</span>
  104. <div style="display: flex; align-items: center; margin-top: 7px">
  105. <a-tag
  106. v-for="tag in selectedTags"
  107. style="display: flex; justify-content: center; align-items: center"
  108. :key="tag"
  109. closable
  110. @close="handleTagClose(tag)"
  111. >
  112. {{ tag }}
  113. </a-tag>
  114. <span v-if="selectedTags.length > 0" class="clean" @click="handleClean">清除筛选</span>
  115. </div>
  116. </div>
  117. </div>
  118. </template>
  119. <script setup>
  120. import { ref, computed } from 'vue'
  121. import MyRadioButtonGroup from '../components/MyRadioButtonGroup.vue'
  122. import MyRadioButton from '../components/MyRadioButton.vue'
  123. import MyRadioButtonOffOut from '../components/MyRadioButtonOffOut.vue'
  124. import collegeApi from '@/api/college'
  125. import orgApi from '@/api/resourceType/resourceType'
  126. const selectedDept = ref('')
  127. const selectedDeptBig = ref('')
  128. const selectedDeptSmail = ref('')
  129. const selectedCourse = ref('')
  130. const selectedType = ref('')
  131. const selectedFormat = ref('')
  132. const Dept = ref(null)
  133. const Big = ref(null)
  134. const Smail = ref(null)
  135. const Course = ref(null)
  136. const Type = ref(null)
  137. const Format = ref(null)
  138. const selectedTags = ref([])
  139. const selectedTagKeys = ref([])
  140. const selectedDepts = ref(['不限', '学校本级', '一旅', '二旅', '三旅', '四旅', '五旅', '维修厂'])
  141. const selectedDeptBigs = ref([
  142. '参谋部',
  143. '政治工作部',
  144. '保障部',
  145. '理论训练系',
  146. '轰运飞行人员改装系',
  147. '职业教育中心',
  148. '教学考评中心',
  149. '教研保障中心',
  150. '服务保障中心',
  151. '教学评价办公室'
  152. ])
  153. const selectedDeptBigsList= ref([
  154. ])
  155. const selectedDeptSmailsList= ref([
  156. ])
  157. const selectedDeptSmails = ref([
  158. '三级架构a',
  159. '三级架构b',
  160. '三级架构c',
  161. '三级架构d',
  162. '三级架构e',
  163. '三级架构f',
  164. '三级架构g',
  165. '三级架构h'
  166. ])
  167. const selectedCourses = ref([
  168. '全部',
  169. '初级飞行训练',
  170. '高级飞行训练',
  171. '实弹训练',
  172. '低空战术飞行',
  173. '跨区转场训练',
  174. '空气动力学',
  175. '航空气象学',
  176. '航空电子设备',
  177. '飞机结构与系统',
  178. '空军作战指挥',
  179. '战场态势感知',
  180. '模拟对抗训练',
  181. '军队政治工作',
  182. '军事理论',
  183. '战斗精神培育',
  184. '机型改装训练',
  185. '应急程序训练'
  186. ])
  187. const selectedTypes = ref(['全部', '热门资源', '名师资源', '必修', '选修'])
  188. const selectedFormats = ref(['全部', 'ppt', 'word', 'excel', 'pdf', 'mp4', 'zip', 'rar'])
  189. const handleSelectedDept = (e) => {
  190. selectedDeptBigs.value=selectedDeptBigsList.value[e]
  191. Big.value.setClean(selectedDeptBigs.value[0])
  192. Smail.value.setClean(selectedDeptSmails.value[0])
  193. updateSelectedTags()
  194. }
  195. const handleSelectedCourses = (e) => {
  196. selectedDeptSmails.value=selectedDeptSmailsList.value[e]
  197. updateSelectedTags()
  198. }
  199. // 处理课程类型选择变化
  200. const handleTypeChange = (e) => {
  201. // selectedFormat.value = undefined // 选择课程类型时,重置课件格式
  202. updateSelectedTags()
  203. }
  204. // 处理课件格式选择变化
  205. const handleFormatChange = (e) => {
  206. // selectedType.value = undefined // 选择课件格式时,重置课程类型
  207. updateSelectedTags()
  208. }
  209. // 更新已选条件
  210. const updateSelectedTags = () => {
  211. selectedTags.value = []
  212. selectedTagKeys.value = []
  213. // selectedTags.value = [
  214. // ...(selectedDept.value !== '全部' ? { key: 'Dept', list: [selectedDept.value] } : []),
  215. // ...(selectedCourse.value !== '全部' ? { key: 'Course', list: [selectedCourse.value] } : []),
  216. // ...(selectedType.value !== '全部' ? { key: 'Type', list: [selectedType.value] } : []),
  217. // ...(selectedFormat.value !== '全部' ? { key: 'Format', list: [selectedFormat.value] } : [])
  218. // ]
  219. if (selectedDept.value !== '不限') {
  220. selectedTags.value.push(...[selectedDept.value])
  221. selectedTagKeys.value.push('Dept')
  222. }
  223. if (selectedCourse.value !== '全部') {
  224. selectedTags.value.push(...[selectedCourse.value])
  225. selectedTagKeys.value.push('Course')
  226. }
  227. if (selectedType.value !== '全部') {
  228. selectedTags.value.push(...[selectedType.value])
  229. selectedTagKeys.value.push('Type')
  230. }
  231. if (selectedFormat.value !== '全部') {
  232. selectedTags.value.push(...[selectedFormat.value])
  233. selectedTagKeys.value.push('Format')
  234. }
  235. console.log('筛选条件', selectedTags.value, selectedTagKeys.value)
  236. }
  237. // 删除已选条件
  238. const handleTagClose = (tag) => {
  239. if (tag === selectedDept.value) {
  240. selectedDept.value = '不限'
  241. } else if (tag === selectedCourse.value) {
  242. selectedCourse.value = '全部'
  243. } else if (tag === selectedType.value) {
  244. selectedType.value = '全部'
  245. } else if (tag === selectedFormat.value) {
  246. selectedFormat.value = '全部'
  247. }
  248. updateSelectedTags()
  249. }
  250. const handleClean = () => {
  251. selectedTags.value = []
  252. selectedDept.value = '不限'
  253. selectedCourse.value = '全部'
  254. selectedType.value = '全部'
  255. selectedFormat.value = '全部'
  256. selectedDeptBigs.value=[]
  257. Dept.value.setClean('不限')
  258. Big.value.setClean(selectedDeptBigs.value[0])
  259. Smail.value.setClean(selectedDeptSmails.value[0])
  260. Course.value.setClean('全部')
  261. Type.value.setClean('全部')
  262. Format.value.setClean('全部')
  263. collegeApi.tree().then((data) => {
  264. selectedDepts.value=data;
  265. selectedDepts.value.forEach((item)=>{
  266. selectedDeptBigsList.value.push(item.children);
  267. item.children.forEach((item)=>{
  268. selectedDeptSmailsList.value.push(item.children);
  269. })
  270. })
  271. handleSelectedDept(0);
  272. handleSelectedCourses(0);
  273. })
  274. updateSelectedTags()
  275. }
  276. onMounted(() => {
  277. // 初始化已选条件
  278. handleClean()
  279. })
  280. </script>
  281. <style scoped>
  282. .filter-bar {
  283. border: 1px solid #00000011; /* 灰色细边框 */
  284. padding-left: 20px;
  285. padding-right: 20px;
  286. padding-top: 5px;
  287. padding-bottom: 20px;
  288. }
  289. .filter-group {
  290. display: flex;
  291. }
  292. .filter-group-title {
  293. color: rgba(0, 0, 0, 0.521);
  294. font-size: 12px;
  295. min-width: 80px;
  296. margin-top: 10px;
  297. }
  298. .line {
  299. width: 100%;
  300. height: 0.25px;
  301. background-color: #00000013;
  302. }
  303. .clean {
  304. color: rgb(133, 183, 224);
  305. cursor: pointer;
  306. }
  307. </style>