index.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <script setup lang="ts">
  2. import { ref, onMounted } from 'vue'
  3. // 模拟反馈数据
  4. interface FeedbackItem {
  5. id: number
  6. content: string
  7. imageUrl?: string
  8. date: string
  9. status: '已回复' | '处理中' | '已解决'
  10. }
  11. const feedbackList = ref<FeedbackItem[]>([
  12. {
  13. id: 1,
  14. content: '这是一个测试反馈内容,用户提出的问题在这里展示。',
  15. imageUrl: '',
  16. date: '2025-10-28 14:30',
  17. status: '已回复'
  18. },
  19. {
  20. id: 2,
  21. content: '另一个反馈示例,带有图片附件。',
  22. imageUrl: '/static/plus.png',
  23. date: '2025-10-29 09:15',
  24. status: '处理中'
  25. }
  26. ])
  27. // 返回上一页
  28. const goBack = () => {
  29. uni.navigateBack()
  30. }
  31. // 页面加载时获取数据
  32. onMounted(() => {
  33. // 这里可以调用 API 获取实际数据
  34. })
  35. // 下拉刷新
  36. const onPullDownRefresh = () => {
  37. // 模拟刷新数据
  38. setTimeout(() => {
  39. uni.stopPullDownRefresh()
  40. // 模拟更新数据
  41. feedbackList.value.unshift({
  42. id: feedbackList.value.length + 1,
  43. content: '这是下拉刷新后新增的反馈内容',
  44. imageUrl: '',
  45. date: new Date().toLocaleString('zh-CN', {
  46. year: 'numeric',
  47. month: '2-digit',
  48. day: '2-digit',
  49. hour: '2-digit',
  50. minute: '2-digit'
  51. }).replace(/\//g, '-'),
  52. status: '处理中'
  53. })
  54. }, 1000)
  55. }
  56. // 跳转到详情页
  57. const goToDetail = (id: number) => {
  58. uni.navigateTo({
  59. url: `/pages/feedback/list/detail/index?id=${id}`
  60. })
  61. }
  62. // 触发下拉刷新的方法(用于测试)
  63. const triggerRefresh = () => {
  64. onPullDownRefresh()
  65. }
  66. </script>
  67. <template>
  68. <!-- 列表内容 -->
  69. <view class="p-3">
  70. <view
  71. v-for="item in feedbackList"
  72. :key="item.id"
  73. class="bg-white rounded-lg shadow-sm mb-4 p-4"
  74. @click="goToDetail(item.id)"
  75. >
  76. <view class="flex justify-between items-start mb-2">
  77. <text class="text-gray-900 font-medium">反馈 #{{ item.id }}</text>
  78. <text class="text-xs px-2 py-1 rounded" :class="{
  79. 'bg-green-100 text-green-800': item.status === '已解决',
  80. 'bg-yellow-100 text-yellow-800': item.status === '处理中',
  81. 'bg-blue-100 text-blue-800': item.status === '已回复'
  82. }">{{ item.status }}</text>
  83. </view>
  84. <view class="text-gray-700 text-sm mb-3">
  85. {{ item.content }}
  86. </view>
  87. <view v-if="item.imageUrl" class="mb-3">
  88. <image
  89. :src="item.imageUrl"
  90. class="w-24 h-24 rounded object-cover"
  91. mode="aspectFill"
  92. />
  93. </view>
  94. <view class="text-xs text-gray-500">
  95. {{ item.date }}
  96. </view>
  97. </view>
  98. <view v-if="feedbackList.length === 0" class="text-center py-10 text-gray-500">
  99. 暂无反馈记录
  100. </view>
  101. </view>
  102. </template>
  103. <style scoped>
  104. </style>