1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
| import { ref, Ref } from 'vue'
| import { PageConfigProperty } from '@/components/DiyEditor/components/mobile/PageConfig/config'
| import { NavigationBarProperty } from '@/components/DiyEditor/components/mobile/NavigationBar/config'
| import { TabBarProperty } from '@/components/DiyEditor/components/mobile/TabBar/config'
|
| // 页面装修组件
| export interface DiyComponent<T> {
| // 用于区分同一种组件的不同实例
| uid?: number
| // 组件唯一标识
| id: string
| // 组件名称
| name: string
| // 组件图标
| icon: string
| /*
| 组件位置:
| top: 固定于手机顶部,例如 顶部的导航栏
| bottom: 固定于手机底部,例如 底部的菜单导航栏
| center: 位于手机中心,每个组件占一行,顺序向下排列
| 空:同center
| fixed: 由组件自己决定位置,如弹窗位于手机中心、浮动按钮一般位于手机右下角
| */
| position?: 'top' | 'bottom' | 'center' | '' | 'fixed'
| // 组件属性
| property: T
| }
|
| // 页面装修组件库
| export interface DiyComponentLibrary {
| // 组件库名称
| name: string
| // 是否展开
| extended: boolean
| // 组件列表
| components: string[]
| }
|
| // 组件样式
| export interface ComponentStyle {
| // 背景类型
| bgType: 'color' | 'img'
| // 背景颜色
| bgColor: string
| // 背景图片
| bgImg: string
| // 外边距
| margin: number
| marginTop: number
| marginRight: number
| marginBottom: number
| marginLeft: number
| // 内边距
| padding: number
| paddingTop: number
| paddingRight: number
| paddingBottom: number
| paddingLeft: number
| // 边框圆角
| borderRadius: number
| borderTopLeftRadius: number
| borderTopRightRadius: number
| borderBottomRightRadius: number
| borderBottomLeftRadius: number
| }
|
| // 页面配置
| export interface PageConfig {
| // 页面属性
| page: PageConfigProperty
| // 顶部导航栏属性
| navigationBar: NavigationBarProperty
| // 底部导航菜单属性
| tabBar?: TabBarProperty
| // 页面组件列表
| components: PageComponent[]
| }
| // 页面组件,只保留组件ID,组件属性
| export interface PageComponent extends Pick<DiyComponent<any>, 'id' | 'property'> {}
|
| // 属性表单监听
| export function usePropertyForm<T>(modelValue: T, emit: Function): { formData: Ref<T> } {
| const formData = ref<T>()
| // 监听属性数据变动
| watch(
| () => modelValue,
| () => {
| formData.value = modelValue
| },
| {
| deep: true,
| immediate: true
| }
| )
| // 监听表单数据变动
| watch(
| () => formData.value,
| () => {
| emit('update:modelValue', formData.value)
| },
| {
| deep: true
| }
| )
|
| return { formData } as { formData: Ref<T> }
| }
|
| // 页面组件库
| export const PAGE_LIBS = [
| {
| name: '基础组件',
| extended: true,
| components: [
| 'SearchBar',
| 'NoticeBar',
| 'MenuSwiper',
| 'MenuGrid',
| 'MenuList',
| 'Popover',
| 'FloatingActionButton'
| ]
| },
| {
| name: '图文组件',
| extended: true,
| components: [
| 'ImageBar',
| 'Carousel',
| 'TitleBar',
| 'VideoPlayer',
| 'Divider',
| 'MagicCube',
| 'HotZone'
| ]
| },
| { name: '商品组件', extended: true, components: ['ProductCard', 'ProductList'] },
| {
| name: '用户组件',
| extended: true,
| components: ['UserCard', 'UserOrder', 'UserWallet', 'UserCoupon']
| },
| {
| name: '营销组件',
| extended: true,
| components: [
| 'PromotionCombination',
| 'PromotionSeckill',
| 'PromotionPoint',
| 'CouponCard',
| 'PromotionArticle'
| ]
| }
| ] as DiyComponentLibrary[]
|
|