bug修改

This commit is contained in:
cjl520cy 2026-04-28 17:48:49 +08:00
parent 0d66d41f15
commit f5e3e96be8
5 changed files with 2587 additions and 2515 deletions

View File

@ -76,6 +76,7 @@
},
/* ios */
"ios" : {
"UIRequiresFullScreen" : false, //
"urlschemewhitelist" : [ "iosmap" ],
"dSYMs" : false,
"plistcmds" : [

View File

@ -599,6 +599,8 @@
{
"path": "pages/shop/photoAlbum/videoplayer",
"style": {
"navigationBarTitleText": "全屏视频播放",
"pageOrientation": "auto",
"navigationStyle": "custom"
}
},
@ -969,7 +971,8 @@
"selectedIconPath": "/static/images/tabbar/home_icon_active.png",
"pagePath": "pages/home/home"
},
{ "iconPath": "/static/images/tabbar/new_message_gray.png",
{
"iconPath": "/static/images/tabbar/new_message_gray.png",
"text": "消息",
"selectedIconPath": "/static/images/tabbar/new_message.png",
"pagePath": "pages/message/message"

View File

@ -6,37 +6,22 @@
<!-- 城市选择-->
<view class="search-container" v-if="isSelectCity">
<text class="search-container-text" @click="goSelectCity">{{ city.name }}</text>
<image src="https://mrrplus.oss-cn-beijing.aliyuncs.com/wxstaic/images/Fill.jpg" mode="aspectFit" class="text-img"></image>
<image src="https://mrrplus.oss-cn-beijing.aliyuncs.com/wxstaic/images/Fill.jpg" mode="aspectFit"
class="text-img"></image>
</view>
<!-- 地图容器 -->
<view class="map-container" :style="{ height: mapHeight + 'rpx' }">
<map
v-if="mapVisible"
:key="mapRenderKey"
id="map"
class="map"
:latitude="latitude"
:longitude="longitude"
scale="19"
@tap="onMapTap"
@regionchange="changeMap"
></map>
<map v-if="mapVisible" :key="mapRenderKey" id="map" class="map" :latitude="latitude" :longitude="longitude"
scale="19" @tap="onMapTap" @regionchange="changeMap"></map>
<image
v-if="showMapSnapshot"
class="map-snapshot"
:src="mapSnapshotUrl"
mode="aspectFill"
@load="onSnapshotLoad"
@error="onSnapshotError"
></image>
<image v-if="showMapSnapshot" class="map-snapshot" :src="mapSnapshotUrl" mode="aspectFill"
@load="onSnapshotLoad" @error="onSnapshotError"></image>
<cover-view v-if="mapVisible" class="center-marker">
<cover-image
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/04007cab-3047-42b0-baab-44df344a92d2"
class="center-marker-img"
></cover-image>
class="center-marker-img"></cover-image>
</cover-view>
</view>
@ -44,13 +29,16 @@
<view class="bottom-edit-section">
<!-- 地址识别输入行 -->
<view class="address-input-row">
<textarea class="raw-address-input" v-model="rawAddress" placeholder="粘贴文本到此处,将自动识别地址信息。" placeholder-style="color: #C6C9CC; font-size: 14px;" :maxlength="200" :adjust-position="true" />
<textarea class="raw-address-input" v-model="rawAddress" placeholder="粘贴文本到此处,将自动识别地址信息。"
placeholder-style="color: #C6C9CC; font-size: 14px;" :maxlength="200" :adjust-position="true" />
<view class="action-buttons">
<view class="action-btn paste-btn" @click="hasRawContent ? clearRawAddress() : onPaste()">
<text class="btn-text" :style="{ color: '#333333' }">{{ hasRawContent ? '一键清空' : '粘贴' }}</text>
</view>
<view class="action-btn smart-btn" :class="{ 'smart-btn-active': hasRawContent }" @click="onSmartRecognize">
<text class="btn-text" :style="{ color: hasRawContent ? '#E8101E' : '#999999' }">{{ smartBtnText }}</text>
<view class="action-btn smart-btn" :class="{ 'smart-btn-active': hasRawContent }"
@click="onSmartRecognize">
<text class="btn-text"
:style="{ color: hasRawContent ? '#E8101E' : '#999999' }">{{ smartBtnText }}</text>
</view>
</view>
</view>
@ -61,13 +49,17 @@
<text class="row-label">所在地区</text>
<view class="row-content">
<text :class="currentRegion ? 'content-text' : 'placeholder'">{{ currentRegion || "请选择"}}</text>
<image src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/71c63001-a104-49ad-a90d-30d2ade73f4d.png" mode="aspectFit" class="arrow-icon"></image>
<image
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/71c63001-a104-49ad-a90d-30d2ade73f4d.png"
mode="aspectFit" class="arrow-icon"></image>
</view>
</view>
<view class="line"></view>
<view class="info-row">
<text class="row-label">详细地址</text>
<input type="text" class="detail-input" v-model="detailAddress" @input="onDetailInput" placeholder="请填写详细地址" placeholder-style="color: #999999; font-size: 14px;" :adjust-position="true" />
<input type="text" class="detail-input" v-model="detailAddress" @input="onDetailInput"
placeholder="请填写详细地址" placeholder-style="color: #999999; font-size: 14px;"
:adjust-position="true" />
</view>
<view class="line"></view>
</view>
@ -89,32 +81,19 @@
<text class="popup-close" @click="closeRegionPicker">×</text>
</view>
<view class="region-body">
<picker-view
@change="onRegionChange"
class="picker-scroll"
:indicator-style="indicatorStyle"
:value="regionPickerValue"
>
<picker-view @change="onRegionChange" class="picker-scroll" :indicator-style="indicatorStyle"
:value="regionPickerValue">
<picker-view-column>
<view
class="picker-item"
v-for="(item, index) in regionProvinceList"
:key="index"
>{{ item.province }}</view>
<view class="picker-item" v-for="(item, index) in regionProvinceList" :key="index">
{{ item.province }}</view>
</picker-view-column>
<picker-view-column>
<view
class="picker-item"
v-for="(item, index) in regionCityList"
:key="index"
>{{ item.city }}</view>
<view class="picker-item" v-for="(item, index) in regionCityList" :key="index">
{{ item.city }}</view>
</picker-view-column>
<picker-view-column>
<view
class="picker-item"
v-for="(item, index) in regionDistrictList"
:key="index"
>{{ item.area }}</view>
<view class="picker-item" v-for="(item, index) in regionDistrictList" :key="index">
{{ item.area }}</view>
</picker-view-column>
</picker-view>
</view>
@ -135,7 +114,9 @@
import request from '@/utils/request'
import ChinaCitys from './data/ChinaCitys.json'
import store from '@/store'
import { setVersion } from '@/utils/version.js'
import {
setVersion
} from '@/utils/version.js'
export default {
data() {
@ -263,15 +244,16 @@
}
this.startDependencyInitLock()
if (hasLocation) {
this.applyMapLocation(options.longitude, options.latitude, true)
this.applyMapLocation(options.longitude, options.latitude, false)
return
}
const dependencyCode = options.dependency_code
;(async () => {
;
(async () => {
let center = null
if (dependencyCode && regions[2]) {
@ -294,7 +276,7 @@
this.updateMapCenter(
parseFloat(locationRes[0]),
parseFloat(locationRes[1]),
true
false
)
}
} else if (!skipAutoLocate) {
@ -326,6 +308,7 @@
this.suppressInitDetailFill = true
}
this.reverseGeocode(parseFloat(options.longitude), parseFloat(options.latitude))
return
}
@ -504,6 +487,7 @@
this.mapReverseTimer = null
}
if (!noReverse) {
this.mapReverseTimer = setTimeout(() => {
this.reverseGeocode(lng, lat)
@ -556,7 +540,11 @@
},
findRegionIndexByCode(baseData, provinceCode, cityCode, areaCode) {
const result = { provinceIndex: -1, cityIndex: -1, areaIndex: -1 }
const result = {
provinceIndex: -1,
cityIndex: -1,
areaIndex: -1
}
const targetProvinceCode = (provinceCode || '').slice(0, 6)
const targetCityCode = (cityCode || '').slice(0, 6)
const targetAreaCode = (areaCode || '').slice(0, 6)
@ -613,7 +601,10 @@
return new Promise((resolve, reject) => {
const handleFail = (err) => {
if (!silent) {
uni.showToast({ title: '获取位置失败', icon: 'none' })
uni.showToast({
title: '获取位置失败',
icon: 'none'
})
}
reject(err)
}
@ -966,7 +957,10 @@
clearRawAddress() {
this.rawAddress = ''
uni.showToast({ title: '已清空', icon: 'none' })
uni.showToast({
title: '已清空',
icon: 'none'
})
},
onDetailInput(e) {
@ -982,7 +976,10 @@
success: (res) => {
if (res.data) {
this.rawAddress = res.data
uni.showToast({ title: '已粘贴', icon: 'none' })
uni.showToast({
title: '已粘贴',
icon: 'none'
})
}
}
})
@ -1125,15 +1122,27 @@
validateRecognizedDetail(detailText, geo, hit = {}) {
const cleaned = String(detailText || '').trim()
if (!cleaned) {
return { valid: false, cleaned: '', reason: 'empty' }
return {
valid: false,
cleaned: '',
reason: 'empty'
}
}
if (this.isLikelyInvalidRecognizedDetail(cleaned)) {
return { valid: false, cleaned: '', reason: 'invalid_detail' }
return {
valid: false,
cleaned: '',
reason: 'invalid_detail'
}
}
if (!geo) {
return { valid: false, cleaned: '', reason: 'geocode_failed' }
return {
valid: false,
cleaned: '',
reason: 'geocode_failed'
}
}
const geoLevel = String(geo?.level || '').trim()
@ -1156,14 +1165,26 @@
!/[A-Za-z]{6,}/.test(cleaned)
if (hasAddressFeature || preciseLevel) {
return { valid: true, cleaned, reason: '' }
return {
valid: true,
cleaned,
reason: ''
}
}
if (sameDistrict && purePoiLike) {
return { valid: true, cleaned, reason: 'district_geo_verified' }
return {
valid: true,
cleaned,
reason: 'district_geo_verified'
}
}
return { valid: false, cleaned: '', reason: 'detail_not_precise' }
return {
valid: false,
cleaned: '',
reason: 'detail_not_precise'
}
},
cleanRecognizedDetail(detail, province, city, district) {
@ -1425,10 +1446,14 @@
const lonlatParsed = this.parseLonlatInfo(res?.data?.lonlat || {})
return {
province_name: (street.province_name || street.province || stdParsed.province_name || divisionParsed.province_name || '').trim(),
city_name: (street.city_name || street.city || stdParsed.city_name || divisionParsed.city_name || '').trim(),
county_name: (street.county_name || street.district || street.county || stdParsed.county_name || divisionParsed.county_name || '').trim(),
town_name: (street.town_name || street.town || street.street_name || stdParsed.town_name || divisionParsed.town_name || '').trim(),
province_name: (street.province_name || street.province || stdParsed.province_name ||
divisionParsed.province_name || '').trim(),
city_name: (street.city_name || street.city || stdParsed.city_name || divisionParsed.city_name ||
'').trim(),
county_name: (street.county_name || street.district || street.county || stdParsed.county_name ||
divisionParsed.county_name || '').trim(),
town_name: (street.town_name || street.town || street.street_name || stdParsed.town_name ||
divisionParsed.town_name || '').trim(),
road_name: (street.road_name || street.road || stdParsed.road_name || '').trim(),
road_no: (street.road_no || street.roadno || stdParsed.road_no || '').trim(),
poi_name: (street.poi_name || street.poi || stdParsed.poi_name || '').trim(),
@ -1440,9 +1465,11 @@
block_no: (street.block_no || street.block || stdParsed.block_no || '').trim(),
detail: (street.detail || street.address || stdParsed.detail || stdParsed.address || '').trim(),
address: (street.address || street.detail || stdParsed.address || stdParsed.detail || '').trim(),
province_code: (street.province_code || stdParsed.province_code || divisionParsed.province_code || '').trim(),
province_code: (street.province_code || stdParsed.province_code || divisionParsed.province_code ||
'').trim(),
city_code: (street.city_code || stdParsed.city_code || divisionParsed.city_code || '').trim(),
county_code: (street.county_code || street.district_code || stdParsed.county_code || divisionParsed.county_code || '').trim(),
county_code: (street.county_code || street.district_code || stdParsed.county_code || divisionParsed
.county_code || '').trim(),
backend_gcj02: lonlatParsed.gcj02,
backend_wgs84: lonlatParsed.wgs84,
backend_level: lonlatParsed.level,
@ -1680,13 +1707,19 @@
this.suppressInitDetailFill = false
if (!this.hasRawContent) {
uni.showToast({ title: '请先粘贴或输入地址', icon: 'none' })
uni.showToast({
title: '请先粘贴或输入地址',
icon: 'none'
})
return
}
const originalRawText = (this.rawAddress || '').trim()
if (!originalRawText) {
uni.showToast({ title: '请先粘贴或输入地址', icon: 'none' })
uni.showToast({
title: '请先粘贴或输入地址',
icon: 'none'
})
return
}
@ -1697,11 +1730,16 @@
const removedNoise = sanitizedText !== originalRawText
if (!sanitizedText) {
uni.showToast({ title: '未提取到有效地址', icon: 'none' })
uni.showToast({
title: '未提取到有效地址',
icon: 'none'
})
return
}
uni.showLoading({ title: '识别中...' })
uni.showLoading({
title: '识别中...'
})
try {
const res = await this.requestRecognizeAddress(sanitizedText)
@ -1851,7 +1889,8 @@
showCancel: false
})
} else {
const tip = this.getRecognizeToast(level, removedNoise, geocodeOk, hit, detailText, detailRejected)
const tip = this.getRecognizeToast(level, removedNoise, geocodeOk, hit, detailText,
detailRejected)
if (tip.type === 'modal') {
uni.showModal({
title: tip.title,
@ -1868,7 +1907,8 @@
return
}
this.commitRecognizedResult(province, city, district, regionText, detailText, geo, level, removedNoise, geocodeOk, hit, detailRejected)
this.commitRecognizedResult(province, city, district, regionText, detailText, geo, level,
removedNoise, geocodeOk, hit, detailRejected)
} catch (error) {
console.error('智能识别失败:', error)
uni.hideLoading()
@ -2015,7 +2055,8 @@
}
},
commitRecognizedResult(province, city, district, regionText, detailText, geo, level, removedNoise, geocodeOk, hit, detailRejected) {
commitRecognizedResult(province, city, district, regionText, detailText, geo, level, removedNoise, geocodeOk,
hit, detailRejected) {
this.currentProvince = province
this.currentCity = city
this.currentDistrict = district
@ -2165,7 +2206,10 @@
const districtItem = this.regionDistrictList[districtIdx]
if (!provinceItem || !cityItem || !districtItem) {
uni.showToast({ title: '选择无效', icon: 'none' })
uni.showToast({
title: '选择无效',
icon: 'none'
})
return
}
@ -2195,7 +2239,10 @@
const [lng, lat] = center.split(',')
this.updateMapCenter(parseFloat(lng), parseFloat(lat), true)
} else {
uni.showToast({ title: '无法定位该地区,请手动拖动地图', icon: 'none' })
uni.showToast({
title: '无法定位该地区,请手动拖动地图',
icon: 'none'
})
}
this.closeRegionPicker()
@ -2221,7 +2268,8 @@
keywords: adcode.slice(0, 6)
},
success: (res) => {
if (res.data.status === '1' && res.data.districts && res.data.districts.length > 0) {
if (res.data.status === '1' && res.data.districts &&
res.data.districts.length > 0) {
const district = res.data.districts[0]
if (district.center) {
resolveInner(district.center)
@ -2245,7 +2293,8 @@
keywords: keyword
},
success: (res) => {
if (res.data.status === '1' && res.data.districts && res.data.districts.length > 0) {
if (res.data.status === '1' && res.data.districts &&
res.data.districts.length > 0) {
const district = res.data.districts[0]
if (district.center) {
resolveInner(district.center)
@ -2418,7 +2467,8 @@
left: 0;
right: 0;
background-color: #FFFFFF;
padding: 20rpx 20rpx env(safe-area-inset-bottom) 20rpx; /* 适配刘海屏 */
padding: 20rpx 20rpx env(safe-area-inset-bottom) 20rpx;
/* 适配刘海屏 */
box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
z-index: 10;
}
@ -2583,10 +2633,12 @@
opacity: 0;
transition: all 0.3s ease;
}
.popup.show {
visibility: visible !important;
opacity: 1 !important;
}
.popup-mask {
position: fixed;
top: 0;
@ -2595,6 +2647,7 @@
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
}
.popup-content {
position: relative;
background-color: #ffffff;
@ -2604,9 +2657,11 @@
transition: transform 0.3s ease;
max-height: 70vh;
}
.popup.show .popup-content {
transform: translateY(0);
}
.popup-header {
display: flex;
align-items: center;
@ -2615,23 +2670,28 @@
padding: 0 0 20rpx 0;
border-bottom: 1rpx solid #F0F0F0;
}
.popup-title {
font-size: 32rpx;
font-weight: 500;
color: #333;
}
.popup-close {
font-size: 40rpx;
color: #999;
padding: 10rpx;
}
.region-body {
height: 400rpx;
overflow: hidden;
}
.picker-scroll {
height: 400rpx;
}
.picker-item {
height: 68rpx;
line-height: 68rpx;
@ -2639,12 +2699,14 @@
font-size: 28rpx;
color: #333;
}
.popup-footer {
display: flex;
margin-top: 30rpx;
padding-top: 20rpx;
border-top: 1rpx solid #F0F0F0;
}
.popup-btn {
flex: 1;
height: 88rpx;
@ -2654,22 +2716,28 @@
justify-content: center;
margin: 0 16rpx;
}
.popup-btn.cancel {
background-color: #f5f5f5;
}
.popup-btn.confirm {
background: #e8101e;
}
.popup-btn .btn-text {
font-size: 32rpx;
font-weight: 500;
}
.popup-btn.cancel .btn-text {
color: #666666;
}
.popup-btn.confirm .btn-text {
color: #ffffff;
}
/* 指示器样式(沿用原有) */
.indicatorStyle {
height: 68rpx;

View File

@ -134,9 +134,9 @@
</view>
<view class="detail-row">
<text class="form-label required">服务功效</text>
<text class="form-label required">服务内容</text>
<view class="detail-textarea-wrap">
<textarea class="detail-textarea" v-model="detailForm.effect" placeholder="请输入服务功效"
<textarea class="detail-textarea" v-model="detailForm.effect" placeholder="请输入服务内容"
placeholder-class="placeholder" maxlength="200"></textarea>
<text class="detail-count">{{(detailForm.effect || '').length}}/200</text>
</view>
@ -442,7 +442,7 @@
// detail
if (!this.formData.efficacy && !this.formData.crowd && !this.formData.product) {
(detail || []).forEach((item) => {
if (item.title === "服务功效") {
if (item.title === "服务内容" || item.title === "服务功效") {
this.detailForm.effect = item.text || "";
} else if (item.title === "适用人群") {
this.detailForm.crowd = item.text || "";
@ -475,7 +475,7 @@
checkDetailForm() {
if (!this.detailForm.effect || !this.detailForm.effect.trim()) {
uni.showToast({
title: "请输入服务功效",
title: "请输入服务内容",
icon: "none",
});
return false;

View File

@ -166,8 +166,8 @@
obj.name = item.name || item.auth_name
}
if (item.id == 0) {
obj.url = item.url
obj.name = item.name
obj.url = item.url || item.auth_url
obj.name = item.name || item.name
}
if (item.type == 2) {
obj.url = obj.url + `?x-oss-process=video/snapshot,t_1000,m_fast,f_jpg,w_600,ar_auto`