SearchMain.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <template>
  2. <div class="page_item">
  3. <div class="tag_group">
  4. <div class="tag_group_title">省份:</div>
  5. <div class="tag_group_content">
  6. <div class="tag_item" v-for="item in searchList.provinceNode" :key="item.provinceCode" @click="selectItem(item.provinceCode, 'provinceCode', item)" :class="item.provinceCode === searchData.provinceCode ? 'active' : ''">
  7. {{ item.provinceName }}
  8. </div>
  9. </div>
  10. </div>
  11. <div class="tag_group" v-if="cityNode.length > 0">
  12. <div class="tag_group_title">城市:</div>
  13. <div class="tag_group_content">
  14. <div class="tag_item" v-for="item in cityNode" :key="item.cityCode" @click="selectItem(item.cityCode, 'cityCode', item)" :class="item.cityCode === searchData.cityCode ? 'active' : ''">
  15. {{ item.cityName }}
  16. </div>
  17. </div>
  18. </div>
  19. <div class="tag_group">
  20. <div class="tag_group_title">运维:</div>
  21. <div class="tag_group_content">
  22. <div class="tag_item" v-for="item in searchList.userInfo" :key="item.userId" @click="selectItem(item.userId, 'userId', item)" :class="item.userId === searchData.userId ? 'active' : ''">
  23. {{ item.nickname }}
  24. </div>
  25. </div>
  26. </div>
  27. <div class="tag_group">
  28. <div class="tag_group_title">状态:</div>
  29. <div class="tag_group_content">
  30. <div class="tag_item" v-for="item in searchList.typeNode" :key="item.type" @click="selectItem(item.type, 'type', item)" :class="item.type === searchData.type ? 'active' : ''">
  31. {{ item.typeName }}
  32. </div>
  33. </div>
  34. </div>
  35. </div>
  36. </template>
  37. <script lang="ts">
  38. export default {
  39. name: 'SearchMain',
  40. }
  41. </script>
  42. <script lang="ts" setup>
  43. import { onMounted, ref } from 'vue'
  44. import { getSearchList } from '@/api/school'
  45. const searchData = ref({
  46. provinceCode: '',
  47. cityCode: '',
  48. type: '',
  49. userId: '',
  50. })
  51. interface City {
  52. cityCode: string
  53. cityName: string
  54. }
  55. const cityNode = ref<City[]>([])
  56. interface Province {
  57. provinceCode: string;
  58. provinceName: string;
  59. children?: City[]; // 如果有子级城市数据的话
  60. }
  61. interface City {
  62. cityCode: string;
  63. cityName: string;
  64. }
  65. interface TypeNode {
  66. type: string;
  67. typeName: string;
  68. }
  69. interface UserInfo {
  70. userId: string;
  71. nickname: string;
  72. }
  73. interface SearchList {
  74. examTypes: any[];
  75. provinceNode: Province[];
  76. typeNode: TypeNode[];
  77. userInfo: UserInfo[];
  78. }
  79. const searchList = ref<SearchList>({
  80. examTypes: [],
  81. provinceNode: [],
  82. typeNode: [],
  83. userInfo: []
  84. })
  85. const emit = defineEmits(['FnSearch'])
  86. type SearchDataKey = 'provinceCode' | 'cityCode' | 'type' | 'userId'
  87. const selectItem = (value: string, str: SearchDataKey, item: any) => {
  88. searchData.value[str] = value
  89. let arr = []
  90. if(str == 'provinceCode') {
  91. if(value) {
  92. arr = [...item.children]
  93. arr.splice(0, 0, { cityCode: "", cityName: "全部" })
  94. cityNode.value = arr
  95. searchData.value.cityCode = ''
  96. }else {
  97. cityNode.value = []
  98. searchData.value.cityCode = ''
  99. }
  100. }
  101. emit('FnSearch', searchData);
  102. }
  103. onMounted(() => {
  104. GetSearchList()
  105. })
  106. const GetSearchList = () => {
  107. getSearchList().then((res: any) => {
  108. console.log(res)
  109. if(res.code == 200) {
  110. const { data } = res
  111. for(let i in data) {
  112. if(i == 'provinceNode') {
  113. data[i].splice(0, 0, { provinceCode: "", provinceName: "全部" })
  114. }else if(i == 'cityNode') {
  115. data[i].splice(0, 0, { cityCode: "", cityName: "全部" })
  116. }else if( i == 'typeNode') {
  117. data[i].splice(0, 0, { type: "", typeName: "全部" })
  118. }else if( i == 'userInfo') {
  119. data[i].splice(0, 0, { userId: "", nickname: "全部" })
  120. }
  121. }
  122. searchList.value = data
  123. console.log(searchList.value)
  124. }
  125. })
  126. }
  127. </script>
  128. <style lang="scss" scoped>
  129. .tag_group{
  130. padding:8px 0;
  131. display: flex;
  132. justify-content: flex-start;
  133. .tag_group_title {
  134. width: auto;
  135. height: auto;
  136. margin-right: 8px;
  137. color: #303133;
  138. font-size: 14px;
  139. text-align: left;
  140. line-height: 30px;
  141. font-weight: 500;
  142. letter-spacing: 0em;
  143. }
  144. .tag_group_content {
  145. width: calc(100% - 80px);
  146. display: flex;
  147. flex-wrap: wrap;
  148. gap: 8px;
  149. .tag_item {
  150. padding: 0 8px;
  151. line-height: 30px;
  152. border-radius: 4px;
  153. font-size: 14px;
  154. background: #fff;
  155. color: #999999;
  156. cursor: pointer;
  157. &.active {
  158. background: rgba(71,113,203,0.1);
  159. color: #2E64FA;
  160. }
  161. &:hover {
  162. color: #2E64FA;
  163. }
  164. }
  165. }
  166. }
  167. </style>