askbot-dragon 0.6.17 → 0.6.21
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.
- package/README.md +27 -27
- package/babel.config.js +5 -5
- package/dragon.iml +7 -7
- package/package.json +54 -52
- package/public/index.html +27 -26
- package/src/App.vue +31 -31
- package/src/api/index.js +1 -1
- package/src/api/mock.http +2 -2
- package/src/api/requestUrl.js +185 -185
- package/src/assets/less/common.css +6760 -6760
- package/src/assets/less/converSationContainer/common.less +4751 -4751
- package/src/assets/less/converSationContainer/converSatonContainer.less +492 -492
- package/src/assets/less/ticketMessage.less +319 -319
- package/src/components/ActionAlertIframe.vue +117 -117
- package/src/components/AskIFrame.vue +15 -15
- package/src/components/ConversationContainer.vue +1388 -1388
- package/src/components/FileType.vue +88 -88
- package/src/components/Message.vue +27 -27
- package/src/components/ask-components/DissatisfactionOptions.vue +57 -57
- package/src/components/ask-components/Msgloading.vue +37 -37
- package/src/components/ask-components/SatisfactionV2.vue +15 -15
- package/src/components/chatContent.vue +512 -512
- package/src/components/feedBack.vue +133 -133
- package/src/components/file/AliyunOssComponents.vue +109 -109
- package/src/components/formTemplate.vue +1898 -2039
- package/src/components/message/ActionAlertIframe.vue +116 -116
- package/src/components/message/ShopMessage.vue +168 -168
- package/src/components/message/TextMessage.vue +895 -895
- package/src/components/message/TicketMessage.vue +173 -173
- package/src/components/message/swiper/index.js +4 -4
- package/src/components/message/swiper/ticketSwiper.vue +530 -530
- package/src/components/message/swiper/ticketSwiperItem.vue +61 -61
- package/src/components/selector/hOption.vue +20 -20
- package/src/components/selector/hSelector.vue +199 -199
- package/src/components/selector/hWrapper.vue +216 -216
- package/src/components/source/BotMessage.vue +24 -24
- package/src/components/source/CustomMessage.vue +24 -24
- package/src/components/test.vue +260 -260
- package/src/components/utils/AliyunIssUtil.js +72 -72
- package/src/components/utils/ckeditor.js +124 -0
- package/src/components/utils/format_date.js +18 -18
- package/src/components/utils/index.js +6 -6
- package/src/components/utils/math_utils.js +15 -15
- package/src/main.js +44 -43
- package/vue.config.js +34 -28
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="slide" :class="{bottomClass:content.multiple===true}">
|
|
3
|
-
<slot></slot>
|
|
4
|
-
</div>
|
|
5
|
-
</template>
|
|
6
|
-
<script>
|
|
7
|
-
export default {
|
|
8
|
-
props:{
|
|
9
|
-
content:{
|
|
10
|
-
type:Object,
|
|
11
|
-
default(){
|
|
12
|
-
return {}
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
mounted() {
|
|
17
|
-
// 下方防止在网速慢的情况下,slide的count数不准确
|
|
18
|
-
/* this.$store.commit("slideCountChange", 1);
|
|
19
|
-
if (this.$store.state.slideCount == this.count) {
|
|
20
|
-
this.$emit("slideEven");
|
|
21
|
-
this.$store.commit("slideCountChange", -this.count);
|
|
22
|
-
}*/
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
</script>
|
|
26
|
-
<style lang="less">
|
|
27
|
-
/*.slide {
|
|
28
|
-
width: 100%;
|
|
29
|
-
flex-shrink: 0;
|
|
30
|
-
transition: 300ms;
|
|
31
|
-
text-align: center;
|
|
32
|
-
align-items: center;
|
|
33
|
-
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
|
|
34
|
-
!* Center slide text vertically *!
|
|
35
|
-
margin-bottom: 16px;
|
|
36
|
-
font-size: 13px;
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
.slide img {
|
|
40
|
-
height: 160px;
|
|
41
|
-
border-radius: 10px;
|
|
42
|
-
object-fit: contain;
|
|
43
|
-
}*/
|
|
44
|
-
.bottomClass{
|
|
45
|
-
margin-bottom: 18px;
|
|
46
|
-
}
|
|
47
|
-
.slide {
|
|
48
|
-
width: 100%;
|
|
49
|
-
flex-shrink: 0;
|
|
50
|
-
text-align: center;
|
|
51
|
-
align-items: center;
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
.slide a{
|
|
55
|
-
color: #0000ee;
|
|
56
|
-
}
|
|
57
|
-
.slide img {
|
|
58
|
-
object-fit: contain;
|
|
59
|
-
width: 100%;
|
|
60
|
-
}
|
|
61
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<div class="slide" :class="{bottomClass:content.multiple===true}">
|
|
3
|
+
<slot></slot>
|
|
4
|
+
</div>
|
|
5
|
+
</template>
|
|
6
|
+
<script>
|
|
7
|
+
export default {
|
|
8
|
+
props:{
|
|
9
|
+
content:{
|
|
10
|
+
type:Object,
|
|
11
|
+
default(){
|
|
12
|
+
return {}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
mounted() {
|
|
17
|
+
// 下方防止在网速慢的情况下,slide的count数不准确
|
|
18
|
+
/* this.$store.commit("slideCountChange", 1);
|
|
19
|
+
if (this.$store.state.slideCount == this.count) {
|
|
20
|
+
this.$emit("slideEven");
|
|
21
|
+
this.$store.commit("slideCountChange", -this.count);
|
|
22
|
+
}*/
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
</script>
|
|
26
|
+
<style lang="less">
|
|
27
|
+
/*.slide {
|
|
28
|
+
width: 100%;
|
|
29
|
+
flex-shrink: 0;
|
|
30
|
+
transition: 300ms;
|
|
31
|
+
text-align: center;
|
|
32
|
+
align-items: center;
|
|
33
|
+
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
|
|
34
|
+
!* Center slide text vertically *!
|
|
35
|
+
margin-bottom: 16px;
|
|
36
|
+
font-size: 13px;
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
.slide img {
|
|
40
|
+
height: 160px;
|
|
41
|
+
border-radius: 10px;
|
|
42
|
+
object-fit: contain;
|
|
43
|
+
}*/
|
|
44
|
+
.bottomClass{
|
|
45
|
+
margin-bottom: 18px;
|
|
46
|
+
}
|
|
47
|
+
.slide {
|
|
48
|
+
width: 100%;
|
|
49
|
+
flex-shrink: 0;
|
|
50
|
+
text-align: center;
|
|
51
|
+
align-items: center;
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
.slide a{
|
|
55
|
+
color: #0000ee;
|
|
56
|
+
}
|
|
57
|
+
.slide img {
|
|
58
|
+
object-fit: contain;
|
|
59
|
+
width: 100%;
|
|
60
|
+
}
|
|
61
|
+
</style>
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<li class="h-selector-option">
|
|
3
|
-
<slot>{{value}}</slot>
|
|
4
|
-
</li>
|
|
5
|
-
</template>
|
|
6
|
-
|
|
7
|
-
<script>
|
|
8
|
-
export default {
|
|
9
|
-
name: "hOption",
|
|
10
|
-
props: {
|
|
11
|
-
value: {
|
|
12
|
-
type: [String,Number],
|
|
13
|
-
required: true
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
</script>
|
|
18
|
-
|
|
19
|
-
<style scoped>
|
|
20
|
-
|
|
1
|
+
<template>
|
|
2
|
+
<li class="h-selector-option">
|
|
3
|
+
<slot>{{value}}</slot>
|
|
4
|
+
</li>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script>
|
|
8
|
+
export default {
|
|
9
|
+
name: "hOption",
|
|
10
|
+
props: {
|
|
11
|
+
value: {
|
|
12
|
+
type: [String,Number],
|
|
13
|
+
required: true
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<style scoped>
|
|
20
|
+
|
|
21
21
|
</style>
|
|
@@ -1,200 +1,200 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="h-selector">
|
|
3
|
-
<!-- 显示在外部的内容,可以显示组件内部计算的数据值,也可以显示外部传入的显示文字 -->
|
|
4
|
-
<div class="h-selector-show" @click="showAddress">
|
|
5
|
-
{{showValue || defaultShowValue}}
|
|
6
|
-
</div>
|
|
7
|
-
<!-- 显示隐藏的移动动画,使用Vue的 transition组件实施 -->
|
|
8
|
-
<transition name="h-selector-move">
|
|
9
|
-
<!-- 级联选择器外层的容器,用于显示隐藏,以及级联选择器头部和内容的显示 -->
|
|
10
|
-
<div class="h-selector-container" v-if="show">
|
|
11
|
-
<!-- 级联选择器的头部,取消按钮,确定按钮,以及显示的标题 -->
|
|
12
|
-
<div class="h-selector-header">
|
|
13
|
-
<div @click="cancel" class="h-selector-header-cancel">取消</div>
|
|
14
|
-
<div class="h-selector-header-title">{{title}}</div>
|
|
15
|
-
<div @click="confirm" class="h-selector-header-confirm">确定</div>
|
|
16
|
-
</div>
|
|
17
|
-
<!-- 包裹级联选择器的容器 -->
|
|
18
|
-
<div class="h-selector-content">
|
|
19
|
-
<!-- 使用插槽,将外部的级联选择器显示到当前组件内,成为当前组件的子组件 -->
|
|
20
|
-
<slot></slot>
|
|
21
|
-
<div class="h-selector-bg"></div>
|
|
22
|
-
</div>
|
|
23
|
-
</div>
|
|
24
|
-
</transition>
|
|
25
|
-
<!-- 遮罩层,淡入淡出动画 -->
|
|
26
|
-
<transition name="h-selector-fade">
|
|
27
|
-
<div class="h-selector-layer" v-if="show" @click="cancel"></div>
|
|
28
|
-
</transition>
|
|
29
|
-
</div>
|
|
30
|
-
</template>
|
|
31
|
-
|
|
32
|
-
<script>
|
|
33
|
-
export default {
|
|
34
|
-
name: "hSelector",
|
|
35
|
-
props: {
|
|
36
|
-
value: { // 数据双向绑定所必须的属性
|
|
37
|
-
type: Object, // 期待接收一个Object的值
|
|
38
|
-
required: true // 必填的
|
|
39
|
-
},
|
|
40
|
-
showValue: { // 由外部定义显示在外层的内容
|
|
41
|
-
type: String,
|
|
42
|
-
},
|
|
43
|
-
title: { // 定义级联选择器的标题
|
|
44
|
-
type:String, // 接收字符串类型
|
|
45
|
-
default: '' // 默认为空字符
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
data() {
|
|
49
|
-
// 定义oldValue用来保存上一次的值,使用Object.assign拷贝一份,避免与绑定的value发生冲突
|
|
50
|
-
let oldValue = Object.assign({}, this.value);
|
|
51
|
-
return {
|
|
52
|
-
oldValue, // 保存上一次修改的值
|
|
53
|
-
show: false // 定义显示隐藏
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
computed: {
|
|
57
|
-
defaultShowValue() { // 定义默认显示的内容,建议使用外部定义的内容显示,内部只做了非常简单的处理
|
|
58
|
-
let arr = [];
|
|
59
|
-
for (let i in this.value) {
|
|
60
|
-
arr.push(i + ':' + this.value[i])
|
|
61
|
-
}
|
|
62
|
-
return arr.join('/');
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
mounted() {
|
|
66
|
-
// Vue实例都拥有的$on方法,监听的是从wrapper发布的changeSelected事件,触发this.changeSelected方法
|
|
67
|
-
this.$on('changeSelected', this.changeSelected);
|
|
68
|
-
},
|
|
69
|
-
// 定义方法
|
|
70
|
-
methods: {
|
|
71
|
-
// 修改当前选中的值,实现数据双向绑定的方法
|
|
72
|
-
changeSelected(prop, value) { // 接收两个参数,prop代表需要修改对象的哪个属性,value代表修改的值
|
|
73
|
-
let obj = {};
|
|
74
|
-
obj[prop] = value;
|
|
75
|
-
// 使用Object.assign将新的值与旧的值合并覆盖,并向外部发布新的值
|
|
76
|
-
let obj2 = Object.assign({}, this.value, obj);
|
|
77
|
-
this.$emit('input', obj2);
|
|
78
|
-
},
|
|
79
|
-
// 取消功能,将上一次的数据发送回外部,并隐藏级联选择器
|
|
80
|
-
cancel() {
|
|
81
|
-
this.$emit('input', this.oldValue);
|
|
82
|
-
this.show = false;
|
|
83
|
-
},
|
|
84
|
-
// 确定功能,将本次修改的值保存,并保存在oldValue中,以供下次使用
|
|
85
|
-
confirm() {
|
|
86
|
-
this.oldValue = Object.assign({}, this.value);
|
|
87
|
-
this.$emit('change', this.value);
|
|
88
|
-
this.show = false;
|
|
89
|
-
},
|
|
90
|
-
// 控制级联选择器显示
|
|
91
|
-
showAddress() {
|
|
92
|
-
this.show = true;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
</script>
|
|
97
|
-
|
|
98
|
-
<style scoped lang="less">
|
|
99
|
-
.h-selector {
|
|
100
|
-
letter-spacing: 1px;
|
|
101
|
-
font-size: 16px;
|
|
102
|
-
width: 100%;
|
|
103
|
-
height: 100%;
|
|
104
|
-
.h-selector-show {
|
|
105
|
-
width: 100%;
|
|
106
|
-
height: 100%;
|
|
107
|
-
box-sizing: border-box;
|
|
108
|
-
padding: 0 20px;
|
|
109
|
-
white-space: nowrap;
|
|
110
|
-
overflow: hidden;
|
|
111
|
-
text-overflow: ellipsis;
|
|
112
|
-
}
|
|
113
|
-
.h-selector-container {
|
|
114
|
-
position: absolute;
|
|
115
|
-
z-index: 999;
|
|
116
|
-
left: 0;
|
|
117
|
-
bottom: 0;
|
|
118
|
-
width: 100%;
|
|
119
|
-
background: #fff;
|
|
120
|
-
}
|
|
121
|
-
.h-selector-layer {
|
|
122
|
-
position: absolute;
|
|
123
|
-
background: rgba(0, 0, 0, 0.3);
|
|
124
|
-
width: 100%;
|
|
125
|
-
height: 100%;
|
|
126
|
-
top: 0;
|
|
127
|
-
left: 0;
|
|
128
|
-
z-index: 2;
|
|
129
|
-
}
|
|
130
|
-
ul, li {
|
|
131
|
-
margin: 0;
|
|
132
|
-
padding: 0;
|
|
133
|
-
list-style: none;
|
|
134
|
-
}
|
|
135
|
-
.h-selector-header {
|
|
136
|
-
display: flex;
|
|
137
|
-
align-items: center;
|
|
138
|
-
height: 40px;
|
|
139
|
-
justify-content: space-between;
|
|
140
|
-
padding: 0 30px;
|
|
141
|
-
.h-selector-header-cancel {
|
|
142
|
-
color: #e9aa14;
|
|
143
|
-
}
|
|
144
|
-
.h-selector-header-confirm {
|
|
145
|
-
color: #508aff;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
.h-selector-content {
|
|
149
|
-
display: flex;
|
|
150
|
-
width: 100%;
|
|
151
|
-
position: relative;
|
|
152
|
-
}
|
|
153
|
-
.h-selector-wrapper {
|
|
154
|
-
flex: 1;
|
|
155
|
-
overflow: hidden;
|
|
156
|
-
& + .h-selector-wrapper {
|
|
157
|
-
border-left: 1px solid #ddd;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
.h-selector-option {
|
|
161
|
-
line-height: 60px;
|
|
162
|
-
height: 60px;
|
|
163
|
-
text-align: center;
|
|
164
|
-
white-space: nowrap;
|
|
165
|
-
overflow: hidden;
|
|
166
|
-
text-overflow: ellipsis;
|
|
167
|
-
}
|
|
168
|
-
.h-selector-bg {
|
|
169
|
-
height: 100%;
|
|
170
|
-
width: 100%;
|
|
171
|
-
position: absolute;
|
|
172
|
-
top: 0;
|
|
173
|
-
left: 0;
|
|
174
|
-
background: linear-gradient(180deg, hsla(0, 0%, 100%, 0.9), hsla(0, 0%, 100%, 0.7)), linear-gradient(0deg, hsla(0, 0%, 100%, 0.9), hsla(0, 0%, 100%, 0.4));
|
|
175
|
-
backface-visibility: hidden;
|
|
176
|
-
pointer-events: none;
|
|
177
|
-
background-repeat: no-repeat;
|
|
178
|
-
background-position: top, bottom;
|
|
179
|
-
background-size: 100% 100px;
|
|
180
|
-
}
|
|
181
|
-
.h-selector-move-enter-to, .h-selector-move-leave {
|
|
182
|
-
transform: translate3d(0, 0, 0);
|
|
183
|
-
}
|
|
184
|
-
.h-selector-move-enter-active, .h-selector-move-leave-active {
|
|
185
|
-
transition: transform .6s;
|
|
186
|
-
}
|
|
187
|
-
.h-selector-move-enter, .h-selector-move-leave-to {
|
|
188
|
-
transform: translate3d(0, 100%, 0);
|
|
189
|
-
}
|
|
190
|
-
.h-selector-fade-enter-to, .h-selector-fade-leave {
|
|
191
|
-
opacity: 1;
|
|
192
|
-
}
|
|
193
|
-
.h-selector-fade-enter-active, .h-selector-fade-leave-active {
|
|
194
|
-
transition: opacity .4s;
|
|
195
|
-
}
|
|
196
|
-
.h-selector-fade-enter, .h-selector-fade-leave-to {
|
|
197
|
-
opacity: 0;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
1
|
+
<template>
|
|
2
|
+
<div class="h-selector">
|
|
3
|
+
<!-- 显示在外部的内容,可以显示组件内部计算的数据值,也可以显示外部传入的显示文字 -->
|
|
4
|
+
<div class="h-selector-show" @click="showAddress">
|
|
5
|
+
{{showValue || defaultShowValue}}
|
|
6
|
+
</div>
|
|
7
|
+
<!-- 显示隐藏的移动动画,使用Vue的 transition组件实施 -->
|
|
8
|
+
<transition name="h-selector-move">
|
|
9
|
+
<!-- 级联选择器外层的容器,用于显示隐藏,以及级联选择器头部和内容的显示 -->
|
|
10
|
+
<div class="h-selector-container" v-if="show">
|
|
11
|
+
<!-- 级联选择器的头部,取消按钮,确定按钮,以及显示的标题 -->
|
|
12
|
+
<div class="h-selector-header">
|
|
13
|
+
<div @click="cancel" class="h-selector-header-cancel">取消</div>
|
|
14
|
+
<div class="h-selector-header-title">{{title}}</div>
|
|
15
|
+
<div @click="confirm" class="h-selector-header-confirm">确定</div>
|
|
16
|
+
</div>
|
|
17
|
+
<!-- 包裹级联选择器的容器 -->
|
|
18
|
+
<div class="h-selector-content">
|
|
19
|
+
<!-- 使用插槽,将外部的级联选择器显示到当前组件内,成为当前组件的子组件 -->
|
|
20
|
+
<slot></slot>
|
|
21
|
+
<div class="h-selector-bg"></div>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
</transition>
|
|
25
|
+
<!-- 遮罩层,淡入淡出动画 -->
|
|
26
|
+
<transition name="h-selector-fade">
|
|
27
|
+
<div class="h-selector-layer" v-if="show" @click="cancel"></div>
|
|
28
|
+
</transition>
|
|
29
|
+
</div>
|
|
30
|
+
</template>
|
|
31
|
+
|
|
32
|
+
<script>
|
|
33
|
+
export default {
|
|
34
|
+
name: "hSelector",
|
|
35
|
+
props: {
|
|
36
|
+
value: { // 数据双向绑定所必须的属性
|
|
37
|
+
type: Object, // 期待接收一个Object的值
|
|
38
|
+
required: true // 必填的
|
|
39
|
+
},
|
|
40
|
+
showValue: { // 由外部定义显示在外层的内容
|
|
41
|
+
type: String,
|
|
42
|
+
},
|
|
43
|
+
title: { // 定义级联选择器的标题
|
|
44
|
+
type:String, // 接收字符串类型
|
|
45
|
+
default: '' // 默认为空字符
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
data() {
|
|
49
|
+
// 定义oldValue用来保存上一次的值,使用Object.assign拷贝一份,避免与绑定的value发生冲突
|
|
50
|
+
let oldValue = Object.assign({}, this.value);
|
|
51
|
+
return {
|
|
52
|
+
oldValue, // 保存上一次修改的值
|
|
53
|
+
show: false // 定义显示隐藏
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
computed: {
|
|
57
|
+
defaultShowValue() { // 定义默认显示的内容,建议使用外部定义的内容显示,内部只做了非常简单的处理
|
|
58
|
+
let arr = [];
|
|
59
|
+
for (let i in this.value) {
|
|
60
|
+
arr.push(i + ':' + this.value[i])
|
|
61
|
+
}
|
|
62
|
+
return arr.join('/');
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
mounted() {
|
|
66
|
+
// Vue实例都拥有的$on方法,监听的是从wrapper发布的changeSelected事件,触发this.changeSelected方法
|
|
67
|
+
this.$on('changeSelected', this.changeSelected);
|
|
68
|
+
},
|
|
69
|
+
// 定义方法
|
|
70
|
+
methods: {
|
|
71
|
+
// 修改当前选中的值,实现数据双向绑定的方法
|
|
72
|
+
changeSelected(prop, value) { // 接收两个参数,prop代表需要修改对象的哪个属性,value代表修改的值
|
|
73
|
+
let obj = {};
|
|
74
|
+
obj[prop] = value;
|
|
75
|
+
// 使用Object.assign将新的值与旧的值合并覆盖,并向外部发布新的值
|
|
76
|
+
let obj2 = Object.assign({}, this.value, obj);
|
|
77
|
+
this.$emit('input', obj2);
|
|
78
|
+
},
|
|
79
|
+
// 取消功能,将上一次的数据发送回外部,并隐藏级联选择器
|
|
80
|
+
cancel() {
|
|
81
|
+
this.$emit('input', this.oldValue);
|
|
82
|
+
this.show = false;
|
|
83
|
+
},
|
|
84
|
+
// 确定功能,将本次修改的值保存,并保存在oldValue中,以供下次使用
|
|
85
|
+
confirm() {
|
|
86
|
+
this.oldValue = Object.assign({}, this.value);
|
|
87
|
+
this.$emit('change', this.value);
|
|
88
|
+
this.show = false;
|
|
89
|
+
},
|
|
90
|
+
// 控制级联选择器显示
|
|
91
|
+
showAddress() {
|
|
92
|
+
this.show = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
</script>
|
|
97
|
+
|
|
98
|
+
<style scoped lang="less">
|
|
99
|
+
.h-selector {
|
|
100
|
+
letter-spacing: 1px;
|
|
101
|
+
font-size: 16px;
|
|
102
|
+
width: 100%;
|
|
103
|
+
height: 100%;
|
|
104
|
+
.h-selector-show {
|
|
105
|
+
width: 100%;
|
|
106
|
+
height: 100%;
|
|
107
|
+
box-sizing: border-box;
|
|
108
|
+
padding: 0 20px;
|
|
109
|
+
white-space: nowrap;
|
|
110
|
+
overflow: hidden;
|
|
111
|
+
text-overflow: ellipsis;
|
|
112
|
+
}
|
|
113
|
+
.h-selector-container {
|
|
114
|
+
position: absolute;
|
|
115
|
+
z-index: 999;
|
|
116
|
+
left: 0;
|
|
117
|
+
bottom: 0;
|
|
118
|
+
width: 100%;
|
|
119
|
+
background: #fff;
|
|
120
|
+
}
|
|
121
|
+
.h-selector-layer {
|
|
122
|
+
position: absolute;
|
|
123
|
+
background: rgba(0, 0, 0, 0.3);
|
|
124
|
+
width: 100%;
|
|
125
|
+
height: 100%;
|
|
126
|
+
top: 0;
|
|
127
|
+
left: 0;
|
|
128
|
+
z-index: 2;
|
|
129
|
+
}
|
|
130
|
+
ul, li {
|
|
131
|
+
margin: 0;
|
|
132
|
+
padding: 0;
|
|
133
|
+
list-style: none;
|
|
134
|
+
}
|
|
135
|
+
.h-selector-header {
|
|
136
|
+
display: flex;
|
|
137
|
+
align-items: center;
|
|
138
|
+
height: 40px;
|
|
139
|
+
justify-content: space-between;
|
|
140
|
+
padding: 0 30px;
|
|
141
|
+
.h-selector-header-cancel {
|
|
142
|
+
color: #e9aa14;
|
|
143
|
+
}
|
|
144
|
+
.h-selector-header-confirm {
|
|
145
|
+
color: #508aff;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
.h-selector-content {
|
|
149
|
+
display: flex;
|
|
150
|
+
width: 100%;
|
|
151
|
+
position: relative;
|
|
152
|
+
}
|
|
153
|
+
.h-selector-wrapper {
|
|
154
|
+
flex: 1;
|
|
155
|
+
overflow: hidden;
|
|
156
|
+
& + .h-selector-wrapper {
|
|
157
|
+
border-left: 1px solid #ddd;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
.h-selector-option {
|
|
161
|
+
line-height: 60px;
|
|
162
|
+
height: 60px;
|
|
163
|
+
text-align: center;
|
|
164
|
+
white-space: nowrap;
|
|
165
|
+
overflow: hidden;
|
|
166
|
+
text-overflow: ellipsis;
|
|
167
|
+
}
|
|
168
|
+
.h-selector-bg {
|
|
169
|
+
height: 100%;
|
|
170
|
+
width: 100%;
|
|
171
|
+
position: absolute;
|
|
172
|
+
top: 0;
|
|
173
|
+
left: 0;
|
|
174
|
+
background: linear-gradient(180deg, hsla(0, 0%, 100%, 0.9), hsla(0, 0%, 100%, 0.7)), linear-gradient(0deg, hsla(0, 0%, 100%, 0.9), hsla(0, 0%, 100%, 0.4));
|
|
175
|
+
backface-visibility: hidden;
|
|
176
|
+
pointer-events: none;
|
|
177
|
+
background-repeat: no-repeat;
|
|
178
|
+
background-position: top, bottom;
|
|
179
|
+
background-size: 100% 100px;
|
|
180
|
+
}
|
|
181
|
+
.h-selector-move-enter-to, .h-selector-move-leave {
|
|
182
|
+
transform: translate3d(0, 0, 0);
|
|
183
|
+
}
|
|
184
|
+
.h-selector-move-enter-active, .h-selector-move-leave-active {
|
|
185
|
+
transition: transform .6s;
|
|
186
|
+
}
|
|
187
|
+
.h-selector-move-enter, .h-selector-move-leave-to {
|
|
188
|
+
transform: translate3d(0, 100%, 0);
|
|
189
|
+
}
|
|
190
|
+
.h-selector-fade-enter-to, .h-selector-fade-leave {
|
|
191
|
+
opacity: 1;
|
|
192
|
+
}
|
|
193
|
+
.h-selector-fade-enter-active, .h-selector-fade-leave-active {
|
|
194
|
+
transition: opacity .4s;
|
|
195
|
+
}
|
|
196
|
+
.h-selector-fade-enter, .h-selector-fade-leave-to {
|
|
197
|
+
opacity: 0;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
200
|
</style>
|