jufubao-base 1.0.259 → 1.0.261

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 (41) hide show
  1. package/package.json +1 -1
  2. package/src/components/JfbBaseAfterOrderList/Attr.js +13 -0
  3. package/src/components/JfbBaseAfterOrderList/JfbBaseAfterOrderList.vue +33 -1
  4. package/src/components/JfbBaseAfterSales/Api.js +58 -0
  5. package/src/components/JfbBaseAfterSales/Attr.js +25 -0
  6. package/src/components/JfbBaseAfterSales/JfbBaseAfterSales.vue +598 -0
  7. package/src/components/JfbBaseAfterSales/JfbBaseAfterSalesLess.less +79 -0
  8. package/src/components/JfbBaseAfterSales/JfbBaseAfterSalesMixin.js +30 -0
  9. package/src/components/JfbBaseAfterSales/Mock.js +6 -0
  10. package/src/components/JfbBaseAfterSales/refundOrderInfo.vue +150 -0
  11. package/src/components/JfbBaseAfterSalesDetail/Api.js +41 -0
  12. package/src/components/JfbBaseAfterSalesDetail/Attr.js +25 -0
  13. package/src/components/JfbBaseAfterSalesDetail/JfbBaseAfterSalesDetail.vue +562 -0
  14. package/src/components/JfbBaseAfterSalesDetail/JfbBaseAfterSalesDetailLess.less +79 -0
  15. package/src/components/JfbBaseAfterSalesDetail/JfbBaseAfterSalesDetailMixin.js +30 -0
  16. package/src/components/JfbBaseAfterSalesDetail/Mock.js +60 -0
  17. package/src/components/JfbBaseAfterSalesDetail/secProd.vue +66 -0
  18. package/src/components/JfbBaseAfterSalesFast/Api.js +30 -0
  19. package/src/components/JfbBaseAfterSalesFast/Attr.js +32 -0
  20. package/src/components/JfbBaseAfterSalesFast/JfbBaseAfterSalesFast.vue +297 -0
  21. package/src/components/JfbBaseAfterSalesFast/JfbBaseAfterSalesFastLess.less +79 -0
  22. package/src/components/JfbBaseAfterSalesFast/JfbBaseAfterSalesFastMixin.js +30 -0
  23. package/src/components/JfbBaseAfterSalesFast/Mock.js +38 -0
  24. package/src/components/JfbBaseAfterSalesList/Api.js +40 -0
  25. package/src/components/JfbBaseAfterSalesList/Attr.js +130 -0
  26. package/src/components/JfbBaseAfterSalesList/JfbBaseAfterSalesList.vue +512 -0
  27. package/src/components/JfbBaseAfterSalesList/JfbBaseAfterSalesListLess.less +79 -0
  28. package/src/components/JfbBaseAfterSalesList/JfbBaseAfterSalesListMixin.js +30 -0
  29. package/src/components/JfbBaseAfterSalesList/Mock.js +362 -0
  30. package/src/components/JfbBaseCard/JfbBaseCard.vue +3 -1
  31. package/src/components/JfbBaseCardSweepInfo/JfbBaseCardSweepInfo.vue +2 -1
  32. package/src/components/JfbBaseCardV2/JfbBaseCardV2.vue +3 -1
  33. package/src/components/JfbBaseCardV3/JfbBaseCardV3.vue +3 -1
  34. package/src/components/JfbBaseOrderDetail/Api.js +11 -0
  35. package/src/components/JfbBaseOrderDetail/Attr.js +36 -0
  36. package/src/components/JfbBaseOrderDetail/JfbBaseOrderDetail.vue +47 -2
  37. package/src/components/JfbBaseOrderList/Api.js +11 -0
  38. package/src/components/JfbBaseOrderList/Attr.js +36 -0
  39. package/src/components/JfbBaseOrderList/JfbBaseOrderList.vue +50 -2
  40. package/src/components/JfbBaseOrderList/Mock.js +1 -1
  41. package/src/components/JfbBaseOrderList/XdTfkOrderItem.vue +17 -5
@@ -0,0 +1,130 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @description 当表单组件中有联动操作时候,使用方法进行返回
5
+ */
6
+ export default {
7
+ style: [],
8
+ content: (data) => {
9
+ return [
10
+ {
11
+ label: "背景颜色:",
12
+ ele: "xd-color",
13
+ valueKey: "bodyBgColor",
14
+ value: data.bodyBgColor || "",
15
+ groupKey: "style",
16
+ },
17
+ {
18
+ label: 'tab文字颜色设置:',
19
+ ele: 'xd-text-and-bgc',
20
+ groupKey:'style',
21
+ valueKey: 'menuTabColor',
22
+ value: data['menuTabColor'] || null,
23
+ setting: {
24
+ fontSize: false, //字体大小选择
25
+ color: true, //文字颜色选项
26
+ bgColor: false, //背景选项
27
+ weight: false, //文字粗细
28
+ },
29
+ handleCustom({action, data}) {
30
+ XdBus.getParentApi('getOptionsSettingList')({setting_id: 'edtix_style_font_size'})
31
+ .then(res => {
32
+ data.cb(res.list)
33
+ })
34
+ .catch(error => {
35
+ console.error(error);
36
+ data.cb([])
37
+ });
38
+ },
39
+ },
40
+ {
41
+ label: "内容配置设置",
42
+ ele: "title",
43
+ groupKey: "style",
44
+ size: "small"
45
+ },
46
+ {
47
+ label: "背景颜色:",
48
+ ele: "xd-color",
49
+ valueKey: "cardItemBgColor",
50
+ value: data.cardItemBgColor || "#FFFFFF",
51
+ groupKey: "style",
52
+ labelInline: true,
53
+ },
54
+ {
55
+ label: "间距设置:",
56
+ ele: "el-input",
57
+ valueKey: "cardItemSpace",
58
+ value: data.cardItemSpace || "20",
59
+ placeholder: '请输入间距',
60
+ groupKey: "style",
61
+ className: "input80",
62
+ labelInline: true,
63
+ inline: false,
64
+ notice: '设置间距,<span style="color: red">单位:像素</span>。默认值:<span style="color:red">20</span>像素',
65
+ },
66
+ {
67
+ label: '投影设置:',
68
+ ele: 'xd-shadow',
69
+ groupKey:'style',
70
+ labelInline: true,
71
+ valueKey: 'cardItemShadow',
72
+ value: data['cardItemShadow'] || '',
73
+ setting: {
74
+ selected: 'N',
75
+ },
76
+ handleCustom({action, data}) {
77
+ XdBus.getParentApi('getOptionsSettingList')({setting_id: 'edtix_style_radius'})
78
+ .then(res => {
79
+ data.cb(res.list)
80
+ })
81
+ .catch(error => {
82
+ console.error(error);
83
+ data.cb([])
84
+ });
85
+ },
86
+ },
87
+ {
88
+ label: '边框设置:',
89
+ ele: 'xd-border',
90
+ groupKey:'style',
91
+ labelInline: true,
92
+ valueKey: 'cardItemBorder',
93
+ value: data['cardItemBorder'] || '',
94
+ setting: {
95
+ selected:'N'
96
+ },
97
+ },
98
+ {
99
+ label: "圆角设置:",
100
+ groupKey: 'style',
101
+ ele: 'xd-slider',
102
+ valueKey: "cardItemRadius",
103
+ value: data['cardItemRadius'] === undefined?16:data['cardItemRadius'] ,
104
+ className: "input80",
105
+ labelInline: true,
106
+ setting:{
107
+ min: 0,//最小值
108
+ max: 60, //最小值
109
+ step:1, //步长
110
+ showStops:false,//显示间断点
111
+ showInput:false,//显示输入框
112
+ }
113
+ },
114
+ {
115
+ label: '服务详情跳转路径:',
116
+ ele: 'xd-select-pages-path',
117
+ valueKey: 'afterSalesDetailPath',
118
+ placeholder: '请选择服务详情跳转路径',
119
+ groupKey:'advanced',
120
+ className: 'input100',
121
+ value: data['afterSalesDetailPath'] || null,
122
+ setting: {
123
+ router: XdBus.getParentApi('getPagesTree'),
124
+ },
125
+ inline: false,
126
+ },
127
+ ].filter(i=>i)
128
+ },
129
+ advanced: [],
130
+ };
@@ -0,0 +1,512 @@
1
+ <template>
2
+ <view
3
+ class="jfb-base-after-sales-list"
4
+ @click="handleEditxSelect"
5
+ :class="{ editx : isEditx && active }"
6
+ >
7
+ <!--#ifdef H5-->
8
+ <view
9
+ class="jfb-base-after-sales-list__edit"
10
+ :class="{ editx : isEditx && active }"
11
+ v-if="isEditx && active"
12
+ >
13
+ <view class="jfb-base-after-sales-list__edit-icon" @click="delEdit">删除</view>
14
+ </view>
15
+ <!-- #endif -->
16
+ <view class="jfb-base-after-sales-list__body" :style="[bodyBoxStyle]">
17
+ <view class="fixed_header" :style="{
18
+ top: layoutInfo.top + 'rpx',
19
+ }">
20
+ <view class="filter_tab" :style="[menuTabStyle]">
21
+ <view v-for="item in statusTabs" :key="item.value" class="filter_item"
22
+ :class="{active: item.value===status}"
23
+ @click="selectStatusTab(item.value)"
24
+ >{{ item.label }}</view>
25
+ </view>
26
+ <view class="search_bar" :style="{
27
+ backgroundColor: bodyBgColor
28
+ }">
29
+ <view class="search_box">
30
+ <xd-font-icon style="margin: 0 32rpx;" icon="iconsousuo_mian" size="32" color="#BBBBBB"></xd-font-icon>
31
+ <input type="text"
32
+ v-model="keyword"
33
+ style="width: 100%;"
34
+ confirm-type="search"
35
+ placeholder="请输入商品名称/订单编号"
36
+ @confirm="handleSearch"/>
37
+ <xd-font-icon v-if="keyword" style="margin: 0 32rpx;" icon="iconshanchu" size="32" color="#BBBBBB" @click.stop="handleClearKeyword"></xd-font-icon>
38
+ </view>
39
+
40
+ </view>
41
+ </view>
42
+
43
+ <view style="height: 220rpx"></view>
44
+
45
+ <view v-if="loaded" class="service_list_wrap">
46
+ <view v-if="orderList.length" class="service_list">
47
+ <view v-for="item in orderList"
48
+ :key="item.service_order_id"
49
+ class="service_item"
50
+ :style="[cardItemBoxStyle]"
51
+ @click="handleToLink(item)">
52
+ <view class="service_header">
53
+ <view class="biz_name">
54
+ <xd-font-icon
55
+ v-if="item.business_icon"
56
+ class="biz_icon"
57
+ :icon="item.business_icon"
58
+ :size="28"
59
+ ></xd-font-icon>
60
+ {{item.business_name}}</view>
61
+ <view class="service_type" :style="[item.colorStyle]">
62
+ <xd-font-icon :icon="item.icon" size="32"></xd-font-icon>
63
+ <view style="margin-left: 8rpx;">{{ item.after_sale_method_name }}</view>
64
+ </view>
65
+ </view>
66
+ <view class="service_body">
67
+ <view class="service_number">服务单号:{{ item.service_order_id }}</view>
68
+ <view v-for="prod in item.product_list" :key="prod.product_id" class="prod_item">
69
+ <view class="prod_img">
70
+ <image :src="prod.thumb" mode="aspectFit"></image>
71
+ </view>
72
+ <view class="prod_info">
73
+ <view class="prod_title"> {{ prod.product_name }} </view>
74
+ <view class="prod_number">申请数量:×{{ prod.after_count }}</view>
75
+ </view>
76
+ </view>
77
+ </view>
78
+ <view class="service_foot">
79
+ <view v-if="item.is_show_cancel_btn === 'Y'" class="opt_btn default" @click.stop="handleCancel(item)">取消申请</view>
80
+ <view v-if="item.is_show_delete_btn === 'Y'" class="opt_btn default" @click.stop="handleDel(item)">删除</view>
81
+ </view>
82
+ </view>
83
+ </view>
84
+ <view v-else>
85
+ <xd-no-data></xd-no-data>
86
+ </view>
87
+ </view>
88
+ </view>
89
+ </view>
90
+ </template>
91
+
92
+ <script>
93
+ import XdFontIcon from "@/components/XdFontIcon/XdFontIcon";
94
+ import XdNoData from "@/components/XdNoData/XdNoData.vue"
95
+ import { jfbRootExec } from "@/utils/xd.event";
96
+ import JfbBaseAfterSalesListMixin from "./JfbBaseAfterSalesListMixin";
97
+ import { getContainerPropsValue } from "@/utils/xd.base";
98
+ import componentsMixins from "@/mixins/componentsMixins";
99
+ import extsMixins from "@/mixins/extsMixins";
100
+ import getServiceUrl from "@/common/getServiceUrl";
101
+ export default {
102
+ name: "JfbBaseAfterSalesList",
103
+ components: {
104
+ XdFontIcon,
105
+ XdNoData
106
+ },
107
+ mixins: [
108
+ componentsMixins, extsMixins, JfbBaseAfterSalesListMixin
109
+ ],
110
+ data() {
111
+ return {
112
+ orderList: [],
113
+
114
+ loaded: false,
115
+ status: "2", //状态 0:全部 1:待处理,2:处理中 3:已完成
116
+ keyword: "",
117
+ page_size: 10,
118
+ page_token: 1,
119
+ hasNext: true,
120
+ next_page_token: "",
121
+ // showStatusFilter: "",
122
+
123
+ statusTabs: [
124
+ // { label: '全部', value: '0'},
125
+ // { label: '待处理', value: '1'},
126
+ { label: '处理中', value: '2'},
127
+ { label: '已完成', value: '3'},
128
+ ],
129
+
130
+ bodyBgColor: "",
131
+
132
+ cardItemBgColor: "",
133
+ cardItemSpace: 20,
134
+ cardItemShadow: "",
135
+ cardItemBorder: "",
136
+ cardItemRadius: 16,
137
+
138
+ afterSalesDetailPath: "",
139
+ menuTabColor: {},
140
+
141
+ }
142
+ },
143
+ watch: {
144
+ container(value, oldValue) {
145
+ if (JSON.stringify(value) === JSON.stringify(oldValue)) return;
146
+ if (this.$configProject['isPreview']) this.init(value)
147
+ },
148
+ },
149
+ computed: {
150
+ bodyBoxStyle(){
151
+ return {
152
+ backgroundColor: this.bodyBgColor,
153
+ minHeight: this.layoutInfo.bodyMinHeight,
154
+ '--main-color': this.mainColor,
155
+ }
156
+ },
157
+ cardItemBoxStyle(){
158
+ return {
159
+ backgroundColor: this.cardItemBgColor,
160
+ marginBottom: this.cardItemSpace + 'rpx',
161
+ boxShadow: this.cardItemShadow,
162
+ border: this.cardItemBorder,
163
+ borderRadius: this.cardItemRadius + 'rpx',
164
+ }
165
+ },
166
+ menuTabStyle(){
167
+ return {
168
+ '--tab-color': this.menuTabColor['color'] || '#333333',
169
+ '--active-tab-color': this.menuTabColor['actColor'] || this.mainColor,
170
+ }
171
+ }
172
+ },
173
+ created() {
174
+ this.init(this.container);
175
+
176
+ //todo
177
+ },
178
+ methods: {
179
+ onJfbLoad(options) {
180
+ this.getList();
181
+ },
182
+ /**
183
+ * @description 监听事件变化
184
+ * @param container {object} 业务组件对象自己
185
+ */
186
+ init(container) {
187
+ // this.showStatusFilter = getContainerPropsValue(container, "content.showStatusFilter", "");
188
+ this.bodyBgColor = getContainerPropsValue(container, "content.bodyBgColor", "#EEEEEE");
189
+
190
+ this.cardItemBgColor = getContainerPropsValue(container, 'content.cardItemBgColor', "#FFFFFF");
191
+ this.cardItemSpace = getContainerPropsValue(container, 'content.cardItemSpace', 20);
192
+ this.cardItemShadow = this.getXdShadow({width:20, color:'rgba(0,0,0,0)'},getContainerPropsValue(container, 'content.cardItemShadow', {}))
193
+ this.cardItemBorder = this.getXdBorder({width:2,color:'rgba(0,0,0,0)'},getContainerPropsValue(container, 'content.cardItemBorder', {}));
194
+ this.cardItemRadius = getContainerPropsValue(container, 'content.cardItemRadius', 16);
195
+ this.menuTabColor = getContainerPropsValue(container, "content.menuTabColor", {});
196
+
197
+ this.afterSalesDetailPath = getContainerPropsValue(container, "content.afterSalesDetailPath", { value: "" }).value;
198
+ },
199
+
200
+ handleSearch(e){
201
+ console.log("handleSearch",e)
202
+ this.page_token = 1;
203
+ this.getList();
204
+ },
205
+ selectStatusTab(status){
206
+ this.status = status;
207
+ this.page_token = 1;
208
+ uni.pageScrollTo({
209
+ scrollTop: 0,
210
+ duration: 0
211
+ });
212
+ this.getList();
213
+ },
214
+ handleCancel(item){
215
+ this.handleConfirm(() => {
216
+ jfbRootExec("cancelAfterServiceOrder", {
217
+ vm: this,
218
+ data:{
219
+ service_order_id: item.service_order_id
220
+ }
221
+ }).then(res => {
222
+ this.page_token = 1;
223
+ this.getList();
224
+ })
225
+ }, '确定取消当前工单吗?')
226
+ },
227
+ handleDel(item){
228
+ this.handleConfirm(() => {
229
+ jfbRootExec("delAfterServiceOrder", {
230
+ vm: this,
231
+ data:{
232
+ service_order_id: item.service_order_id
233
+ }
234
+ }).then(res => {
235
+ this.page_token = 1;
236
+ this.getList();
237
+ })
238
+ }, '确定删除当前工单吗?')
239
+ },
240
+ getMethodTypeStyle(method){
241
+ switch (method) {
242
+ case "refund_and_good":
243
+ return { color: "#FF5733" };
244
+ case "refund":
245
+ return { color: "#FF5733" };
246
+ case "exchange":
247
+ return { color: "#2A82E4" };
248
+ case "again":
249
+ return { color: "#43CF7C" };
250
+ case "good":
251
+ return { color: "#FF8D1A" };
252
+ case "zero":
253
+ return { color: "#FF8D1A" };
254
+ default:
255
+ return {};
256
+ }
257
+ },
258
+ getMethodTypeIcon(method){
259
+ let method_icon = {
260
+ 'refund_and_good': "icontuikuan",
261
+ 'refund': "icontuihuo",
262
+ 'exchange': "iconhuanhuo",
263
+ 'again': "iconbufa",
264
+ 'zero': 'iconhuanhuo'
265
+ }
266
+ return method_icon[method] || "";
267
+ },
268
+ getList() {
269
+ this.$xdShowLoading({});
270
+ jfbRootExec("getAfterServiceOrderList", {
271
+ vm: this,
272
+ data: {
273
+ page_size: this.page_size,
274
+ page_token: this.page_token,
275
+ status: this.status,
276
+ keyword: this.keyword,
277
+ },
278
+ })
279
+ .then((res) => {
280
+ this.loaded = true;
281
+ this.$xdHideLoading();
282
+ let list = res.list.map(item => {
283
+ // item.thumb = getServiceUrl(item.thumb, 'size2');
284
+ item.product_list = item.product_list.map(prod => {
285
+ prod.thumb = getServiceUrl(prod.thumb);
286
+ return prod;
287
+ })
288
+ item.colorStyle = this.getMethodTypeStyle(item.after_sale_method);
289
+ item.icon = this.getMethodTypeIcon(item.after_sale_method);
290
+ return item;
291
+ });
292
+ if (this.page_token === 1) {
293
+ this.orderList = list;
294
+ } else {
295
+ this.orderList = this.orderList.concat(list);
296
+ }
297
+ this.hasNext = res.next_page_token !== "";
298
+ this.next_page_token = res.next_page_token;
299
+ })
300
+ .catch((err) => {
301
+ this.$xdHideLoading();
302
+ });
303
+ },
304
+ handleToLink(item) {
305
+ this.$xdUniHelper.navigateTo({
306
+ url: `${this.afterSalesDetailPath}?service_order_id=${item.service_order_id}`,
307
+ });
308
+ },
309
+ handleConfirm(cb, content){
310
+ this.$xdConfirm({
311
+ styles: this.styles,
312
+ title: "提示",
313
+ width: '90%',
314
+ content: content,
315
+ confirmText: '确认',
316
+ isHtml: true,
317
+ cancelText: '取消',
318
+ showClose: false,
319
+ success: (res) => {
320
+ if (res.confirm) {
321
+ cb && cb();
322
+ }
323
+ else{}
324
+ }
325
+ })
326
+ },
327
+ handleClearKeyword(){
328
+ this.keyword = "";
329
+ this.page_token = 1;
330
+ this.getList();
331
+ },
332
+ onJfbScroll(options) {
333
+ // console.log("event.onJfbScroll", options);
334
+ },
335
+ onJfbReachBottom(options) {
336
+ if (this.hasNext) {
337
+ this.page_token = this.next_page_token;
338
+ this.getList();
339
+ }
340
+ },
341
+ onJfbShow(options) {
342
+ this.page_token = 1;
343
+ this.getList();
344
+ // console.log('event.onJfbShow', options)
345
+ },
346
+ onJfbHide(options) {
347
+ console.log('event.onJfbHide', options)
348
+ },
349
+ onJfbBack(options) {
350
+ console.log('event.onJfbBack', options)
351
+ },
352
+ onJfbUpdate(...data) {
353
+ console.log('event.onJfbUpdate', data)
354
+ },
355
+ onJfbCustomEvent(options) {
356
+ console.log('event.onJfbReachBottom', options)
357
+ },
358
+ }
359
+ }
360
+
361
+ </script>
362
+
363
+ <style scoped lang="less">
364
+ @import "./JfbBaseAfterSalesListLess.less";
365
+
366
+ .jfb-base-after-sales-list {
367
+ &__body{
368
+ padding: 24rpx;
369
+ box-sizing: border-box;
370
+ .fixed_header{
371
+ position: fixed;
372
+ top: 0;
373
+ left: 0;
374
+ width: 100%;
375
+ z-index: 111;
376
+ }
377
+ .filter_tab{
378
+ display: flex;
379
+ align-items: center;
380
+ background-color: #FFFFFF;
381
+ justify-content: center;
382
+ height: 100rpx;
383
+ line-height: 100rpx;
384
+ border-bottom: 1px solid #DDD;
385
+
386
+ .filter_item{
387
+ margin: 0 110rpx;
388
+ font-size: 28rpx;
389
+ color: var(--tab-color);
390
+ &.active{
391
+ border-bottom: 2px solid var(--active-tab-color);
392
+ color: var(--active-tab-color);
393
+ }
394
+ }
395
+ }
396
+ .search_bar{
397
+ padding: 24rpx;
398
+
399
+ .search_box{
400
+ height: 80rpx;
401
+ display: flex;
402
+ align-items: center;
403
+ background-color: #FFFFFF;
404
+ border-radius: 80rpx;
405
+ ::v-deep .input-placeholder{
406
+ color: #BBBBBB;
407
+ }
408
+ }
409
+ }
410
+ .service_list_wrap{
411
+
412
+ }
413
+ .service_list{
414
+
415
+ }
416
+ .service_item{
417
+ padding: 32rpx;
418
+ .service_header{
419
+ display: flex;
420
+ align-items: center;
421
+ justify-content: space-between;
422
+ padding-bottom: 24rpx;
423
+ border-bottom: 1px solid #F2F2F2;
424
+ font-size: 28rpx;
425
+ font-weight: 500;
426
+ color: #333333;
427
+ .biz_name{
428
+ display: flex;
429
+ align-items: center;
430
+ .biz_icon{
431
+ margin-right: 16rpx;
432
+ }
433
+ }
434
+ .service_type{
435
+ display: flex;
436
+ align-items: center;
437
+ }
438
+ }
439
+ .service_body{
440
+ .service_number{
441
+ font-size: 24rpx;
442
+ font-weight: 500;
443
+ color: #333333;
444
+ margin: 24rpx 0;
445
+ }
446
+ .prod_item{
447
+ display: flex;
448
+ align-items: center;
449
+ margin: 24rpx 0;
450
+ .prod_img{
451
+ width: 140rpx;
452
+ height: 140rpx;
453
+ border-radius: 16rpx;
454
+ background-color: #EEE;
455
+ image{
456
+ width: 100%;
457
+ height: 100%;
458
+ }
459
+ }
460
+ .prod_info{
461
+ margin-left: 20rpx;
462
+ flex: 1;
463
+ align-self: stretch;
464
+ display: flex;
465
+ flex-direction: column;
466
+ justify-content: space-between;
467
+ .prod_title{
468
+ margin-bottom: 10rpx;
469
+ font-size: 28rpx;
470
+ color: #333333;
471
+ }
472
+ .prod_number{
473
+ color: #999999;
474
+ font-size: 24rpx;
475
+ }
476
+ }
477
+ }
478
+ }
479
+ .service_foot{
480
+ text-align: right;
481
+ margin-top: 24rpx;
482
+ .opt_btn{
483
+ width: 120rpx;
484
+ height: 60rpx;
485
+ background: #FFFFFF;
486
+ color: #999999;
487
+ border: 1px solid #999999;
488
+ font-size: 24rpx;
489
+ text-align: center;
490
+ line-height: 60rpx;
491
+ border-radius: 60rpx;
492
+ display: inline-block;
493
+ & + .opt_btn{
494
+ margin-left: 20rpx;
495
+ }
496
+ &.default{
497
+ background: #EFEFEF;
498
+ border-color: #EFEFEF;
499
+ color: #999999;
500
+ width: 140rpx;
501
+ }
502
+ &.primary{
503
+ background: var(--main-color);
504
+ border-color: var(--main-color);
505
+ color: #FFFFFF;
506
+ }
507
+ }
508
+ }
509
+ }
510
+ }
511
+ }
512
+ </style>