鸿宇研学生前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

234 lines
5.1 KiB

  1. <template>
  2. <view class="page__view">
  3. <navbar title="选择出行人" leftClick @leftClick="$utils.navigateBack" color="#191919" bgColor="#FFFFFF" />
  4. <view class="main">
  5. <view class="card" v-for="item in list" :key="item.id">
  6. <travelerCard
  7. :data="item"
  8. @defaultChange="onDefaultChange(item.id, $event)"
  9. @selectChange="onSelectChange(item.id, $event)"
  10. @edit="onEdit(item.id)"
  11. @delete="onDelete(item.id)"
  12. ></travelerCard>
  13. </view>
  14. </view>
  15. <view class="flex bottom">
  16. <button class="btn" @click="onAdd">添加出行人</button>
  17. </view>
  18. <travelerPopup ref="travelerPopup" @submitted="getData"></travelerPopup>
  19. </view>
  20. </template>
  21. <script>
  22. import mixinsList from '@/mixins/list.js'
  23. import travelerCard from './travelerCard.vue'
  24. import travelerPopup from './travelerPopup.vue'
  25. export default {
  26. mixins: [mixinsList],
  27. components: {
  28. travelerCard,
  29. travelerPopup,
  30. },
  31. data() {
  32. return {
  33. // todo: check key
  34. mixinsListApi: '',
  35. queryParams: {
  36. pageNo: 1,
  37. pageSize: 10,
  38. },
  39. selectedIdList: [],
  40. }
  41. },
  42. onLoad(arg) {
  43. const { selectIds } = arg
  44. this.selectedIdList = selectIds?.split?.(',') || []
  45. this.getData()
  46. },
  47. onUnload() {
  48. const list = this.selectedIdList.map(id => this.list.find(item => item.id === id))
  49. this.$store.commit('setTravelerList', list)
  50. },
  51. methods: {
  52. updateSelectIdList() {
  53. this.selectedIdList = this.list.filter(item => item.isSelected).map(item => item.id)
  54. },
  55. // todo: delete
  56. getData() {
  57. let records = [
  58. {
  59. id: '001',
  60. name: '李梓发',
  61. idNo: '430223********9999',
  62. type: 0,
  63. isSelected: false,
  64. isDefault: false,
  65. },
  66. {
  67. id: '002',
  68. name: '吴彦谦',
  69. idNo: '430223********9999',
  70. type: 0,
  71. isSelected: false,
  72. isDefault: false,
  73. },
  74. {
  75. id: '003',
  76. name: '冯云',
  77. idNo: '430223********9999',
  78. type: 1,
  79. isSelected: false,
  80. isDefault: false,
  81. },
  82. {
  83. id: '004',
  84. name: '冯思钗',
  85. idNo: '430223********9999',
  86. type: 2,
  87. isSelected: false,
  88. isDefault: false,
  89. },
  90. {
  91. id: '005',
  92. name: '李书萍',
  93. idNo: '430223********9999',
  94. type: 0,
  95. isSelected: false,
  96. isDefault: false,
  97. },
  98. {
  99. id: '006',
  100. name: '冯艺莲',
  101. idNo: '430223********9999',
  102. type: 1,
  103. isSelected: false,
  104. isDefault: false,
  105. },
  106. ]
  107. this.selectedIdList.forEach(id => {
  108. const target = records.find(item => item.id === id)
  109. target.isSelected = true
  110. })
  111. this.list = records
  112. this.updateSelectIdList()
  113. },
  114. async onDefaultChange(id, val) {
  115. try {
  116. // todo: fetch
  117. // await this.$fetch('setAddressDefault', { addressId })
  118. const target = this.list.find(item => item.id === id)
  119. target.isDefault = val
  120. this.updateSelectIdList()
  121. } catch (err) {
  122. }
  123. },
  124. onSelectChange(id, val) {
  125. const target = this.list.find(item => item.id === id)
  126. target.isSelected = val
  127. this.updateSelectIdList()
  128. },
  129. async onDelete(id) {
  130. uni.showToast({
  131. icon: 'loading',
  132. title: '正在删除',
  133. });
  134. try {
  135. // todo: check api & key
  136. // await this.$fetch('deleteAddress', { id })
  137. uni.showToast({
  138. icon: 'success',
  139. title: '删除成功',
  140. });
  141. this.getData()
  142. } catch (err) {
  143. }
  144. },
  145. onEdit(id) {
  146. this.$refs.travelerPopup.open(id)
  147. },
  148. onAdd() {
  149. this.$refs.travelerPopup.open()
  150. },
  151. },
  152. }
  153. </script>
  154. <style scoped lang="scss">
  155. .page__view {
  156. width: 100vw;
  157. min-height: 100vh;
  158. background-color: $uni-bg-color;
  159. position: relative;
  160. /deep/ .nav-bar__view {
  161. position: fixed;
  162. top: 0;
  163. left: 0;
  164. }
  165. }
  166. .main {
  167. padding: calc(var(--status-bar-height) + 160rpx) 40rpx 254rpx 40rpx;
  168. }
  169. .card {
  170. & + & {
  171. margin-top: 40rpx;
  172. }
  173. }
  174. .bottom {
  175. position: fixed;
  176. left: 0;
  177. bottom: 0;
  178. align-items: flex-start;
  179. width: 100vw;
  180. // height: 214rpx;
  181. padding: 32rpx 40rpx;
  182. padding-bottom: calc(env(safe-area-inset-bottom) + 32rpx);
  183. background: #FFFFFF;
  184. box-sizing: border-box;
  185. .btn {
  186. width: 100%;
  187. padding: 14rpx 0;
  188. box-sizing: border-box;
  189. font-family: PingFang SC;
  190. font-weight: 500;
  191. font-size: 36rpx;
  192. line-height: 1.4;
  193. color: #FFFFFF;
  194. background-image: linear-gradient(to right, #21FEEC, #019AF9);
  195. border: 2rpx solid #00A9FF;
  196. border-radius: 41rpx;
  197. }
  198. }
  199. </style>