index.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <!--
  2. * @Author: wanglj wanglijie@dashoo.cn
  3. * @Date: 2025-03-11 18:02:10
  4. * @LastEditors: wanglj wanglijie@dashoo.cn
  5. * @LastEditTime: 2025-03-29 14:16:50
  6. * @FilePath: \vant-demo-master\vant\vue3-ts\src\view\login\index.vue
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. -->
  9. <template>
  10. <div class="entry-container">
  11. <van-tabs v-model:active="state.queryParams.approveStatus" @change="changeType">
  12. <van-tab title="审批中" name="20"></van-tab>
  13. <van-tab title="已通过" name="30"></van-tab>
  14. <van-tab title="全部申请" name=""></van-tab>
  15. </van-tabs>
  16. <div class="list-container">
  17. <van-list v-model:loading="state.loading" :finished="state.finished" finished-text="没有更多了" @load="onLoad">
  18. <van-cell v-for="item in state.list" :key="item" @click="toDetail(item.id)">
  19. <template #default>
  20. <div class="list">
  21. <header class="flex justify-between">
  22. <strong class="title">{{ `${item.memberName}的${item.platformName}入室申请` }}</strong>
  23. <van-tag v-if="item.approveStatus == 10" type="warning">待提交</van-tag>
  24. <van-tag v-else-if="item.approveStatus == 20" type="primary">审批中</van-tag>
  25. <van-tag v-else-if="item.approveStatus == 30" type="success">审批通过</van-tag>
  26. <van-tag v-else-if="item.approveStatus == 40" type="danger">审批退回</van-tag>
  27. </header>
  28. <p class="inst-title">
  29. <span>课题名称</span>
  30. <span class="title ml8">{{ item.pgName }}</span>
  31. </p>
  32. <p class="inst-title">
  33. <span>申请平台</span>
  34. <span class="title ml8">{{ item.platformName }}</span>
  35. </p>
  36. <p class="inst-title">
  37. <span>申请时长</span>
  38. <span class="title ml8">{{ item.platformTime }}个月</span>
  39. </p>
  40. <p class="inst-title">
  41. <span>入室周期</span>
  42. <span class="title ml8">{{
  43. item.appointEndDate
  44. ? `${formatDate(new Date(item.appointEndDate), 'YYYY-mm-dd')}~${formatDate(new Date(item.appointEndDate), 'YYYY-mm-dd')}`
  45. : '-'
  46. }}</span>
  47. </p>
  48. <footer class="flex justify-between mt4">
  49. <span class="title">{{ item.memberName }}</span>
  50. <span class="time">{{ formatDate(new Date(item.createdTime), 'YYYY-mm-dd') }}</span>
  51. </footer>
  52. </div>
  53. </template>
  54. </van-cell>
  55. </van-list>
  56. </div>
  57. <van-floating-bubble v-model:offset="offset" icon="plus" @click="onClick" axis="y" />
  58. </div>
  59. </template>
  60. <script name="home" lang="ts" setup>
  61. import to from 'await-to-js'
  62. import { formatDate } from '/@/utils/formatTime'
  63. import { onMounted, reactive, ref } from 'vue'
  64. import { useRouter, useRoute } from 'vue-router'
  65. import { usePlatformAppointApi } from '/@/api/platform/appoint'
  66. const platformAppointApi = usePlatformAppointApi()
  67. const router = useRouter()
  68. const route = useRoute()
  69. const offset = ref({ x: -80, y: 600 })
  70. const state = reactive({
  71. queryParams: {
  72. approveStatus: '20',
  73. pageNum: 1,
  74. pageSize: 10
  75. },
  76. finished: false,
  77. loading: true,
  78. list: [] as any[]
  79. })
  80. const changeType = (name: string) => {
  81. state.queryParams.pageNum = 1
  82. state.list = []
  83. onLoad()
  84. }
  85. const onLoad = async () => {
  86. const [err, res]: ToResponse = await to(platformAppointApi.getList(state.queryParams))
  87. if (err) return
  88. const list = res?.data?.list || []
  89. for (const item of list) {
  90. state.list.push(item)
  91. }
  92. state.loading = false
  93. state.queryParams.pageNum++
  94. if (list.length < state.queryParams.pageSize) {
  95. state.finished = true
  96. }
  97. }
  98. const toDetail = (id: number) => {
  99. router.push({
  100. path: '/entry/detail',
  101. query: {
  102. id
  103. }
  104. })
  105. }
  106. const onClick = () => {
  107. router.push('/entry/add')
  108. }
  109. onMounted(() => {
  110. const type = route.query.type
  111. if (type) {
  112. state.queryParams.approveStatus = type as string
  113. }
  114. onLoad()
  115. })
  116. </script>
  117. <style lang="scss" scoped>
  118. .entry-container {
  119. position: relative;
  120. display: flex;
  121. flex-direction: column;
  122. .list-container {
  123. overflow-y: auto;
  124. padding: 10px;
  125. border-radius: 4px;
  126. flex: 1;
  127. }
  128. .van-list {
  129. .van-cell {
  130. background-color: #fff;
  131. + .van-cell {
  132. margin-top: 10px;
  133. }
  134. header,
  135. footer {
  136. color: #333;
  137. }
  138. .title {
  139. flex: 1;
  140. white-space: nowrap;
  141. overflow: hidden;
  142. text-overflow: ellipsis;
  143. text-align: left;
  144. }
  145. .inst-title {
  146. color: #333;
  147. text-align: left;
  148. flex: 1;
  149. overflow: hidden;
  150. white-space: nowrap;
  151. text-overflow: ellipsis;
  152. margin-top: 4px;
  153. span:first-child {
  154. color: rgb(120, 120, 120);
  155. }
  156. }
  157. .time {
  158. color: #f69a4d;
  159. }
  160. }
  161. }
  162. }
  163. </style>