Merge remote-tracking branch 'origin/master'
已添加32个文件
已删除4个文件
已修改12个文件
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "permission": { |
| | | "edit": { |
| | | "*": "allow" |
| | | } |
| | | } |
| | | } |
| | |
| | | }, |
| | | /* SDKé
ç½® */ |
| | | "sdkConfigs" : { |
| | | "maps" : { |
| | | "amap" : { |
| | | "name" : "", |
| | | "appkey_ios" : "e4d46c87adf151dca20060317592b1b6", |
| | | "appkey_android" : "e4d46c87adf151dca20060317592b1b6" |
| | | } |
| | | }, |
| | | "push" : { |
| | | "unipush" : { |
| | | "version" : "2", |
| | |
| | | { |
| | | "path": "pages/mine/mine", |
| | | "style": { |
| | | "navigationBarTitleText": "æç", |
| | | "navigationBarBackgroundColor": "#ffffff" |
| | | "navigationStyle": "custom", |
| | | "app-plus": { |
| | | "titleNView": false |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/order/order", |
| | | "style": { |
| | | "navigationBarTitleText": "订å" |
| | | "navigationStyle": "custom", |
| | | "app-plus": { |
| | | "titleNView": false |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/order-detail/order-detail", |
| | | "style": { |
| | | "navigationStyle": "custom", |
| | | "app-plus": { |
| | | "titleNView": false |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/message/message", |
| | | "style": { |
| | | "navigationBarTitleText": "æ¶æ¯" |
| | | "navigationStyle": "custom", |
| | | "app-plus": { |
| | | "titleNView": false |
| | | } |
| | | } |
| | | }, |
| | | { |
| | |
| | | "titleNView": false |
| | | } |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/settings/settings", |
| | | "style": { |
| | | "navigationBarTitleText": "设置" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/change-password/change-password", |
| | | "style": { |
| | | "navigationBarTitleText": "ä¿®æ¹å¯ç " |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/driver-certification/driver-certification", |
| | | "style": { |
| | | "navigationBarTitleText": "叿ºè®¤è¯" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/certification-details/certification-details", |
| | | "style": { |
| | | "navigationBarTitleText": "叿ºè®¤è¯" |
| | | } |
| | | } |
| | | ], |
| | | "globalStyle": { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="cert-details-page"> |
| | | <view class="cert-details-page__status-card" :class="'cert-details-page__status-card--' + statusType"> |
| | | <view class="cert-details-page__status-head"> |
| | | <image class="cert-details-page__status-icon" :src="statusIcon" mode="aspectFit"></image> |
| | | <text class="cert-details-page__status-title" :class="'cert-details-page__status-title--' + statusType">{{ statusTitle }}</text> |
| | | </view> |
| | | <text v-if="statusDesc" class="cert-details-page__status-desc">{{ statusDesc }}</text> |
| | | </view> |
| | | |
| | | <view class="cert-details-page__section"> |
| | | <text class="cert-details-page__section-title">åºæ¬ä¿¡æ¯</text> |
| | | |
| | | <view class="cert-details-page__info-list"> |
| | | <view v-for="item in basicInfo" :key="item.label" class="cert-details-page__info-item"> |
| | | <text class="cert-details-page__info-label">{{ item.label }}</text> |
| | | <text class="cert-details-page__info-value">{{ item.value }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="cert-details-page__upload-group"> |
| | | <text class="cert-details-page__upload-title">èº«ä»½è¯æ£åé¢</text> |
| | | <view class="cert-details-page__upload-list"> |
| | | <view class="cert-details-page__upload-card"> |
| | | |
| | | </view> |
| | | <view class="cert-details-page__upload-card"> |
| | | |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="cert-details-page__section cert-details-page__section--last"> |
| | | <text class="cert-details-page__section-title">车è¾ä¿¡æ¯</text> |
| | | |
| | | <view class="cert-details-page__info-list"> |
| | | <view v-for="item in vehicleInfo" :key="item.label" class="cert-details-page__info-item"> |
| | | <text class="cert-details-page__info-label">{{ item.label }}</text> |
| | | <text class="cert-details-page__info-value">{{ item.value }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="cert-details-page__upload-group"> |
| | | <text class="cert-details-page__upload-title">车è¾ç
§ç</text> |
| | | <view class="cert-details-page__upload-list"> |
| | | <view class="cert-details-page__upload-img"> |
| | | |
| | | </view> |
| | | <view class="cert-details-page__upload-img"> |
| | | |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="cert-details-page__upload-group"> |
| | | <text class="cert-details-page__upload-title">驾驶è¯ç
§ç</text> |
| | | <view class="cert-details-page__upload-list cert-details-page__upload-list--single"> |
| | | <view class="cert-details-page__upload-img"> |
| | | |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | statusType: 'review', |
| | | basicInfo: [ |
| | | { label: 'æ³¨åææºå·', value: '18155114565' }, |
| | | { label: '叿ºå§å', value: 'èçç' }, |
| | | { label: 'å©å§»ç¶åµ', value: 'æªå©' }, |
| | | { label: 'å±
ä½åå¸', value: 'å®å¾½ç/åè¥å¸/åºé³åº' }, |
| | | { label: '详ç»å°å', value: 'ä¹å山路201å·' }, |
| | | { label: 'æ¯ä»å®è´¦å·', value: '18155114565' }, |
| | | { label: '身份è¯å·', value: '3482938472937838902' } |
| | | ], |
| | | vehicleInfo: [ |
| | | { label: '车çå·', value: 'çBD23189' }, |
| | | { label: '车è¾ç±»å', value: 'é¢å
车' }, |
| | | { label: '车è¾é¢è²', value: 'ç½è²' }, |
| | | { label: 'é©¾é©¶è¯æææ', value: '2016å¹´1æ1æ¥è³2036å¹´1æ1æ¥' } |
| | | ] |
| | | } |
| | | }, |
| | | computed: { |
| | | statusTitle() { |
| | | const titleMap = { |
| | | review: 'å¹³å°å®¡æ ¸ä¸', |
| | | approved: '叿ºè®¤è¯å·²éè¿', |
| | | rejected: '叿ºè®¤è¯å·²æç»' |
| | | } |
| | | |
| | | return titleMap[this.statusType] || titleMap.review |
| | | }, |
| | | statusDesc() { |
| | | const descMap = { |
| | | review: 'å®¡æ ¸ç»æå°éè¿çä¿¡/è®¢åæ¶æ¯éç¥æ¨', |
| | | approved: '', |
| | | rejected: '驾驶è¯è¿æï¼è¯·éæ°æäº¤å®¡æ ¸' |
| | | } |
| | | |
| | | return descMap[this.statusType] || '' |
| | | }, |
| | | statusIcon() { |
| | | const iconMap = { |
| | | review: '/static/image/ic_renzhengzhong@2x.png', |
| | | approved: '/static/image/ic_pass@2x.png', |
| | | rejected: '/static/image/ic_fail@2x.png' |
| | | } |
| | | |
| | | return iconMap[this.statusType] || iconMap.review |
| | | } |
| | | }, |
| | | onLoad(options) { |
| | | this.statusType = options && options.status ? options.status : 'review' |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .cert-details-page { |
| | | background: #ffffff; |
| | | |
| | | &__status-card { |
| | | width: 100%; |
| | | height: 248rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | flex-direction: column; |
| | | background: linear-gradient(180deg, #fff3e7 0%, #fff7f0 100%); |
| | | text-align: center; |
| | | |
| | | &--approved { |
| | | background: linear-gradient(180deg, #ecfff3 0%, #f5fff9 100%); |
| | | } |
| | | |
| | | &--rejected { |
| | | background: linear-gradient(180deg, #fff1f1 0%, #fff7f7 100%); |
| | | } |
| | | } |
| | | |
| | | &__status-head { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | gap: 12rpx; |
| | | } |
| | | |
| | | &__status-icon { |
| | | width: 60rpx; |
| | | height: 60rpx; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__status-title { |
| | | font-weight: 600; |
| | | font-size: 40rpx; |
| | | color: #FA8010; |
| | | |
| | | &--approved { |
| | | color: #18c86d; |
| | | } |
| | | |
| | | &--rejected { |
| | | color: #ff2f2f; |
| | | } |
| | | } |
| | | |
| | | &__status-desc { |
| | | display: block; |
| | | margin-top: 14rpx; |
| | | font-weight: 400; |
| | | font-size: 28rpx; |
| | | color: #333333; |
| | | } |
| | | |
| | | &__section { |
| | | padding: 24rpx 30rpx; |
| | | box-sizing: border-box; |
| | | |
| | | &--last { |
| | | padding-bottom: calc(env(safe-area-inset-bottom) + 28rpx); |
| | | } |
| | | } |
| | | |
| | | &__section-title { |
| | | display: block; |
| | | font-weight: 600; |
| | | font-size: 36rpx; |
| | | color: #222222; |
| | | } |
| | | |
| | | &__info-list { |
| | | margin-top: 14rpx; |
| | | } |
| | | |
| | | &__info-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | gap: 20rpx; |
| | | padding: 30rpx 0; |
| | | box-sizing: border-box; |
| | | border-bottom: 1rpx solid #E5E5E5; |
| | | } |
| | | |
| | | &__info-label { |
| | | font-weight: 400; |
| | | font-size: 30rpx; |
| | | color: #777777; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__info-value { |
| | | font-weight: 400; |
| | | font-size: 30rpx; |
| | | color: #222222; |
| | | text-align: right; |
| | | } |
| | | |
| | | &__upload-group { |
| | | padding-top: 24rpx; |
| | | } |
| | | |
| | | &__upload-title { |
| | | display: block; |
| | | font-weight: 400; |
| | | font-size: 30rpx; |
| | | color: #777777; |
| | | } |
| | | |
| | | &__upload-list { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 20rpx; |
| | | margin-top: 30rpx; |
| | | |
| | | &--single { |
| | | justify-content: flex-start; |
| | | } |
| | | } |
| | | |
| | | &__upload-card { |
| | | flex: 1; |
| | | height: 216rpx; |
| | | border-radius: 10rpx; |
| | | overflow: hidden; |
| | | background: #f7f8fa; |
| | | border: 1rpx solid #eef1f5; |
| | | |
| | | &--license { |
| | | height: 124rpx; |
| | | } |
| | | } |
| | | |
| | | &__upload-img { |
| | | width: 144rpx; |
| | | height: 144rpx; |
| | | background-color: #333333; |
| | | } |
| | | |
| | | &__id-avatar { |
| | | width: 36rpx; |
| | | height: 42rpx; |
| | | margin-left: auto; |
| | | margin-top: -34rpx; |
| | | border-radius: 8rpx; |
| | | background: linear-gradient(180deg, #ffd39a 0%, #ffc56d 100%); |
| | | } |
| | | |
| | | &__id-emblem, |
| | | &__id-emblem-sub { |
| | | display: block; |
| | | font-size: 14rpx; |
| | | font-weight: 700; |
| | | color: #9b6e67; |
| | | } |
| | | |
| | | &__id-emblem-sub { |
| | | margin-top: 6rpx; |
| | | letter-spacing: 2rpx; |
| | | } |
| | | |
| | | &__car-photo { |
| | | position: relative; |
| | | width: 144rpx; |
| | | height: 144rpx; |
| | | background: linear-gradient(180deg, #f5f7fa 0%, #eff2f7 100%); |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="change-password-page"> |
| | | <view class="change-password-page__form"> |
| | | <view class="change-password-page__item"> |
| | | <text class="change-password-page__label">æ°å¯ç </text> |
| | | <input v-model="form.password" class="change-password-page__input" password placeholder="请è¾å
¥æ°å¯ç " placeholder-style="color: #c2c7d0;" /> |
| | | </view> |
| | | |
| | | <view class="change-password-page__item"> |
| | | <text class="change-password-page__label">确认å¯ç </text> |
| | | <input v-model="form.confirmPassword" class="change-password-page__input" password placeholder="è¯·åæ¬¡è¾å
¥æ°å¯ç " placeholder-style="color: #c2c7d0;" /> |
| | | </view> |
| | | |
| | | <text class="change-password-page__rule">å¯ç è§åï¼åæ¯ãæ°åç»åï¼ä¸å°äº8个å符</text> |
| | | </view> |
| | | |
| | | <button class="change-password-page__submit" hover-class="change-password-page__submit--hover">确认修æ¹</button> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | form: { |
| | | password: '', |
| | | confirmPassword: '' |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .change-password-page { |
| | | min-height: 100vh; |
| | | background: #ffffff; |
| | | padding-top: 2rpx; |
| | | |
| | | &__form { |
| | | background: #ffffff; |
| | | } |
| | | |
| | | &__item { |
| | | display: flex; |
| | | align-items: center; |
| | | height: 100rpx; |
| | | padding: 0 30rpx; |
| | | border-bottom: 1rpx solid #eceff4; |
| | | } |
| | | |
| | | &__label { |
| | | width: 150rpx; |
| | | font-size: 32rpx; |
| | | font-weight: 500; |
| | | color: #333333; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__input { |
| | | flex: 1; |
| | | height: 100rpx; |
| | | text-align: right; |
| | | font-size: 30rpx; |
| | | color: #333333; |
| | | background: transparent; |
| | | } |
| | | |
| | | &__rule { |
| | | display: block; |
| | | padding: 20rpx 30rpx 0; |
| | | font-size: 24rpx; |
| | | line-height: 1.6; |
| | | color: #b3b8c1; |
| | | } |
| | | |
| | | &__submit { |
| | | width: calc(100% - 60rpx); |
| | | height: 78rpx; |
| | | line-height: 78rpx; |
| | | margin: 110rpx auto 0; |
| | | border-radius: 999rpx; |
| | | background: #2476f6; |
| | | font-size: 30rpx; |
| | | font-weight: 500; |
| | | color: #ffffff; |
| | | border: 0; |
| | | padding: 0; |
| | | |
| | | &::after { |
| | | border: 0; |
| | | } |
| | | |
| | | &--hover { |
| | | opacity: 0.92; |
| | | } |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="driver-cert-page"> |
| | | <view class="driver-cert-page__steps"> |
| | | <view class="driver-cert-page__step" |
| | | :class="{ 'driver-cert-page__step--active': currentStep === 1, 'driver-cert-page__step--done': currentStep > 1 }"> |
| | | <view class="driver-cert-page__step-circle"> |
| | | <view class="driver-cert-page__step-circle-inner"> |
| | | <u-icon v-if="currentStep > 1" name="checkbox-mark" color="#ffffff" size="10"></u-icon> |
| | | </view> |
| | | </view> |
| | | <text class="driver-cert-page__step-text" |
| | | :class="{ 'driver-cert-page__step-text--active': currentStep === 1, 'driver-cert-page__step-text--done': currentStep > 1 }">åºæ¬ä¿¡æ¯</text> |
| | | </view> |
| | | |
| | | <view class="driver-cert-page__step-line"></view> |
| | | |
| | | <view class="driver-cert-page__step" :class="{ 'driver-cert-page__step--active': currentStep === 2 }"> |
| | | <view class="driver-cert-page__step-circle" |
| | | :class="{ 'driver-cert-page__step-circle--inactive': currentStep !== 2 }"> |
| | | <view class="driver-cert-page__step-circle-inner">{{ currentStep === 2 ? '' : '2' }}</view> |
| | | </view> |
| | | <text class="driver-cert-page__step-text" |
| | | :class="{ 'driver-cert-page__step-text--active': currentStep === 2 }">车è¾ä¿¡æ¯</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="driver-cert-page__scroll"> |
| | | <view v-if="currentStep === 1" class="driver-cert-card"> |
| | | <text class="driver-cert-card__title">åºæ¬ä¿¡æ¯</text> |
| | | <text class="driver-cert-card__mobile">æ³¨åææºå·ï¼18155114565</text> |
| | | |
| | | <view class="driver-cert-card__field"> |
| | | <text class="driver-cert-card__label">叿ºå§å</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | <input v-model="form.name" class="driver-cert-card__input" placeholder="请è¾å
¥å¸æºå§å" |
| | | placeholder-style="color: #b9bfc8;" /> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__field"> |
| | | <text class="driver-cert-card__label">身份è¯å·</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | <input v-model="form.idCard" class="driver-cert-card__input" placeholder="请è¾å
¥å¸æºèº«ä»½è¯å·ç " |
| | | placeholder-style="color: #b9bfc8;" /> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__field driver-cert-card__field--select"> |
| | | <view class="driver-cert-card__field-head"> |
| | | <text class="driver-cert-card__label">å©å§»ç¶åµ</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | </view> |
| | | <view class="driver-cert-card__selector"> |
| | | <text class="driver-cert-card__selector-text">è¯·éæ©</text> |
| | | <text class="driver-cert-card__arrow">âº</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__field driver-cert-card__field--select"> |
| | | <view class="driver-cert-card__field-head"> |
| | | <text class="driver-cert-card__label">å±
ä½åå¸</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | </view> |
| | | <view class="driver-cert-card__selector"> |
| | | <text class="driver-cert-card__selector-text">è¯·éæ©çå¸åº</text> |
| | | <text class="driver-cert-card__arrow">âº</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__field"> |
| | | <text class="driver-cert-card__label">详ç»å°å</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | <input v-model="form.address" class="driver-cert-card__input" placeholder="请è¾å
¥è¯¦ç»å±
ä½å°å" |
| | | placeholder-style="color: #b9bfc8;" /> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__field"> |
| | | <text class="driver-cert-card__label">æ¯ä»å®è´¦å·</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | <input v-model="form.alipay" class="driver-cert-card__input" placeholder="请è¾å
¥æ¶æ¬¾æ¯ä»å®è´¦å·" |
| | | placeholder-style="color: #b9bfc8;" /> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__upload-block"> |
| | | <view class="driver-cert-card__upload-title-row"> |
| | | <text class="driver-cert-card__label">èº«ä»½è¯æ£åé¢</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__upload-list"> |
| | | <view class="driver-cert-card__upload-item"> |
| | | <image class="driver-cert-card__upload-icon" src="/static/image/ic_camera@2x.png" |
| | | mode="aspectFit"></image> |
| | | <text class="driver-cert-card__upload-text">ä¸ä¼ 人åé¢</text> |
| | | </view> |
| | | <view class="driver-cert-card__upload-item"> |
| | | <image class="driver-cert-card__upload-icon" src="/static/image/ic_camera@2x.png" |
| | | mode="aspectFit"></image> |
| | | <text class="driver-cert-card__upload-text">ä¸ä¼ å½å¾½é¢</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view v-else class="driver-cert-card driver-cert-card--vehicle"> |
| | | <text class="driver-cert-card__title">车è¾ä¿¡æ¯</text> |
| | | |
| | | <view class="driver-cert-card__field"> |
| | | <text class="driver-cert-card__label">车çå·</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | <input v-model="vehicleForm.plateNumber" class="driver-cert-card__input" placeholder="请è¾å
¥è½¦çå·" |
| | | placeholder-style="color: #b9bfc8;" /> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__field driver-cert-card__field--select"> |
| | | <view class="driver-cert-card__field-head"> |
| | | <text class="driver-cert-card__label">车è¾ç±»å</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | </view> |
| | | <view class="driver-cert-card__selector"> |
| | | <text class="driver-cert-card__selector-text">è¯·éæ©</text> |
| | | <text class="driver-cert-card__arrow">âº</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__field"> |
| | | <text class="driver-cert-card__label">车è¾é¢è²</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | <input v-model="vehicleForm.color" class="driver-cert-card__input" placeholder="请è¾å
¥è½¦è¾é¢è²" |
| | | placeholder-style="color: #b9bfc8;" /> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__field driver-cert-card__field--select"> |
| | | <view class="driver-cert-card__field-head"> |
| | | <text class="driver-cert-card__label">é©¾é©¶è¯æææ</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | </view> |
| | | <view class="driver-cert-card__selector"> |
| | | <text class="driver-cert-card__selector-text">è¯·éæ©</text> |
| | | <text class="driver-cert-card__arrow">âº</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__upload-block driver-cert-card__upload-block--stacked"> |
| | | <view class="driver-cert-card__upload-title-row"> |
| | | <text class="driver-cert-card__label">车è¾ç
§ç</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | <text class="driver-cert-card__upload-tip">æå¤ä¸ä¼ 3å¼ ç
§ç</text> |
| | | </view> |
| | | <view class="driver-cert-card__upload-list driver-cert-card__upload-list--single"> |
| | | <view class="driver-cert-card__upload-item driver-cert-card__upload-item--single"> |
| | | <image class="driver-cert-card__upload-image" src="/static/image/btn_upload2@2x.png" |
| | | mode="aspectFit"></image> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__upload-block driver-cert-card__upload-block--stacked"> |
| | | <view class="driver-cert-card__upload-title-row"> |
| | | <text class="driver-cert-card__label">驾驶è¯ç
§ç</text> |
| | | <text class="driver-cert-card__required">*</text> |
| | | <text class="driver-cert-card__upload-tip">æå¤ä¸ä¼ 3å¼ ç
§ç</text> |
| | | </view> |
| | | <view class="driver-cert-card__upload-list driver-cert-card__upload-list--single"> |
| | | <view class="driver-cert-card__upload-item driver-cert-card__upload-item--single"> |
| | | <image class="driver-cert-card__upload-image" src="/static/image/btn_upload2@2x.png" |
| | | mode="aspectFit"></image> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="driver-cert-card__upload-block driver-cert-card__upload-block--stacked"> |
| | | <view class="driver-cert-card__upload-title-row"> |
| | | <text class="driver-cert-card__label">å
¶ä»ææ</text> |
| | | <text class="driver-cert-card__upload-tip">æå¤ä¸ä¼ 3å¼ ç
§ç</text> |
| | | </view> |
| | | <view class="driver-cert-card__upload-list driver-cert-card__upload-list--single"> |
| | | <view class="driver-cert-card__upload-item driver-cert-card__upload-item--single"> |
| | | <image class="driver-cert-card__upload-image" src="/static/image/btn_upload2@2x.png" |
| | | mode="aspectFit"></image> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="driver-cert-page__bottom-bar"> |
| | | <label v-if="currentStep === 2" class="driver-cert-page__agreement"> |
| | | <radio class="driver-cert-page__agreement-radio" :checked="true" color="#2D7CFF" /> |
| | | <text class="driver-cert-page__agreement-text">æå·²é
读并åæãé£é©å£°æãããè¡æå¯ååé¡»ç¥ãåãæå¡åè®®ã</text> |
| | | </label> |
| | | |
| | | <view class="driver-cert-page__actions" :class="{ 'driver-cert-page__actions--dual': currentStep === 2 }"> |
| | | <button v-if="currentStep === 2" class="driver-cert-page__submit driver-cert-page__submit--ghost" |
| | | hover-class="driver-cert-page__submit--hover" @click="goPrevStep">ä¸ä¸æ¥</button> |
| | | <button class="driver-cert-page__submit" hover-class="driver-cert-page__submit--hover" |
| | | @click="handlePrimaryAction">{{ currentStep === 1 ? 'ä¸ä¸æ¥' : 'æäº¤è®¤è¯ç³è¯·' }}</button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | currentStep: 1, |
| | | form: { |
| | | name: '', |
| | | idCard: '', |
| | | address: '', |
| | | alipay: '' |
| | | }, |
| | | vehicleForm: { |
| | | plateNumber: '', |
| | | color: '' |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | handlePrimaryAction() { |
| | | if (this.currentStep === 1) { |
| | | this.scrollToTop() |
| | | this.currentStep = 2 |
| | | } |
| | | }, |
| | | goPrevStep() { |
| | | this.scrollToTop() |
| | | this.currentStep = 1 |
| | | }, |
| | | scrollToTop() { |
| | | uni.pageScrollTo({ |
| | | scrollTop: 0, |
| | | duration: 0 |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .driver-cert-page { |
| | | min-height: 100vh; |
| | | padding: 18rpx 16rpx 32rpx; |
| | | background: linear-gradient(180deg, #d7f0ff 0%, #f6fbff 28%, #ffffff 100%); |
| | | box-sizing: border-box; |
| | | overflow: hidden; |
| | | |
| | | &__scroll { |
| | | width: 100%; |
| | | } |
| | | |
| | | &__steps { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | padding: 10rpx 20rpx 24rpx; |
| | | } |
| | | |
| | | &__step { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | min-width: 150rpx; |
| | | |
| | | &--active { |
| | | .driver-cert-page__step-circle { |
| | | background: #b9e9ff; |
| | | } |
| | | |
| | | .driver-cert-page__step-circle-inner { |
| | | background: #106efa; |
| | | color: #ffffff; |
| | | box-shadow: 0 8rpx 18rpx rgba(16, 110, 250, 0.24); |
| | | } |
| | | } |
| | | |
| | | &--done { |
| | | .driver-cert-page__step-circle { |
| | | background: #b9e9ff; |
| | | } |
| | | |
| | | .driver-cert-page__step-circle-inner { |
| | | background: #106efa; |
| | | color: #ffffff; |
| | | } |
| | | } |
| | | } |
| | | |
| | | &__step-circle { |
| | | width: 52rpx; |
| | | height: 52rpx; |
| | | border-radius: 50%; |
| | | background: #b9e9ff; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | |
| | | &--inactive { |
| | | background: #8c939f; |
| | | |
| | | .driver-cert-page__step-circle-inner { |
| | | width: 100%; |
| | | height: 100%; |
| | | background: transparent; |
| | | box-shadow: none; |
| | | } |
| | | } |
| | | } |
| | | |
| | | &__step-circle-inner { |
| | | width: 32rpx; |
| | | height: 32rpx; |
| | | border-radius: 50%; |
| | | background: #106efa; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | font-size: 22rpx; |
| | | font-weight: 700; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &__step-text { |
| | | margin-top: 12rpx; |
| | | font-size: 30rpx; |
| | | font-weight: 500; |
| | | color: #7f8693; |
| | | |
| | | &--active { |
| | | color: #2b3139; |
| | | font-weight: 700; |
| | | } |
| | | |
| | | &--done { |
| | | color: #106efa; |
| | | font-weight: 700; |
| | | } |
| | | } |
| | | |
| | | &__step-line { |
| | | width: 160rpx; |
| | | height: 2rpx; |
| | | margin: 0 12rpx 30rpx; |
| | | background: #b4c7ea; |
| | | } |
| | | |
| | | &__bottom-bar { |
| | | margin-top: 30rpx; |
| | | padding: 18rpx 0 calc(env(safe-area-inset-bottom) + 18rpx); |
| | | background: #ffffff; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | &__actions { |
| | | display: flex; |
| | | justify-content: center; |
| | | |
| | | &--dual { |
| | | gap: 18rpx; |
| | | } |
| | | } |
| | | |
| | | &__submit { |
| | | width: 100%; |
| | | height: 78rpx; |
| | | line-height: 78rpx; |
| | | border-radius: 999rpx; |
| | | background: #2476f6; |
| | | font-size: 30rpx; |
| | | font-weight: 500; |
| | | color: #ffffff; |
| | | border: 0; |
| | | padding: 0; |
| | | |
| | | &::after { |
| | | border: 0; |
| | | } |
| | | |
| | | &--hover { |
| | | opacity: 0.92; |
| | | } |
| | | |
| | | &--ghost { |
| | | width: 220rpx; |
| | | background: #f3f8ff; |
| | | border: 1rpx solid #7db0ff; |
| | | color: #2d7cff; |
| | | } |
| | | } |
| | | |
| | | &__agreement { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | margin-bottom: 18rpx; |
| | | } |
| | | |
| | | &__agreement-radio { |
| | | transform: scale(0.9); |
| | | transform-origin: left top; |
| | | margin-right: 6rpx; |
| | | } |
| | | |
| | | &__agreement-text { |
| | | font-size: 22rpx; |
| | | line-height: 1.6; |
| | | color: #98a0ad; |
| | | } |
| | | } |
| | | |
| | | .driver-cert-card { |
| | | padding: 24rpx 24rpx 22rpx; |
| | | border-radius: 22rpx; |
| | | background: #ffffff; |
| | | overflow: hidden; |
| | | box-shadow: 0rpx 2rpx 20rpx 0rpx rgba(0, 0, 0, 0.08); |
| | | |
| | | &__title { |
| | | display: block; |
| | | font-size: 40rpx; |
| | | font-weight: 700; |
| | | color: #2b3139; |
| | | } |
| | | |
| | | &__mobile { |
| | | display: block; |
| | | margin-top: 14rpx; |
| | | font-size: 28rpx; |
| | | color: #9aa1ad; |
| | | } |
| | | |
| | | &--vehicle { |
| | | margin-bottom: 30rpx; |
| | | } |
| | | |
| | | &__field { |
| | | padding: 28rpx 0 24rpx; |
| | | border-bottom: 1rpx solid #eef1f5; |
| | | |
| | | &--select { |
| | | padding-bottom: 20rpx; |
| | | } |
| | | } |
| | | |
| | | &__field-head, |
| | | &__upload-title-row { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | &__label { |
| | | font-size: 32rpx; |
| | | font-weight: 600; |
| | | color: #2b3139; |
| | | } |
| | | |
| | | &__required { |
| | | margin-left: 4rpx; |
| | | font-size: 32rpx; |
| | | line-height: 1; |
| | | color: #ff4a3d; |
| | | } |
| | | |
| | | &__input { |
| | | width: 100%; |
| | | height: 78rpx; |
| | | margin-top: 10rpx; |
| | | font-size: 30rpx; |
| | | color: #333333; |
| | | background: transparent; |
| | | } |
| | | |
| | | &__selector { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | height: 78rpx; |
| | | margin-top: 10rpx; |
| | | } |
| | | |
| | | &__selector-text { |
| | | font-size: 30rpx; |
| | | color: #b9bfc8; |
| | | } |
| | | |
| | | &__arrow { |
| | | font-size: 34rpx; |
| | | line-height: 1; |
| | | color: #9aa1ad; |
| | | } |
| | | |
| | | &__upload-block { |
| | | padding-top: 28rpx; |
| | | |
| | | &--stacked { |
| | | border-top: 1rpx solid #eef1f5; |
| | | margin-top: 2rpx; |
| | | } |
| | | } |
| | | |
| | | &__upload-list { |
| | | display: flex; |
| | | gap: 20rpx; |
| | | margin-top: 22rpx; |
| | | |
| | | &--single { |
| | | gap: 0; |
| | | } |
| | | } |
| | | |
| | | &__upload-item { |
| | | flex: 1; |
| | | height: 144rpx; |
| | | border-radius: 16rpx; |
| | | background: #f7f8fa; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | |
| | | &--single { |
| | | flex: none; |
| | | width: 144rpx; |
| | | } |
| | | } |
| | | |
| | | &__upload-image { |
| | | width: 144rpx; |
| | | height: 144rpx; |
| | | } |
| | | |
| | | &__upload-icon { |
| | | width: 52rpx; |
| | | height: 52rpx; |
| | | opacity: 0.5; |
| | | } |
| | | |
| | | &__upload-text { |
| | | margin-top: 16rpx; |
| | | font-size: 28rpx; |
| | | color: #8f96a3; |
| | | } |
| | | |
| | | &__upload-tip { |
| | | margin-left: 10rpx; |
| | | font-size: 22rpx; |
| | | color: #b7bdc7; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <view class="hall-page"> |
| | | <view class="hall-page__header" :style="{ paddingTop: statusBarHeight + 'px' }"> |
| | | <view class="hall-page"> |
| | | <view v-if="showOrderDetail && isStatusDetail" class="order-detail-map-layer" :style="{ top: statusBarHeight + 'px' }"> |
| | | <map |
| | | class="order-detail-map-layer__map" |
| | | :latitude="detailMap.center.latitude" |
| | | :longitude="detailMap.center.longitude" |
| | | :markers="detailMap.markers" |
| | | :polyline="detailMap.polyline" |
| | | :include-points="detailMap.includePoints" |
| | | :scale="detailMap.scale" |
| | | :enable-zoom="true" |
| | | :enable-scroll="true" |
| | | ></map> |
| | | </view> |
| | | |
| | | <view class="hall-page__header" :style="{ paddingTop: statusBarHeight + 'px' }"> |
| | | <view class="hall-page__user-row"> |
| | | <view class="hall-page__user"> |
| | | <image class="hall-page__avatar" src="/static/image/login_bg@2x.png" mode="aspectFill"></image> |
| | |
| | | <!-- 订å详æ
--> |
| | | <u-popup :show="showOrderDetail" round="20" mode="bottom" :overlayStyle="{ background: 'rgba(0, 0, 0, 0.32)' }" @close="showOrderDetail = false"> |
| | | <view class="order-detail" :style="{ height: 'calc(100vh - ' + statusBarHeight + 'px)' }"> |
| | | <scroll-view class="order-detail__scroll" scroll-y> |
| | | <view v-if="isStatusDetail" class="order-detail__map-section"> |
| | | <view class="order-detail__map"> |
| | | <image class="order-detail__map-image" mode="aspectFill"></image> |
| | | <view class="order-detail__map-bubble">{{ detailOrder.mapTips }}</view> |
| | | <view v-if="isStatusDetail" class="order-detail__map-section"> |
| | | <view class="order-detail__map"> |
| | | <view class="order-detail__map-placeholder"></view> |
| | | <view class="order-detail__map-bubble">{{ detailMap.tips }}</view> |
| | | </view> |
| | | <view class="order-detail__status-bar"> |
| | | <view class="order-detail__status-left"> |
| | | <image class="order-detail__status-icon" mode="aspectFit"></image> |
| | | <text class="order-detail__status-name">{{ detailOrder.statusText }}</text> |
| | | </view> |
| | | <view class="order-detail__status-bar"> |
| | | <view class="order-detail__status-left"> |
| | | <image class="order-detail__status-icon" mode="aspectFit"></image> |
| | | <text class="order-detail__status-name">{{ detailOrder.statusText }}</text> |
| | | </view> |
| | | <view class="order-detail__status-right"> |
| | | <text v-if="detailOrder.showCancelTag" class="order-detail__cancel-tag">åæ¶è®¢å</text> |
| | | <text class="order-detail__status-no">#{{ detailOrder.serialNo }}</text> |
| | | </view> |
| | | <view class="order-detail__status-right"> |
| | | <text v-if="detailOrder.showCancelTag" class="order-detail__cancel-tag">åæ¶è®¢å</text> |
| | | <text class="order-detail__status-no">#{{ detailOrder.serialNo }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <scroll-view class="order-detail__scroll" scroll-y> |
| | | |
| | | <view class="order-detail__content"> |
| | | <view class="order-detail__head"> |
| | |
| | | <image class="order-detail__cancel-icon" src="/static/image/ic_close2@2x.png" mode="aspectFit"></image> |
| | | </view> |
| | | <button v-if="!isStatusDetail" class="order-detail__confirm" hover-class="order-detail__confirm--hover">确认æ¢å</button> |
| | | <button v-else class="order-detail__confirm order-detail__confirm--status" hover-class="order-detail__confirm--hover"> |
| | | <image class="order-detail__confirm-icon" mode="aspectFit"></image> |
| | | <button v-else class="order-detail__confirm order-detail__confirm--status" hover-class="order-detail__confirm--hover" @click="handleStatusAction"> |
| | | <image class="order-detail__confirm-icon" src="/static/image/ic_photo@2x.png" mode="aspectFit"></image> |
| | | <text>{{ detailPopupType === 'pickup' ? 'æç
§åè´§' : 'æç
§éè¾¾' }}</text> |
| | | </button> |
| | | </view> |
| | | </view> |
| | | </u-popup> |
| | | |
| | | <u-popup :show="showPhotoDeliverPopup" round="20" mode="bottom"> |
| | | <view class="photo-deliver"> |
| | | <view class="photo-deliver__header"> |
| | | <image class="photo-deliver__close-placeholder" mode="aspectFit"></image> |
| | | <text class="photo-deliver__title">æç
§éè¾¾</text> |
| | | <image class="photo-deliver__close" mode="aspectFit" @click="showPhotoDeliverPopup = false"></image> |
| | | </view> |
| | | |
| | | <view class="photo-deliver__section"> |
| | | <view class="photo-deliver__label-row"> |
| | | <text class="photo-deliver__label">ææéè¾¾ç
§ç</text> |
| | | <text class="photo-deliver__required">*</text> |
| | | <text class="photo-deliver__hint">æå¤3å¼ ç
§ç</text> |
| | | </view> |
| | | |
| | | <view class="photo-deliver__photos"> |
| | | <view class="photo-deliver__upload-card"> |
| | | <image class="photo-deliver__upload-icon" mode="aspectFit"></image> |
| | | <text class="photo-deliver__upload-text">ç¹å»æç
§</text> |
| | | </view> |
| | | |
| | | <view class="photo-deliver__preview-card"> |
| | | <image class="photo-deliver__preview-image" mode="aspectFill"></image> |
| | | <view class="photo-deliver__preview-mask"> |
| | | <text class="photo-deliver__preview-delete">å é¤</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="photo-deliver__section photo-deliver__section--remark"> |
| | | <text class="photo-deliver__remark-title">夿³¨ä¿¡æ¯</text> |
| | | <textarea class="photo-deliver__textarea" maxlength="200" placeholder="请è¾å
¥" placeholder-style="color: #c7cbd3;" /> |
| | | </view> |
| | | |
| | | <button class="photo-deliver__submit" hover-class="photo-deliver__submit--hover" @click="showPhotoDeliverPopup = false">确认éè¾¾</button> |
| | | </view> |
| | | </u-popup> |
| | | </view> |
| | |
| | | tts: null, |
| | | show: false, |
| | | show1: false, |
| | | showPhotoDeliverPopup: false, |
| | | showOrderDetail: false, |
| | | detailPopupType: 'hall', |
| | | routeInfo: null, |
| | | statusBarHeight: 0, |
| | | headerHeight: 0, |
| | | tabbarHeight: 0, |
| | |
| | | statusText: 'æ¢å大å
', |
| | | qrcodeValue: '767889', |
| | | qrcodeLabel: 'åè´§ç ', |
| | | mapTips: 'å©ä½3.2kmï¼çº¦4åé', |
| | | mapTips: '', |
| | | showCancelTag: false, |
| | | startPoint: { |
| | | latitude: 31.8269, |
| | | longitude: 117.2334 |
| | | }, |
| | | endPoint: { |
| | | latitude: 31.8435, |
| | | longitude: 117.2852 |
| | | }, |
| | | tags: [ |
| | | { text: 'æ éè¾¾', type: 'blue' }, |
| | | { text: 'è´µéç©å', type: 'orange' } |
| | |
| | | time: '45åéå
', |
| | | price: 'Â¥20.5', |
| | | extra: '3.0', |
| | | startPoint: { |
| | | latitude: 31.829512, |
| | | longitude: 117.239211 |
| | | }, |
| | | endPoint: { |
| | | latitude: 31.841268, |
| | | longitude: 117.278695 |
| | | }, |
| | | tags: [ |
| | | { text: 'æéè¾¾', type: 'blue' }, |
| | | { text: 'è´µéç©å', type: 'orange' } |
| | |
| | | time: '45åéå
', |
| | | price: 'Â¥20.5', |
| | | extra: '3.0', |
| | | startPoint: { |
| | | latitude: 31.827106, |
| | | longitude: 117.232884 |
| | | }, |
| | | endPoint: { |
| | | latitude: 31.847331, |
| | | longitude: 117.289762 |
| | | }, |
| | | tags: [ |
| | | { text: 'æéè¾¾', type: 'red' }, |
| | | { text: '大件ç©å', type: 'blue-light' } |
| | |
| | | time: '45åéå
', |
| | | price: 'Â¥20.5', |
| | | extra: '3.0', |
| | | startPoint: { |
| | | latitude: 31.823761, |
| | | longitude: 117.228947 |
| | | }, |
| | | endPoint: { |
| | | latitude: 31.838473, |
| | | longitude: 117.272513 |
| | | }, |
| | | tags: [ |
| | | { text: 'æéè¾¾', type: 'red' }, |
| | | { text: '大件ç©å', type: 'blue-light' } |
| | |
| | | statusText: 'å¾
åè´§', |
| | | qrcodeValue: '767889', |
| | | qrcodeLabel: 'åè´§ç ', |
| | | mapTips: 'å©ä½3.2kmï¼çº¦4åé', |
| | | mapTips: '', |
| | | showCancelTag: true, |
| | | startPoint: { |
| | | latitude: 31.829512, |
| | | longitude: 117.239211 |
| | | }, |
| | | endPoint: { |
| | | latitude: 31.841268, |
| | | longitude: 117.278695 |
| | | }, |
| | | time: '45åéå
', |
| | | price: 'Â¥20.5', |
| | | extra: '3.0', |
| | |
| | | statusText: 'é
éä¸', |
| | | qrcodeValue: '767889', |
| | | qrcodeLabel: 'åä»¶ç ', |
| | | mapTips: 'å©ä½3.2kmï¼çº¦4åé', |
| | | mapTips: '', |
| | | showCancelTag: false, |
| | | startPoint: { |
| | | latitude: 31.827106, |
| | | longitude: 117.232884 |
| | | }, |
| | | endPoint: { |
| | | latitude: 31.847331, |
| | | longitude: 117.289762 |
| | | }, |
| | | time: '45åéå
', |
| | | price: 'Â¥20.5', |
| | | extra: '3.0', |
| | |
| | | return this.detailPopupType === 'pickup' || this.detailPopupType === 'delivering' |
| | | }, |
| | | |
| | | detailMap() { |
| | | const fallbackPoint = { |
| | | latitude: 31.8269, |
| | | longitude: 117.2334 |
| | | } |
| | | const startPoint = this.detailOrder.startPoint || fallbackPoint |
| | | const endPoint = this.detailOrder.endPoint || fallbackPoint |
| | | const routePoints = this.routeInfo && this.routeInfo.points && this.routeInfo.points.length ? this.routeInfo.points : [] |
| | | const center = { |
| | | latitude: (startPoint.latitude + endPoint.latitude) / 2, |
| | | longitude: (startPoint.longitude + endPoint.longitude) / 2 |
| | | } |
| | | const distanceKm = this.routeInfo && this.routeInfo.distanceKm ? this.routeInfo.distanceKm : 0 |
| | | const durationMinutes = this.routeInfo && this.routeInfo.durationMinutes ? this.routeInfo.durationMinutes : 0 |
| | | const tips = this.detailOrder.mapTips || (distanceKm ? `å©ä½${distanceKm.toFixed(1)}kmï¼çº¦${durationMinutes}åé` : '路线è§åä¸...') |
| | | |
| | | return { |
| | | center, |
| | | markers: [ |
| | | { |
| | | id: 1, |
| | | latitude: startPoint.latitude, |
| | | longitude: startPoint.longitude, |
| | | iconPath: '/static/image/map_marker_start.svg', |
| | | width: 32, |
| | | height: 38, |
| | | anchor: { |
| | | x: 0.5, |
| | | y: 1 |
| | | } |
| | | }, |
| | | { |
| | | id: 2, |
| | | latitude: endPoint.latitude, |
| | | longitude: endPoint.longitude, |
| | | iconPath: '/static/image/map_marker_end.svg', |
| | | width: 32, |
| | | height: 38, |
| | | anchor: { |
| | | x: 0.5, |
| | | y: 1 |
| | | } |
| | | } |
| | | ], |
| | | polyline: [ |
| | | ...(routePoints.length ? [{ |
| | | points: routePoints, |
| | | color: '#2A7FFF', |
| | | width: 8, |
| | | dottedLine: false, |
| | | arrowLine: true |
| | | }] : []) |
| | | ], |
| | | includePoints: routePoints.length ? routePoints : [startPoint, endPoint], |
| | | scale: 12, |
| | | tips |
| | | } |
| | | }, |
| | | |
| | | currentOrderList() { |
| | | const orderMap = { |
| | | hall: this.orderList, |
| | |
| | | }, |
| | | |
| | | methods: { |
| | | calculateDistance(startPoint, endPoint) { |
| | | if (!startPoint || !endPoint) { |
| | | return 0 |
| | | } |
| | | |
| | | const toRad = (value) => value * Math.PI / 180 |
| | | const earthRadius = 6371 |
| | | const deltaLat = toRad(endPoint.latitude - startPoint.latitude) |
| | | const deltaLng = toRad(endPoint.longitude - startPoint.longitude) |
| | | const lat1 = toRad(startPoint.latitude) |
| | | const lat2 = toRad(endPoint.latitude) |
| | | const a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(deltaLng / 2) * Math.sin(deltaLng / 2) |
| | | const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)) |
| | | |
| | | return earthRadius * c |
| | | }, |
| | | |
| | | estimateDuration(distanceKm) { |
| | | if (!distanceKm) { |
| | | return 1 |
| | | } |
| | | |
| | | const averageSpeedKmPerHour = 35 |
| | | return Math.max(1, Math.round(distanceKm / averageSpeedKmPerHour * 60)) |
| | | }, |
| | | |
| | | handleStatusAction() { |
| | | if (this.detailPopupType === 'delivering') { |
| | | this.showOrderDetail = false |
| | | this.showPhotoDeliverPopup = true |
| | | } |
| | | }, |
| | | |
| | | openDetailPopup(item) { |
| | | this.detailPopupType = this.activeTab |
| | | this.routeInfo = null |
| | | this.detailOrder = { |
| | | ...this.detailOrder, |
| | | ...item, |
| | |
| | | photos: item.photos || this.detailOrder.photos |
| | | } |
| | | this.showOrderDetail = true |
| | | |
| | | if (this.activeTab === 'pickup' || this.activeTab === 'delivering') { |
| | | this.fetchDrivingRoute(this.detailOrder) |
| | | } |
| | | }, |
| | | |
| | | fetchDrivingRoute(order) { |
| | | if (!order || !order.startPoint || !order.endPoint) { |
| | | return |
| | | } |
| | | |
| | | const origin = `${order.startPoint.longitude},${order.startPoint.latitude}` |
| | | const destination = `${order.endPoint.longitude},${order.endPoint.latitude}` |
| | | |
| | | uni.request({ |
| | | url: 'https://restapi.amap.com/v3/direction/driving', |
| | | method: 'GET', |
| | | data: { |
| | | key: 'e4d46c87adf151dca20060317592b1b6', |
| | | origin, |
| | | destination, |
| | | extensions: 'all', |
| | | strategy: 0, |
| | | output: 'json' |
| | | }, |
| | | success: (response) => { |
| | | const path = response.data && response.data.route && response.data.route.paths && response.data.route.paths[0] |
| | | if (!path) { |
| | | this.routeInfo = this.buildMockRouteInfo(order.startPoint, order.endPoint) |
| | | return |
| | | } |
| | | |
| | | const points = this.parseRoutePoints(path.steps || [], order.startPoint, order.endPoint) |
| | | const distanceKm = Number(path.distance || 0) / 1000 |
| | | const durationMinutes = Math.max(1, Math.round(Number(path.duration || 0) / 60)) |
| | | |
| | | this.routeInfo = { |
| | | points, |
| | | distanceKm: distanceKm || this.calculateDistance(order.startPoint, order.endPoint), |
| | | durationMinutes |
| | | } |
| | | }, |
| | | fail: () => { |
| | | this.routeInfo = this.buildMockRouteInfo(order.startPoint, order.endPoint) |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | buildMockRouteInfo(startPoint, endPoint) { |
| | | const middleLatitude = (startPoint.latitude + endPoint.latitude) / 2 |
| | | const middleLongitude = (startPoint.longitude + endPoint.longitude) / 2 |
| | | const points = [ |
| | | startPoint, |
| | | { |
| | | latitude: startPoint.latitude + (middleLatitude - startPoint.latitude) * 0.65, |
| | | longitude: startPoint.longitude + 0.008 |
| | | }, |
| | | { |
| | | latitude: middleLatitude + 0.004, |
| | | longitude: middleLongitude + 0.012 |
| | | }, |
| | | { |
| | | latitude: endPoint.latitude - 0.003, |
| | | longitude: endPoint.longitude - 0.008 |
| | | }, |
| | | endPoint |
| | | ] |
| | | const distanceKm = this.calculatePathDistance(points) |
| | | const durationMinutes = this.estimateDuration(distanceKm) |
| | | |
| | | return { |
| | | points, |
| | | distanceKm, |
| | | durationMinutes |
| | | } |
| | | }, |
| | | |
| | | parseRoutePoints(steps, startPoint, endPoint) { |
| | | const points = [] |
| | | |
| | | steps.forEach((step) => { |
| | | const polyline = step.polyline || '' |
| | | polyline.split(';').forEach((pointText) => { |
| | | const [longitude, latitude] = pointText.split(',').map(Number) |
| | | if (!Number.isNaN(latitude) && !Number.isNaN(longitude)) { |
| | | points.push({ latitude, longitude }) |
| | | } |
| | | }) |
| | | }) |
| | | |
| | | if (!points.length) { |
| | | return [startPoint, endPoint] |
| | | } |
| | | |
| | | return points |
| | | }, |
| | | |
| | | calculatePathDistance(points) { |
| | | if (!points || points.length < 2) { |
| | | return 0 |
| | | } |
| | | |
| | | let totalDistance = 0 |
| | | for (let index = 1; index < points.length; index += 1) { |
| | | totalDistance += this.calculateDistance(points[index - 1], points[index]) |
| | | } |
| | | |
| | | return totalDistance |
| | | }, |
| | | |
| | | toggleFilterPopup(show) { |
| | |
| | | height: 100vh; |
| | | background: #f5f6f8; |
| | | overflow: hidden; |
| | | |
| | | .order-detail-map-layer { |
| | | position: fixed; |
| | | left: 0; |
| | | right: 0; |
| | | height: 330rpx; |
| | | z-index: 10081; |
| | | overflow: hidden; |
| | | border-top-left-radius: 28rpx; |
| | | border-top-right-radius: 28rpx; |
| | | |
| | | &__map { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | } |
| | | |
| | | .qrcode { |
| | | padding: 36rpx 30rpx; |
| | |
| | | } |
| | | } |
| | | |
| | | .photo-deliver { |
| | | padding: 32rpx 28rpx calc(env(safe-area-inset-bottom) + 28rpx); |
| | | background: #ffffff; |
| | | box-sizing: border-box; |
| | | border-top-left-radius: 20rpx; |
| | | border-top-right-radius: 20rpx; |
| | | overflow: hidden; |
| | | |
| | | &__header { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | } |
| | | |
| | | &__title { |
| | | font-size: 34rpx; |
| | | font-weight: 700; |
| | | color: #111111; |
| | | } |
| | | |
| | | &__close, |
| | | &__close-placeholder { |
| | | width: 36rpx; |
| | | height: 36rpx; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__close-placeholder { |
| | | opacity: 0; |
| | | } |
| | | |
| | | &__section { |
| | | margin-top: 56rpx; |
| | | |
| | | &--remark { |
| | | margin-top: 46rpx; |
| | | } |
| | | } |
| | | |
| | | &__label-row { |
| | | display: flex; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | } |
| | | |
| | | &__label, |
| | | &__remark-title { |
| | | font-size: 28rpx; |
| | | font-weight: 700; |
| | | color: #23262d; |
| | | } |
| | | |
| | | &__required { |
| | | margin-left: 4rpx; |
| | | font-size: 28rpx; |
| | | font-weight: 700; |
| | | color: #ff3b30; |
| | | } |
| | | |
| | | &__hint { |
| | | margin-left: 12rpx; |
| | | font-size: 24rpx; |
| | | color: #a8adb7; |
| | | } |
| | | |
| | | &__photos { |
| | | display: flex; |
| | | gap: 18rpx; |
| | | margin-top: 30rpx; |
| | | } |
| | | |
| | | &__upload-card, |
| | | &__preview-card { |
| | | position: relative; |
| | | width: 160rpx; |
| | | height: 160rpx; |
| | | border-radius: 8rpx; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | &__upload-card { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | border: 2rpx dashed #c9ced6; |
| | | background: #ffffff; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | &__upload-icon { |
| | | width: 52rpx; |
| | | height: 52rpx; |
| | | } |
| | | |
| | | &__upload-text { |
| | | margin-top: 14rpx; |
| | | font-size: 26rpx; |
| | | color: #9da3ae; |
| | | } |
| | | |
| | | &__preview-card { |
| | | background: #eef1f5; |
| | | } |
| | | |
| | | &__preview-image { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | |
| | | &__preview-mask { |
| | | position: absolute; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | height: 48rpx; |
| | | background: rgba(0, 0, 0, 0.46); |
| | | } |
| | | |
| | | &__preview-delete { |
| | | font-size: 26rpx; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &__textarea { |
| | | width: 100%; |
| | | height: 110rpx; |
| | | margin-top: 24rpx; |
| | | padding: 28rpx 24rpx; |
| | | border-radius: 12rpx; |
| | | background: #f7f8fa; |
| | | box-sizing: border-box; |
| | | font-size: 30rpx; |
| | | color: #2c3139; |
| | | } |
| | | |
| | | &__submit { |
| | | width: 100%; |
| | | height: 88rpx; |
| | | line-height: 88rpx; |
| | | margin-top: 86rpx; |
| | | border-radius: 50rpx; |
| | | background: #106efa; |
| | | font-size: 32rpx; |
| | | font-weight: 700; |
| | | color: #ffffff; |
| | | border: 0; |
| | | padding: 0; |
| | | |
| | | &::after { |
| | | border: 0; |
| | | } |
| | | |
| | | &--hover { |
| | | opacity: 0.92; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .order-detail { |
| | | display: flex; |
| | | flex-direction: column; |
| | |
| | | &__map { |
| | | position: relative; |
| | | height: 330rpx; |
| | | background: linear-gradient(180deg, #eef5ff 0%, #dbe9ff 100%); |
| | | background: #eef5ff; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | &__map-image { |
| | | &__map-view { |
| | | width: 100%; |
| | | height: 100%; |
| | | opacity: 0.2; |
| | | } |
| | | |
| | | &__map-placeholder { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | |
| | | &__map-bubble { |
| | |
| | | } |
| | | |
| | | &__confirm-icon { |
| | | width: 32rpx; |
| | | height: 32rpx; |
| | | width: 44rpx; |
| | | height: 44rpx; |
| | | flex-shrink: 0; |
| | | } |
| | | } |
| | |
| | | <template> |
| | | <view> |
| | | |
| | | <view class="message-page"> |
| | | <view class="message-page__nav" :style="{ paddingTop: statusBarHeight + 'px' }"> |
| | | <view class="message-page__nav-inner"> |
| | | <text class="message-page__nav-title">æ¶æ¯</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <scroll-view class="message-page__body" scroll-y :style="bodyStyle"> |
| | | <view class="message-page__list"> |
| | | <view v-for="item in messageList" :key="item.id" class="message-card"> |
| | | <view class="message-card__icon-wrap"> |
| | | <view class="message-card__icon-bg"> |
| | | <text class="message-card__icon">ð</text> |
| | | </view> |
| | | <view v-if="item.unread" class="message-card__dot"></view> |
| | | </view> |
| | | |
| | | <view class="message-card__content"> |
| | | <text class="message-card__title">{{ item.title }}</text> |
| | | <text class="message-card__desc">{{ item.desc }}</text> |
| | | <text class="message-card__time">{{ item.time }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </scroll-view> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | export default { |
| | | data() { |
| | | return { |
| | | |
| | | }; |
| | | statusBarHeight: 0, |
| | | navHeight: 0, |
| | | messageList: [ |
| | | { |
| | | id: 1, |
| | | title: '订åå¾
é
é', |
| | | desc: 'æ¨å·²æ¢åæåï¼è®¢åï¼32728367487367ï¼è¯·ææ¶å°ãä¸éå¿«è¿åç«æè°åºãåè´§', |
| | | time: '2026-04-12 20:00', |
| | | unread: true |
| | | }, |
| | | { |
| | | id: 2, |
| | | title: 'é
éä¸', |
| | | desc: '订åï¼32728367487367å·²åè´§ï¼è¯·ææ¶éè¾¾', |
| | | time: '2026-04-12 20:00', |
| | | unread: true |
| | | }, |
| | | { |
| | | id: 3, |
| | | title: 'å·²éè¾¾', |
| | | desc: '订åï¼32728367487367å·²éè¾¾ï¼è¯·èç³»ç¨æ·ç¡®è®¤ç¾æ¶', |
| | | time: '2026-04-12 20:00', |
| | | unread: false |
| | | }, |
| | | { |
| | | id: 4, |
| | | title: '订å已宿', |
| | | desc: '订åï¼32728367487367已宿ï¼ç¸å
³è®¢åç»ç®ä¼å¨3ä¸ªå·¥ä½æ¥å
宿', |
| | | time: '2026-04-12 20:00', |
| | | unread: false |
| | | }, |
| | | { |
| | | id: 5, |
| | | title: '订åå·²è¯ä»·', |
| | | desc: '订åï¼32728367487367ï¼ç¨æ·å·²è¯ä»·ï¼å¯æ¥çè¯ä»·å
容', |
| | | time: '2026-04-12 20:00', |
| | | unread: false |
| | | }, |
| | | { |
| | | id: 6, |
| | | title: '鿬¾ä¸', |
| | | desc: '订åï¼32728367487367ï¼ç¨æ·å·²æäº¤é款ç³è¯·ï¼è¯¥è®¢åä»»å¡å·²åæ¶ï¼è¯·å¿åå¾ã', |
| | | time: '2026-04-12 20:00', |
| | | unread: false |
| | | }, |
| | | { |
| | | id: 7, |
| | | title: '订åå·²ç»ç®', |
| | | desc: 'è¡æè®¢åï¼3729378487987 å¹³å°å·²å®æç»ç®ï¼éé¢ä¸ºXXå
ï¼è¯·æ³¨ææ¥æ¶', |
| | | time: '2026-04-12 20:00', |
| | | unread: false |
| | | } |
| | | ] |
| | | } |
| | | }, |
| | | computed: { |
| | | bodyStyle() { |
| | | return { |
| | | marginTop: this.navHeight + 'px', |
| | | height: `calc(100vh - ${this.navHeight}px)` |
| | | } |
| | | } |
| | | }, |
| | | onLoad() { |
| | | const systemInfo = uni.getSystemInfoSync() |
| | | this.statusBarHeight = systemInfo.statusBarHeight || 0 |
| | | this.navHeight = this.statusBarHeight + uni.upx2px(88) |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | <style lang="scss" scoped> |
| | | .message-page { |
| | | height: 100vh; |
| | | background: #f6f8fc; |
| | | overflow: hidden; |
| | | |
| | | </style> |
| | | &__nav { |
| | | position: fixed; |
| | | left: 0; |
| | | top: 0; |
| | | right: 0; |
| | | z-index: 10; |
| | | background: linear-gradient(180deg, #1f73f6 0%, #1b6df2 100%); |
| | | } |
| | | |
| | | &__nav-inner { |
| | | height: 88rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 0 24rpx; |
| | | } |
| | | |
| | | &__nav-title { |
| | | font-size: 36rpx; |
| | | font-weight: 700; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &__body { |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | &__list { |
| | | padding: 18rpx 18rpx calc(env(safe-area-inset-bottom) + 24rpx); |
| | | } |
| | | } |
| | | |
| | | .message-card { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | gap: 18rpx; |
| | | padding: 24rpx 20rpx; |
| | | margin-bottom: 18rpx; |
| | | border-radius: 18rpx; |
| | | background: #ffffff; |
| | | box-shadow: 0 8rpx 20rpx rgba(28, 55, 106, 0.04); |
| | | |
| | | &__icon-wrap { |
| | | position: relative; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__icon-bg { |
| | | width: 52rpx; |
| | | height: 52rpx; |
| | | border-radius: 50%; |
| | | background: #fff7e3; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | &__icon { |
| | | font-size: 26rpx; |
| | | line-height: 1; |
| | | } |
| | | |
| | | &__dot { |
| | | position: absolute; |
| | | right: 0; |
| | | top: 0; |
| | | width: 14rpx; |
| | | height: 14rpx; |
| | | border-radius: 50%; |
| | | background: #ff3b30; |
| | | border: 2rpx solid #ffffff; |
| | | } |
| | | |
| | | &__content { |
| | | flex: 1; |
| | | min-width: 0; |
| | | } |
| | | |
| | | &__title { |
| | | display: block; |
| | | font-size: 36rpx; |
| | | font-weight: 700; |
| | | color: #2b3139; |
| | | line-height: 1.35; |
| | | } |
| | | |
| | | &__desc { |
| | | display: block; |
| | | margin-top: 10rpx; |
| | | font-size: 28rpx; |
| | | line-height: 1.55; |
| | | color: #8c95a3; |
| | | } |
| | | |
| | | &__time { |
| | | display: block; |
| | | margin-top: 16rpx; |
| | | font-size: 26rpx; |
| | | color: #b1b7c1; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <view class="index"> |
| | | <view class="index_list"> |
| | | <view class="index_list_item"> |
| | | <view class="index_list_item_info"> |
| | | <text>SHEäºä»¶ä¸æ¥</text> |
| | | <text>FAC/NM</text> |
| | | </view> |
| | | <image src="/static/bg_a.png" mode="widthFix"></image> |
| | | <view class="mine-page"> |
| | | <view class="mine-page__nav" :style="{ paddingTop: statusBarHeight + 'px' }"> |
| | | <view class="mine-page__nav-inner"> |
| | | <text class="mine-page__nav-title">æç</text> |
| | | </view> |
| | | <view class="index_list_item"> |
| | | <view class="index_list_item_info"> |
| | | <text>è·ç»æ»é£é©ä¸æ¥</text> |
| | | <text>TAG</text> |
| | | </view> |
| | | |
| | | <scroll-view class="mine-page__body" scroll-y :style="bodyStyle"> |
| | | <view class="mine-page__content"> |
| | | <view class="mine-page__profile"> |
| | | <image class="mine-page__avatar" src="/static/image/ic_pic@2x.png" mode="aspectFill"></image> |
| | | <view class="mine-page__profile-info"> |
| | | <view class="mine-page__name-row"> |
| | | <text class="mine-page__name">{{ currentProfile.name }}</text> |
| | | <view v-if="currentProfile.levelTag" class="mine-page__level-tag"> |
| | | <!-- <text class="mine-page__level-dot"></text> --> |
| | | <image src="/static/image/ic_jiangpai@2x.png" mode="widthFix" class="mine-page__level-dot"></image> |
| | | <text class="mine-page__level-text">{{ currentProfile.levelTag }}</text> |
| | | </view> |
| | | </view> |
| | | <text class="mine-page__phone">{{ currentProfile.phone }}</text> |
| | | </view> |
| | | </view> |
| | | <image src="/static/bg_b.png" mode="widthFix"></image> |
| | | |
| | | <view class="income-card"> |
| | | <view class="income-card__left"> |
| | | <text class="income-card__label">累计佣é(å
)</text> |
| | | <text class="income-card__value">{{ currentProfile.totalIncome }}</text> |
| | | </view> |
| | | <view class="income-card__right"> |
| | | <view class="income-card__stat"> |
| | | <text class="income-card__stat-label">å¾
ç»ç®(å
)ï¼</text> |
| | | <text class="income-card__stat-value">{{ currentProfile.pendingIncome }}</text> |
| | | </view> |
| | | <view class="income-card__stat"> |
| | | <text class="income-card__stat-label">è®¢åæ»æ°ï¼</text> |
| | | <text class="income-card__stat-value">{{ currentProfile.orderCount }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="menu-panel"> |
| | | <view v-for="item in menuList" :key="item.title" class="menu-panel__item" @click="jump(item)"> |
| | | <text class="menu-panel__title">{{ item.title }}</text> |
| | | <view class="menu-panel__right"> |
| | | <template v-if="item.key === 'wallet'"> |
| | | <text class="menu-panel__sub menu-panel__sub--muted">ä½é¢ï¼{{ currentProfile.walletBalance }}</text> |
| | | </template> |
| | | <template v-else-if="item.key === 'driver' && !currentProfile.verified"> |
| | | <text class="menu-panel__sub menu-panel__sub--danger">å®æè®¤è¯åå³å¯æ¥å</text> |
| | | </template> |
| | | <template v-else-if="item.key === 'driver' && currentProfile.verified"> |
| | | <text class="menu-panel__sub menu-panel__sub--warning">å®¡æ ¸ä¸</text> |
| | | <text class="menu-panel__sub menu-panel__sub--primary">已认è¯</text> |
| | | </template> |
| | | <template v-else-if="item.key === 'setting'"> |
| | | <text class="menu-panel__sub menu-panel__sub--muted">å½åçæ¬V1.0.0</text> |
| | | </template> |
| | | <view class="menu-panel__arrow"> |
| | | <image src="/static/image/mine_ar2@2x.png" mode="widthFix"></image> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </scroll-view> |
| | | |
| | | <view class="mine-page__footer"> |
| | | <button class="mine-page__logout" hover-class="mine-page__logout--hover">éåºç»å½</button> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import { mapState } from 'vuex' |
| | | export default { |
| | | computed: { |
| | | ...mapState(['userInfo']) |
| | | }, |
| | | data() { |
| | | return { |
| | | title: 'Hello' |
| | | statusBarHeight: 0, |
| | | navHeight: 0, |
| | | useVerifiedState: true, |
| | | menuList: [ |
| | | { key: 'wallet', title: 'æçé±å
' }, |
| | | { key: 'driver', title: '叿ºè®¤è¯' }, |
| | | { key: 'guide', title: 'è§èé¡»ç¥' }, |
| | | { key: 'help', title: '帮å©ä¸å®¢æ' }, |
| | | { key: 'setting', title: '设置' } |
| | | ], |
| | | profileStates: { |
| | | guest: { |
| | | name: 'æ±¤åæ°', |
| | | phone: '18166565677', |
| | | levelTag: '', |
| | | totalIncome: '-', |
| | | pendingIncome: '-', |
| | | orderCount: '-', |
| | | walletBalance: 'Â¥0', |
| | | verified: false |
| | | }, |
| | | verified: { |
| | | name: 'æ±¤åæ°', |
| | | phone: '18166565677ï¼çBD23189ï¼', |
| | | levelTag: 'S级', |
| | | totalIncome: '8,314.90', |
| | | pendingIncome: '2000.00', |
| | | orderCount: '329', |
| | | walletBalance: 'Â¥1500.00', |
| | | verified: true |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | computed: { |
| | | currentProfile() { |
| | | return this.useVerifiedState ? this.profileStates.verified : this.profileStates.guest |
| | | }, |
| | | bodyStyle() { |
| | | const footerHeight = uni.upx2px(124) |
| | | return { |
| | | marginTop: this.navHeight + 'px', |
| | | height: `calc(100vh - ${this.navHeight + footerHeight}px)` |
| | | } |
| | | } |
| | | }, |
| | | onLoad() { |
| | | |
| | | const systemInfo = uni.getSystemInfoSync() |
| | | this.statusBarHeight = systemInfo.statusBarHeight || 0 |
| | | this.navHeight = this.statusBarHeight + uni.upx2px(88) |
| | | }, |
| | | methods: { |
| | | jump(type) { |
| | | switch (type) { |
| | | case 1: |
| | | uni.navigateTo({ |
| | | url: '/pages/reporting_she/reporting_she' |
| | | }) |
| | | break; |
| | | case 2: |
| | | uni.navigateTo({ |
| | | url: '/pages/riskReporting/riskReporting' |
| | | }) |
| | | break; |
| | | case 3: |
| | | uni.navigateTo({ |
| | | url: '/pages/report_dca/report_dca' |
| | | }) |
| | | break; |
| | | jump(item) { |
| | | console.log(item) |
| | | if (item.key === 'setting') { |
| | | uni.navigateTo({ |
| | | url: '/pages/settings/settings' |
| | | }) |
| | | } else if (item.key === 'driver') { |
| | | uni.navigateTo({ |
| | | url: '/pages/certification-details/certification-details' |
| | | }) |
| | | } |
| | | } |
| | | } |
| | |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .index { |
| | | width: 100vw; |
| | | padding: 30rpx; |
| | | .mine-page { |
| | | height: 100vh; |
| | | background: #f6f8fc; |
| | | overflow: hidden; |
| | | |
| | | &__nav { |
| | | position: fixed; |
| | | left: 0; |
| | | top: 0; |
| | | right: 0; |
| | | z-index: 10; |
| | | background: #ffffff; |
| | | } |
| | | |
| | | &__nav-inner { |
| | | height: 88rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 0 26rpx; |
| | | } |
| | | |
| | | &__nav-title { |
| | | font-size: 36rpx; |
| | | font-weight: 700; |
| | | color: #2b3139; |
| | | } |
| | | |
| | | &__body { |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | &__content { |
| | | padding: 28rpx 20rpx 20rpx; |
| | | } |
| | | |
| | | &__profile { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 20rpx; |
| | | padding: 8rpx 0 24rpx; |
| | | } |
| | | |
| | | &__avatar { |
| | | width: 92rpx; |
| | | height: 92rpx; |
| | | border-radius: 50%; |
| | | background: #e8f1ff; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__profile-info { |
| | | flex: 1; |
| | | min-width: 0; |
| | | } |
| | | |
| | | &__name-row { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 12rpx; |
| | | } |
| | | |
| | | &__name { |
| | | font-size: 40rpx; |
| | | font-weight: 700; |
| | | color: #2b3139; |
| | | } |
| | | |
| | | &__level-tag { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 6rpx; |
| | | padding: 4rpx 10rpx; |
| | | border-radius: 999rpx; |
| | | background: linear-gradient(180deg, #ff9e68 0%, #ff7d34 100%); |
| | | } |
| | | |
| | | &__level-dot { |
| | | width: 20rpx; |
| | | height: 24rpx; |
| | | } |
| | | |
| | | &__level-text { |
| | | font-size: 22rpx; |
| | | font-weight: 700; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &__phone { |
| | | display: block; |
| | | margin-top: 10rpx; |
| | | font-size: 28rpx; |
| | | color: #8f96a3; |
| | | } |
| | | |
| | | &__footer { |
| | | position: fixed; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | padding: 16rpx 0 calc(env(safe-area-inset-bottom) + 20rpx); |
| | | background: #f6f8fc; |
| | | display: flex; |
| | | justify-content: center; |
| | | } |
| | | |
| | | &__logout { |
| | | width: 186rpx; |
| | | height: 70rpx; |
| | | line-height: 70rpx; |
| | | border-radius: 999rpx; |
| | | background: #ffffff; |
| | | border: 1rpx solid #d8dde5; |
| | | font-size: 28rpx; |
| | | font-weight: 500; |
| | | color: #7e8794; |
| | | padding: 0; |
| | | |
| | | &::after { |
| | | border: 0; |
| | | } |
| | | |
| | | &--hover { |
| | | opacity: 0.92; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .income-card { |
| | | position: relative; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | gap: 20rpx; |
| | | padding: 10rpx 30rpx 40rpx 30rpx; |
| | | box-sizing: border-box; |
| | | height: calc(100vh - 44px - 50px); |
| | | background: linear-gradient( 180deg, #B5D2FF 0%, #FFFFFF 100%); |
| | | .index_list { |
| | | width: 100%; |
| | | background-image: url('../../static/image/ming_bg@2x.png'); |
| | | background-repeat: no-repeat; |
| | | background-size: 100% 100%; |
| | | overflow: hidden; |
| | | |
| | | &__left, |
| | | &__right { |
| | | position: relative; |
| | | z-index: 1; |
| | | } |
| | | |
| | | &__left { |
| | | flex: 1; |
| | | } |
| | | |
| | | &__label, |
| | | &__stat-label, |
| | | &__stat-value { |
| | | font-size: 24rpx; |
| | | color: rgba(255, 255, 255, 0.78); |
| | | } |
| | | |
| | | &__value { |
| | | display: block; |
| | | margin-top: 20rpx; |
| | | font-size: 52rpx; |
| | | line-height: 1; |
| | | font-weight: normal; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &__right { |
| | | display: flex; |
| | | flex-direction: column; |
| | | margin-top: 12rpx; |
| | | .index_list_item { |
| | | align-items: flex-end; |
| | | justify-content: flex-end; |
| | | gap: 18rpx; |
| | | padding-top: 12rpx; |
| | | } |
| | | |
| | | &__stat { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 10rpx; |
| | | } |
| | | } |
| | | |
| | | .menu-panel { |
| | | margin-top: 20rpx; |
| | | border-radius: 22rpx; |
| | | background: #ffffff; |
| | | overflow: hidden; |
| | | |
| | | &__item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | height: 102rpx; |
| | | padding: 0 24rpx; |
| | | box-sizing: border-box; |
| | | border-bottom: 1rpx solid #eef1f5; |
| | | |
| | | &:last-child { |
| | | border-bottom: 0; |
| | | } |
| | | } |
| | | |
| | | &__title { |
| | | font-size: 34rpx; |
| | | font-weight: 600; |
| | | color: #2b3139; |
| | | } |
| | | |
| | | &__right { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | gap: 10rpx; |
| | | } |
| | | |
| | | &__sub { |
| | | font-size: 26rpx; |
| | | white-space: nowrap; |
| | | |
| | | &--muted { |
| | | color: #b2b8c1; |
| | | } |
| | | |
| | | &--danger { |
| | | color: #ff5a4f; |
| | | } |
| | | |
| | | &--warning { |
| | | color: #ff7b38; |
| | | } |
| | | |
| | | &--primary { |
| | | color: #2b7cff; |
| | | } |
| | | } |
| | | |
| | | &__arrow { |
| | | width: 16rpx; |
| | | height: 28rpx; |
| | | image { |
| | | width: 100%; |
| | | height: 200rpx; |
| | | margin-bottom: 30rpx; |
| | | position: relative; |
| | | .index_list_item_info { |
| | | width: 100%; |
| | | height: 100%; |
| | | padding: 0 48rpx; |
| | | box-sizing: border-box; |
| | | display: flex; |
| | | justify-content: center; |
| | | flex-direction: column; |
| | | position: relative; |
| | | z-index: 99; |
| | | text { |
| | | &:nth-child(1) { |
| | | font-weight: bold; |
| | | font-size: 34rpx; |
| | | color: #FFFFFF; |
| | | } |
| | | &:nth-child(2) { |
| | | font-weight: 400; |
| | | font-size: 26rpx; |
| | | color: rgba(255,255,255,0.6); |
| | | margin-top: 10rpx; |
| | | } |
| | | } |
| | | } |
| | | image { |
| | | width: 100%; |
| | | height: 100%; |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | } |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="order-detail-page"> |
| | | <view v-if="!showMapStatus" class="order-detail-page__simple-nav" :style="{ paddingTop: statusBarHeight + 'px' }"> |
| | | <view class="order-detail-page__simple-nav-inner"> |
| | | <text class="order-detail-page__simple-nav-title">{{ detailStatus === 'rated' ? '订åå·²è¯ä»·' : '订å已宿' }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view v-if="showMapStatus" class="order-detail-page__fixed-top"> |
| | | <view class="order-detail-page__map-wrap"> |
| | | <map |
| | | class="order-detail-page__map" |
| | | :latitude="mapData.center.latitude" |
| | | :longitude="mapData.center.longitude" |
| | | :markers="mapData.markers" |
| | | :polyline="mapData.polyline" |
| | | :include-points="mapData.includePoints" |
| | | :scale="mapData.scale" |
| | | :enable-zoom="true" |
| | | :enable-scroll="true" |
| | | ></map> |
| | | <view class="order-detail-page__map-bubble"> |
| | | <text class="order-detail-page__map-bubble-text">å©ä½3.2kmï¼çº¦4åé</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="order-detail-page__status-bar"> |
| | | <view class="order-detail-page__status-left"> |
| | | <view class="order-detail-page__status-dot"></view> |
| | | <text class="order-detail-page__status-title">{{ statusTextMap[detailStatus] || 'å¾
åè´§' }}</text> |
| | | </view> |
| | | <view class="order-detail-page__status-right"> |
| | | <text v-if="detailStatus === 'pickup'" class="order-detail-page__status-cancel">åæ¶è®¢å</text> |
| | | <text class="order-detail-page__status-no">#1</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <scroll-view class="order-detail-page__body" scroll-y :style="bodyStyle"> |
| | | <view class="order-detail-page__content"> |
| | | <view class="order-detail-page__section order-detail-page__section--main"> |
| | | <view v-if="showMapStatus" class="order-detail-page__summary"> |
| | | <view class="order-detail-page__summary-left"> |
| | | <view class="order-detail-page__head-left"> |
| | | <text class="order-detail-page__time">35åéå
</text> |
| | | <text class="order-detail-page__time-sub">éè¾¾</text> |
| | | </view> |
| | | |
| | | <view class="order-detail-page__tags"> |
| | | <image class="order-detail-page__tag-icon" src="/static/image/ic_biaosuda@2x.png" mode="widthFix"></image> |
| | | <text class="order-detail-page__tag-text">è´µéç©å</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="order-detail-page__summary-right"> |
| | | <text class="order-detail-page__price">Â¥20.5</text> |
| | | <text class="order-detail-page__extra">å«å æ¥Â¥3.0</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view v-else class="order-detail-page__done-summary"> |
| | | <view class="order-detail-page__done-summary-left"> |
| | | <text class="order-detail-page__done-title">{{ detailStatus === 'rated' ? '订åå·²è¯ä»·' : '订å已宿' }}</text> |
| | | <view class="order-detail-page__tags order-detail-page__tags--done"> |
| | | <image class="order-detail-page__tag-icon" src="/static/image/ic_biaosuda@2x.png" mode="widthFix"></image> |
| | | <text class="order-detail-page__tag-text">è´µéç©å</text> |
| | | </view> |
| | | </view> |
| | | <view class="order-detail-page__done-summary-right"> |
| | | <view class="order-detail-page__done-price-row"> |
| | | <text v-if="detailStatus === 'rated'" class="order-detail-page__settled-tag">å·²ç»ç®</text> |
| | | <text class="order-detail-page__price">Â¥20.5</text> |
| | | </view> |
| | | <text class="order-detail-page__extra">å«å æ¥Â¥3.0</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="order-detail-page__route-list"> |
| | | <view class="order-detail-page__route-item"> |
| | | <view class="order-detail-page__route-left"> |
| | | <text class="order-detail-page__distance-top">349</text> |
| | | <text class="order-detail-page__distance-unit">m</text> |
| | | <view class="order-detail-page__route-divider"></view> |
| | | </view> |
| | | <view class="order-detail-page__route-main"> |
| | | <view class="order-detail-page__route-texts"> |
| | | <text class="order-detail-page__route-title">ä¸éå¿«è¿åç«æè°åº</text> |
| | | <text class="order-detail-page__route-desc">è²è±è·¯200å·è²è±äº§ä¸åFæ 401</text> |
| | | </view> |
| | | <view class="order-detail-page__route-actions"> |
| | | <image class="order-detail-page__route-icon" src="/static/image/ic_c1all@2x.png" mode="aspectFit"></image> |
| | | <image class="order-detail-page__route-icon" src="/static/image/ic_daohang@2x.png" mode="aspectFit"></image> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="order-detail-page__route-item order-detail-page__route-item--end"> |
| | | <view class="order-detail-page__route-left"> |
| | | <view class="order-detail-page__route-pin"></view> |
| | | <view class="order-detail-page__route-divider order-detail-page__route-divider--light"></view> |
| | | <text class="order-detail-page__distance-top">12.5</text> |
| | | <text class="order-detail-page__distance-unit">km</text> |
| | | </view> |
| | | <view class="order-detail-page__route-main"> |
| | | <view class="order-detail-page__route-texts"> |
| | | <text class="order-detail-page__route-title">ä½³èå·´é»é½å¸3æ10æ 301室</text> |
| | | <text class="order-detail-page__route-desc">æ´åºæ¹è·¯ä¸æ¹å路交åå£è¥¿150ç±³</text> |
| | | </view> |
| | | <view class="order-detail-page__route-actions"> |
| | | <image class="order-detail-page__route-icon" src="/static/image/ic_c1all@2x.png" mode="aspectFit"></image> |
| | | <image class="order-detail-page__route-icon" src="/static/image/ic_daohang@2x.png" mode="aspectFit"></image> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view v-if="showMapStatus" class="order-detail-page__qrcode-wrap"> |
| | | <view class="order-detail-page__qrcode-box"> |
| | | <image class="order-detail-page__qrcode-image" src="/static/logo.png" mode="aspectFit"></image> |
| | | </view> |
| | | <text class="order-detail-page__qrcode-value">767889</text> |
| | | <text class="order-detail-page__qrcode-label">åè´§ç </text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="order-detail-page__section"> |
| | | <text class="order-detail-page__section-title">客æ·ä¿¡æ¯</text> |
| | | <view class="order-detail-page__row-info"> |
| | | <text class="order-detail-page__row-text">åå
çï¼ææºå·2878ï¼</text> |
| | | <image class="order-detail-page__row-icon" src="/static/image/ic_call@2x.png" mode="aspectFit"></image> |
| | | </view> |
| | | <view v-if="detailStatus === 'rated'" class="order-detail-page__comment-card"> |
| | | <text class="order-detail-page__comment-title">客æ·å·²è¯ä»·ï¼</text> |
| | | <view class="order-detail-page__comment-score"> |
| | | <text class="order-detail-page__comment-star">â
</text> |
| | | <text class="order-detail-page__comment-score-text">4.5</text> |
| | | </view> |
| | | <text class="order-detail-page__comment-content">éçå¾å¿«ï¼ä¸è¥¿å®å¥½æ æ</text> |
| | | <image class="order-detail-page__comment-image" src="/static/logo.png" mode="aspectFill"></image> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="order-detail-page__section"> |
| | | <text class="order-detail-page__section-title">ç©åæ¸
åï¼å
±8ä»¶ï¼</text> |
| | | <view class="order-detail-page__goods-list"> |
| | | <view v-for="item in goodsList" :key="item.name" class="order-detail-page__goods-item"> |
| | | <text class="order-detail-page__goods-name">{{ item.name }}</text> |
| | | <text class="order-detail-page__goods-count">x{{ item.count }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="order-detail-page__section"> |
| | | <text class="order-detail-page__section-title">ç©åä¿¡æ¯</text> |
| | | <text class="order-detail-page__goods-category">æä»¶</text> |
| | | <view class="order-detail-page__photos"> |
| | | <image v-for="(item, index) in photos" :key="index" class="order-detail-page__photo" :src="item" mode="aspectFill"></image> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="order-detail-page__section order-detail-page__section--last"> |
| | | <text class="order-detail-page__section-title">订åä¿¡æ¯</text> |
| | | <view class="order-detail-page__detail-list"> |
| | | <view class="order-detail-page__detail-item"> |
| | | <text class="order-detail-page__detail-label">订åç¼å·ï¼</text> |
| | | <text class="order-detail-page__detail-value">202107131749250001</text> |
| | | </view> |
| | | <view class="order-detail-page__detail-item"> |
| | | <text class="order-detail-page__detail-label">ä¸åæ¶é´ï¼</text> |
| | | <text class="order-detail-page__detail-value">2026-04-12 12:00:00</text> |
| | | </view> |
| | | <view class="order-detail-page__detail-item"> |
| | | <text class="order-detail-page__detail-label">æ¥åæ¶é´ï¼</text> |
| | | <text class="order-detail-page__detail-value">2026-04-12 12:00:00</text> |
| | | </view> |
| | | <view class="order-detail-page__detail-item"> |
| | | <text class="order-detail-page__detail-label">订å夿³¨ï¼</text> |
| | | <text class="order-detail-page__detail-value">-</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </scroll-view> |
| | | |
| | | <view v-if="footerButtons.length" class="order-detail-page__footer"> |
| | | <button |
| | | v-for="button in footerButtons" |
| | | :key="button.text" |
| | | class="order-detail-page__footer-btn" |
| | | :class="button.primary ? 'order-detail-page__footer-btn--primary' : 'order-detail-page__footer-btn--ghost'" |
| | | hover-class="order-detail-page__footer-btn--hover" |
| | | @click="handleFooterAction(button)" |
| | | > |
| | | {{ button.text }} |
| | | </button> |
| | | </view> |
| | | |
| | | <u-popup :show="showPhotoPopup" round="20" mode="bottom" @close="closePhotoPopup"> |
| | | <view class="photo-popup"> |
| | | <view class="photo-popup__header"> |
| | | <view class="photo-popup__placeholder"></view> |
| | | <text class="photo-popup__title">{{ photoPopupTitle }}</text> |
| | | <image class="photo-popup__close" src="/static/image/ic_close2@2x.png" mode="aspectFit" @click="closePhotoPopup"></image> |
| | | </view> |
| | | |
| | | <view class="photo-popup__section"> |
| | | <view class="photo-popup__label-row"> |
| | | <text class="photo-popup__label">{{ photoPopupLabel }}</text> |
| | | <text class="photo-popup__required">*</text> |
| | | <text class="photo-popup__hint">æå¤3å¼ ç
§ç</text> |
| | | </view> |
| | | |
| | | <view class="photo-popup__photos"> |
| | | <view class="photo-popup__upload-card"> |
| | | <image class="photo-popup__upload-icon" src="/static/image/ic_photo@2x.png" mode="aspectFit"></image> |
| | | <text class="photo-popup__upload-text">ç¹å»æç
§</text> |
| | | </view> |
| | | |
| | | <view class="photo-popup__preview-card"> |
| | | <image class="photo-popup__preview-image" src="/static/logo.png" mode="aspectFill"></image> |
| | | <view class="photo-popup__preview-mask"> |
| | | <text class="photo-popup__preview-delete">å é¤</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="photo-popup__section photo-popup__section--remark"> |
| | | <text class="photo-popup__remark-title">夿³¨ä¿¡æ¯</text> |
| | | <textarea v-model="photoRemark" class="photo-popup__textarea" maxlength="200" placeholder="请è¾å
¥" placeholder-style="color: #c7cbd3;" /> |
| | | </view> |
| | | |
| | | <button class="photo-popup__submit" hover-class="photo-popup__submit--hover" @click="submitPhotoPopup">{{ photoPopupSubmitText }}</button> |
| | | </view> |
| | | </u-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | detailStatus: 'pickup', |
| | | statusBarHeight: 0, |
| | | topFixedHeight: 0, |
| | | showPhotoPopup: false, |
| | | photoPopupMode: '', |
| | | photoRemark: '', |
| | | statusTextMap: { |
| | | pickup: 'å¾
åè´§', |
| | | delivering: 'é
éä¸', |
| | | finished: '已宿', |
| | | rated: 'å·²è¯ä»·', |
| | | cancelled: '已忶' |
| | | }, |
| | | goodsList: [ |
| | | { name: 'å¤§ä»¶è¡æ', count: 1 }, |
| | | { name: 'ä¸ä»¶è¡æ', count: 2 }, |
| | | { name: 'å°ä»¶è¡æ', count: 3 }, |
| | | { name: 'èå
', count: 2 } |
| | | ], |
| | | photos: ['/static/logo.png', '/static/logo.png', '/static/logo.png'] |
| | | } |
| | | }, |
| | | computed: { |
| | | showMapStatus() { |
| | | return this.detailStatus === 'pickup' || this.detailStatus === 'delivering' |
| | | }, |
| | | mapData() { |
| | | const startPoint = { latitude: 31.829512, longitude: 117.239211 } |
| | | const endPoint = { latitude: 31.841268, longitude: 117.278695 } |
| | | const routePoints = [ |
| | | startPoint, |
| | | { latitude: 31.831624, longitude: 117.247836 }, |
| | | { latitude: 31.834918, longitude: 117.255467 }, |
| | | { latitude: 31.838214, longitude: 117.265358 }, |
| | | { latitude: 31.840126, longitude: 117.272481 }, |
| | | endPoint |
| | | ] |
| | | |
| | | return { |
| | | center: { latitude: 31.83539, longitude: 117.258953 }, |
| | | markers: [ |
| | | { id: 1, latitude: startPoint.latitude, longitude: startPoint.longitude, iconPath: '/static/image/map_marker_start.svg', width: 32, height: 38, anchor: { x: 0.5, y: 1 } }, |
| | | { id: 2, latitude: endPoint.latitude, longitude: endPoint.longitude, iconPath: '/static/image/map_marker_end.svg', width: 32, height: 38, anchor: { x: 0.5, y: 1 } } |
| | | ], |
| | | polyline: [ |
| | | { points: routePoints, color: '#00c67a', width: 20, arrowLine: true, dottedLine: true, borderColor: '#469972', borderWidth: 10 } |
| | | ], |
| | | includePoints: routePoints, |
| | | scale: 12 |
| | | } |
| | | }, |
| | | bodyStyle() { |
| | | const footerHeight = uni.upx2px(116) |
| | | const simpleNavHeight = this.statusBarHeight + uni.upx2px(88) |
| | | return { |
| | | paddingTop: (this.showMapStatus ? this.topFixedHeight : simpleNavHeight) + 'px', |
| | | height: `calc(100vh - ${this.footerButtons.length ? footerHeight : 0}px)` |
| | | } |
| | | }, |
| | | footerButtons() { |
| | | const buttonMap = { |
| | | pickup: [ |
| | | { text: 'åæ¶è®¢å', primary: false }, |
| | | { text: 'æç
§åè´§', primary: true } |
| | | ], |
| | | delivering: [ |
| | | { text: 'æç
§éè¾¾', primary: true } |
| | | ], |
| | | finished: [], |
| | | rated: [], |
| | | cancelled: [] |
| | | } |
| | | |
| | | return buttonMap[this.detailStatus] || [] |
| | | }, |
| | | photoPopupTitle() { |
| | | return this.photoPopupMode === 'delivering' ? 'æç
§éè¾¾' : 'æç
§åè´§' |
| | | }, |
| | | photoPopupLabel() { |
| | | return this.photoPopupMode === 'delivering' ? 'ææéè¾¾ç
§ç' : 'ææåè´§ç
§ç' |
| | | }, |
| | | photoPopupSubmitText() { |
| | | return this.photoPopupMode === 'delivering' ? '确认éè¾¾' : '确认åè´§' |
| | | } |
| | | }, |
| | | onLoad() { |
| | | const pages = getCurrentPages() |
| | | const currentPage = pages[pages.length - 1] |
| | | const options = currentPage && currentPage.options ? currentPage.options : {} |
| | | const systemInfo = uni.getSystemInfoSync() |
| | | this.statusBarHeight = systemInfo.statusBarHeight || 0 |
| | | this.detailStatus = options.status || 'pickup' |
| | | this.topFixedHeight = uni.upx2px(500 + 92) |
| | | }, |
| | | methods: { |
| | | handleFooterAction(button) { |
| | | if (!button.primary) { |
| | | return |
| | | } |
| | | |
| | | this.photoPopupMode = this.detailStatus === 'delivering' ? 'delivering' : 'pickup' |
| | | this.showPhotoPopup = true |
| | | }, |
| | | closePhotoPopup() { |
| | | this.showPhotoPopup = false |
| | | }, |
| | | submitPhotoPopup() { |
| | | this.showPhotoPopup = false |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .order-detail-page { |
| | | height: 100vh; |
| | | background: #f6f8fc; |
| | | overflow: hidden; |
| | | |
| | | &__simple-nav { |
| | | position: fixed; |
| | | left: 0; |
| | | top: 0; |
| | | right: 0; |
| | | z-index: 11; |
| | | background: #106EFA; |
| | | } |
| | | |
| | | &__simple-nav-inner { |
| | | height: 88rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 0 24rpx; |
| | | } |
| | | |
| | | &__simple-nav-title { |
| | | font-size: 36rpx; |
| | | font-weight: 700; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &__fixed-top { |
| | | position: fixed; |
| | | left: 0; |
| | | top: 0; |
| | | right: 0; |
| | | z-index: 10; |
| | | background: #ffffff; |
| | | } |
| | | |
| | | &__map-wrap { |
| | | position: relative; |
| | | margin: 0; |
| | | height: 500rpx; |
| | | border-radius: 0; |
| | | overflow: hidden; |
| | | background: #dbe8ff; |
| | | } |
| | | |
| | | &__map { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | |
| | | &__map-bubble { |
| | | position: absolute; |
| | | left: 34rpx; |
| | | bottom: 32rpx; |
| | | padding: 12rpx 18rpx; |
| | | border-radius: 14rpx; |
| | | background: rgba(255, 255, 255, 0.96); |
| | | box-shadow: 0 8rpx 18rpx rgba(23, 74, 163, 0.12); |
| | | } |
| | | |
| | | &__map-bubble-text { |
| | | font-size: 24rpx; |
| | | font-weight: 600; |
| | | color: #2f6ff2; |
| | | } |
| | | |
| | | &__status-bar { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | height: 92rpx; |
| | | padding: 0 24rpx; |
| | | background: #d9e8ff; |
| | | } |
| | | |
| | | &__status-left, |
| | | &__status-right { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | &__status-dot { |
| | | width: 18rpx; |
| | | height: 18rpx; |
| | | border-radius: 6rpx; |
| | | background: #2b7cff; |
| | | margin-right: 12rpx; |
| | | } |
| | | |
| | | &__status-title, |
| | | &__status-no { |
| | | font-size: 34rpx; |
| | | font-weight: 700; |
| | | color: #2b3139; |
| | | } |
| | | |
| | | &__status-cancel { |
| | | padding: 8rpx 18rpx; |
| | | margin-right: 18rpx; |
| | | border: 2rpx solid #72a8ff; |
| | | border-radius: 999rpx; |
| | | font-size: 24rpx; |
| | | color: #2b7cff; |
| | | background: rgba(255, 255, 255, 0.7); |
| | | } |
| | | |
| | | &__body { |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | &__content { |
| | | padding: 16rpx 0 calc(env(safe-area-inset-bottom) + 26rpx); |
| | | } |
| | | |
| | | &__section { |
| | | margin: 16rpx 20rpx 0; |
| | | padding: 26rpx 22rpx; |
| | | border-radius: 20rpx; |
| | | background: #ffffff; |
| | | |
| | | &--main { |
| | | margin-top: 0; |
| | | } |
| | | |
| | | &--last { |
| | | margin-bottom: calc(env(safe-area-inset-bottom) + 26rpx); |
| | | } |
| | | } |
| | | |
| | | &__summary { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: flex-start; |
| | | } |
| | | |
| | | &__done-summary { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: flex-start; |
| | | gap: 20rpx; |
| | | } |
| | | |
| | | &__done-summary-left { |
| | | flex: 1; |
| | | min-width: 0; |
| | | } |
| | | |
| | | &__done-summary-right { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: flex-end; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__done-title { |
| | | font-size: 38rpx; |
| | | font-weight: 700; |
| | | color: #2b3139; |
| | | } |
| | | |
| | | &__done-price-row { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 10rpx; |
| | | } |
| | | |
| | | &__settled-tag { |
| | | padding: 4rpx 10rpx; |
| | | border-radius: 8rpx; |
| | | border: 1rpx solid #ff8f8f; |
| | | font-size: 22rpx; |
| | | font-weight: 600; |
| | | color: #ff6a6a; |
| | | background: #fff4f4; |
| | | } |
| | | |
| | | &__summary-left { |
| | | flex: 1; |
| | | min-width: 0; |
| | | } |
| | | |
| | | &__summary-right { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: flex-end; |
| | | margin-left: 20rpx; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__head-left { |
| | | display: flex; |
| | | align-items: baseline; |
| | | } |
| | | |
| | | &__time { |
| | | font-size: 42rpx; |
| | | font-weight: 700; |
| | | color: #ff972c; |
| | | } |
| | | |
| | | &__time-sub, |
| | | &__extra, |
| | | &__route-desc, |
| | | &__qrcode-label, |
| | | &__detail-label, |
| | | &__detail-value, |
| | | &__goods-count, |
| | | &__row-text, |
| | | &__goods-category { |
| | | font-size: 24rpx; |
| | | color: #adb3bd; |
| | | } |
| | | |
| | | &__time-sub { |
| | | margin-left: 8rpx; |
| | | } |
| | | |
| | | &__price { |
| | | font-size: 44rpx; |
| | | font-weight: 700; |
| | | color: #ff4132; |
| | | } |
| | | |
| | | &__extra { |
| | | margin-top: 6rpx; |
| | | } |
| | | |
| | | &__tags { |
| | | display: flex; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | gap: 12rpx; |
| | | margin-top: 14rpx; |
| | | |
| | | &--done { |
| | | margin-top: 12rpx; |
| | | } |
| | | } |
| | | |
| | | &__tag-icon { |
| | | width: 108rpx; |
| | | height: 40rpx; |
| | | } |
| | | |
| | | &__tag-text { |
| | | padding: 5rpx 12rpx; |
| | | border-radius: 8rpx; |
| | | background: #ff9c45; |
| | | font-size: 22rpx; |
| | | font-weight: 600; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &__route-list { |
| | | margin-top: 22rpx; |
| | | } |
| | | |
| | | &__route-item { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | |
| | | &--end { |
| | | margin-top: 24rpx; |
| | | } |
| | | } |
| | | |
| | | &__route-left { |
| | | width: 60rpx; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__distance-top { |
| | | font-size: 28rpx; |
| | | font-weight: 600; |
| | | color: #515866; |
| | | } |
| | | |
| | | &__distance-unit { |
| | | font-size: 22rpx; |
| | | color: #939aa6; |
| | | } |
| | | |
| | | &__route-divider { |
| | | width: 4rpx; |
| | | height: 42rpx; |
| | | margin-top: 8rpx; |
| | | border-radius: 999rpx; |
| | | background: #d7dbe2; |
| | | |
| | | &--light { |
| | | height: 18rpx; |
| | | margin: 8rpx 0; |
| | | } |
| | | } |
| | | |
| | | &__route-pin { |
| | | width: 18rpx; |
| | | height: 18rpx; |
| | | margin-top: 4rpx; |
| | | border-radius: 50%; |
| | | background: #888f9b; |
| | | } |
| | | |
| | | &__route-main { |
| | | flex: 1; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | gap: 18rpx; |
| | | } |
| | | |
| | | &__route-texts { |
| | | flex: 1; |
| | | min-width: 0; |
| | | } |
| | | |
| | | &__route-title { |
| | | display: block; |
| | | font-size: 38rpx; |
| | | font-weight: 700; |
| | | line-height: 1.3; |
| | | color: #2b3139; |
| | | } |
| | | |
| | | &__route-desc { |
| | | display: block; |
| | | margin-top: 8rpx; |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | &__route-actions { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 12rpx; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__route-icon, |
| | | &__row-icon { |
| | | width: 40rpx; |
| | | height: 40rpx; |
| | | } |
| | | |
| | | &__qrcode-wrap { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | padding-top: 30rpx; |
| | | } |
| | | |
| | | &__qrcode-box { |
| | | width: 360rpx; |
| | | height: 360rpx; |
| | | padding: 16rpx; |
| | | border-radius: 8rpx; |
| | | border: 2rpx solid #EEEEEE; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | &__qrcode-image { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | |
| | | &__qrcode-value { |
| | | margin-top: 16rpx; |
| | | font-size: 40rpx; |
| | | font-weight: 700; |
| | | color: #303640; |
| | | } |
| | | |
| | | &__qrcode-label { |
| | | margin-top: 6rpx; |
| | | } |
| | | |
| | | &__section-title { |
| | | display: block; |
| | | font-size: 32rpx; |
| | | font-weight: 700; |
| | | color: #2b3139; |
| | | } |
| | | |
| | | &__row-info { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | gap: 16rpx; |
| | | margin-top: 26rpx; |
| | | } |
| | | |
| | | &__row-text { |
| | | flex: 1; |
| | | font-size: 28rpx; |
| | | color: #4d5562; |
| | | } |
| | | |
| | | &__comment-card { |
| | | margin-top: 20rpx; |
| | | padding: 22rpx 20rpx; |
| | | border-radius: 16rpx; |
| | | background: #f7f8fa; |
| | | } |
| | | |
| | | &__comment-title, |
| | | &__comment-content, |
| | | &__comment-score-text { |
| | | font-size: 28rpx; |
| | | color: #4d5562; |
| | | } |
| | | |
| | | &__comment-score { |
| | | display: flex; |
| | | align-items: center; |
| | | margin-top: 10rpx; |
| | | } |
| | | |
| | | &__comment-star { |
| | | font-size: 28rpx; |
| | | color: #ffb323; |
| | | margin-right: 8rpx; |
| | | } |
| | | |
| | | &__comment-content { |
| | | display: block; |
| | | margin-top: 12rpx; |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | &__comment-image { |
| | | width: 92rpx; |
| | | height: 92rpx; |
| | | border-radius: 10rpx; |
| | | margin-top: 14rpx; |
| | | } |
| | | |
| | | &__goods-list, |
| | | &__detail-list { |
| | | margin-top: 22rpx; |
| | | } |
| | | |
| | | &__goods-item, |
| | | &__detail-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 8rpx 0; |
| | | } |
| | | |
| | | &__goods-name { |
| | | font-size: 28rpx; |
| | | color: #4d5562; |
| | | } |
| | | |
| | | &__goods-category { |
| | | display: block; |
| | | margin-top: 24rpx; |
| | | font-size: 28rpx; |
| | | color: #4d5562; |
| | | } |
| | | |
| | | &__photos { |
| | | display: flex; |
| | | gap: 16rpx; |
| | | margin-top: 18rpx; |
| | | } |
| | | |
| | | &__photo { |
| | | width: 92rpx; |
| | | height: 92rpx; |
| | | border-radius: 10rpx; |
| | | } |
| | | |
| | | &__detail-label { |
| | | color: #aeb4be; |
| | | } |
| | | |
| | | &__detail-value { |
| | | color: #666d79; |
| | | } |
| | | |
| | | &__footer { |
| | | position: fixed; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | gap: 20rpx; |
| | | padding: 14rpx 20rpx calc(env(safe-area-inset-bottom) + 14rpx); |
| | | background: #ffffff; |
| | | box-shadow: 0 -8rpx 20rpx rgba(30, 46, 80, 0.06); |
| | | } |
| | | |
| | | &__footer-btn { |
| | | width: 182rpx; |
| | | height: 68rpx; |
| | | line-height: 68rpx; |
| | | padding: 0; |
| | | border-radius: 999rpx; |
| | | font-size: 28rpx; |
| | | font-weight: 500; |
| | | border: 1rpx solid transparent; |
| | | |
| | | &::after { |
| | | border: 0; |
| | | } |
| | | |
| | | &--ghost { |
| | | background: #ffffff; |
| | | border-color: #d8dde5; |
| | | color: #959daa; |
| | | } |
| | | |
| | | &--primary { |
| | | background: #2d7cff; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &--hover { |
| | | opacity: 0.92; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .photo-popup { |
| | | padding: 30rpx 28rpx calc(env(safe-area-inset-bottom) + 28rpx); |
| | | background: #ffffff; |
| | | border-top-left-radius: 20rpx; |
| | | border-top-right-radius: 20rpx; |
| | | overflow: hidden; |
| | | |
| | | &__header { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | } |
| | | |
| | | &__placeholder, |
| | | &__close { |
| | | width: 36rpx; |
| | | height: 36rpx; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__placeholder { |
| | | opacity: 0; |
| | | } |
| | | |
| | | &__title { |
| | | font-size: 34rpx; |
| | | font-weight: 700; |
| | | color: #111111; |
| | | } |
| | | |
| | | &__section { |
| | | margin-top: 54rpx; |
| | | |
| | | &--remark { |
| | | margin-top: 48rpx; |
| | | } |
| | | } |
| | | |
| | | &__label-row { |
| | | display: flex; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | } |
| | | |
| | | &__label, |
| | | &__remark-title { |
| | | font-size: 28rpx; |
| | | font-weight: 700; |
| | | color: #23262d; |
| | | } |
| | | |
| | | &__required { |
| | | margin-left: 4rpx; |
| | | font-size: 28rpx; |
| | | font-weight: 700; |
| | | color: #ff3b30; |
| | | } |
| | | |
| | | &__hint { |
| | | margin-left: 12rpx; |
| | | font-size: 24rpx; |
| | | color: #a8adb7; |
| | | } |
| | | |
| | | &__photos { |
| | | display: flex; |
| | | gap: 18rpx; |
| | | margin-top: 28rpx; |
| | | } |
| | | |
| | | &__upload-card, |
| | | &__preview-card { |
| | | position: relative; |
| | | width: 160rpx; |
| | | height: 160rpx; |
| | | border-radius: 8rpx; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | &__upload-card { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | border: 2rpx solid #ebedf2; |
| | | background: #f8f9fb; |
| | | } |
| | | |
| | | &__upload-icon { |
| | | width: 48rpx; |
| | | height: 48rpx; |
| | | opacity: 0.55; |
| | | } |
| | | |
| | | &__upload-text { |
| | | margin-top: 12rpx; |
| | | font-size: 26rpx; |
| | | color: #a0a6b0; |
| | | } |
| | | |
| | | &__preview-card { |
| | | background: #eef1f5; |
| | | } |
| | | |
| | | &__preview-image { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | |
| | | &__preview-mask { |
| | | position: absolute; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | height: 48rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | background: rgba(0, 0, 0, 0.42); |
| | | } |
| | | |
| | | &__preview-delete { |
| | | font-size: 26rpx; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &__textarea { |
| | | width: 100%; |
| | | height: 110rpx; |
| | | margin-top: 24rpx; |
| | | padding: 28rpx 24rpx; |
| | | border-radius: 12rpx; |
| | | background: #f7f8fa; |
| | | font-size: 30rpx; |
| | | color: #2c3139; |
| | | } |
| | | |
| | | &__submit { |
| | | width: 100%; |
| | | height: 88rpx; |
| | | line-height: 88rpx; |
| | | margin-top: 86rpx; |
| | | border-radius: 50rpx; |
| | | background: #106efa; |
| | | font-size: 32rpx; |
| | | font-weight: 700; |
| | | color: #ffffff; |
| | | border: 0; |
| | | padding: 0; |
| | | |
| | | &::after { |
| | | border: 0; |
| | | } |
| | | |
| | | &--hover { |
| | | opacity: 0.92; |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <view> |
| | | |
| | | <view class="order-page"> |
| | | <view class="order-page__nav" :style="{ paddingTop: statusBarHeight + 'px' }"> |
| | | <view class="order-page__nav-inner"> |
| | | <text class="order-page__nav-title">æç订å</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="order-page__tabs" :style="{ top: navHeight + 'px' }"> |
| | | <view v-for="tab in displayTabs" :key="tab.value" class="order-page__tab" :class="{ 'order-page__tab--active': activeTab === tab.value }" @click="activeTab = tab.value"> |
| | | <text class="order-page__tab-text">{{ tab.label }}</text> |
| | | <view v-if="activeTab === tab.value" class="order-page__tab-line"></view> |
| | | </view> |
| | | </view> |
| | | |
| | | <scroll-view class="order-page__body" scroll-y :style="bodyStyle"> |
| | | <view class="order-page__list"> |
| | | <view v-for="item in currentOrders" :key="item.id" class="order-card" @click="goToOrderDetail(item)"> |
| | | <view class="order-card__head"> |
| | | <view class="order-card__head-left"> |
| | | <image class="order-card__badge-icon" :src="getBadgeIcon(item.badge)" mode="widthFix"></image> |
| | | <text class="order-card__time-text">ä¸åæ¶é´: {{ item.orderTime }}</text> |
| | | </view> |
| | | <text class="order-card__status" :class="{ 'order-card__status--highlight': item.actions && item.actions.length }">{{ item.statusText }}</text> |
| | | </view> |
| | | |
| | | <view class="order-card__route-item"> |
| | | <view class="order-card__point order-card__point--pickup">å</view> |
| | | <view class="order-card__route-texts"> |
| | | <text class="order-card__route-title">{{ item.pickupName }}</text> |
| | | <text class="order-card__route-desc">{{ item.pickupAddress }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="order-card__route-item order-card__route-item--delivery"> |
| | | <view class="order-card__point order-card__point--delivery">é</view> |
| | | <view class="order-card__route-texts"> |
| | | <text class="order-card__route-title">{{ item.deliveryName }}</text> |
| | | <text class="order-card__route-desc">{{ item.deliveryAddress }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="order-card__footer"> |
| | | <view class="order-card__arrival"> |
| | | <image class="order-card__clock" src="/static/image/ic_clock@2x.png" mode="aspectFit"></image> |
| | | <text class="order-card__arrival-text">{{ item.arriveLabel || 'éè¾¾æ¶é´ï¼' }}{{ item.arriveTime }}</text> |
| | | </view> |
| | | <view class="order-card__price-wrap"> |
| | | <text v-if="item.priceTag" class="order-card__price-tag">{{ item.priceTag }}</text> |
| | | <text class="order-card__price">{{ item.price }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view v-if="item.actions && item.actions.length" class="order-card__actions"> |
| | | <button |
| | | v-for="action in item.actions" |
| | | :key="action.text" |
| | | class="order-card__action-btn" |
| | | :class="['order-card__action-btn--' + action.type, { 'order-card__action-btn--primary-fill': action.fill }]" |
| | | hover-class="order-card__action-btn--hover" |
| | | > |
| | | {{ action.text }} |
| | | </button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </scroll-view> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | export default { |
| | | data() { |
| | | return { |
| | | |
| | | }; |
| | | statusBarHeight: 0, |
| | | navHeight: 0, |
| | | activeTab: 'all', |
| | | tabs: [ |
| | | { label: 'å
¨é¨', value: 'all' }, |
| | | { label: 'å¾
åè´§', value: 'pickup' }, |
| | | { label: 'é
éä¸', value: 'delivering' }, |
| | | { label: '已宿', value: 'finished' } |
| | | ], |
| | | orders: [ |
| | | { |
| | | id: 1, |
| | | type: 'pickup', |
| | | badge: 'æ éè¾¾', |
| | | badgeType: 'blue', |
| | | orderTime: '2026-04-12 12:09', |
| | | statusText: 'å¾
åè´§', |
| | | pickupName: 'ä¸éå¿«è¿åç«æè°åº', |
| | | pickupAddress: 'è²è±è·¯200å·è²è±äº§ä¸åFæ 401', |
| | | deliveryName: 'ä½³èå·´é»é½å¸3æ10æ 301室', |
| | | deliveryAddress: 'æ´åºæ¹è·¯ä¸æ¹å路交åå£è¥¿150ç±³', |
| | | arriveLabel: '', |
| | | arriveTime: '45åéå
éè¾¾', |
| | | priceTag: '', |
| | | price: 'Â¥20.5', |
| | | actions: [ |
| | | { text: 'åæ¶è®¢å', type: 'light', fill: false }, |
| | | { text: 'åè´§ç ', type: 'primary', fill: false }, |
| | | { text: 'æç
§åè´§', type: 'primary', fill: true } |
| | | ] |
| | | }, |
| | | { |
| | | id: 4, |
| | | type: 'pickup', |
| | | badge: 'æéè¾¾', |
| | | badgeType: 'red', |
| | | orderTime: '2026-04-12 12:33', |
| | | statusText: 'å¾
åè´§', |
| | | pickupName: 'ä¸éå¿«è¿åç«æè°åº', |
| | | pickupAddress: 'è²è±è·¯200å·è²è±äº§ä¸åFæ 401', |
| | | deliveryName: 'ä½³èå·´é»é½å¸3æ10æ 301室', |
| | | deliveryAddress: 'æ´åºæ¹è·¯ä¸æ¹å路交åå£è¥¿150ç±³', |
| | | arriveLabel: '', |
| | | arriveTime: '50åéå
éè¾¾', |
| | | priceTag: '', |
| | | price: 'Â¥20.5', |
| | | actions: [ |
| | | { text: 'åæ¶è®¢å', type: 'light', fill: false }, |
| | | { text: 'åè´§ç ', type: 'primary', fill: false }, |
| | | { text: 'æç
§åè´§', type: 'primary', fill: true } |
| | | ] |
| | | }, |
| | | { |
| | | id: 2, |
| | | type: 'delivering', |
| | | badge: 'æéè¾¾', |
| | | badgeType: 'red', |
| | | orderTime: '2026-04-12 12:33', |
| | | statusText: 'é
éä¸', |
| | | pickupName: 'ä¸éå¿«è¿åç«æè°åº', |
| | | pickupAddress: 'è²è±è·¯200å·è²è±äº§ä¸åFæ 401', |
| | | deliveryName: 'ä½³èå·´é»é½å¸3æ10æ 301室', |
| | | deliveryAddress: 'æ´åºæ¹è·¯ä¸æ¹å路交åå£è¥¿150ç±³', |
| | | arriveLabel: 'éè¾¾æ¶é´ï¼', |
| | | arriveTime: '04-12 12:58', |
| | | priceTag: '', |
| | | price: 'Â¥20.5' |
| | | }, |
| | | { |
| | | id: 5, |
| | | type: 'rated', |
| | | badge: 'æéè¾¾', |
| | | badgeType: 'red', |
| | | orderTime: '2026-04-12 13:08', |
| | | statusText: 'å·²è¯ä»·', |
| | | pickupName: 'ä¸éå¿«è¿åç«æè°åº', |
| | | pickupAddress: 'è²è±è·¯200å·è²è±äº§ä¸åFæ 401', |
| | | deliveryName: 'ä½³èå·´é»é½å¸3æ10æ 301室', |
| | | deliveryAddress: 'æ´åºæ¹è·¯ä¸æ¹å路交åå£è¥¿150ç±³', |
| | | arriveLabel: 'éè¾¾æ¶é´ï¼', |
| | | arriveTime: '04-12 13:36', |
| | | priceTag: '', |
| | | price: 'Â¥18.8' |
| | | }, |
| | | { |
| | | id: 6, |
| | | type: 'cancelled', |
| | | badge: 'æ éè¾¾', |
| | | badgeType: 'blue', |
| | | orderTime: '2026-04-12 13:18', |
| | | statusText: '已忶', |
| | | pickupName: 'ä¸éå¿«è¿åç«æè°åº', |
| | | pickupAddress: 'è²è±è·¯200å·è²è±äº§ä¸åFæ 401', |
| | | deliveryName: 'ä½³èå·´é»é½å¸3æ10æ 301室', |
| | | deliveryAddress: 'æ´åºæ¹è·¯ä¸æ¹å路交åå£è¥¿150ç±³', |
| | | arriveLabel: 'éè¾¾æ¶é´ï¼', |
| | | arriveTime: '04-12 13:52', |
| | | priceTag: '', |
| | | price: 'Â¥16.5' |
| | | }, |
| | | { |
| | | id: 3, |
| | | type: 'finished', |
| | | badge: 'æéè¾¾', |
| | | badgeType: 'red', |
| | | orderTime: '2026-04-12 12:33', |
| | | statusText: '已宿', |
| | | pickupName: 'ä¸éå¿«è¿åç«æè°åº', |
| | | pickupAddress: 'è²è±è·¯200å·è²è±äº§ä¸åFæ 401', |
| | | deliveryName: 'ä½³èå·´é»é½å¸3æ10æ 301室', |
| | | deliveryAddress: 'æ´åºæ¹è·¯ä¸æ¹å路交åå£è¥¿150ç±³', |
| | | arriveLabel: 'éè¾¾æ¶é´ï¼', |
| | | arriveTime: '04-12 12:58', |
| | | priceTag: 'å·²ç»ç®', |
| | | price: 'Â¥20.5' |
| | | } |
| | | ] |
| | | } |
| | | }, |
| | | computed: { |
| | | displayTabs() { |
| | | const countMap = { |
| | | pickup: this.orders.filter((item) => item.type === 'pickup').length, |
| | | delivering: this.orders.filter((item) => item.type === 'delivering').length, |
| | | finished: this.orders.filter((item) => item.type === 'finished').length |
| | | } |
| | | |
| | | return this.tabs.map((tab) => { |
| | | if (!countMap[tab.value]) { |
| | | return tab |
| | | } |
| | | |
| | | return { |
| | | ...tab, |
| | | label: `${tab.label} ${countMap[tab.value]}` |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | bodyStyle() { |
| | | return { |
| | | marginTop: this.navHeight + uni.upx2px(88) + 'px', |
| | | height: `calc(100vh - ${this.navHeight + uni.upx2px(88)}px)` |
| | | } |
| | | }, |
| | | currentOrders() { |
| | | if (this.activeTab === 'all') { |
| | | return this.orders |
| | | } |
| | | |
| | | return this.orders.filter((item) => item.type === this.activeTab) |
| | | } |
| | | }, |
| | | onLoad() { |
| | | const systemInfo = uni.getSystemInfoSync() |
| | | this.statusBarHeight = systemInfo.statusBarHeight || 0 |
| | | this.navHeight = this.statusBarHeight + uni.upx2px(88) |
| | | }, |
| | | methods: { |
| | | getBadgeIcon(badge) { |
| | | const badgeMap = { |
| | | 'æéè¾¾': '/static/image/ic_jisuda@2x.png', |
| | | 'æ éè¾¾': '/static/image/ic_biaosuda@2x.png' |
| | | } |
| | | |
| | | return badgeMap[badge] || '' |
| | | }, |
| | | goToOrderDetail(item) { |
| | | uni.navigateTo({ |
| | | url: `/pages/order-detail/order-detail?id=${item.id}&status=${item.type === 'delivering' ? 'delivering' : item.type === 'finished' ? 'finished' : item.type === 'cancelled' ? 'cancelled' : item.type === 'rated' ? 'rated' : 'pickup'}` |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | <style lang="scss" scoped> |
| | | .order-page { |
| | | height: 100vh; |
| | | background: #f5f7fb; |
| | | overflow: hidden; |
| | | |
| | | </style> |
| | | &__nav { |
| | | position: fixed; |
| | | left: 0; |
| | | top: 0; |
| | | right: 0; |
| | | z-index: 10; |
| | | background: linear-gradient(180deg, #1f73f6 0%, #1b6cf2 100%); |
| | | } |
| | | |
| | | &__nav-inner { |
| | | height: 88rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 0 28rpx; |
| | | } |
| | | |
| | | &__nav-title { |
| | | font-size: 38rpx; |
| | | font-weight: 700; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &__tabs { |
| | | position: fixed; |
| | | left: 0; |
| | | right: 0; |
| | | z-index: 9; |
| | | height: 88rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | background: #ffffff; |
| | | box-shadow: 0 10rpx 20rpx rgba(40, 72, 128, 0.04); |
| | | } |
| | | |
| | | &__tab { |
| | | position: relative; |
| | | flex: 1; |
| | | height: 100%; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | |
| | | &--active { |
| | | .order-page__tab-text { |
| | | color: #272b33; |
| | | font-weight: 700; |
| | | } |
| | | } |
| | | } |
| | | |
| | | &__tab-text { |
| | | font-size: 30rpx; |
| | | color: #8f96a3; |
| | | } |
| | | |
| | | &__tab-line { |
| | | position: absolute; |
| | | left: 26rpx; |
| | | right: 26rpx; |
| | | bottom: 0; |
| | | height: 4rpx; |
| | | border-radius: 999rpx; |
| | | background: #1a73f8; |
| | | } |
| | | |
| | | &__body { |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | &__list { |
| | | padding: 18rpx 22rpx calc(env(safe-area-inset-bottom) + 26rpx); |
| | | } |
| | | } |
| | | |
| | | .order-card { |
| | | margin-bottom: 18rpx; |
| | | padding: 20rpx 18rpx 18rpx; |
| | | border-radius: 20rpx; |
| | | background: #ffffff; |
| | | box-shadow: 0 8rpx 20rpx rgba(43, 65, 106, 0.05); |
| | | |
| | | &__head { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | } |
| | | |
| | | &__head-left { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 12rpx; |
| | | min-width: 0; |
| | | } |
| | | |
| | | &__badge { |
| | | padding: 4rpx 10rpx; |
| | | border-radius: 10rpx; |
| | | font-size: 22rpx; |
| | | line-height: 1.2; |
| | | font-weight: 600; |
| | | |
| | | &--blue { |
| | | border: 1rpx solid #75cfff; |
| | | color: #27a8f8; |
| | | background: #eefaff; |
| | | } |
| | | |
| | | &--red { |
| | | border: 1rpx solid #ff8f8f; |
| | | color: #ff5d5d; |
| | | background: #fff1f1; |
| | | } |
| | | } |
| | | |
| | | &__badge-icon { |
| | | width: 108rpx; |
| | | height: 40rpx; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__time-text, |
| | | &__status, |
| | | &__route-desc, |
| | | &__arrival-text { |
| | | font-size: 24rpx; |
| | | color: #a1a7b2; |
| | | } |
| | | |
| | | &__status { |
| | | flex-shrink: 0; |
| | | |
| | | &--highlight { |
| | | color: #ff4a3d; |
| | | font-weight: 700; |
| | | } |
| | | } |
| | | |
| | | &__route-item { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | margin-top: 22rpx; |
| | | |
| | | &--delivery { |
| | | margin-top: 20rpx; |
| | | } |
| | | } |
| | | |
| | | &__point { |
| | | width: 34rpx; |
| | | height: 34rpx; |
| | | line-height: 34rpx; |
| | | text-align: center; |
| | | border-radius: 50%; |
| | | font-size: 22rpx; |
| | | font-weight: 700; |
| | | color: #ffffff; |
| | | flex-shrink: 0; |
| | | margin-right: 16rpx; |
| | | |
| | | &--pickup { |
| | | background: #2ab8ff; |
| | | } |
| | | |
| | | &--delivery { |
| | | background: #ff9d2e; |
| | | } |
| | | } |
| | | |
| | | &__route-texts { |
| | | flex: 1; |
| | | min-width: 0; |
| | | } |
| | | |
| | | &__route-title { |
| | | display: block; |
| | | font-size: 34rpx; |
| | | font-weight: 700; |
| | | color: #2d3139; |
| | | line-height: 1.3; |
| | | } |
| | | |
| | | &__route-desc { |
| | | display: block; |
| | | margin-top: 8rpx; |
| | | line-height: 1.4; |
| | | } |
| | | |
| | | &__footer { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-top: 22rpx; |
| | | padding-top: 16rpx; |
| | | border-top: 1rpx solid #f0f2f6; |
| | | } |
| | | |
| | | &__arrival { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 10rpx; |
| | | } |
| | | |
| | | &__clock { |
| | | width: 24rpx; |
| | | height: 24rpx; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &__price-wrap { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 10rpx; |
| | | } |
| | | |
| | | &__price-tag { |
| | | padding: 3rpx 8rpx; |
| | | border-radius: 8rpx; |
| | | border: 1rpx solid #ff8f8f; |
| | | font-size: 22rpx; |
| | | font-weight: 600; |
| | | color: #ff6a6a; |
| | | background: #fff4f4; |
| | | } |
| | | |
| | | &__price { |
| | | font-size: 40rpx; |
| | | font-weight: 700; |
| | | color: #ff4030; |
| | | } |
| | | |
| | | &__actions { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | gap: 20rpx; |
| | | margin-top: 18rpx; |
| | | padding-top: 18rpx; |
| | | border-top: 1rpx solid #f0f2f6; |
| | | } |
| | | |
| | | &__action-btn { |
| | | width: 160rpx; |
| | | height: 64rpx; |
| | | line-height: 64rpx; |
| | | padding: 0; |
| | | border-radius: 34rpx; |
| | | font-size: 28rpx; |
| | | font-weight: 500; |
| | | border: 1rpx solid transparent; |
| | | background: #ffffff; |
| | | box-sizing: border-box; |
| | | |
| | | &::after { |
| | | border: 0; |
| | | } |
| | | |
| | | &--light { |
| | | border-color: #d7dbe3; |
| | | color: #8f96a3; |
| | | } |
| | | |
| | | &--primary { |
| | | border-color: #2c7cff; |
| | | color: #2c7cff; |
| | | } |
| | | |
| | | &--primary-fill { |
| | | background: #2c7cff; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &--hover { |
| | | opacity: 0.92; |
| | | } |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="box"> |
| | | <view class="box-item" @click="jump"> |
| | | <text>ä¿®æ¹å¯ç </text> |
| | | <image src="/static/image/mine_ar2@2x.png" mode="widthFix"></image> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | |
| | | }; |
| | | }, |
| | | methods: { |
| | | jump() { |
| | | uni.navigateTo({ |
| | | url: '/pages/change-password/change-password' |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .box { |
| | | width: 100%; |
| | | padding: 0 30rpx; |
| | | box-sizing: border-box; |
| | | .box-item { |
| | | width: 100%; |
| | | height: 104rpx; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | border-bottom: 1rpx solid #E5E5E5; |
| | | text { |
| | | font-weight: 400; |
| | | font-size: 30rpx; |
| | | color: #222222; |
| | | } |
| | | image { |
| | | width: 14rpx; |
| | | height: 28rpx; |
| | | } |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <svg width="64" height="76" viewBox="0 0 64 76" fill="none" xmlns="http://www.w3.org/2000/svg"> |
| | | <path d="M32 75C31.1 75 30.2 74.6 29.6 73.8C24.9 68.2 8 47.2 8 31C8 17.7 18.7 7 32 7C45.3 7 56 17.7 56 31C56 47.2 39.1 68.2 34.4 73.8C33.8 74.6 32.9 75 32 75Z" fill="#FF5A5A"/> |
| | | <circle cx="32" cy="31" r="19" fill="white"/> |
| | | <text x="32" y="37" text-anchor="middle" font-size="24" font-family="Arial, sans-serif" font-weight="700" fill="#FF5A5A">ç»</text> |
| | | </svg> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <svg width="64" height="76" viewBox="0 0 64 76" fill="none" xmlns="http://www.w3.org/2000/svg"> |
| | | <path d="M32 75C31.1 75 30.2 74.6 29.6 73.8C24.9 68.2 8 47.2 8 31C8 17.7 18.7 7 32 7C45.3 7 56 17.7 56 31C56 47.2 39.1 68.2 34.4 73.8C33.8 74.6 32.9 75 32 75Z" fill="#15BF74"/> |
| | | <circle cx="32" cy="31" r="19" fill="white"/> |
| | | <text x="32" y="37" text-anchor="middle" font-size="24" font-family="Arial, sans-serif" font-weight="700" fill="#15BF74">èµ·</text> |
| | | </svg> |
| | |
| | | |
| | | var isReady=false;var onReadyCallbacks=[]; |
| | | var isServiceReady=false;var onServiceReadyCallbacks=[]; |
| | | var __uniConfig = {"pages":["pages/guide-page/guide-page","pages/index/index","pages/mine/mine","pages/order/order","pages/message/message","pages/login/login"],"window":{"navigationBarTextStyle":"black","navigationBarTitleText":"uni-app","navigationBarBackgroundColor":"#F8F8F8","backgroundColor":"#F8F8F8"},"tabBar":{"color":"#999999","selectedColor":"#222222","borderStyle":"black","backgroundColor":"#fff","list":[{"pagePath":"pages/index/index","iconPath":"static/tabbar/nav_home_sel@2x.png","selectedIconPath":"static/tabbar/nav_home_sel@2x1.png","text":"大å
"},{"pagePath":"pages/order/order","iconPath":"static/tabbar/nav_order@2x.png","selectedIconPath":"static/tabbar/nav_order@2x1.png","text":"订å"},{"pagePath":"pages/message/message","iconPath":"static/tabbar/nav_xiaoxi@2x.png","selectedIconPath":"static/tabbar/nav_xiaoxi@2x1.png","text":"æ¶æ¯"},{"pagePath":"pages/mine/mine","iconPath":"static/tabbar/nav_mine@2x.png","selectedIconPath":"static/tabbar/nav_mine@2x1.png","text":"æç"}]},"darkmode":false,"nvueCompiler":"uni-app","nvueStyleCompiler":"uni-app","renderer":"auto","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":false},"appname":"é«éç«è¡æå¯å","compilerVersion":"5.07","entryPagePath":"pages/guide-page/guide-page","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000}}; |
| | | var __uniRoutes = [{"path":"/pages/guide-page/guide-page","meta":{"isQuit":true},"window":{"titleNView":false}},{"path":"/pages/index/index","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationStyle":"custom","titleNView":false}},{"path":"/pages/mine/mine","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"æç","navigationBarBackgroundColor":"#ffffff"}},{"path":"/pages/order/order","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"订å"}},{"path":"/pages/message/message","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"æ¶æ¯"}},{"path":"/pages/login/login","meta":{},"window":{"titleNView":false}}]; |
| | | var __uniConfig = {"pages":["pages/guide-page/guide-page","pages/index/index","pages/mine/mine","pages/order/order","pages/order-detail/order-detail","pages/message/message","pages/login/login","pages/settings/settings","pages/change-password/change-password","pages/driver-certification/driver-certification","pages/certification-details/certification-details"],"window":{"navigationBarTextStyle":"black","navigationBarTitleText":"uni-app","navigationBarBackgroundColor":"#F8F8F8","backgroundColor":"#F8F8F8"},"tabBar":{"color":"#999999","selectedColor":"#222222","borderStyle":"black","backgroundColor":"#fff","list":[{"pagePath":"pages/index/index","iconPath":"static/tabbar/nav_home_sel@2x.png","selectedIconPath":"static/tabbar/nav_home_sel@2x1.png","text":"大å
"},{"pagePath":"pages/order/order","iconPath":"static/tabbar/nav_order@2x.png","selectedIconPath":"static/tabbar/nav_order@2x1.png","text":"订å"},{"pagePath":"pages/message/message","iconPath":"static/tabbar/nav_xiaoxi@2x.png","selectedIconPath":"static/tabbar/nav_xiaoxi@2x1.png","text":"æ¶æ¯"},{"pagePath":"pages/mine/mine","iconPath":"static/tabbar/nav_mine@2x.png","selectedIconPath":"static/tabbar/nav_mine@2x1.png","text":"æç"}]},"darkmode":false,"nvueCompiler":"uni-app","nvueStyleCompiler":"uni-app","renderer":"auto","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":false},"appname":"é«éç«è¡æå¯å","compilerVersion":"5.07","entryPagePath":"pages/guide-page/guide-page","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000}}; |
| | | var __uniRoutes = [{"path":"/pages/guide-page/guide-page","meta":{"isQuit":true},"window":{"titleNView":false}},{"path":"/pages/index/index","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationStyle":"custom","titleNView":false}},{"path":"/pages/mine/mine","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationStyle":"custom","titleNView":false}},{"path":"/pages/order/order","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationStyle":"custom","titleNView":false}},{"path":"/pages/order-detail/order-detail","meta":{},"window":{"navigationStyle":"custom","titleNView":false}},{"path":"/pages/message/message","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationStyle":"custom","titleNView":false}},{"path":"/pages/login/login","meta":{},"window":{"titleNView":false}},{"path":"/pages/settings/settings","meta":{},"window":{"navigationBarTitleText":"设置"}},{"path":"/pages/change-password/change-password","meta":{},"window":{"navigationBarTitleText":"ä¿®æ¹å¯ç "}},{"path":"/pages/driver-certification/driver-certification","meta":{},"window":{"navigationBarTitleText":"叿ºè®¤è¯"}},{"path":"/pages/certification-details/certification-details","meta":{},"window":{"navigationBarTitleText":"叿ºè®¤è¯"}}]; |
| | | __uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}}); |
| | | __uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}}); |
| | | service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:Math.round(f/20)})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:void 0,window:void 0,document:void 0,frames:void 0,self:void 0,location:void 0,navigator:void 0,localStorage:void 0,history:void 0,Caches:void 0,screen:void 0,alert:void 0,confirm:void 0,prompt:void 0,fetch:void 0,XMLHttpRequest:void 0,WebSocket:void 0,webkit:void 0,print:void 0}}}}); |
| | |
| | | {"@platforms":["android","iPhone","iPad"],"id":"__UNI__965A7DA","name":"é«éç«è¡æå¯å","version":{"name":"1.0.0","code":"100"},"description":"","launch_path":"__uniappview.html","developer":{"name":"","email":"","url":""},"permissions":{"Push":{},"UniNView":{"description":"UniNViewåçæ¸²æ"}},"plus":{"useragent":{"value":"uni-app","concatenate":true},"splashscreen":{"target":"id:1","autoclose":true,"waiting":true,"delay":0},"popGesture":"close","launchwebview":{"id":"1","kernel":"WKWebview"},"statusbar":{"immersed":"supportedDevice","style":"dark","background":"#F8F8F8"},"usingComponents":true,"nvueStyleCompiler":"uni-app","compilerVersion":3,"distribute":{"icons":{"android":{"hdpi":""}},"google":{"permissions":["<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>","<uses-permission android:name=\"android.permission.VIBRATE\"/>","<uses-permission android:name=\"android.permission.READ_LOGS\"/>","<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>","<uses-feature android:name=\"android.hardware.camera.autofocus\"/>","<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.CAMERA\"/>","<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>","<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>","<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>","<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>","<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>","<uses-feature android:name=\"android.hardware.camera\"/>","<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>","<uses-permission android:name=\"android.permission.INTERNET\"/>","<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"]},"apple":{"dSYMs":false},"plugins":{"push":{"unipush":{"version":"2","offline":true,"honor":{},"meizu":{},"mi":{},"vivo":{},"oppo":{},"hms":{}}},"audio":{"mp3":{"description":"Androidå¹³å°å½é³æ¯æMP3æ ¼å¼æä»¶"}}}},"uniStatistics":{"enable":false},"allowsInlineMediaPlayback":true,"safearea":{"background":"#fff","bottom":{"offset":"auto"}},"uni-app":{"compilerVersion":"5.07","control":"uni-v3","nvueCompiler":"uni-app","renderer":"auto","nvue":{"flex-direction":"column"},"nvueLaunchMode":"normal"},"tabBar":{"color":"#999999","selectedColor":"#222222","borderStyle":"rgba(0,0,0,0.4)","backgroundColor":"#fff","list":[{"pagePath":"pages/index/index","iconPath":"static/tabbar/nav_home_sel@2x.png","selectedIconPath":"static/tabbar/nav_home_sel@2x1.png","text":"大å
"},{"pagePath":"pages/order/order","iconPath":"static/tabbar/nav_order@2x.png","selectedIconPath":"static/tabbar/nav_order@2x1.png","text":"订å"},{"pagePath":"pages/message/message","iconPath":"static/tabbar/nav_xiaoxi@2x.png","selectedIconPath":"static/tabbar/nav_xiaoxi@2x1.png","text":"æ¶æ¯"},{"pagePath":"pages/mine/mine","iconPath":"static/tabbar/nav_mine@2x.png","selectedIconPath":"static/tabbar/nav_mine@2x1.png","text":"æç"}],"height":"50px"},"launch_path":"__uniappview.html"},"locale":"zh-Hans"} |
| | | {"@platforms":["android","iPhone","iPad"],"id":"__UNI__965A7DA","name":"é«éç«è¡æå¯å","version":{"name":"1.0.0","code":"100"},"description":"","launch_path":"__uniappview.html","developer":{"name":"","email":"","url":""},"permissions":{"Push":{},"UniNView":{"description":"UniNViewåçæ¸²æ"}},"plus":{"useragent":{"value":"uni-app","concatenate":true},"splashscreen":{"target":"id:1","autoclose":true,"waiting":true,"delay":0},"popGesture":"close","launchwebview":{"id":"1","kernel":"WKWebview"},"statusbar":{"immersed":"supportedDevice","style":"dark","background":"#F8F8F8"},"usingComponents":true,"nvueStyleCompiler":"uni-app","compilerVersion":3,"distribute":{"icons":{"android":{"hdpi":""}},"google":{"permissions":["<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>","<uses-permission android:name=\"android.permission.VIBRATE\"/>","<uses-permission android:name=\"android.permission.READ_LOGS\"/>","<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>","<uses-feature android:name=\"android.hardware.camera.autofocus\"/>","<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.CAMERA\"/>","<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>","<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>","<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>","<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>","<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>","<uses-feature android:name=\"android.hardware.camera\"/>","<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>","<uses-permission android:name=\"android.permission.INTERNET\"/>","<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"]},"apple":{"dSYMs":false},"plugins":{"maps":{"amap":{"name":"","appkey_ios":"e4d46c87adf151dca20060317592b1b6","appkey_android":"e4d46c87adf151dca20060317592b1b6"}},"push":{"unipush":{"version":"2","offline":true,"honor":{},"meizu":{},"mi":{},"vivo":{},"oppo":{},"hms":{}}},"audio":{"mp3":{"description":"Androidå¹³å°å½é³æ¯æMP3æ ¼å¼æä»¶"}}}},"uniStatistics":{"enable":false},"allowsInlineMediaPlayback":true,"safearea":{"background":"#fff","bottom":{"offset":"auto"}},"uni-app":{"compilerVersion":"5.07","control":"uni-v3","nvueCompiler":"uni-app","renderer":"auto","nvue":{"flex-direction":"column"},"nvueLaunchMode":"normal"},"tabBar":{"color":"#999999","selectedColor":"#222222","borderStyle":"rgba(0,0,0,0.4)","backgroundColor":"#fff","list":[{"pagePath":"pages/index/index","iconPath":"static/tabbar/nav_home_sel@2x.png","selectedIconPath":"static/tabbar/nav_home_sel@2x1.png","text":"大å
"},{"pagePath":"pages/order/order","iconPath":"static/tabbar/nav_order@2x.png","selectedIconPath":"static/tabbar/nav_order@2x1.png","text":"订å"},{"pagePath":"pages/message/message","iconPath":"static/tabbar/nav_xiaoxi@2x.png","selectedIconPath":"static/tabbar/nav_xiaoxi@2x1.png","text":"æ¶æ¯"},{"pagePath":"pages/mine/mine","iconPath":"static/tabbar/nav_mine@2x.png","selectedIconPath":"static/tabbar/nav_mine@2x1.png","text":"æç"}],"height":"50px"},"launch_path":"__uniappview.html"},"locale":"zh-Hans"} |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <svg width="64" height="76" viewBox="0 0 64 76" fill="none" xmlns="http://www.w3.org/2000/svg"> |
| | | <path d="M32 75C31.1 75 30.2 74.6 29.6 73.8C24.9 68.2 8 47.2 8 31C8 17.7 18.7 7 32 7C45.3 7 56 17.7 56 31C56 47.2 39.1 68.2 34.4 73.8C33.8 74.6 32.9 75 32 75Z" fill="#FF5A5A"/> |
| | | <circle cx="32" cy="31" r="19" fill="white"/> |
| | | <text x="32" y="37" text-anchor="middle" font-size="24" font-family="Arial, sans-serif" font-weight="700" fill="#FF5A5A">ç»</text> |
| | | </svg> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <svg width="64" height="76" viewBox="0 0 64 76" fill="none" xmlns="http://www.w3.org/2000/svg"> |
| | | <path d="M32 75C31.1 75 30.2 74.6 29.6 73.8C24.9 68.2 8 47.2 8 31C8 17.7 18.7 7 32 7C45.3 7 56 17.7 56 31C56 47.2 39.1 68.2 34.4 73.8C33.8 74.6 32.9 75 32 75Z" fill="#15BF74"/> |
| | | <circle cx="32" cy="31" r="19" fill="white"/> |
| | | <text x="32" y="37" text-anchor="middle" font-size="24" font-family="Arial, sans-serif" font-weight="700" fill="#15BF74">èµ·</text> |
| | | </svg> |