feat: 合并代码

This commit is contained in:
赵毅 2025-07-11 09:11:44 +08:00
commit 142e1ad8fe
11 changed files with 1654 additions and 9 deletions

View File

@ -48,7 +48,7 @@
},
{
photo:"https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/footer_door.png",
photoAc:"https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/footer_doorAc.png",
photoAc:"https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/footer_communityAc.png",
nav_name:"上门服务",
url:"/packages/homeServer/index/index"
},

View File

@ -0,0 +1,74 @@
# slider-range
uni-app 滑块区间选择组件
可根据具体需求,修改、自定义其他内容。
## 属性说明
|属性名|类型|默认值|说明|
| -- | -- | --|--|
| value | Array<Number, Number> | [0,100] |滑块已选中区间的值|
| min | Number| 0 | 滑块区间最小值 |
| max | Number | 100 | 滑块区间最大值 |
| step | Number | 1 | 拖动时的步长 |
| disabled | Boolean | false | 是否为禁用状态 |
| height | Number | 50 | 滑块容器高度 |
| barHeight | Number | 5 | 滑块进度条高度 |
| backgroundColor | String | #e9e9e9| 滑块进度条背景色|
| activeColor | String | #1aad19 | 已选中区间进度条颜色|
| blockSize | Number | 20 | 滑块大小 |
| blockColor | String | #fff | 滑块颜色 |
| decorationVisible | Boolean | false | 是否显示滑块内装饰元素|
| tipVisible | Boolean | true | 是否显示滑块值提示文本 |
| fomat| Function | | 滑块值提示文本格式化函数,**注意**:小程序中此属性必传,否则会报错,如果无需格式化,可以简单返回原始值: `format(val) { return val }`H5中可以不传。|
## 使用示例
```html
<slider-range
:value="rangeValue"
:min="rangeMin"
:max="rangMax"
:step="5"
:bar-height="3"
:block-size="26"
background-color="#EEEEF6"
active-color="#FF6B00"
:format="format"
:decorationVisible="true"
@change="handleRangeChange"
></slider-range>
```
```javascript
import SliderRange from '../components/slider-range/index.vue'
export default {
components: {
SliderRange
},
data() {
return {
rangeMin: 5,
rangMax: 200,
rangeValue: [10, 50]
}
},
methods: {
format(val) {
return val + '%'
},
handleRangeChange(e) {
this.rangeValue = e
}
}
}
```
效果图
![](http://images.alisali.cn/img_20190715175325.png)

View File

@ -0,0 +1,378 @@
<template>
<view
class="slider-range"
:class="{ disabled: disabled }"
:style="{ paddingLeft: blockSize / 2 + 'px', paddingRight: blockSize / 2 + 'px' }"
>
<view class="slider-range-inner" :style="{ height: height + 'px' }">
<view
class="slider-bar"
:style="{
height: barHeight + 'px',
}"
>
<!-- 背景条 -->
<view
class="slider-bar-bg"
:style="{
backgroundColor: backgroundColor,
}"
></view>
<!-- 滑块实际区间 -->
<view
class="slider-bar-inner"
:style="{
width: ((values[1] - values[0]) / (max - min)) * 100 + '%',
left: lowerHandlePosition + '%',
backgroundColor: activeColor,
}"
></view>
</view>
<!-- 滑动块- -->
<view
class="slider-handle-block"
:class="{ decoration: decorationVisible }"
:style="{
backgroundColor: blockColor,
width: blockSize + 'px',
height: blockSize + 'px',
left: lowerHandlePosition + '%',
}"
@touchstart="_onTouchStart"
@touchmove="_onBlockTouchMove"
@touchend="_onBlockTouchEnd"
data-tag="lowerBlock"
></view>
<!-- 滑动块- -->
<view
class="slider-handle-block"
:class="{ decoration: decorationVisible }"
:style="{
backgroundColor: blockColor,
width: blockSize + 'px',
height: blockSize + 'px',
left: higherHandlePosition + '%',
}"
@touchstart="_onTouchStart"
@touchmove="_onBlockTouchMove"
@touchend="_onBlockTouchEnd"
data-tag="higherBlock"
></view>
<!-- 滑块值提示 -->
<view v-if="tipVisible" class="range-tip" :style="lowerTipStyle">{{ format(values[0]) }}</view>
<view v-if="tipVisible" class="range-tip" :style="higherTipStyle">{{ format(values[1]) }}</view>
</view>
</view>
</template>
<script>
export default {
components: {},
props: {
//
value: {
type: Array,
default: function() {
return [0, 100]
},
},
//
min: {
type: Number,
default: 0,
},
//
max: {
type: Number,
default: 100,
},
step: {
type: Number,
default: 1,
},
format: {
type: Function,
default: function(val) {
return val
},
},
disabled: {
type: Boolean,
default: false,
},
//
height: {
height: Number,
default: 50,
},
//
barHeight: {
type: Number,
default: 5,
},
//
backgroundColor: {
type: String,
default: '#e9e9e9',
},
//
activeColor: {
type: String,
default: '#1aad19',
},
//
blockSize: {
type: Number,
default: 20,
},
blockColor: {
type: String,
default: '#fff',
},
tipVisible: {
type: Boolean,
default: true,
},
decorationVisible: {
type: Boolean,
default: false,
},
},
data() {
return {
values: [this.min, this.max],
startDragPos: 0, //
startVal: 0, //
}
},
computed: {
//
lowerHandlePosition() {
return ((this.values[0] - this.min) / (this.max - this.min)) * 100
},
//
higherHandlePosition() {
return ((this.values[1] - this.min) / (this.max - this.min)) * 100
},
lowerTipStyle() {
if (this.lowerHandlePosition < 90) {
return `left: ${this.lowerHandlePosition}%;`
}
return `right: ${100 - this.lowerHandlePosition}%;transform: translate(50%, -100%);`
},
higherTipStyle() {
if (this.higherHandlePosition < 90) {
return `left: ${this.higherHandlePosition}%;`
}
return `right: ${100 - this.higherHandlePosition}%;transform: translate(50%, -100%);`
},
},
created: function() {},
onLoad: function(option) {},
watch: {
//
value: {
immediate: true,
handler(newVal, oldVal) {
if (this._isValuesValid(newVal) && (newVal[0] !== this.values[0] || newVal[1] !== this.values[1])) {
this._updateValue(newVal)
}
},
},
},
methods: {
_updateValue(newVal) {
//
if (this.step >= this.max - this.min) {
throw new RangeError('Invalid slider step or slider range')
}
let newValues = []
if (Array.isArray(newVal)) {
newValues = [newVal[0], newVal[1]]
}
if (typeof newValues[0] !== 'number') {
newValues[0] = this.values[0]
} else {
newValues[0] = Math.round((newValues[0] - this.min) / this.step) * this.step + this.min
}
if (typeof newValues[1] !== 'number') {
newValues[1] = this.values[1]
} else {
newValues[1] = Math.round((newValues[1] - this.min) / this.step) * this.step + this.min
}
//
if (this.values[0] === newValues[0] && this.values[1] === newValues[1]) {
return
}
//
if (newValues[0] < this.min) {
newValues[0] = this.min
}
//
if (newValues[1] > this.max) {
newValues[1] = this.max
}
// 使
if (newValues[0] >= newValues[1]) {
//
if (newValues[0] === this.values[0]) {
newValues[1] = newValues[0] + this.step
} else {
//
newValues[0] = newValues[1] - this.step
}
}
this.values = newValues
this.$emit('change', this.values)
},
_onTouchStart: function(event) {
if (this.disabled) {
return
}
this.isDragging = true
let tag = event.target.dataset.tag
//h5
let e = event.changedTouches ? event.changedTouches[0] : event
this.startDragPos = e.pageX
this.startVal = tag === 'lowerBlock' ? this.values[0] : this.values[1]
},
_onBlockTouchMove: function(e) {
if (this.disabled) {
return
}
this._onDrag(e)
},
_onBlockTouchEnd: function(e) {
if (this.disabled) {
return
}
this.isDragging = false
this._onDrag(e)
},
_onDrag(event) {
if (!this.isDragging) {
return
}
let view = uni
.createSelectorQuery()
.in(this)
.select('.slider-range-inner')
view
.boundingClientRect(data => {
let sliderWidth = data.width
const tag = event.target.dataset.tag
let e = event.changedTouches ? event.changedTouches[0] : event
let diff = ((e.pageX - this.startDragPos) / sliderWidth) * (this.max - this.min)
let nextVal = this.startVal + diff
if (tag === 'lowerBlock') {
this._updateValue([nextVal, null])
} else {
this._updateValue([null, nextVal])
}
})
.exec()
},
_isValuesValid: function(values) {
return Array.isArray(values) && values.length == 2
},
},
}
</script>
<style scoped>
.slider-range {
position: relative;
padding-top: 40rpx;
}
.slider-range-inner {
position: relative;
width: 100%;
}
.slider-range.disabled .slider-bar-inner {
opacity: 0.35;
}
.slider-range.disabled .slider-handle-block {
cursor: not-allowed;
}
.slider-bar {
position: absolute;
top: 50%;
left: 0;
right: 0;
transform: translateY(-50%);
}
.slider-bar-bg {
position: absolute;
width: 100%;
height: 100%;
border-radius: 10000px;
z-index: 10;
}
.slider-bar-inner {
position: absolute;
width: 100%;
height: 100%;
border-radius: 10000px;
z-index: 11;
}
.slider-handle-block {
position: absolute;
top: 50%;
transform: translate(-50%, -50%);
border-radius: 50%;
box-shadow: 0 0 3px 2px rgba(227, 229, 241, 0.5);
z-index: 12;
}
.slider-handle-block.decoration::before {
position: absolute;
content: '';
width: 6upx;
height: 24upx;
top: 50%;
left: 29%;
transform: translateY(-50%);
background: #eeedf2;
border-radius: 3upx;
z-index: 13;
}
.slider-handle-block.decoration::after {
position: absolute;
content: '';
width: 6upx;
height: 24upx;
top: 50%;
right: 29%;
transform: translateY(-50%);
background: #eeedf2;
border-radius: 3upx;
z-index: 13;
}
.range-tip {
position: absolute;
top: 0;
font-size: 24upx;
color: #666;
transform: translate(-50%, -100%);
}
</style>

View File

@ -0,0 +1,90 @@
<template>
<view class="demo-slider-range">
<view class="section-title">普通用法</view>
<view class="slider-item">
<slider-range
:value="slider1.rangeValue"
:min="slider1.min"
:max="slider1.max"
:step="slider1.step"
:bar-height="barHeight"
:block-size="blockSize"
:background-color="backgroundColor"
:format="format1"
@change="handleRangeChange"
></slider-range>
</view>
<view class="section-title">自定义</view>
<view class="slider-item">
<slider-range
:value="slider2.rangeValue"
:min="slider2.min"
:max="slider2.max"
:step="slider2.step"
:bar-height="barHeight"
:block-size="blockSize"
:background-color="backgroundColor"
:active-color="slider2.activeColor"
:format="format2"
:decorationVisible="slider2.decorationVisible"
@change="handleRangeChange"
></slider-range>
</view>
</view>
</template>
<script>
import SliderRange from '../../components/slider-range/index.vue'
export default {
components: {
SliderRange,
},
data() {
return {
barHeight: 3,
blockSize: 26,
backgroundColor: '#EEEEF6',
slider1: {
min: 50,
max: 200,
step: 10,
rangeValue: [50, 150],
},
slider2: {
rangeMin: 0,
rangMax: 100,
rangeValue: [8, 80],
step: 1,
activeColor: '#FF6B00',
decorationVisible: true,
},
}
},
methods: {
format1(val) {
return val
},
format2(val) {
return `${val}%`
},
handleRangeChange(e) {
this.rangeValue = e
},
},
}
</script>
<style>
.demo-slider-range {
background-color: #fff;
padding: 100rpx 40rpx 0;
}
.section-title {
padding: 0 0 20rpx;
color: #666;
}
.slider-item:not(:last-child) {
margin-bottom: 100rpx;
}
</style>

View File

@ -0,0 +1,411 @@
page {
background-color: #f6f6fa;
padding: 0 !important;
}
.container {
display: flex;
flex-direction: column;
height: 100vh;
overflow: hidden;
}
.header {
z-index: 9;
}
.main {
flex: 1;
box-sizing: border-box;
overflow: hidden;
overflow-y: auto;
position: relative;
}
.searchBox {
display: flex;
align-items: center;
background-color: #fff;
}
.Filter {
display: flex;
align-items: center;
background-color: #fff;
}
.Filter_right {
width: 133rpx;
height: 110rpx;
background: #FFFFFF;
border-radius: 0rpx 0rpx 0rpx 0rpx;
font-size: 30rpx;
color: #FF370B;
display: flex;
align-items: center;
justify-content: center;
}
.Filter_right image {
width: 26rpx;
height: 30rpx;
margin-left: 7rpx;
}
.iptBox {
width: 431rpx;
height: 70rpx;
background: #F6F7FB;
border-radius: 100rpx 100rpx 100rpx 100rpx;
margin-left: 40rpx;
display: flex;
align-items: center;
padding-left: 30rpx;
box-sizing: border-box;
}
.iptBox image {
width: 30rpx;
height: 30rpx;
margin-right: 16rpx;
}
.iptBox .u-input {
padding: 0 !important;
background-color: transparent !important;
}
.Filter_left {
display: flex;
align-items: center;
overflow: hidden;
overflow-x: auto;
white-space: nowrap;
}
.FilterItem {
font-size: 28rpx;
color: #222222;
display: flex;
align-items: center;
padding: 0 20rpx;
margin-right: 10rpx;
}
.FilterItem image {
width: 24rpx;
height: 15rpx;
margin-left: 10rpx;
}
.MasterList {
margin-top: 30rpx;
}
.MasterItem {
display: flex;
align-items: center;
margin-bottom: 20rpx;
}
.MasterItem_left {
width: 32rpx;
height: 32rpx;
margin-left: 20rpx;
}
.MasterItem_right {
flex: 1;
margin-left: 40rpx;
background: #FFFFFF;
border-radius: 20rpx 20rpx 20rpx 20rpx;
margin-right: 20rpx;
}
.MasterItem_info {
box-sizing: border-box;
padding: 12rpx 0 20rpx 20rpx;
display: flex;
align-items: flex-start;
}
.MasterItem_Info_left {
display: flex;
flex-direction: column;
justify-content: center;
width: 130rpx;
margin-right: 40rpx;
}
.MasterItem_Info_left image {
width: 130rpx;
height: 130rpx;
}
.state {
width: 110rpx;
height: 40rpx;
border-radius: 100rpx 100rpx 100rpx 100rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 26rpx;
color: #FFFFFF;
margin: 0 auto;
margin-top: -20rpx;
z-index: 2;
position: relative;
}
.state1 {
background: #AECE2B;
}
.state2 {
background: #CECECE;
}
.state3 {
background: #FF370B;
}
.MasterItem_Info_right {
flex: 1;
}
.MasterItem_Info_right_1 {
display: flex;
align-items: center;
font-size: 36rpx;
color: #222222;
}
.Medal {
width: 35rpx;
height: 40rpx;
margin-left: 6rpx;
margin-right: 28rpx;
}
.star {
width: 22rpx;
height: 22rpx;
margin-right: 6rpx;
}
.MasterItem_Info_right_1 span {
font-size: 26rpx;
color: #000000;
}
.MasterItem_Info_right_2 {
font-size: 26rpx;
color: #999999;
margin-top: 8rpx;
}
.MasterItem_Info_right_3 {
font-size: 26rpx;
display: flex;
color: #999999;
align-items: center;
margin-top: 16rpx;
}
.MasterItem_Info_right_3 span {
color: #FF370B;
}
.MasterItem_Info_right_4 {
display: flex;
align-items: center;
margin-top: 16rpx;
}
.tagItem {
width: 130rpx;
height: 40rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 100rpx 100rpx 100rpx 100rpx;
font-size: 22rpx;
color: #555555;
margin-right: 10rpx;
}
.tag1 {
background: rgba(255, 178, 23, 0.1);
}
.tag2 {
background: rgba(255, 81, 42, 0.1);
}
.tag3 {
background: rgba(175, 175, 175, 0.1);
}
.MasterItem_Info_right_5 {
font-size: 28rpx;
color: #999999;
display: flex;
align-items: center;
margin-top: 16rpx;
}
.MasterItem_Info_right_5 span {
color: #FF370B;
}
.MasterItem_Info_right_6 {
display: flex;
align-items: center;
margin-top: 20rpx;
}
.MasterItem_Info_right_6 image {
width: 110rpx;
height: 110rpx;
margin-right: 20rpx;
border-radius: 20rpx;
overflow: hidden;
}
.MasterItem_more {
font-weight: normal;
font-size: 28rpx;
color: #FF370B;
padding: 30rpx 0;
border-top: 1rpx solid #EBEBEB;
text-align: center;
}
.Btn {
font-size: 36rpx;
color: #FFFFFF;
width: 600rpx;
height: 90rpx;
background: linear-gradient(91deg, #FF7658 0%, #FF370B 100%);
border-radius: 100rpx 100rpx 100rpx 100rpx;
display: flex;
align-items: center;
justify-content: center;
position: fixed;
left: 50%;
bottom: 60rpx;
transform: translateX(-50%);
z-index: 3;
}
.local {
display: flex;
align-items: center;
}
.local span {
font-weight: 700;
}
.filterMore1 {
display: flex;
align-items: center;
overflow: hidden;
overflow-x: auto;
white-space: nowrap;
margin-top: 20rpx;
}
.filterMoreItem {
font-size: 28rpx;
color: #222222;
display: flex;
align-items: center;
background-color: #f6f6fa;
padding: 0 20rpx;
margin-right: 10rpx;
margin-right: 20rpx;
border-radius: 20rpx;
padding: 10rpx 20rpx;
}
.filterMore2_item {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20rpx;
color: #999;
}
.filterMore2_item_left {}
.active2 {
color: #ff702c !important;
}
.filterMore2_item_left2 {
color: #000;
}
.filterMore3Item {
font-size: 26rpx;
color: #555555;
width: 130rpx;
height: 50rpx;
background: #F6F7FB;
border-radius: 10rpx 10rpx 10rpx 10rpx;
display: flex;
align-items: center;
justify-content: center;
margin-right: 40rpx;
margin-bottom: 18rpx;
}
.filterMore3Item:nth-child(4n) {
margin-right: 0;
}
.fullscreen-black-bg {
/* position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
background-color: rgba(0, 0, 0, .4);
box-sizing: border-box;
z-index: 9;
overflow: hidden; */
}
.FilterMore3 {
width: 100%;
background-color: #fff;
padding: 20rpx;
box-sizing: border-box;
display: flex;
flex-wrap: wrap;
}
.FilterMore {
width: 100%;
background-color: #fff;
padding: 20rpx;
box-sizing: border-box;
}
.dialogBox{
position: absolute;
background-color: rgba(0, 0, 0, .4);
z-index:8;
width: 100%;
height: 100%;
}

View File

@ -1,5 +1,176 @@
<template>
<view class="container">
<div class="header">
<div class="searchBox" :style="{ height: localHeight + 'px', paddingTop: top + 'px' }">
<view class="searchBox_add">
<u-icon bold color="#000" size="40" name="arrow-left" @click="back"></u-icon>
</view>
<div class="iptBox">
<image src="http://192.168.0.172:5500/com_communitySearchIcon.png"></image>
<u--input placeholder="请输入内容" border="none" v-model="value" @change="change"></u--input>
</div>
</div>
<div class="Filter">
<div class="Filter_left">
<div class="FilterItem" @click="show1=!show1">
附近
<image src="http://192.168.0.172:5500/homeServer_filterMore.png"></image>
</div>
<div class="FilterItem">
综合
<image src="http://192.168.0.172:5500/homeServer_filterMore.png"></image>
</div>
<div class="FilterItem">
排序
<image src="http://192.168.0.172:5500/homeServer_filterMore.png"></image>
</div>
<div class="FilterItem">
分类
<image src="http://192.168.0.172:5500/homeServer_filterMore.png"></image>
</div>
<div class="FilterItem">
地区
<image src="http://192.168.0.172:5500/homeServer_filterMore.png"></image>
</div>
</div>
<div class="Filter_right">
筛选
<image src="http://192.168.0.172:5500/homeServer_filter.png"></image>
</div>
</div>
<!-- 位置筛选 -->
<div class="FilterMore" v-if="show1">
<div class="local">距离 <span>上海公馆</span></div>
<div class="filterMore1">
<div class="filterMoreItem">附近</div>
<div class="filterMoreItem">500m</div>
<div class="filterMoreItem">1km</div>
<div class="filterMoreItem">3km</div>
<div class="filterMoreItem">5km</div>
<div class="filterMoreItem">10km</div>
</div>
</div>
<!-- 综合筛选 -->
<div class="FilterMore" v-if="show2">
<div class="filterMore2_item">
<div class="filterMore2_item_left">综合</div>
<div class="filterMore2_item_right">
<u-icon name="checkmark-circle-fill" color="#ff702c"></u-icon>
</div>
</div>
<div class="filterMore2_item">
<div class="filterMore2_item_left active2">从高到低</div>
<div class="filterMore2_item_right">
<u-icon name="checkmark-circle-fill" color="#ff702c"></u-icon>
</div>
</div>
<div class="filterMore2_item">
<div class="filterMore2_item_left">从低到高</div>
<div class="filterMore2_item_right">
<u-icon name="checkmark-circle-fill" color="#ff702c"></u-icon>
</div>
</div>
</div>
<!-- 排序筛选 -->
<div class="FilterMore" v-if="show3">
<div class="filterMore2_item">
<div class="filterMore2_item_left2">智能排序</div>
<div class="filterMore2_item_right">
<u-icon name="checkmark-circle-fill" color="#ff702c"></u-icon>
</div>
</div>
<div class="filterMore2_item">
<div class="filterMore2_item_left2 active2">距离优先</div>
<div class="filterMore2_item_right">
<u-icon name="checkmark-circle-fill" color="#ff702c"></u-icon>
</div>
</div>
<div class="filterMore2_item">
<div class="filterMore2_item_left2">好评优先</div>
<div class="filterMore2_item_right">
<u-icon name="checkmark-circle-fill" color="#ff702c"></u-icon>
</div>
</div>
<div class="filterMore2_item">
<div class="filterMore2_item_left2">销量优先</div>
<div class="filterMore2_item_right">
<u-icon name="checkmark-circle-fill" color="#ff702c"></u-icon>
</div>
</div>
</div>
<!-- 分类筛选 -->
<div class="FilterMore3" v-if="show4">
<div class="filterMore3Item" v-for="(item,index) in 9" :key="index">家电维修</div>
</div>
</div>
<div class="main">
<!-- 遮罩 -->
<div class="dialogBox" v-if="show1"></div>
<div class="MasterList">
<div class="MasterItem" v-for="(item, index) in 3" :key="index">
<div class="MasterItem_left">
<image src="http://192.168.0.172:5500/community_providentFund_Group_1444.png"></image>
<image v-if="false" src="http://192.168.0.172:5500/community_providentFund_Ellipse_160.png"></image>
</div>
<div class="MasterItem_right">
<div class="MasterItem_info">
<div class="MasterItem_Info_left">
<image src="http://192.168.0.172:5500/home_icon12.png"></image>
<div class="state state1">待服务</div>
<div class="state state2" v-if="false">休息中</div>
<div class="state state3" v-if="false">服务中</div>
</div>
<div class="MasterItem_Info_right">
<div class="MasterItem_Info_right_1">
林师傅
<image class="Medal" src="http://192.168.0.172:5500/homeServer_Champion.png"></image>
<image class="Medal" v-if="false"
src="http://192.168.0.172:5500/homeServer_RunnerUp.png">
</image>
<image class="star" src="http://192.168.0.172:5500/local_start1.png"></image>
<span>4.8</span>
</div>
<div class="MasterItem_Info_right_2">52 广东梅州人 5-10</div>
<div class="MasterItem_Info_right_3">
<span>500+</span>预定 <span>100+</span>评价
</div>
<div class="MasterItem_Info_right_4">
<div class="tagItem tag1">积极主动</div>
<div class="tagItem tag2">技术精湛</div>
<div class="tagItem tag3">技术精湛</div>
</div>
<div class="MasterItem_Info_right_5">
价格范围 <span>500-800</span>
</div>
<div class="MasterItem_Info_right_6">
<image src="http://192.168.0.172:5500/com_MsgImg1.png"></image>
<image src="http://192.168.0.172:5500/com_MsgImg1.png"></image>
<image src="http://192.168.0.172:5500/com_MsgImg1.png"></image>
</div>
</div>
</div>
<div class="MasterItem_more" @click="masterInfo">
查看资料
</div>
</div>
</div>
</div>
<div class="Btn">
确定
</div>
</div>
</view>
</template>
@ -12,19 +183,26 @@ export default {
data() {
return {
top: "",
localHeight: ""
localHeight: "",
show1:false,
show2:false,
show3:false,
show4:false,
}
},
methods: {
masterInfo(){
NavgateTo("../masterInfo/index")
},
},
onReady() {
},
onload(options) {
onLoad(options) {
const meun = menuButtonInfo();
this.top = meun.top;
// this.top = meun.height + meun.top;
this.localHeight = meun.height;
},
onShow() {

View File

@ -0,0 +1,180 @@
page {
background-color: #f6f7fb;
}
.searchBox {
display: flex;
align-items: center;
background-color: #fff;
}
.searchBox_left,
.searchBox_right,
.searchBox_mid {
flex: 1;
}
.searchBox_left {
padding-left: 20rpx;
}
.searchBox_right {
opacity: 0;
padding-right: 20rpx;
}
.searchBox_mid {
font-size: 40rpx;
color: #222222;
text-align: center;
}
.banner {
margin: 0 auto;
padding-top: 30rx;
background-color: #fff;
width: 100%;
}
.banner swiper {
margin: 0 auto;
width: 710rpx;
height: 307rpx;
}
.dotList {
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto;
margin-top: 10rpx;
padding-bottom: 20rpx;
}
.dot {
width: 8rpx;
height: 8rpx;
background: #555555;
border-radius: 50%;
margin-right: 6rpx;
}
.active {
background: #FF370B;
width: 20rpx;
height: 8rpx;
border-radius: 10rpx 10rpx 10rpx 10rpx;
}
.master {
background-color: #fff;
margin-top: 30rpx;
padding: 26rpx 20rpx;
}
.master_info {
display: flex;
align-items: flex-start;
}
.master_info_left {
display: flex;
flex-direction: column;
justify-content: center;
width: 130rpx;
margin-right: 42rpx;
}
.master_info_left image {
width: 130rpx;
height: 130rpx;
}
.state {
width: 110rpx;
height: 40rpx;
border-radius: 100rpx 100rpx 100rpx 100rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 26rpx;
color: #FFFFFF;
margin: 0 auto;
margin-top: -20rpx;
z-index: 2;
position: relative;
}
.state1 {
background: #AECE2B;
}
.state2 {
background: #CECECE;
}
.state3 {
background: #FF370B;
}
.master_info_right{
flex: 1;
}
.master_info_right1 {
display: flex;
align-items: center;
font-size: 36rpx;
color: #222222;
}
.Medal {
width: 35rpx;
height: 40rpx;
margin-left: 6rpx;
margin-right: 28rpx;
}
.star {
width: 22rpx;
height: 22rpx;
margin-right: 6rpx;
}
.master_info_right1 span {
font-size: 26rpx;
color: #000000;
}
.master_info_right2 {
font-size: 28rpx;
color: #999999;
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 16rpx;
}
.master_info_right2 span {
color: #FF370B;
}
.master_info_right3{
margin-top: 13rpx;
}
.master_info_right3_item {
display: flex;
align-items: center;
font-size: 26rpx;
color: #999999;
margin-bottom: 10rpx;
}
.master_info_right3_item span {
font-size: 26rpx;
color: #222222;
margin-left: 23rpx;
}
.master_info_right3_item>div{
margin-right: 27rpx;
}

View File

@ -1,5 +1,69 @@
<template>
<view class="container">
<div class="searchBox" :style="{ height: localHeight + 'px', paddingTop: top + 'px' }">
<view class="searchBox_left">
<u-icon bold color="#000" size="40" name="arrow-left" @click="back"></u-icon>
</view>
<div class="searchBox_mid">
刘师傅
</div>
<div class="searchBox_right">
<u-icon bold color="#000" size="40" name="arrow-left" @click="back"></u-icon>
</div>
</div>
<div class="banner">
<swiper>
<swiper-item>
<image src="http://192.168.0.172:5500/homeServer_banner.png"></image>
</swiper-item>
</swiper>
<div class="dotList">
<div class="dot active"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
</div>
<div class="master">
<div class="master_info">
<div class="master_info_left">
<image src="http://192.168.0.172:5500/home_icon12.png"></image>
<div class="state state1">待服务</div>
<div class="state state2" v-if="false">休息中</div>
<div class="state state3" v-if="false">服务中</div>
</div>
<div class="master_info_right">
<div class="master_info_right1">
林师傅
<image class="Medal" src="http://192.168.0.172:5500/homeServer_Champion.png"></image>
<image class="Medal" v-if="false" src="http://192.168.0.172:5500/homeServer_RunnerUp.png">
</image>
<image class="star" src="http://192.168.0.172:5500/local_start1.png"></image>
<span>4.8</span>
</div>
<div class="master_info_right2">
价格范围 <span>500-800</span>
</div>
<div class="master_info_right3">
<div class="master_info_right3_item">
<div>专业性</div>
<u-line-progress class="gradient-progress" :showText="false" :percentage="30" activeColor="transparent"></u-line-progress>
<span>80</span>
</div>
<div class="master_info_right3_item">
<div>好评率</div>
<u-line-progress class="gradient-progress" :showText="false" :percentage="30" activeColor="transparent"></u-line-progress>
<span>80%</span>
</div>
<div class="master_info_right3_item">
<div>准时率</div>
<u-line-progress class="gradient-progress" :showText="false" :percentage="30" activeColor="transparent"></u-line-progress>
<span>80%</span>
</div>
</div>
</div>
</div>
</div>
</view>
</template>
@ -22,7 +86,7 @@ export default {
},
onload(options) {
onLoad(options) {
const meun = menuButtonInfo();
this.top = meun.top;
this.localHeight = meun.height;
@ -43,4 +107,9 @@ export default {
<style>
@import url("./index.css");
/* 添加渐变色样式 */
.gradient-progress .u-line-progress__active {
background: linear-gradient( 90deg, #FFFFFF 0%, #FF370B 100%);
}
</style>

View File

@ -0,0 +1,189 @@
.banner {
margin: 0 auto;
margin-top: 30rpx;
width: 100%;
}
.banner swiper {
margin: 0 auto;
width: 710rpx;
height: 307rpx;
}
.dotList {
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto;
margin-top: 10rpx;
padding-bottom: 20rpx;
}
.dot {
width: 8rpx;
height: 8rpx;
background: #555555;
border-radius: 50%;
margin-right: 6rpx;
}
.active {
background: #FF370B;
width: 20rpx;
height: 8rpx;
border-radius: 10rpx 10rpx 10rpx 10rpx;
}
.line {
height: 20rpx;
width: 100%;
background-color: #f6f7fb;
}
.serverTitBox {
padding: 30rpx 20rpx;
box-sizing: border-box;
}
.serverTit {
display: flex;
align-items: center;
justify-content: space-between;
}
.serverTit_right {
font-size: 26rpx;
color: #999999;
}
.serverTit_left {
display: flex;
align-items: center;
}
.tit {
font-size: 40rpx;
color: #222222;
font-weight: 700;
}
.msg {
font-size: 26rpx;
color: #E9BE62;
display: flex;
align-items: center;
margin-left: 36rpx;
}
.serverCon {
margin-top: 30rpx;
font-size: 26rpx;
color: #999999;
}
.priceSelect {
padding: 24rpx 20rpx;
}
.serverList {
padding: 20rpx;
box-sizing: border-box;
}
.serverListTit {
font-size: 63rpx;
color: #222222;
font-weight: 600;
}
.serverItem {
display: flex;
padding: 20rpx;
border-bottom: 1rpx solid #EBEBEB;
}
.serverItem_left {
width: 140rpx;
height: 140rpx;
margin-right: 14rpx;
border-radius: 20rpx;
overflow: hidden;
}
.serverItem_right {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
}
.msg_tit {
font-size: 30rpx;
color: #222222;
margin-bottom: 20rpx;
}
.msg_price {
font-size: 26rpx;
color: rgba(153, 153, 153, 0.6);
display: flex;
align-items: center;
}
.msg_price span {
color: #FF370B;
}
.serverItem_right_btn {
width: 180rpx;
height: 50rpx;
background: #FF370B;
border-radius: 100rpx 100rpx 100rpx 100rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 30rpx;
color: #FFFFFF;
}
.serverItem_right_btn .more {
width: 26rpx;
height: 26rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
}
.range {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
overflow: hidden;
/* 防止内容溢出 */
}
.minPrice,
.maxPrice {
width: 70rpx;
height: 70rpx;
background: #F6F7FB;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 24rpx;
color: #999999;
margin-top: 20rpx;
}
.slider-range {
flex: 1 !important;
margin: 0 10rpx;
/* 添加左右间距 */
min-width: 0;
/* 防止 flex 子项溢出 */
}

View File

@ -1,5 +1,65 @@
<template>
<view class="container">
<div class="banner">
<swiper>
<swiper-item>
<image src="http://192.168.0.172:5500/homeServer_banner.png"></image>
</swiper-item>
</swiper>
<div class="dotList">
<div class="dot active"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
</div>
<div class="line"></div>
<div class="serverTitBox">
<div class="serverTit">
<div class="serverTit_left">
<div class="tit">空调清洗</div>
<div class="msg">
平台保障
</div>
</div>
<div class="serverTit_right">已预约100+</div>
</div>
<div class="serverCon">专业保洁团队全屋深度清洁去除顽固污渍还您清新居所还您清新居所</div>
</div>
<div class="line"></div>
<div class="priceSelect">
<div class="tit">价格范围</div>
<div class="range">
<div class="minPrice">10</div>
<slider-range style="flex: 1;" :value="rangeValue" :min="rangeMin" :max="rangeMax" :step="5" :bar-height="3"
:block-size="26" background-color="#EEEEF6" active-color="#FF6B00" :format="format"
:decorationVisible="true" @change="handleRangeChange"></slider-range>
<div class="maxPrice">39</div>
</div>
</div>
<div class="serverList">
<div class="serverListTit">匹配的服务商(3)</div>
<div class="serverItem">
<div class="serverItem_left">
<image src="http://192.168.0.172:5500/test.png"></image>
</div>
<div class="serverItem_right">
<div class="serverItem_right_msg">
<div class="msg_tit">安心家政</div>
<div class="msg_price">价格范围 <span>80-150</span></div>
</div>
<div class="serverItem_right_btn" @click="selectMaster">
选择师傅
<div class="more">
<u-icon name="arrow-right" color="#fff" size="28"></u-icon>
</div>
</div>
</div>
</div>
</div>
</view>
</template>
@ -7,22 +67,38 @@
<script>
import { request, picUrl, NavgateTo, menuButtonInfo } from '../../../utils/index';
import { apiArr } from '../../../api/reservation';
import SliderRange from '@/components/primewind-sliderrange/components/primewind-sliderrange/index.vue'
export default {
components: {
//
SliderRange
},
data() {
return {
top: "",
localHeight: ""
localHeight: "",
rangeMin: 5,
rangeMax: 200,
rangeValue: [10, 50]
}
},
methods: {
format(val) {
return val + '%'
},
handleRangeChange(e) {
this.rangeValue = e
},
selectMaster(){
NavgateTo("../chooseMaster/index")
},
},
onReady() {
},
onload(options) {
onLoad(options) {
const meun = menuButtonInfo();
this.top = meun.top;
this.localHeight = meun.height;

View File

@ -640,8 +640,8 @@
"path": "serverInfo/index",
"style": {
"navigationBarBackgroundColor": "#fff",
"navigationStyle": "custom",
"navigationBarTitleText": "服务详情"
}
},
{