@tplc/business 0.0.52 → 0.0.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/components/lcb-action-view/lcb-action-view.vue +4 -0
  3. package/components/lcb-banner-block/lcb-banner-block.vue +3 -4
  4. package/components/lcb-calendar-search/lcb-calendar-search.vue +3 -2
  5. package/components/lcb-gap/lcb-gap.vue +7 -1
  6. package/components/lcb-list/components/FilterList/index.vue +14 -17
  7. package/components/lcb-list/components/FilterList/type.ts +1 -1
  8. package/components/lcb-list/components/FilterView/index.vue +121 -0
  9. package/components/lcb-list/components/FilterView/type.ts +8 -0
  10. package/components/lcb-list/lcb-list.vue +44 -127
  11. package/components/lcb-list/types.ts +1 -0
  12. package/components/lcb-nav/lcb-nav.vue +1 -2
  13. package/components/lcb-product/lcb-product.vue +98 -0
  14. package/components/lcb-product-item/components/ItemValue.vue +6 -24
  15. package/components/lcb-user-top/lcb-user-top.vue +15 -15
  16. package/iconfonts/index.css +24 -3
  17. package/package.json +3 -2
  18. package/types/components/lcb-action-view/lcb-action-view.vue.d.ts +2 -22
  19. package/types/components/lcb-banner-block/lcb-banner-block.vue.d.ts +0 -9
  20. package/types/components/lcb-calendar-search/lcb-calendar-search.vue.d.ts +5 -3
  21. package/types/components/lcb-list/components/FilterList/type.d.ts +1 -1
  22. package/types/components/lcb-list/components/FilterView/index.vue.d.ts +36 -0
  23. package/types/components/lcb-list/components/FilterView/type.d.ts +7 -0
  24. package/types/components/lcb-list/lcb-list.vue.d.ts +1 -0
  25. package/types/components/lcb-list/types.d.ts +1 -0
  26. package/types/components/lcb-nav/lcb-nav.vue.d.ts +0 -3
  27. package/types/components/lcb-product-item/lcb-product-item.vue.d.ts +2 -2
  28. package/types/components/lcb-list/components/FilterList/mockData.d.ts +0 -63
package/CHANGELOG.md CHANGED
@@ -2,6 +2,26 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [0.0.55](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/compare/v0.0.54...v0.0.55) (2024-11-02)
6
+
7
+
8
+ ### ✨ Features | 新功能
9
+
10
+ * 兼容icon ([dce6350](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/commit/dce63504062480ec2413f61a18705ab1f56b2253))
11
+ * 兼容no sticky ([f4b44f3](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/commit/f4b44f39bf8b3f5aacaab4ed8db74bb651c48b80))
12
+ * 兼容引擎 ([ea2de3b](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/commit/ea2de3bda892b118444db583576bdbaf627e378a))
13
+ * 新增默认click ([2cf168e](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/commit/2cf168e9a38c58f61d65989ae9ebccd094b71231))
14
+ * 调整手机号策略 ([c17daaa](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/commit/c17daaa82f485bb68b8e0176934403a8c818de4d))
15
+
16
+ ### [0.0.54](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/compare/v0.0.53...v0.0.54) (2024-10-30)
17
+
18
+ ### [0.0.53](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/compare/v0.0.52...v0.0.53) (2024-10-30)
19
+
20
+
21
+ ### ✨ Features | 新功能
22
+
23
+ * 增加 list 瀑布流布局 ([53e7752](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/commit/53e7752b90a009fa9c3d946a9472ca94c66088ad))
24
+
5
25
  ### [0.0.52](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/compare/v0.1.23...v0.0.52) (2024-10-29)
6
26
 
7
27
 
@@ -27,6 +27,7 @@ const props = defineProps<LcbActionViewProps>()
27
27
  const emits = defineEmits<{
28
28
  (e: 'phone', value: { detail: { errMsg: string; encryptedData: string; iv: string } }): void
29
29
  (e: 'avatar', value: string): void
30
+ (e: 'click', value: void): void
30
31
  }>()
31
32
 
32
33
  const openType = computed(() => {
@@ -126,6 +127,9 @@ const onActionClick = () => {
126
127
  phoneNumber,
127
128
  })
128
129
  break
130
+ default:
131
+ emits('click')
132
+ break
129
133
  }
130
134
  }
131
135
  const getPhoneNumber = (e) => {
@@ -13,14 +13,16 @@
13
13
  </view>
14
14
  <scroll-view scroll-x class="w-full whitespace-nowrap pb-24rpx">
15
15
  <lcb-action-view v-for="(item, index) in items" :key="index" v-bind="item.link">
16
- <img
16
+ <image
17
17
  :src="item.url"
18
18
  class="block"
19
19
  :style="{
20
20
  height: transformValueUnit(height),
21
21
  width: transformValueUnit(imgWidth),
22
22
  marginRight: transformValueUnit(itemPadding),
23
+ borderRadius: transformValueUnit(imageRadius),
23
24
  }"
25
+ mode="aspectFill"
24
26
  />
25
27
  </lcb-action-view>
26
28
  </scroll-view>
@@ -59,9 +61,6 @@ defineOptions({
59
61
  },
60
62
  })
61
63
  const props = withDefaults(defineProps<LcbBannerListProps>(), {
62
- radius: 16,
63
- imageRadius: 0,
64
- marginHorizontal: 24,
65
64
  backgroundColor: '#ffffff',
66
65
  })
67
66
  const bannerProps = computed(() => {
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <lcb-block v-bind="$props" customClass="flex items-center">
2
+ <lcb-block v-bind="$props" customClass="flex items-center !bg-white">
3
3
  <view
4
4
  class="flex flex-1 text-#333 rounded-16rpx bg-#F5F5F7 h-78rpx flex items-center px-3 text-[28rpx]"
5
5
  >
@@ -46,9 +46,10 @@ defineOptions({
46
46
  },
47
47
  })
48
48
  withDefaults(defineProps<LcbCalendarSearchProps>(), {
49
- marginHorizontal: 24,
49
+ paddingHorizontal: 24,
50
50
  radius: 16,
51
51
  placeholder: '城市|地点|品牌',
52
+ icon: 'search',
52
53
  })
53
54
  const addressCity = ref<ChildHotAddress>()
54
55
 
@@ -4,12 +4,14 @@
4
4
  :safe-area-bottom="safeAreaBottom"
5
5
  :bg-color="bgColor"
6
6
  :safe-area-top="safeAreaTop"
7
+ :custom-class="cutomClass"
7
8
  />
8
9
  </template>
9
10
 
10
11
  <script setup lang="ts">
11
12
  import { LcbGapProps } from './types'
12
13
  import { transformValueUnit } from '../../utils/transform'
14
+ import { computed } from 'vue'
13
15
  defineOptions({
14
16
  name: 'LcbGap',
15
17
  options: {
@@ -18,7 +20,11 @@ defineOptions({
18
20
  styleIsolation: 'shared',
19
21
  },
20
22
  })
21
- withDefaults(defineProps<LcbGapProps>(), {})
23
+ const props = withDefaults(defineProps<LcbGapProps>(), {})
24
+ /** 兼容引擎 */
25
+ const cutomClass = computed(() => {
26
+ return props.safeAreaTop ? 'anyTopGap' : ''
27
+ })
22
28
  </script>
23
29
 
24
30
  <style lang="scss" scoped></style>
@@ -1,23 +1,25 @@
1
1
  <template>
2
+ <view id="pagingTop"></view>
2
3
  <z-paging
3
4
  ref="paging"
4
5
  :empty-view-z-index="0"
5
6
  :auto="true"
6
7
  v-model="dataList"
7
8
  @query="queryList"
8
- use-page-scroll
9
+ :fixed="false"
10
+ :use-page-scroll="!autoHeight"
11
+ :height="autoHeight ? height : ''"
9
12
  >
10
13
  <slot :items="normalizeDataList"></slot>
11
14
  </z-paging>
12
15
  </template>
13
16
 
14
17
  <script setup lang="ts">
15
- import { computed, ref, watch, useAttrs } from 'vue'
18
+ import { computed, getCurrentInstance, onMounted, ref, watch } from 'vue'
16
19
  import useZPaging from 'z-paging/components/z-paging/js/hooks/useZPaging'
17
20
  import { LcbFilterListProps } from './type'
18
21
  import { formatJson } from '../../../../utils/utils'
19
- import mockData from './mockData'
20
- const attrs = useAttrs()
22
+ import { getRect } from '@tplc/wot/components/common/util'
21
23
 
22
24
  defineOptions({
23
25
  name: 'FilterList',
@@ -30,6 +32,8 @@ defineOptions({
30
32
  const props = defineProps<LcbFilterListProps>()
31
33
  const dataList = ref<unknown[]>([])
32
34
  const paging = ref()
35
+ const viewPageHeight = uni.getSystemInfoSync().windowHeight
36
+ const height = ref('')
33
37
  useZPaging(paging)
34
38
 
35
39
  const normalizeDataList = computed(() => {
@@ -39,18 +43,13 @@ const normalizeDataList = computed(() => {
39
43
  return {
40
44
  image: imgArr?.[1] || imgArr?.[0],
41
45
  title: item?.productName,
42
- // subTitle: item?.poiName,
43
46
  location: item?.address,
44
47
  price: item?.price,
45
48
  priceSuffix: item?.behindUnit,
46
- // originPrice: item?.price,
47
- // originPriceSuffix: item?.behindUnit,
48
49
  ...item,
49
50
  tags,
50
51
  }
51
52
  })
52
- // console.log('list', list)
53
-
54
53
  return list
55
54
  })
56
55
 
@@ -80,7 +79,6 @@ watch(
80
79
  )
81
80
  const queryList = async (page: number, limit: number) => {
82
81
  try {
83
- // const { data } = mockData
84
82
  const { data } = await uni.$lcb.http.post(props.url, {
85
83
  ...props.baseParam,
86
84
  ...props.filter,
@@ -94,13 +92,12 @@ const queryList = async (page: number, limit: number) => {
94
92
  paging.value.complete(false)
95
93
  }
96
94
  }
97
-
98
- // watch(
99
- // () => dataList.value,
100
- // () => {
101
- // console.log('dataList', dataList.value)
102
- // },
103
- // )
95
+ const { proxy } = getCurrentInstance() as any
96
+ onMounted(() => {
97
+ getRect(`#pagingTop`, false, proxy).then((res) => {
98
+ height.value = viewPageHeight - (res.top || 0) + 'px'
99
+ })
100
+ })
104
101
  </script>
105
102
  <style lang="scss" scoped>
106
103
  .action-view {
@@ -7,5 +7,5 @@ export interface PageListProps {
7
7
  }
8
8
  export interface LcbFilterListProps extends PageListProps, LcbListInfo {
9
9
  filter?: Record<string, any>
10
- test?: any
10
+ autoHeight?: boolean
11
11
  }
@@ -0,0 +1,121 @@
1
+ <template>
2
+ <view
3
+ :class="{
4
+ 'lcb-filter__border-top': showPlain ? false : border,
5
+ 'lcb-filter__plain': showPlain,
6
+ 'lcb-filter__view': !showPlain,
7
+ }"
8
+ class="w-100vw"
9
+ >
10
+ <FilterTabs
11
+ v-model="filter[info?.filterTabs?.valueName]"
12
+ v-bind="info?.filterTabs?.componentProps"
13
+ v-if="info?.filterTabs"
14
+ />
15
+ <wd-drop-menu>
16
+ <wd-drop-menu-item
17
+ v-for="(item, index) in info?.filterComponent"
18
+ :key="item.valueName"
19
+ :title="titleObj[item.valueName] || item.filterName"
20
+ icon="caret-down-small"
21
+ icon-size="26rpx"
22
+ :selected="getSelect(item)"
23
+ ref="dropMenu"
24
+ @opened="handleOpened"
25
+ >
26
+ <view class="lcb-filter__popup">
27
+ <FilterSelect
28
+ v-if="item.component === 'select'"
29
+ v-bind="item.componentProps"
30
+ v-model="filter[item.valueName]"
31
+ v-model:title="titleObj[item.valueName]"
32
+ @submit="onSubmit(index)"
33
+ />
34
+ <TreeSelect
35
+ v-else-if="item.component === 'treeSelect'"
36
+ v-bind="item.componentProps"
37
+ v-model="filter[item.valueName]"
38
+ v-model:title="titleObj[item.valueName]"
39
+ @submit="onSubmit(index)"
40
+ />
41
+ <ComponentGroup
42
+ v-else-if="item.component === 'componentGroup'"
43
+ v-bind="item.componentProps"
44
+ :filter="filter"
45
+ @submit="onSubmit(index, $event)"
46
+ />
47
+ </view>
48
+ </wd-drop-menu-item>
49
+ </wd-drop-menu>
50
+ <view
51
+ v-if="info?.filterTags || info.btnComponent"
52
+ class="px-3 pb-2 box-border flex items-center"
53
+ :class="{
54
+ 'mt-2': showPlain,
55
+ }"
56
+ >
57
+ <view class="flex gap-3.5 flex-1">
58
+ <TagSelect
59
+ v-if="info.filterTags"
60
+ size="small"
61
+ v-bind="info.filterTags.componentProps"
62
+ v-model="filter[info.filterTags.valueName]"
63
+ />
64
+ </view>
65
+ <wd-button v-if="info?.btnComponent" custom-class="!h-60rpx opacity-primary">
66
+ {{ info?.btnComponent?.postRequest }}
67
+ </wd-button>
68
+ </view>
69
+ </view>
70
+ </template>
71
+
72
+ <script setup lang="ts">
73
+ import { computed, ref } from 'vue'
74
+ import { FilterComponent } from '../../../lcb-list/api'
75
+ import ComponentGroup from '../ComponentGroup/index.vue'
76
+ import FilterSelect from '../FilterSelect/index.vue'
77
+ import FilterTabs from '../FilterTabs/index.vue'
78
+ import TagSelect from '../TagSelect/index.vue'
79
+ import TreeSelect from '../TreeSelect/index.vue'
80
+ import { FilterViewProps } from './type'
81
+
82
+ defineOptions({
83
+ name: 'FilterView',
84
+ options: {
85
+ addGlobalClass: true,
86
+ virtualHost: true,
87
+ styleIsolation: 'shared',
88
+ },
89
+ })
90
+ const dropMenu = ref()
91
+ const props = defineProps<FilterViewProps>()
92
+
93
+ const filter = defineModel<Record<string, any>>({
94
+ default: {},
95
+ })
96
+ const showPlain = computed(() => {
97
+ return props.styleMode === 'plain' && !props.sticky
98
+ })
99
+
100
+ const onSubmit = (index: number, filterObj?: Record<string, any>) => {
101
+ dropMenu.value?.[index]?.close()
102
+ if (filterObj) {
103
+ filter.value = {
104
+ ...filter.value,
105
+ ...filterObj,
106
+ }
107
+ }
108
+ }
109
+ const getSelect = (item: FilterComponent) => {
110
+ if (item.component === 'componentGroup') {
111
+ return item.componentProps.componentList?.some((v) => filter.value[v.valueName])
112
+ } else {
113
+ return Boolean(filter.value[item.valueName])
114
+ }
115
+ }
116
+
117
+ const handleOpened = () => {
118
+ uni.$emit('drop-opened')
119
+ }
120
+ </script>
121
+ <style lang="scss" scoped></style>
@@ -0,0 +1,8 @@
1
+ import { LcbFilterResult } from '../../../lcb-list/api'
2
+ import { LcbListProps } from '../../types'
3
+
4
+ export interface FilterViewProps extends LcbListProps {
5
+ info: LcbFilterResult
6
+ titleObj: Record<string, any>
7
+ sticky: boolean
8
+ }
@@ -1,77 +1,24 @@
1
1
  <template>
2
- <view v-if="info" class="bg-gray-100">
3
- <wd-sticky @sticky="sticky = $event" :offset-top="0.0001">
4
- <view
5
- :class="{
6
- 'lcb-filter__border-top': showPlain ? false : border,
7
- 'lcb-filter__plain': showPlain,
8
- 'lcb-filter__view': !showPlain,
9
- }"
10
- class="w-100vw"
11
- >
12
- <FilterTabs
13
- v-model="filter[info?.filterTabs?.valueName]"
14
- v-bind="info?.filterTabs?.componentProps"
15
- v-if="info?.filterTabs"
16
- />
17
- <wd-drop-menu>
18
- <wd-drop-menu-item
19
- v-for="(item, index) in info?.filterComponent"
20
- :key="item.valueName"
21
- :title="titleObj[item.valueName] || item.filterName"
22
- icon="caret-down-small"
23
- icon-size="26rpx"
24
- :selected="getSelect(item)"
25
- ref="dropMenu"
26
- @opened="handleOpened"
27
- >
28
- <view class="lcb-filter__popup">
29
- <FilterSelect
30
- v-if="item.component === 'select'"
31
- v-bind="item.componentProps"
32
- v-model="filter[item.valueName]"
33
- v-model:title="titleObj[item.valueName]"
34
- @submit="onSubmit(index)"
35
- />
36
- <TreeSelect
37
- v-else-if="item.component === 'treeSelect'"
38
- v-bind="item.componentProps"
39
- v-model="filter[item.valueName]"
40
- v-model:title="titleObj[item.valueName]"
41
- @submit="onSubmit(index)"
42
- />
43
- <ComponentGroup
44
- v-else-if="item.component === 'componentGroup'"
45
- v-bind="item.componentProps"
46
- :filter="filter"
47
- @submit="onSubmit(index, $event)"
48
- />
49
- </view>
50
- </wd-drop-menu-item>
51
- </wd-drop-menu>
52
- <view
53
- v-if="info?.filterTags || info.btnComponent"
54
- class="px-3 pb-2 box-border flex items-center"
55
- :class="{
56
- 'mt-2': showPlain,
57
- }"
58
- >
59
- <view class="flex gap-3.5 flex-1">
60
- <TagSelect
61
- v-if="info.filterTags"
62
- size="small"
63
- v-bind="info.filterTags.componentProps"
64
- v-model="filter[info.filterTags.valueName]"
65
- />
66
- </view>
67
- <wd-button v-if="info.btnComponent" custom-class="!h-60rpx opacity-primary">
68
- {{ info.btnComponent?.postRequest }}
69
- </wd-button>
70
- </view>
71
- </view>
2
+ <template v-if="info">
3
+ <wd-sticky @sticky="sticky = $event" :offset-top="0.0001" v-if="isSticky">
4
+ <FilterView
5
+ v-bind="$props"
6
+ :info="info"
7
+ v-model="filter"
8
+ :titleObj="titleObj"
9
+ :sticky="sticky"
10
+ />
72
11
  </wd-sticky>
12
+ <FilterView
13
+ v-else
14
+ v-bind="$props"
15
+ :info="info"
16
+ v-model="filter"
17
+ :titleObj="titleObj"
18
+ :sticky="sticky"
19
+ />
73
20
 
74
- <FilterList v-bind="{ ...info.listInfo, listType, filter, ...attrs }">
21
+ <FilterList v-bind="{ ...info.listInfo, listType, filter, ...attrs }" :autoHeight="!isSticky">
75
22
  <template #default="{ items }">
76
23
  <slot name="list" :items="items">
77
24
  <lcb-product v-bind="{ ...attrs }" :listType="listType" :items="items" v-if="$slots.item">
@@ -88,24 +35,21 @@
88
35
  </slot>
89
36
  </template>
90
37
  </FilterList>
91
- </view>
38
+ </template>
92
39
  </template>
93
40
 
94
41
  <script setup lang="ts">
95
- import { computed, inject, Ref, ref, watch, useAttrs } from 'vue'
96
- import { LcbListProps } from './types'
97
- import { FilterComponent, getFilterDetail, LcbFilterResult } from './api'
98
- import FilterSelect from './components/FilterSelect/index.vue'
99
- import TreeSelect from './components/TreeSelect/index.vue'
100
- import ComponentGroup from './components/ComponentGroup/index.vue'
101
- import TagSelect from './components/TagSelect/index.vue'
42
+ import { inject, Ref, ref, useAttrs, watch } from 'vue'
43
+ import { getFilterDetail, LcbFilterResult } from './api'
102
44
  import FilterList from './components/FilterList/index.vue'
103
- import FilterTabs from './components/FilterTabs/index.vue'
45
+ import FilterView from './components/FilterView/index.vue'
46
+ import { LcbListProps } from './types'
104
47
 
105
- import './index.scss'
106
48
  import { FORM_KEY } from '../../constants'
49
+ import './index.scss'
107
50
  const attrs = useAttrs()
108
-
51
+ /** 是否悬停 */
52
+ const sticky = ref(false)
109
53
  defineOptions({
110
54
  name: 'LcbList',
111
55
  options: {
@@ -114,13 +58,15 @@ defineOptions({
114
58
  styleIsolation: 'shared',
115
59
  },
116
60
  })
61
+ const titleObj = ref<Record<string, any>>({})
117
62
  const form = inject<Ref<Record<string, any>>>(FORM_KEY)
118
- const dropMenu = ref()
63
+ const filter = ref<Record<string, any>>({})
119
64
  const props = withDefaults(defineProps<LcbListProps>(), {
120
65
  pageFilterType: 'hotelTravelFilter',
121
66
  border: true,
122
67
  styleMode: 'default',
123
68
  listType: 'list',
69
+ isSticky: true,
124
70
  // @ts-ignore
125
71
  pageListProps: () => ({
126
72
  productProps: {
@@ -129,14 +75,21 @@ const props = withDefaults(defineProps<LcbListProps>(), {
129
75
  }),
130
76
  } as LcbListProps as any)
131
77
  const info = ref<LcbFilterResult>()
132
- const filter = ref<Record<string, any>>({})
133
- const titleObj = ref<Record<string, any>>({})
134
- /** 是否悬停 */
135
- const sticky = ref(false)
136
- const showPlain = computed(() => {
137
- // console.log(props.styleMode, sticky.value, 'showPlain')
138
- return props.styleMode === 'plain' && !sticky.value
139
- })
78
+ watch(
79
+ () => filter.value,
80
+ async (val) => {
81
+ if (form && Object.keys(val).length) {
82
+ form.value = {
83
+ ...form.value,
84
+ ...val,
85
+ }
86
+ }
87
+ },
88
+ {
89
+ immediate: true,
90
+ deep: true,
91
+ },
92
+ )
140
93
  watch(
141
94
  () => props.pageFilterType,
142
95
  async (val) => {
@@ -166,42 +119,6 @@ watch(
166
119
  immediate: true,
167
120
  },
168
121
  )
169
- const onSubmit = (index: number, filterObj?: Record<string, any>) => {
170
- dropMenu.value?.[index]?.close()
171
- if (filterObj) {
172
- filter.value = {
173
- ...filter.value,
174
- ...filterObj,
175
- }
176
- }
177
- }
178
- const getSelect = (item: FilterComponent) => {
179
- if (item.component === 'componentGroup') {
180
- return item.componentProps.componentList?.some((v) => filter.value[v.valueName])
181
- } else {
182
- return Boolean(filter.value[item.valueName])
183
- }
184
- }
185
- const handleOpened = () => {
186
- uni.$emit('drop-opened')
187
- }
188
-
189
- watch(
190
- () => filter.value,
191
- async (val) => {
192
- if (form && Object.keys(val).length) {
193
- form.value = {
194
- ...form.value,
195
- ...val,
196
- }
197
- }
198
- },
199
- {
200
- immediate: true,
201
- deep: true,
202
- },
203
- )
204
-
205
122
  defineSlots<{
206
123
  list(props: { items: any }): any
207
124
  item(props: { item: any }): any
@@ -7,6 +7,7 @@ export interface LcbListProps {
7
7
  border?: boolean
8
8
  styleMode?: 'default' | 'plain'
9
9
  listType?: LcbProductProps['listType']
10
+ isSticky?: boolean
10
11
  }
11
12
  export interface Option {
12
13
  label: string
@@ -3,7 +3,7 @@
3
3
  class="customNavigation"
4
4
  :class="{
5
5
  immersiveTop: topStyle === 2,
6
- fixed,
6
+ fixed: topStyle === 1,
7
7
  }"
8
8
  :style="{
9
9
  paddingTop,
@@ -114,7 +114,6 @@ const props = withDefaults(defineProps<NavProps>(), {
114
114
  backColor: '#ffffff',
115
115
  contentColor: '#000000',
116
116
  logoImg: '',
117
- fixed: false,
118
117
  back: false,
119
118
  capsuleMode: 'light',
120
119
  immersionMode: 1,
@@ -1,5 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, useAttrs } from 'vue'
3
+ import UWaterfall from 'uview-plus/components/u-waterfall/u-waterfall.vue'
3
4
  import { LcbProductProps } from './types'
4
5
 
5
6
  const attrs = useAttrs()
@@ -92,6 +93,103 @@ defineSlots<{
92
93
  </view>
93
94
  </view>
94
95
 
96
+ <u-waterfall :modelValue="items" v-if="listType === 'waterfall'" class="flex gap-3 p-3">
97
+ <template #left="{ leftList: list }">
98
+ <view class="flex flex-col gap-3">
99
+ <view
100
+ v-for="(item, index) in list"
101
+ :key="`${item?.productId}:${index}`"
102
+ class="rounded overflow-hidden"
103
+ >
104
+ <slot name="item" :item="item">
105
+ <lcb-product-item
106
+ v-bind="{ ...item, ...attrs }"
107
+ layoutType="vertical"
108
+ tag-overflow-wrap
109
+ :title-line-clamp="2"
110
+ >
111
+ <template #image="{ value }">
112
+ <image :src="value" class="w-full" mode="widthFix" />
113
+ </template>
114
+ <!-- <template #itemTopSection>
115
+ <view class="min-w-10 min-h-10 bg-red-500/50"></view>
116
+ </template>
117
+ <template #itemBottomSection>
118
+ <view class="min-w-10 min-h-10 bg-yellow-500/50"></view>
119
+ </template>
120
+ <template #itemLeftSection>
121
+ <view class="min-w-10 min-h-10 bg-blue-500/50"></view>
122
+ </template>
123
+ <template #itemRightSection>
124
+ <view class="min-w-10 min-h-10 bg-green-500/50"></view>
125
+ </template> -->
126
+
127
+ <!-- <template #imageSection>
128
+ <view class="min-w-5 min-h-5 bg-yellow-400 right-1 top-1 absolute z-10"></view>
129
+ </template>
130
+
131
+ <template #itemSection>
132
+ <view class="min-w-10 min-h-10 bg-blue-500/50 right-0 top-0 absolute z-10"></view>
133
+ </template>
134
+ <template #contentSection>
135
+ <view
136
+ class="min-w-15 min-h-15 bg-gray-500/20 right-10 top-10 absolute z-10 rounded-full"
137
+ ></view>
138
+ </template> -->
139
+ </lcb-product-item>
140
+ </slot>
141
+ </view>
142
+ </view>
143
+ </template>
144
+ <template #right="{ rightList: list }">
145
+ <view class="flex flex-col gap-3">
146
+ <view
147
+ v-for="(item, index) in list"
148
+ :key="`${item?.productId}:${index}`"
149
+ class="rounded overflow-hidden"
150
+ >
151
+ <slot name="item" :item="item">
152
+ <lcb-product-item
153
+ v-bind="{ ...item, ...attrs }"
154
+ layoutType="vertical"
155
+ tag-overflow-wrap
156
+ :title-line-clamp="2"
157
+ >
158
+ <template #image="{ value }">
159
+ <image :src="value" class="w-full" mode="widthFix" />
160
+ </template>
161
+ <!-- <template #itemTopSection>
162
+ <view class="min-w-10 min-h-10 bg-red-500/50"></view>
163
+ </template>
164
+ <template #itemBottomSection>
165
+ <view class="min-w-10 min-h-10 bg-yellow-500/50"></view>
166
+ </template>
167
+ <template #itemLeftSection>
168
+ <view class="min-w-10 min-h-10 bg-blue-500/50"></view>
169
+ </template>
170
+ <template #itemRightSection>
171
+ <view class="min-w-10 min-h-10 bg-green-500/50"></view>
172
+ </template> -->
173
+
174
+ <!-- <template #imageSection>
175
+ <view class="min-w-5 min-h-5 bg-yellow-400 right-1 top-1 absolute z-10"></view>
176
+ </template>
177
+
178
+ <template #itemSection>
179
+ <view class="min-w-10 min-h-10 bg-blue-500/50 right-0 top-0 absolute z-10"></view>
180
+ </template>
181
+ <template #contentSection>
182
+ <view
183
+ class="min-w-15 min-h-15 bg-gray-500/20 right-10 top-10 absolute z-10 rounded-full"
184
+ ></view>
185
+ </template> -->
186
+ </lcb-product-item>
187
+ </slot>
188
+ </view>
189
+ </view>
190
+ </template>
191
+ </u-waterfall>
192
+
95
193
  <scroll-view v-if="listType == 'horizontal'" scroll-x>
96
194
  <view class="p-2 flex gap-2 whitespace-nowrap overflow-auto flex-nowrap">
97
195
  <view
@@ -49,7 +49,7 @@ const value = computed(() => {
49
49
  >
50
50
  <!-- 图片 -->
51
51
  <slot :value="value" v-if="prop === 'image'" name="image">
52
- <view :value="value" :class="className" :style="style">
52
+ <view :class="className" :style="style">
53
53
  <image :src="value" class="w-full h-full" mode="aspectFill" />
54
54
  <slot></slot>
55
55
  </view>
@@ -79,7 +79,6 @@ const value = computed(() => {
79
79
  <view
80
80
  :class="className"
81
81
  :style="style"
82
- :value="value"
83
82
  class="text-22rpx text-gray-500 text-ellipsis line-clamp-1"
84
83
  >
85
84
  <view>{{ value }}</view>
@@ -91,7 +90,6 @@ const value = computed(() => {
91
90
  <view
92
91
  :class="className"
93
92
  :style="style"
94
- :value="value"
95
93
  class="text-gray-500 text-22rpx flex gap-3rpx items-center"
96
94
  >
97
95
  <wd-icon name="location" size="32rpx"></wd-icon>
@@ -104,7 +102,6 @@ const value = computed(() => {
104
102
  <view
105
103
  :class="className"
106
104
  :style="style"
107
- :value="value"
108
105
  class="text-gray-500 text-22rpx flex gap-3rpx items-center"
109
106
  >
110
107
  <wd-icon name="location" size="32rpx"></wd-icon>
@@ -145,12 +142,7 @@ const value = computed(() => {
145
142
 
146
143
  <!-- 价格单位 -->
147
144
  <slot :value="value" v-if="prop === 'priceUnit'" name="priceUnit">
148
- <view
149
- :class="className"
150
- :style="style"
151
- :value="value"
152
- class="text-red-500 font-bold text-22rpx"
153
- >
145
+ <view :class="className" :style="style" class="text-red-500 font-bold text-22rpx">
154
146
  <view>{{ value }}</view>
155
147
  </view>
156
148
  </slot>
@@ -169,38 +161,28 @@ const value = computed(() => {
169
161
 
170
162
  <!-- 价格后缀 -->
171
163
  <slot :value="value" v-if="prop === 'priceSuffix'" name="priceSuffix">
172
- <view :class="className" :style="style" :value="value" class="text-22rpx">
164
+ <view :class="className" :style="style" class="text-22rpx">
173
165
  <view>{{ value }}</view>
174
166
  </view>
175
167
  </slot>
176
168
 
177
169
  <!-- 原始价格单位 -->
178
170
  <slot :value="value" v-if="prop === 'originPriceUnit'" name="originPriceUnit">
179
- <view
180
- :class="className"
181
- :style="style"
182
- :value="value"
183
- class="text-gray-500 font-bold text-19rpx"
184
- >
171
+ <view :class="className" :style="style" class="text-gray-500 font-bold text-19rpx">
185
172
  <view>{{ value }}</view>
186
173
  </view>
187
174
  </slot>
188
175
 
189
176
  <!-- 原始价格 -->
190
177
  <slot :value="value" v-if="prop === 'originPrice'" name="originPrice">
191
- <view
192
- :class="className"
193
- :style="style"
194
- :value="value"
195
- class="text-gray-500 font-bold text-20rpx"
196
- >
178
+ <view :class="className" :style="style" class="text-gray-500 font-bold text-20rpx">
197
179
  <view>{{ value }}</view>
198
180
  </view>
199
181
  </slot>
200
182
 
201
183
  <!-- 原始价格后缀 -->
202
184
  <slot :value="value" v-if="prop === 'originPriceSuffix'" name="originPriceSuffix">
203
- <view :class="className" :style="style" :value="value" class="text-gray-500 text-20rpx">
185
+ <view :class="className" :style="style" class="text-gray-500 text-20rpx">
204
186
  <view>{{ value }}</view>
205
187
  </view>
206
188
  </slot>
@@ -27,17 +27,17 @@
27
27
  />
28
28
  </lcb-action-view>
29
29
  <view class="flex-1">
30
- <lcb-action-view :jumpType="88" @phone="phoneHandler" v-if="!userStore?.userInfo?.phone">
31
- <view
32
- class="font-500"
33
- :style="{
34
- fontSize: transformValueUnit(textSize),
35
- color: textColor,
36
- }"
37
- >
38
- 授权登录
39
- </view>
40
- </lcb-action-view>
30
+ <view
31
+ class="font-500"
32
+ v-if="!userStore?.userInfo?.phone"
33
+ :style="{
34
+ fontSize: transformValueUnit(textSize),
35
+ color: textColor,
36
+ }"
37
+ @click="phoneHandler"
38
+ >
39
+ 授权登录
40
+ </view>
41
41
  <view v-else class="leading-none">
42
42
  <view class="text-32rpx font-#333 font-500 mb-20rpx">
43
43
  {{ userStore?.userInfo?.userName || '微信用户' }}
@@ -104,7 +104,6 @@ import { transformValueUnit } from '../../utils/transform'
104
104
  import Nums from './Nums/index.vue'
105
105
  import { computed } from 'vue'
106
106
  import { addUnit } from '@tplc/wot/components/common/util'
107
- import { getPhone } from '../../utils/auth'
108
107
 
109
108
  const { statusBarHeight } = uni.getSystemInfoSync()
110
109
  defineOptions({
@@ -137,9 +136,10 @@ withDefaults(defineProps<LcbUserTopProps>(), {
137
136
  const padTop = computed(() => {
138
137
  return addUnit(statusBarHeight || 0)
139
138
  })
140
- const phoneHandler = async (e) => {
141
- await getPhone(e)
142
- userStore?.getUser()
139
+ const phoneHandler = () => {
140
+ uni.navigateTo({
141
+ url: '/pages/system/authPhone',
142
+ })
143
143
  }
144
144
  const onAvatar = (headImgUrl) => {
145
145
  userStore?.updateUser({
@@ -1,9 +1,10 @@
1
+ /* 在线链接服务仅供平台体验和调试使用,平台不承诺服务的稳定性,企业客户需下载字体包自行发布使用并做好备份。 */
1
2
  @font-face {
2
3
  font-family: 'lcb'; /* Project id 4710234 */
3
4
  src:
4
- url('//at.alicdn.com/t/c/font_4710234_4pa59gffcpf.woff2?t=1729228175639') format('woff2'),
5
- url('//at.alicdn.com/t/c/font_4710234_4pa59gffcpf.woff?t=1729228175639') format('woff'),
6
- url('//at.alicdn.com/t/c/font_4710234_4pa59gffcpf.ttf?t=1729228175639') format('truetype');
5
+ url('//at.alicdn.com/t/c/font_4710234_15ayvpii3yk.woff2?t=1730440551449') format('woff2'),
6
+ url('//at.alicdn.com/t/c/font_4710234_15ayvpii3yk.woff?t=1730440551449') format('woff'),
7
+ url('//at.alicdn.com/t/c/font_4710234_15ayvpii3yk.ttf?t=1730440551449') format('truetype');
7
8
  }
8
9
 
9
10
  .lcb {
@@ -14,6 +15,26 @@
14
15
  -moz-osx-font-smoothing: grayscale;
15
16
  }
16
17
 
18
+ .lcb-a-xingzhuang103:before {
19
+ content: '\e64e';
20
+ }
21
+
22
+ .lcb-a-xingzhuang97:before {
23
+ content: '\e651';
24
+ }
25
+
26
+ .lcb-jiaobiao:before {
27
+ content: '\e62c';
28
+ }
29
+
30
+ .lcb-jianshao:before {
31
+ content: '\e649';
32
+ }
33
+
34
+ .lcb-zengjia:before {
35
+ content: '\e64a';
36
+ }
37
+
17
38
  .lcb-mingpian:before {
18
39
  content: '\e654';
19
40
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tplc/business",
3
- "version": "0.0.52",
3
+ "version": "0.0.55",
4
4
  "keywords": [
5
5
  "业务组件"
6
6
  ],
@@ -18,7 +18,8 @@
18
18
  "pnpm": ">=7.30"
19
19
  },
20
20
  "dependencies": {
21
- "qs": "6.5.3"
21
+ "qs": "6.5.3",
22
+ "uview-plus": "^3.3.9"
22
23
  },
23
24
  "scripts": {
24
25
  "pub": "pnpm dts && pnpm publish --no-git-checks",
@@ -10,30 +10,10 @@ declare const __VLS_component: import('vue').DefineComponent<
10
10
  {},
11
11
  import('vue').ComponentOptionsMixin,
12
12
  import('vue').ComponentOptionsMixin,
13
- {
14
- phone: (value: {
15
- detail: {
16
- errMsg: string
17
- encryptedData: string
18
- iv: string
19
- }
20
- }) => void
21
- avatar: (value: string) => void
22
- },
13
+ any,
23
14
  string,
24
15
  import('vue').PublicProps,
25
- Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<LcbActionViewProps>>> & {
26
- onPhone?:
27
- | ((value: {
28
- detail: {
29
- errMsg: string
30
- encryptedData: string
31
- iv: string
32
- }
33
- }) => any)
34
- | undefined
35
- onAvatar?: ((value: string) => any) | undefined
36
- },
16
+ any,
37
17
  {},
38
18
  {}
39
19
  >
@@ -3,9 +3,6 @@ declare const _default: import('vue').DefineComponent<
3
3
  __VLS_WithDefaults<
4
4
  __VLS_TypePropsToOption<LcbBannerListProps>,
5
5
  {
6
- radius: number
7
- imageRadius: number
8
- marginHorizontal: number
9
6
  backgroundColor: string
10
7
  }
11
8
  >,
@@ -23,18 +20,12 @@ declare const _default: import('vue').DefineComponent<
23
20
  __VLS_WithDefaults<
24
21
  __VLS_TypePropsToOption<LcbBannerListProps>,
25
22
  {
26
- radius: number
27
- imageRadius: number
28
- marginHorizontal: number
29
23
  backgroundColor: string
30
24
  }
31
25
  >
32
26
  >
33
27
  >,
34
28
  {
35
- imageRadius: number
36
- radius: number
37
- marginHorizontal: number
38
29
  backgroundColor: string
39
30
  },
40
31
  {}
@@ -3,9 +3,10 @@ declare const _default: import('vue').DefineComponent<
3
3
  __VLS_WithDefaults<
4
4
  __VLS_TypePropsToOption<LcbCalendarSearchProps>,
5
5
  {
6
- marginHorizontal: number
6
+ paddingHorizontal: number
7
7
  radius: number
8
8
  placeholder: string
9
+ icon: string
9
10
  }
10
11
  >,
11
12
  {},
@@ -22,9 +23,10 @@ declare const _default: import('vue').DefineComponent<
22
23
  __VLS_WithDefaults<
23
24
  __VLS_TypePropsToOption<LcbCalendarSearchProps>,
24
25
  {
25
- marginHorizontal: number
26
+ paddingHorizontal: number
26
27
  radius: number
27
28
  placeholder: string
29
+ icon: string
28
30
  }
29
31
  >
30
32
  >
@@ -32,7 +34,7 @@ declare const _default: import('vue').DefineComponent<
32
34
  {
33
35
  radius: number
34
36
  placeholder: string
35
- marginHorizontal: number
37
+ paddingHorizontal: number
36
38
  },
37
39
  {}
38
40
  >
@@ -7,5 +7,5 @@ export interface PageListProps {
7
7
  }
8
8
  export interface LcbFilterListProps extends PageListProps, LcbListInfo {
9
9
  filter?: Record<string, any>
10
- test?: any
10
+ autoHeight?: boolean
11
11
  }
@@ -0,0 +1,36 @@
1
+ import { FilterViewProps } from './type'
2
+ declare let __VLS_typeProps: FilterViewProps
3
+ type __VLS_PublicProps = {
4
+ modelValue?: Record<string, any>
5
+ } & typeof __VLS_typeProps
6
+ declare const _default: import('vue').DefineComponent<
7
+ __VLS_TypePropsToOption<__VLS_PublicProps>,
8
+ {},
9
+ unknown,
10
+ {},
11
+ {},
12
+ import('vue').ComponentOptionsMixin,
13
+ import('vue').ComponentOptionsMixin,
14
+ {
15
+ 'update:modelValue': (modelValue: Record<string, any>) => void
16
+ },
17
+ string,
18
+ import('vue').PublicProps,
19
+ Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<__VLS_PublicProps>>> & {
20
+ 'onUpdate:modelValue'?: ((modelValue: Record<string, any>) => any) | undefined
21
+ },
22
+ {},
23
+ {}
24
+ >
25
+ export default _default
26
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T
27
+ type __VLS_TypePropsToOption<T> = {
28
+ [K in keyof T]-?: {} extends Pick<T, K>
29
+ ? {
30
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>
31
+ }
32
+ : {
33
+ type: import('vue').PropType<T[K]>
34
+ required: true
35
+ }
36
+ }
@@ -0,0 +1,7 @@
1
+ import { LcbFilterResult } from '../../../lcb-list/api'
2
+ import { LcbListProps } from '../../types'
3
+ export interface FilterViewProps extends LcbListProps {
4
+ info: LcbFilterResult
5
+ titleObj: Record<string, any>
6
+ sticky: boolean
7
+ }
@@ -27,6 +27,7 @@ declare const __VLS_component: import('vue').DefineComponent<
27
27
  pageListProps: import('./components/FilterList/type').PageListProps
28
28
  border: boolean
29
29
  styleMode: 'default' | 'plain'
30
+ isSticky: boolean
30
31
  },
31
32
  {}
32
33
  >
@@ -6,6 +6,7 @@ export interface LcbListProps {
6
6
  border?: boolean
7
7
  styleMode?: 'default' | 'plain'
8
8
  listType?: LcbProductProps['listType']
9
+ isSticky?: boolean
9
10
  }
10
11
  export interface Option {
11
12
  label: string
@@ -13,7 +13,6 @@ declare const _default: import('vue').DefineComponent<
13
13
  backColor: string
14
14
  contentColor: string
15
15
  logoImg: string
16
- fixed: boolean
17
16
  back: boolean
18
17
  capsuleMode: string
19
18
  immersionMode: number
@@ -43,7 +42,6 @@ declare const _default: import('vue').DefineComponent<
43
42
  backColor: string
44
43
  contentColor: string
45
44
  logoImg: string
46
- fixed: boolean
47
45
  back: boolean
48
46
  capsuleMode: string
49
47
  immersionMode: number
@@ -53,7 +51,6 @@ declare const _default: import('vue').DefineComponent<
53
51
  >,
54
52
  {
55
53
  title: string
56
- fixed: boolean
57
54
  styleGroup: 1 | 2 | 3 | 4
58
55
  back: boolean
59
56
  topStyle: 1 | 2
@@ -110,10 +110,10 @@ declare const __VLS_component: import('vue').DefineComponent<
110
110
  >,
111
111
  {
112
112
  layoutType: 'vertical' | 'horizontal'
113
+ tagOverflowWrap: boolean
114
+ titleLineClamp: number
113
115
  priceUnit: any
114
116
  originPriceUnit: any
115
- titleLineClamp: number
116
- tagOverflowWrap: boolean
117
117
  tagType: import('@tplc/wot/components/wd-tag/types').TagType
118
118
  tagPlain: boolean
119
119
  tagMark: boolean
@@ -1,63 +0,0 @@
1
- declare const _default: {
2
- code: string
3
- count: number
4
- data: {
5
- address: string
6
- agentId: string
7
- areaId: string
8
- areaName: string
9
- auditDateTime: string
10
- auditRemark: string
11
- auditStatus: number
12
- behindUnit: string
13
- bigIcon: boolean
14
- businessStatus: number
15
- cityAreaName: string
16
- cityId: string
17
- cityName: string
18
- clickCount: number
19
- collectCount: number
20
- collectFlag: boolean
21
- commentCount: number
22
- coverImg: string
23
- createDate: string
24
- distance: string
25
- hideTags: string
26
- hierarchy: number
27
- lastModifyDate: string
28
- latitude: string
29
- level: string
30
- longitude: string
31
- mapShowFlag: boolean
32
- marketingType: number
33
- merchantHeadId: string
34
- merchantId: string
35
- orderCount: number
36
- orderSkuCount: number
37
- peopleNumScope: string
38
- phone: string
39
- poiId: string
40
- poiName: string
41
- poiNameI18n: string
42
- poiType: string
43
- praiseCount: number
44
- praiseFlag: boolean
45
- price: number
46
- productId: string
47
- productName: string
48
- productNameI18n: string
49
- productType: string
50
- provinceId: string
51
- provinceName: string
52
- scribePrice: number
53
- showDateFlag: boolean
54
- startDateStr: string
55
- startTime: string
56
- status: number
57
- tags: string
58
- weightSort: string
59
- }[]
60
- dataClass: string
61
- traceId: string
62
- }
63
- export default _default