portrait.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <template>
  2. <view class="box">
  3. <!-- 已选中 -->
  4. <view class="chose borderLine">
  5. <view class="choseTitle">已选中标签</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" @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 submit = async () => {
  83. await savePersonPortrait({ tagList: select.value })
  84. uni.showToast({ title: '编辑成功', icon: 'success' })
  85. await useUserStore.getInfo()
  86. //
  87. setTimeout(() => {
  88. uni.navigateBack({
  89. delta: 1,
  90. })
  91. }, 1000);
  92. }
  93. </script>
  94. <style lang="scss" scoped>
  95. $px: 30rpx;
  96. .borderLine {
  97. border-bottom: 2rpx solid #f5f5f5;
  98. }
  99. .box {
  100. padding: 20rpx $px;
  101. .chose {
  102. margin-bottom: $px;
  103. .choseTitle {
  104. margin-bottom: $px;
  105. }
  106. }
  107. .tags {
  108. padding: $px 0;
  109. display: flex;
  110. flex-wrap: wrap;
  111. .tag {
  112. margin: 0 15rpx 12rpx 0;
  113. border: 2rpx 15rpx #00B760;
  114. color: #00B760;
  115. white-space: nowrap;
  116. padding: 4rpx 10rpx;
  117. border-radius: 10rpx;
  118. font-size: 24rpx;
  119. }
  120. }
  121. }
  122. </style>