portrait.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <template>
  2. <view class="box">
  3. <!-- 已选中 -->
  4. <view class="chose borderLine">
  5. <view class="choseTitle MiSans-Noraml">已选中标签</view>
  6. <view class="tags">
  7. <view
  8. v-for="tag in select"
  9. :key="tag"
  10. class="tag"
  11. style="color: orange; border: 2rpx solid orange;"
  12. @tap="handleCancelSelect(tag)"
  13. >
  14. {{ tag }}
  15. <uni-icons type="clear" size="16" color="#ea8d03"></uni-icons>
  16. </view>
  17. </view>
  18. </view>
  19. <!-- 选择项 -->
  20. <view v-if="showTagList && tagList?.length" class="list">
  21. <uni-collapse v-model="collapseOpen">
  22. <uni-collapse-item
  23. v-for="val in tagList" :key="val.id"
  24. :name="val.id"
  25. :title="val?.nameCn || '--'"
  26. >
  27. <view v-if="val?.children?.length" class="tags">
  28. <view v-for="k in val.children" :key="k.id">
  29. <view v-if="select.includes(k.nameCn)" class="tag" style="color: grey; border: 2rpx solid grey;">
  30. <uni-icons type="plusempty" size="14" color="#00B760"></uni-icons>
  31. {{ k?.nameCn || '--' }}
  32. </view>
  33. <view v-else class="tag" style="color: #00B760; border: 2rpx solid #00B760;" @tap="handleSelect(k.nameCn)">
  34. <uni-icons type="plusempty" size="14" color="#00B760"></uni-icons>
  35. {{ k?.nameCn || '--' }}
  36. </view>
  37. </view>
  38. </view>
  39. </uni-collapse-item>
  40. </uni-collapse>
  41. </view>
  42. <view class="f-horizon-center">
  43. <button type="primary" size="default" class="send-button MiSans-Medium" :disabled="disabled" @click="submit">提 交</button>
  44. </view>
  45. </view>
  46. </template>
  47. <script setup>
  48. import { getTagTreeDataApi, savePersonPortrait } from '@/api/user'
  49. import { ref } from 'vue'
  50. import { userStore } from '@/store/user'; const useUserStore = userStore()
  51. // 选择
  52. const handleSelect = (nameCn) => {
  53. const result = select.value.includes(nameCn)
  54. if (!result) return select.value.push(nameCn)
  55. else select.value = select.value.filter(e => e !== nameCn)
  56. }
  57. // 删除
  58. const handleCancelSelect = (nameCn) => {
  59. select.value = select.value.filter(e => e !== nameCn)
  60. }
  61. const select = ref([])
  62. // 获取基础信息
  63. function getBaseInfo () {
  64. const baseInfo = useUserStore.baseInfo
  65. select.value = baseInfo.tagList && baseInfo.tagList?.length ? baseInfo.tagList : []
  66. }
  67. // 获取基础信息
  68. getBaseInfo()
  69. const tagList = ref([])
  70. const collapseOpen = ref([])
  71. const showTagList = ref(false)
  72. // 获取标签字典数据
  73. const getTagList = async () => {
  74. showTagList.value = false
  75. const res = await getTagTreeDataApi({ type: 0 })
  76. tagList.value = res?.data || []
  77. collapseOpen.value = tagList.value?.map(e => e.id)
  78. showTagList.value = true
  79. }
  80. getTagList()
  81. // 提交
  82. const disabled = ref(false)
  83. const submit = async () => {
  84. disabled.value = true
  85. try {
  86. await savePersonPortrait({ tagList: select.value })
  87. uni.showToast({ title: '编辑成功', icon: 'success' })
  88. await useUserStore.getInfo(false)
  89. setTimeout(() => {
  90. uni.navigateBack({
  91. delta: 1
  92. })
  93. disabled.value = false
  94. }, 1000)
  95. } catch {
  96. disabled.value = false
  97. }
  98. }
  99. </script>
  100. <style lang="scss" scoped>
  101. $px: 30rpx;
  102. .borderLine {
  103. border-bottom: 2rpx solid #f5f5f5;
  104. }
  105. .box {
  106. padding: 20rpx $px;
  107. .chose {
  108. margin-bottom: $px;
  109. .choseTitle {
  110. margin-bottom: $px;
  111. }
  112. }
  113. .tags {
  114. padding: $px 0;
  115. display: flex;
  116. flex-wrap: wrap;
  117. .tag {
  118. margin: 0 15rpx 12rpx 0;
  119. border: 2rpx 15rpx #00B760;
  120. color: #00B760;
  121. white-space: nowrap;
  122. padding: 4rpx 10rpx;
  123. border-radius: 10rpx;
  124. font-size: 24rpx;
  125. }
  126. }
  127. }
  128. </style>