help.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <template>
  2. <cwg-page-wrapper class="permission-page">
  3. <view class="content">
  4. <u-collapse :border="false" @close="close" @open="open" class="u-collapses" v-if="treeData.length > 0">
  5. <u-collapse-item :border="false" v-for="value in treeData" :title="value.type" :name="value.id"
  6. :key="value.id" :class="value.id !== typeId ? 'u-collapse-items' : 'u-collapse-item'">
  7. <view class="u-collapse-content" v-for="(item, index) in value.children" :key="item.id"
  8. @click="openProblem(item)">
  9. <view class="answer">{{ Number(index) + 1 }}</view>
  10. <view class="question">{{ item.problem }}</view>
  11. </view>
  12. </u-collapse-item>
  13. </u-collapse>
  14. <cwg-empty-state v-if="treeData.length === 0" />
  15. </view>
  16. </cwg-page-wrapper>
  17. </template>
  18. <script setup lang="ts">
  19. import { onLoad } from '@dcloudio/uni-app'
  20. import { ref, onMounted } from 'vue'
  21. import { ucardApi } from '@/api/ucard'
  22. import { useI18n } from "vue-i18n";
  23. import useUserStore from "@/stores/use-user-store";
  24. const userStore = useUserStore();
  25. const { t, locale } = useI18n();
  26. const list = ref([]);
  27. const dropdownList = ref([]);
  28. const treeData = ref([]);
  29. const typeId = ref(null);
  30. const open = (name) => {
  31. typeId.value = name;
  32. };
  33. const close = (name) => {
  34. typeId.value = null;
  35. };
  36. const openProblem = (item) => {
  37. userStore.saveProblemDetails(item);
  38. uni.navigateTo({
  39. url: `/pages/mine/help-detail`
  40. });
  41. };
  42. const getAppCommonProblemPage = async () => {
  43. const res = await ucardApi.getAppCommonProblemPage({ page: { current: 1, row: 100 }, language: locale.value });
  44. if (res.code === 200) {
  45. list.value = res.data
  46. }
  47. };
  48. const getAppCommonProblemDropdown = async () => {
  49. const res = await ucardApi.getAppCommonProblemDropdown({ language: locale.value });
  50. if (res.code === 200) {
  51. dropdownList.value = res.data
  52. }
  53. };
  54. // 将数据处理成树形结构
  55. const buildTreeData = () => {
  56. treeData.value = dropdownList.value.map(dropdown => {
  57. const children = list.value.filter(item => item.typeId === dropdown.id);
  58. if (children.length === 0) return null;
  59. return { ...dropdown, children }
  60. }).filter(item => item !== null);
  61. };
  62. const loadData = async () => {
  63. await getAppCommonProblemDropdown();
  64. await getAppCommonProblemPage();
  65. buildTreeData();
  66. };
  67. onMounted(() => {
  68. loadData();
  69. })
  70. </script>
  71. <style lang="scss" scoped>
  72. @import "@/uni.scss";
  73. .permission-page {
  74. min-height: 100vh;
  75. background: #f5f5f5;
  76. padding: px2rpx(12) !important;
  77. .u-collapses {
  78. border-radius: px2rpx(8);
  79. overflow: hidden;
  80. }
  81. .u-collapse-item {
  82. background: #fff;
  83. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  84. :deep(.u-cell__body) {
  85. // background: linear-gradient(90deg, #eb4e6b 0%, #e7afba 100%);
  86. background: rgba(208, 37, 55, 0.03);
  87. border-radius: px2rpx(8);
  88. // color: #fff;
  89. transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);
  90. }
  91. :deep(.u-collapse-item__content) {
  92. border-radius: px2rpx(8);
  93. z-index: 3;
  94. background: #fff;
  95. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  96. overflow: hidden;
  97. }
  98. :deep(.u-collapse-item__content__text) {
  99. transition: opacity 0.25s ease-in-out;
  100. }
  101. }
  102. .u-collapse-items {
  103. border-radius: px2rpx(8);
  104. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  105. :deep(.u-cell__body) {
  106. background: #fff;
  107. border-radius: px2rpx(8);
  108. color: #333;
  109. transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);
  110. }
  111. :deep(.u-collapse-item__content) {
  112. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  113. overflow: hidden;
  114. }
  115. :deep(.u-collapse-item__content__text) {
  116. transition: opacity 0.25s ease-in-out;
  117. }
  118. }
  119. .u-collapse-content {
  120. display: flex;
  121. align-items: center;
  122. transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.25s ease-in-out;
  123. &:active {
  124. transform: scale(0.98);
  125. opacity: 0.8;
  126. }
  127. .question {
  128. flex: 1;
  129. padding: px2rpx(16);
  130. font-size: px2rpx(16);
  131. color: #333;
  132. }
  133. }
  134. }
  135. </style>