Răsfoiți Sursa

Merge branch 'master' of http://8.152.195.41:3000/alien/h5

lxr 6 zile în urmă
părinte
comite
7a5d131fef

+ 6 - 6
HBuilderProjects/secondShareGoods.html

@@ -695,7 +695,7 @@
 					</style>
 					</style>
 					<button class="wx-open-app-btn" aria-label="APP内打开">
 					<button class="wx-open-app-btn" aria-label="APP内打开">
 						<span class="fab__brand-clip" aria-hidden="true">
 						<span class="fab__brand-clip" aria-hidden="true">
-							<img class="fab__brand-img" src="https://test.ailien.shop/h5/HBuilderProjects/images/uBtn.svg" alt="" decoding="async">
+							<img class="fab__brand-img" src="https://prod.ailien.shop/h5/HBuilderProjects/images/uBtn.svg" alt="" decoding="async">
 						</span>
 						</span>
 						<span class="fab__label">APP内打开</span>
 						<span class="fab__label">APP内打开</span>
 					</button>
 					</button>
@@ -723,7 +723,7 @@
 		var APP_IOS_URL_SCHEME = 'shopro://';
 		var APP_IOS_URL_SCHEME = 'shopro://';
 		var APP_UNI_STORE_PATH = 'pages/secondHandTransactions/pages/detail/index';
 		var APP_UNI_STORE_PATH = 'pages/secondHandTransactions/pages/detail/index';
 
 
-		var API_BASE = 'https://test.ailien.shop/alienStore';
+		var API_BASE = 'https://prod.ailien.shop/alienStore';
 
 
 		/**
 		/**
 		 * 微信 JSSDK — 与 shareIndex.html 一致
 		 * 微信 JSSDK — 与 shareIndex.html 一致
@@ -732,9 +732,9 @@
 		var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
 		var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
 		var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
 		var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
-		var H5_PAGE_BASE_FALLBACK = 'https://test.ailien.shop/h5/HBuilderProjects/';
+		var H5_PAGE_BASE_FALLBACK = 'https://prod.ailien.shop/h5/HBuilderProjects/';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'secondShareGoods.html';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'secondShareGoods.html';
-		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'test.ailien.shop'];
+		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'prod.ailien.shop'];
 		var weChatJssdkConfigured = false;
 		var weChatJssdkConfigured = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxInitLastError = '';
 		var wxInitLastError = '';
@@ -1380,8 +1380,8 @@
 				return custom.replace(/\/+$/, '');
 				return custom.replace(/\/+$/, '');
 			}
 			}
 			var host = (location.hostname || '').toLowerCase();
 			var host = (location.hostname || '').toLowerCase();
-			if (host === 'test.ailien.shop' || host === 'uat.ailien.shop') {
-				return 'https://test.ailien.shop/alienSecond';
+			if (host === 'prod.ailien.shop' || host === 'uat.ailien.shop') {
+				return 'https://prod.ailien.shop/alienSecond';
 			}
 			}
 			return 'http://120.26.186.130:8000/alienSecond';
 			return 'http://120.26.186.130:8000/alienSecond';
 		}
 		}

+ 3 - 3
HBuilderProjects/shareAiConsult.html

@@ -289,13 +289,13 @@
     (function () {
     (function () {
       "use strict";
       "use strict";
 
 
-      var API_BASE = "https://test.ailien.shop/alienStore";
+      var API_BASE = "https://prod.ailien.shop/alienStore";
       var WECHAT_MP_APP_ID = "wx412792c77f47babd";
       var WECHAT_MP_APP_ID = "wx412792c77f47babd";
       var WECHAT_OPEN_APP_ID = "wxf5f1efe3a9f5012e";
       var WECHAT_OPEN_APP_ID = "wxf5f1efe3a9f5012e";
       var WECHAT_GET_WX_CONFIG_PATH = "/wx/getWxConfig";
       var WECHAT_GET_WX_CONFIG_PATH = "/wx/getWxConfig";
-      var H5_PAGE_BASE_FALLBACK = "https://test.ailien.shop/h5/HBuilderProjects/";
+      var H5_PAGE_BASE_FALLBACK = "https://prod.ailien.shop/h5/HBuilderProjects/";
       var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + "shareAiConsult.html";
       var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + "shareAiConsult.html";
-      var WECHAT_JS_SAFE_HOSTS = ["uat.ailien.shop", "test.ailien.shop"];
+      var WECHAT_JS_SAFE_HOSTS = ["uat.ailien.shop", "prod.ailien.shop"];
       var APP_ANDROID_PACKAGE = "com.alien.Udianzaizhe";
       var APP_ANDROID_PACKAGE = "com.alien.Udianzaizhe";
       var APP_IOS_URL_SCHEME = "shopro://";
       var APP_IOS_URL_SCHEME = "shopro://";
       var APP_UNI_AI_PATH = "pages/aiSearchResult/index";
       var APP_UNI_AI_PATH = "pages/aiSearchResult/index";

+ 6 - 507
HBuilderProjects/shareCheckIn.html

@@ -411,7 +411,7 @@
 			opacity: 0.2;
 			opacity: 0.2;
 		}
 		}
 
 
-		/* deleteFlag=1:与 shareIndex 关店区一致 — 顶部已删除 + empty.png + 更多推荐 */
+		/* deleteFlag=1:与 shareIndex 关店区一致 — 顶部已删除 + empty.png */
 		.share-checkin-deleted-root {
 		.share-checkin-deleted-root {
 			min-height: 40vh;
 			min-height: 40vh;
 		}
 		}
@@ -438,122 +438,6 @@
 			font-weight: 600;
 			font-weight: 600;
 			color: #989898;
 			color: #989898;
 		}
 		}
-
-		.closed-rec-divider {
-			height: 8px;
-			background: #F7F7F7;
-			margin: 0;
-		}
-
-		.closed-rec-title {
-			padding: 8px 15px 12px;
-			font-size: 16px;
-			font-weight: 700;
-		}
-
-		.closed-rec-grid {
-			display: grid;
-			grid-template-columns: repeat(2, 1fr);
-			gap: 10px;
-			padding: 0 15px 20px;
-		}
-
-		#checkInDeletedRecEmpty {
-			grid-column: 1 / -1;
-		}
-
-		.closed-rec-empty {
-			padding: 12px;
-			color: var(--text-secondary);
-			font-size: 14px;
-		}
-
-		.closed-rec-card {
-			min-width: 0;
-			background: #fff;
-			border-radius: 10px;
-			overflow: hidden;
-			box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
-		}
-
-		.closed-rec-card__img {
-			aspect-ratio: 4 / 3;
-			background: #eee;
-		}
-
-		.closed-rec-card__img img {
-			width: 100%;
-			height: 100%;
-			object-fit: cover;
-			display: block;
-			border-radius: 0;
-		}
-
-		.closed-rec-card__body {
-			padding: 10px;
-		}
-
-		.closed-rec-card__top {
-			display: flex;
-			justify-content: space-between;
-			align-items: baseline;
-			gap: 8px;
-			margin-bottom: 6px;
-		}
-
-		.closed-rec-card__name {
-			font-size: 15px;
-			font-weight: 700;
-			flex: 1;
-			min-width: 0;
-			overflow: hidden;
-			text-overflow: ellipsis;
-			white-space: nowrap;
-		}
-
-		.closed-rec-card__dist {
-			font-size: 12px;
-			color: var(--text-secondary);
-			flex-shrink: 0;
-		}
-
-		.closed-rec-card__rating {
-			display: flex;
-			align-items: center;
-			flex-wrap: wrap;
-			gap: 4px 6px;
-		}
-
-		.closed-rec-card__rating .closed-rec-stars {
-			display: inline-flex;
-			align-items: center;
-			gap: 2px;
-		}
-
-		.closed-rec-card__rating .closed-rec-star {
-			display: block;
-			flex-shrink: 0;
-		}
-
-		.closed-rec-rating-num {
-			font-size: 12px;
-			font-weight: 600;
-			color: var(--orange);
-		}
-
-		.closed-rec-meta {
-			font-size: 12px;
-			color: var(--text-secondary);
-		}
-
-		.closed-rec-card__footer {
-			margin-top: 8px;
-			font-size: 12px;
-			color: var(--text-secondary);
-			overflow: hidden;
-			text-overflow: ellipsis;
-			white-space: nowrap;
-		}
 	</style>
 	</style>
 </head>
 </head>
 <body class="page-checkin">
 <body class="page-checkin">
@@ -563,11 +447,6 @@
 			<img src="images/empty.png" alt="" decoding="async">
 			<img src="images/empty.png" alt="" decoding="async">
 			<p class="checkin-deleted-top__text">内容已删除</p>
 			<p class="checkin-deleted-top__text">内容已删除</p>
 		</section>
 		</section>
-		<div class="closed-rec-divider"></div>
-		<h3 class="closed-rec-title">更多推荐</h3>
-		<div class="closed-rec-grid" id="checkInDeletedRecList">
-			<p id="checkInDeletedRecEmpty" class="closed-rec-empty" style="display:none;">暂无推荐</p>
-		</div>
 	</div>
 	</div>
 
 
 	<div id="shareCheckInNormalRoot">
 	<div id="shareCheckInNormalRoot">
@@ -667,7 +546,7 @@
 					</style>
 					</style>
 					<button class="wx-open-app-btn" aria-label="APP内打开">
 					<button class="wx-open-app-btn" aria-label="APP内打开">
 						<span class="fab__brand-clip" aria-hidden="true">
 						<span class="fab__brand-clip" aria-hidden="true">
-							<img class="fab__brand-img" src="https://test.ailien.shop/h5/HBuilderProjects/images/uBtn.svg" alt="" decoding="async">
+							<img class="fab__brand-img" src="https://prod.ailien.shop/h5/HBuilderProjects/images/uBtn.svg" alt="" decoding="async">
 						</span>
 						</span>
 						<span class="fab__label">APP内打开</span>
 						<span class="fab__label">APP内打开</span>
 					</button>
 					</button>
@@ -691,7 +570,7 @@
 		var APP_UNI_STORE_PATH = 'pages/checkIn/index';
 		var APP_UNI_STORE_PATH = 'pages/checkIn/index';
 
 
 		/** 与 shareUndefined.html 一致 */
 		/** 与 shareUndefined.html 一致 */
-		var API_BASE = 'https://test.ailien.shop/alienStore';
+		var API_BASE = 'https://prod.ailien.shop/alienStore';
 
 
 		/**
 		/**
 		 * 微信 JSSDK — 与 shareIndex.html 一致
 		 * 微信 JSSDK — 与 shareIndex.html 一致
@@ -700,9 +579,9 @@
 		var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
 		var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
 		var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
 		var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
-		var H5_PAGE_BASE_FALLBACK = 'https://test.ailien.shop/h5/HBuilderProjects/';
+		var H5_PAGE_BASE_FALLBACK = 'https://prod.ailien.shop/h5/HBuilderProjects/';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareCheckIn.html';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareCheckIn.html';
-		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'test.ailien.shop'];
+		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'prod.ailien.shop'];
 		var weChatJssdkConfigured = false;
 		var weChatJssdkConfigured = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxInitLastError = '';
 		var wxInitLastError = '';
@@ -1430,7 +1309,7 @@
 			return v2 == null ? '' : String(v2).trim();
 			return v2 == null ? '' : String(v2).trim();
 		}
 		}
 
 
-		/** getDeleteFlagById:data.deleteFlag 为 1 时本页展示「内容已删除 + 更多推荐」(与 shareIndex 关店态一致) */
+		/** getDeleteFlagById:data.deleteFlag 为 1 时本页展示「内容已删除」(与 shareIndex 关店态一致) */
 		function isShareCheckInDeletedByDeleteFlag(res) {
 		function isShareCheckInDeletedByDeleteFlag(res) {
 			if (!res || typeof res !== 'object') return false;
 			if (!res || typeof res !== 'object') return false;
 			var d = res.data;
 			var d = res.data;
@@ -1494,385 +1373,6 @@
 				});
 				});
 		}
 		}
 
 
-		/** 与 shareIndex.html 关店「更多推荐」:POST 全局店铺推荐 */
-		var API_LIFE_AI_BASE = 'http://183.252.196.135:9100';
-		var STORE_GLOBAL_RECOMMEND_PATH =
-			'/ai/multimodal-services/api/v1/search/global/store-recommend';
-		var FALLBACK_REC_USER_LAT = 38.925749;
-		var FALLBACK_REC_USER_LNG = 121.662531;
-		var FALLBACK_REC_USER_CITY = '大连市';
-		var cachedRecUserLoc = null;
-		var ensureRecommendLocPromise = null;
-
-		function getCityFromReverseGeocodeClient(lat, lng) {
-			var u =
-				'https://api.bigdatacloud.net/data/reverse-geocode-client?latitude=' +
-				encodeURIComponent(lat) +
-				'&longitude=' +
-				encodeURIComponent(lng) +
-				'&localityLanguage=zh';
-			return fetch(u, {
-				method: 'GET',
-				mode: 'cors',
-				credentials: 'omit',
-				headers: { Accept: 'application/json' }
-			})
-				.then(function (res) {
-					if (!res.ok) throw new Error('HTTP ' + res.status);
-					return res.json();
-				})
-				.then(function (j) {
-					if (!j || typeof j !== 'object') return '';
-					return (
-						(j.city != null && String(j.city).trim()) ||
-						(j.locality != null && String(j.locality).trim()) ||
-						(j.principalSubdivision != null && String(j.principalSubdivision).trim()) ||
-						''
-					);
-				})
-				.catch(function () {
-					return '';
-				});
-		}
-
-		function tryIpApproxLocationThen(finish) {
-			fetch('https://get.geojs.io/v1/ip/geo.json', {
-				method: 'GET',
-				mode: 'cors',
-				credentials: 'omit',
-				headers: { Accept: 'application/json' }
-			})
-				.then(function (res) {
-					if (!res.ok) throw new Error('HTTP ' + res.status);
-					return res.json();
-				})
-				.then(function (data) {
-					var lat = parseFloat(data.latitude);
-					var lng = parseFloat(data.longitude);
-					var city = data.city != null ? String(data.city).trim() : '';
-					if (!isNaN(lat) && !isNaN(lng)) {
-						finish({ lat: lat, lng: lng, city: city || FALLBACK_REC_USER_CITY });
-					} else {
-						finish({
-							lat: FALLBACK_REC_USER_LAT,
-							lng: FALLBACK_REC_USER_LNG,
-							city: FALLBACK_REC_USER_CITY
-						});
-					}
-				})
-				.catch(function () {
-					finish({
-						lat: FALLBACK_REC_USER_LAT,
-						lng: FALLBACK_REC_USER_LNG,
-						city: FALLBACK_REC_USER_CITY
-					});
-				});
-		}
-
-		function tryGpsThenIpForRecommendLoc(finish) {
-			if (!navigator.geolocation || typeof navigator.geolocation.getCurrentPosition !== 'function') {
-				tryIpApproxLocationThen(finish);
-				return;
-			}
-			navigator.geolocation.getCurrentPosition(
-				function (pos) {
-					var lat = pos.coords.latitude;
-					var lng = pos.coords.longitude;
-					getCityFromReverseGeocodeClient(lat, lng).then(function (city) {
-						finish({ lat: lat, lng: lng, city: city || FALLBACK_REC_USER_CITY });
-					});
-				},
-				function () {
-					tryIpApproxLocationThen(finish);
-				},
-				{ enableHighAccuracy: false, timeout: 12000, maximumAge: 600000 }
-			);
-		}
-
-		function ensureRecommendUserLocation() {
-			if (cachedRecUserLoc) return Promise.resolve(cachedRecUserLoc);
-			if (ensureRecommendLocPromise) return ensureRecommendLocPromise;
-			ensureRecommendLocPromise = new Promise(function (resolve) {
-				tryGpsThenIpForRecommendLoc(function (loc) {
-					cachedRecUserLoc = loc;
-					resolve(loc);
-				});
-			});
-			return ensureRecommendLocPromise;
-		}
-
-		var CLOSED_REC_STAR_PATH =
-			'M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z';
-
-		function closedRecEscHtml(s) {
-			return String(s == null ? '': s)
-				.replace(/&/g, '&amp;')
-				.replace(/</g, '&lt;')
-				.replace(/>/g, '&gt;')
-				.replace(/"/g, '&quot;');
-		}
-
-		function closedRecStarsHtml(score) {
-			var s = Number(score);
-			if (isNaN(s)) s = 0;
-			s = Math.max(0, Math.min(5, s));
-			var rounded = Math.round(s);
-			var parts = [];
-			for (var i = 1; i <= 5; i++) {
-				var fill = i <= rounded ? '#F58220' : '#E5E5E5';
-				parts.push(
-					'<svg class="closed-rec-star" width="11" height="11" viewBox="0 0 24 24" aria-hidden="true">' +
-						'<path fill="' +
-						fill +
-						'" d="' +
-						CLOSED_REC_STAR_PATH +
-						'"/></svg>'
-				);
-			}
-			return '<span class="closed-rec-stars">' + parts.join('') + '</span>';
-		}
-
-		function closedRecFormatDistance(item) {
-			if (item.distance != null && item.distance !== '') {
-				var km = Number(item.distance);
-				if (!isNaN(km) && km >= 0) return Math.round(km * 1000) + '米';
-				return String(item.distance).trim();
-			}
-			if (item.position != null && String(item.position).trim() !== '') {
-				return String(item.position).trim();
-			}
-			if (item.dist != null && item.dist !== '') {
-				var dn = Number(item.dist);
-				if (!isNaN(dn)) {
-					return dn >= 1 ? dn.toFixed(dn % 1 === 0 ? 0 : 1) + 'km' : Math.round(dn * 1000) + '米';
-				}
-			}
-			return '';
-		}
-
-		function closedRecPickScore(item) {
-			var x =
-				item.scoreAvg != null
-					? Number(item.scoreAvg)
-					: item.score != null
-						? Number(item.score)
-						: item.rating != null
-							? Number(item.rating)
-							: item.starScore != null
-								? Number(item.starScore)
-								: NaN;
-			return isNaN(x) ? null : x;
-		}
-
-		function closedRecPickReviewCount(item) {
-			var n =
-				item.commitCount != null
-					? Number(item.commitCount)
-					: item.commentCount != null
-						? Number(item.commentCount)
-						: item.reviewCount != null
-							? Number(item.reviewCount)
-							: item.evaluateCount != null
-								? Number(item.evaluateCount)
-								: NaN;
-			return isNaN(n) ? 0 : Math.max(0, Math.floor(n));
-		}
-
-		function normalizeClosedStoreRecommendList(res) {
-			if (!res || typeof res !== 'object') return [];
-			var raw = res.data != null ? res.data : res.result;
-			if (Array.isArray(raw)) return raw;
-			if (raw && typeof raw === 'object') {
-				if (Array.isArray(raw.list)) return raw.list;
-				if (Array.isArray(raw.records)) return raw.records;
-				if (Array.isArray(raw.rows)) return raw.rows;
-				if (Array.isArray(raw.content)) return raw.content;
-				if (Array.isArray(raw.stores)) return raw.stores;
-				if (Array.isArray(raw.storeList)) return raw.storeList;
-				if (Array.isArray(raw.storeVos)) return raw.storeVos;
-				if (Array.isArray(raw.items)) return raw.items;
-			}
-			if (Array.isArray(res.list)) return res.list;
-			if (Array.isArray(res.records)) return res.records;
-			return [];
-		}
-
-		/** 逆地理等偶发日文/繁体「連」→ 简体「连」(如 大連市 → 大连市) */
-		function normalizeRecommendUserCityToZhCn(city) {
-			var s = String(city == null ? '' : city).trim();
-			if (!s || s === 'undefined') return '';
-			return s.replace(/連/g, '连');
-		}
-
-		function fetchCheckInDeletedStoreRecommend(storeIdStr) {
-			var latRaw = (
-				mergedQ('userLat') ||
-				mergedQ('latitude') ||
-				mergedQ('lat') ||
-				mergedQ('weidu')
-			).trim();
-			var lngRaw = (
-				mergedQ('userLng') ||
-				mergedQ('longitude') ||
-				mergedQ('lon') ||
-				mergedQ('jingdu')
-			).trim();
-			var userCityRaw = (mergedQ('userCity') || mergedQ('city')).trim();
-			var page = parseInt(mergedQ('page') || q('page') || '1', 10);
-			var pageSize = parseInt(mergedQ('pageSize') || q('pageSize') || '10', 10);
-			if (isNaN(page) || page < 1) page = 1;
-			if (isNaN(pageSize) || pageSize < 1) pageSize = 10;
-
-			function postRecommend(userLat, userLng, userCity) {
-				var cityZh = normalizeRecommendUserCityToZhCn(userCity);
-				if (!cityZh) cityZh = FALLBACK_REC_USER_CITY;
-				var body = {
-					page: page,
-					pageSize: pageSize,
-					storeId: String(storeIdStr || ''),
-					userCity: cityZh,
-					userLat: userLat,
-					userLng: userLng
-				};
-				return fetch(API_LIFE_AI_BASE + STORE_GLOBAL_RECOMMEND_PATH, {
-					method: 'POST',
-					mode: 'cors',
-					credentials: 'omit',
-					headers: {
-						Accept: 'application/json',
-						'Content-Type': 'application/json;charset=UTF-8'
-					},
-					body: JSON.stringify(body)
-				}).then(function (res) {
-					if (!res.ok) throw new Error('HTTP ' + res.status);
-					return res.json();
-				});
-			}
-
-			var hasUrlCoords =
-				latRaw !== '' && !isNaN(Number(latRaw)) && lngRaw !== '' && !isNaN(Number(lngRaw));
-			if (hasUrlCoords) {
-				var ul = Number(latRaw);
-				var ug = Number(lngRaw);
-				if (userCityRaw !== '') return postRecommend(ul, ug, userCityRaw);
-				return getCityFromReverseGeocodeClient(ul, ug).then(function (city) {
-					return postRecommend(ul, ug, city || FALLBACK_REC_USER_CITY);
-				});
-			}
-			return ensureRecommendUserLocation().then(function (loc) {
-				var city = userCityRaw !== '' ? userCityRaw : loc.city;
-				return postRecommend(loc.lat, loc.lng, city);
-			});
-		}
-
-		function renderCheckInDeletedRecommended(list) {
-			var wrap = document.getElementById('checkInDeletedRecList');
-			var empty = document.getElementById('checkInDeletedRecEmpty');
-			if (!wrap || !empty) return;
-			wrap.querySelectorAll('.closed-rec-card').forEach(function (n) {
-				n.remove();
-			});
-			if (!list || !list.length) {
-				empty.style.display = 'block';
-				return;
-			}
-			empty.style.display = 'none';
-			list.forEach(function (item) {
-				if (!item || typeof item !== 'object') return;
-				var imgUrlField = item.imgUrl != null ? String(item.imgUrl).trim() : '';
-				var home = item.homeImage != null ? String(item.homeImage).trim() : '';
-				if (home && /\.mp4(\?|#|$)/i.test(home)) {
-					var vf = item.videoFirstFrame != null ? String(item.videoFirstFrame).trim() : '';
-					if (vf) home = vf;
-				}
-				var imgUrl =
-					imgUrlField ||
-					home ||
-					(item.coverUrl != null ? String(item.coverUrl).trim() : '') ||
-					(item.mainImage != null ? String(item.mainImage).trim() : '') ||
-					(item.goodsImage != null ? String(item.goodsImage).trim() : '') ||
-					(item.entranceImage != null ? String(item.entranceImage).trim() : '') ||
-					(Array.isArray(item.goodsImageList) && item.goodsImageList[0]) ||
-					(Array.isArray(item.imageList) && item.imageList[0]) ||
-					(Array.isArray(item.storeAlbumUrlList) && item.storeAlbumUrlList[0]) ||
-					'';
-				var name =
-					item.title != null && String(item.title).trim() !== ''
-						? String(item.title).replace(/\r?\n/g, ' ').replace(/\s+/g, ' ').trim()
-						: item.storeName ||
-							item.goodsName ||
-							item.secondGoodsTitle ||
-							item.name ||
-							'推荐';
-				var dist = closedRecFormatDistance(item);
-				var scoreVal = closedRecPickScore(item);
-				var displayScore = scoreVal != null ? scoreVal.toFixed(1) : '—';
-				var starScore = scoreVal != null ? scoreVal : 0;
-				var rc = closedRecPickReviewCount(item);
-				var reviewLabel = rc > 0 ? rc + '条评价' : '';
-				var seller =
-					item.userName != null && String(item.userName).trim() !== ''
-						? String(item.userName).trim()
-						: item.nickName != null && String(item.nickName).trim() !== ''
-							? String(item.nickName).trim()
-							: '';
-				var card = document.createElement('article');
-				card.className = 'closed-rec-card';
-				card.innerHTML =
-					'<div class="closed-rec-card__img"><img class="closed-rec-card__cover" src="" alt="" decoding="async"></div>' +
-					'<div class="closed-rec-card__body">' +
-					'<div class="closed-rec-card__top">' +
-					'<span class="closed-rec-card__name">' +
-					closedRecEscHtml(name) +
-					'</span>' +
-					(dist ? '<span class="closed-rec-card__dist">' + closedRecEscHtml(dist) + '</span>' : '') +
-					'</div>' +
-					'<div class="closed-rec-card__rating">' +
-					closedRecStarsHtml(starScore) +
-					'<span class="closed-rec-rating-num">' +
-					closedRecEscHtml(displayScore) +
-					'</span>' +
-					(reviewLabel
-						? '<span class="closed-rec-meta">' + closedRecEscHtml(reviewLabel) + '</span>'
-						: '') +
-					'</div>' +
-					(seller ? '<div class="closed-rec-card__footer">' + closedRecEscHtml(seller) + '</div>' : '') +
-					'</div>';
-				var coverIm = card.querySelector('img.closed-rec-card__cover');
-				if (coverIm) {
-					coverIm.src = imgUrl;
-					coverIm.onerror = function () {
-						this.onerror = null;
-						this.src = '';
-					};
-				}
-				wrap.appendChild(card);
-			});
-		}
-
-		function loadCheckInDeletedRecommendations() {
-			var sid =
-				mergedQ('storeId') ||
-				mergedQ('id') ||
-				'';
-			if (!sid) {
-				renderCheckInDeletedRecommended([]);
-				return;
-			}
-			fetchCheckInDeletedStoreRecommend(sid)
-				.then(function (res) {
-					var list = normalizeClosedStoreRecommendList(res);
-					if (!list.length && res && res.msg) {
-						console.warn('[store-recommend]', res.msg);
-					}
-					renderCheckInDeletedRecommended(list);
-				})
-				.catch(function (e) {
-					console.warn(e);
-					renderCheckInDeletedRecommended([]);
-				});
-		}
-
 		function applyCheckInDeletedByDeleteFlagUi() {
 		function applyCheckInDeletedByDeleteFlagUi() {
 			var delRoot = document.getElementById('shareCheckInDeletedRoot');
 			var delRoot = document.getElementById('shareCheckInDeletedRoot');
 			var normRoot = document.getElementById('shareCheckInNormalRoot');
 			var normRoot = document.getElementById('shareCheckInNormalRoot');
@@ -1884,7 +1384,6 @@
 				normRoot.style.display = 'none';
 				normRoot.style.display = 'none';
 				normRoot.setAttribute('aria-hidden', 'true');
 				normRoot.setAttribute('aria-hidden', 'true');
 			}
 			}
-			loadCheckInDeletedRecommendations();
 		}
 		}
 
 
 		function tryDecode(s) {
 		function tryDecode(s) {

+ 4 - 366
HBuilderProjects/shareCheckInUndefined.html

@@ -64,116 +64,6 @@
 			font-weight: 400;
 			font-weight: 400;
 		}
 		}
 
 
-		.divider {
-			height: 8px;
-			background: #F7F7F7;
-			margin: 0;
-		}
-
-		.more-title {
-			padding: 8px 15px 12px;
-			font-size: 16px;
-			font-weight: 700;
-		}
-
-		.more-scroll {
-			display: grid;
-			grid-template-columns: repeat(2, 1fr);
-			gap: 10px;
-			padding: 0 15px 20px;
-		}
-
-		#recEmpty {
-			grid-column: 1 / -1;
-		}
-
-		.rec-card {
-			min-width: 0;
-			background: #fff;
-			border-radius: 10px;
-			overflow: hidden;
-			box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
-		}
-
-		.rec-card__img {
-			aspect-ratio: 4 / 3;
-			background: #eee;
-		}
-
-		.rec-card__img img {
-			width: 100%;
-			height: 100%;
-			object-fit: cover;
-			display: block;
-			border-radius: 0;
-		}
-
-		.rec-card__body {
-			padding: 10px;
-		}
-
-		.rec-card__top {
-			display: flex;
-			justify-content: space-between;
-			align-items: baseline;
-			gap: 8px;
-			margin-bottom: 6px;
-		}
-
-		.rec-card__name {
-			font-size: 15px;
-			font-weight: 700;
-			flex: 1;
-			min-width: 0;
-			overflow: hidden;
-			text-overflow: ellipsis;
-			white-space: nowrap;
-		}
-
-		.rec-card__dist {
-			font-size: 12px;
-			color: var(--text-secondary);
-			flex-shrink: 0;
-		}
-
-		.rec-card__rating {
-			display: flex;
-			align-items: center;
-			flex-wrap: wrap;
-			gap: 4px 6px;
-		}
-
-		.rec-card__rating .stars {
-			display: inline-flex;
-			align-items: center;
-			gap: 2px;
-		}
-
-		.rec-card__rating .rec-star {
-			display: block;
-			flex-shrink: 0;
-		}
-
-		.rec-card__rating .rating-num {
-			font-size: 12px;
-			font-weight: 600;
-			color: var(--orange);
-		}
-
-		.rec-meta {
-			font-size: 12px;
-			color: var(--text-secondary);
-		}
-
-		.rec-card__footer {
-			margin-top: 8px;
-			font-size: 12px;
-			color: var(--text-secondary);
-			overflow: hidden;
-			text-overflow: ellipsis;
-			white-space: nowrap;
-		}
-
 		.fab-wrap {
 		.fab-wrap {
 			position: fixed;
 			position: fixed;
 			left: 0;
 			left: 0;
@@ -301,13 +191,6 @@
 		<p class="hero--empty__tip" id="heroEmptyTip">内容已删除</p>
 		<p class="hero--empty__tip" id="heroEmptyTip">内容已删除</p>
 	</div>
 	</div>
 
 
-	<div class="divider"></div>
-
-	<h3 class="more-title">更多推荐</h3>
-	<div class="more-scroll" id="recList">
-		<p id="recEmpty" style="padding:12px;color:#999;font-size:14px;display:none;">暂无推荐</p>
-	</div>
-
 	<div id="openAppToast" role="status" aria-live="polite"></div>
 	<div id="openAppToast" role="status" aria-live="polite"></div>
 	<div class="fab-wrap">
 	<div class="fab-wrap">
 		<div class="fab-dock__slot">
 		<div class="fab-dock__slot">
@@ -365,7 +248,7 @@
 					</style>
 					</style>
 					<button class="wx-open-app-btn" aria-label="APP内打开">
 					<button class="wx-open-app-btn" aria-label="APP内打开">
 						<span class="fab__brand-clip" aria-hidden="true">
 						<span class="fab__brand-clip" aria-hidden="true">
-							<img class="fab__brand-img" src="https://test.ailien.shop/h5/HBuilderProjects/images/uBtn.svg" alt="" decoding="async">
+							<img class="fab__brand-img" src="https://prod.ailien.shop/h5/HBuilderProjects/images/uBtn.svg" alt="" decoding="async">
 						</span>
 						</span>
 						<span class="fab__label">APP内打开</span>
 						<span class="fab__label">APP内打开</span>
 					</button>
 					</button>
@@ -381,19 +264,9 @@
 		'use strict';
 		'use strict';
 
 
 		/**
 		/**
-		 * 更多推荐:POST …/dev-life-manager-ai/ai/multimodal-services/api/v1/search/global/store-recommend
-		 * 请求体:page、pageSize、storeId(字符串)、userCity、userLat、userLng;均可由 URL query 覆盖。
-		 *
 		 * businessStatus=99(关店,与 shareIndex.html 一致):点「APP内打开」深链为 shopro://pages/index/login?…,不再进打卡页。
 		 * businessStatus=99(关店,与 shareIndex.html 一致):点「APP内打开」深链为 shopro://pages/index/login?…,不再进打卡页。
 		 */
 		 */
-		var API_BASE = 'https://test.ailien.shop/alienStore';
-		var API_LIFE_AI_BASE = 'http://183.252.196.135:9100';
-		var STORE_GLOBAL_RECOMMEND_PATH =
-			'/ai/multimodal-services/api/v1/search/global/store-recommend';
-		var DEFAULT_USER_LAT = 38.925747;
-		var DEFAULT_USER_LNG = 121.662531;
-		var DEFAULT_USER_CITY = '大连市';
-		var DEFAULT_STORE_ID = '378';
+		var API_BASE = 'https://prod.ailien.shop/alienStore';
 
 
 		/**
 		/**
 		 * 微信 JSSDK — 与 shareIndex.html 一致
 		 * 微信 JSSDK — 与 shareIndex.html 一致
@@ -402,9 +275,9 @@
 		var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
 		var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
 		var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
 		var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
-		var H5_PAGE_BASE_FALLBACK = 'https://test.ailien.shop/h5/HBuilderProjects/';
+		var H5_PAGE_BASE_FALLBACK = 'https://prod.ailien.shop/h5/HBuilderProjects/';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareCheckInUndefined.html';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareCheckInUndefined.html';
-		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'test.ailien.shop'];
+		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'prod.ailien.shop'];
 		var weChatJssdkConfigured = false;
 		var weChatJssdkConfigured = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxInitLastError = '';
 		var wxInitLastError = '';
@@ -1119,240 +992,6 @@
 			}, 2600);
 			}, 2600);
 		}
 		}
 
 
-		function isApiOk(res) {
-			if (!res || typeof res !== 'object') return false;
-			if (res.success === false) return false;
-			var c = res.code;
-			return c === 200 || c === '200' || Number(c) === 200;
-		}
-
-		function fetchStoreGlobalRecommend() {
-			var latRaw = (q('userLat') || q('latitude') || q('lat') || q('weidu')).trim();
-			var lngRaw = (q('userLng') || q('longitude') || q('lon') || q('jingdu')).trim();
-			var userLat =
-				latRaw !== '' && !isNaN(Number(latRaw)) ? Number(latRaw) : DEFAULT_USER_LAT;
-			var userLng =
-				lngRaw !== '' && !isNaN(Number(lngRaw)) ? Number(lngRaw) : DEFAULT_USER_LNG;
-
-			var page = parseInt(q('page') || '1', 10);
-			var pageSize = parseInt(q('pageSize') || '10', 10);
-			if (isNaN(page) || page < 1) page = 1;
-			if (isNaN(pageSize) || pageSize < 1) pageSize = 10;
-
-			var storeIdRaw = (q('storeId') || q('id') || '').trim();
-			var storeId = storeIdRaw !== '' ? storeIdRaw : DEFAULT_STORE_ID;
-
-			var userCityRaw = (q('userCity') || q('city') || '').trim();
-			var userCity = userCityRaw !== '' ? userCityRaw : DEFAULT_USER_CITY;
-
-			var body = {
-				page: page,
-				pageSize: pageSize,
-				storeId: String(storeId),
-				userCity: userCity,
-				userLat: userLat,
-				userLng: userLng
-			};
-
-			return fetch(API_LIFE_AI_BASE + STORE_GLOBAL_RECOMMEND_PATH, {
-				method: 'POST',
-				mode: 'cors',
-				credentials: 'omit',
-				headers: {
-					Accept: 'application/json',
-					'Content-Type': 'application/json;charset=UTF-8'
-				},
-				body: JSON.stringify(body)
-			}).then(function (res) {
-				if (!res.ok) throw new Error('HTTP ' + res.status);
-				return res.json();
-			});
-		}
-
-		function normalizeStoreRecommendList(res) {
-			if (!res || typeof res !== 'object') return [];
-			var raw = res.data != null ? res.data : res.result;
-			if (Array.isArray(raw)) return raw;
-			if (raw && typeof raw === 'object') {
-				if (Array.isArray(raw.list)) return raw.list;
-				if (Array.isArray(raw.records)) return raw.records;
-				if (Array.isArray(raw.rows)) return raw.rows;
-				if (Array.isArray(raw.content)) return raw.content;
-				if (Array.isArray(raw.stores)) return raw.stores;
-				if (Array.isArray(raw.storeList)) return raw.storeList;
-				if (Array.isArray(raw.storeVos)) return raw.storeVos;
-				if (Array.isArray(raw.items)) return raw.items;
-			}
-			if (Array.isArray(res.list)) return res.list;
-			if (Array.isArray(res.records)) return res.records;
-			return [];
-		}
-
-		function formatRecDistance(item) {
-			/** 后端 distance 为千米,展示为米 */
-			if (item.distance != null && item.distance !== '') {
-				var km = Number(item.distance);
-				if (!isNaN(km) && km >= 0) {
-					return Math.round(km * 1000) + '米';
-				}
-				return String(item.distance).trim();
-			}
-			if (item.position != null && String(item.position).trim() !== '') {
-				return String(item.position).trim();
-			}
-			if (item.dist != null && item.dist !== '') {
-				var dn = Number(item.dist);
-				if (!isNaN(dn)) {
-					return dn >= 1 ? dn.toFixed(dn % 1 === 0 ? 0 : 1) + 'km' : Math.round(dn * 1000) + '米';
-				}
-			}
-			return '';
-		}
-
-		function escHtml(s) {
-			return String(s == null ? '' : s)
-				.replace(/&/g, '&amp;')
-				.replace(/</g, '&lt;')
-				.replace(/>/g, '&gt;')
-				.replace(/"/g, '&quot;');
-		}
-
-		var STAR_PATH = 'M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z';
-
-		function starsHtml(score) {
-			var s = Number(score);
-			if (isNaN(s)) s = 0;
-			s = Math.max(0, Math.min(5, s));
-			var rounded = Math.round(s);
-			var parts = [];
-			var i;
-			for (i = 1; i <= 5; i++) {
-				var fill = i <= rounded ? '#F58220' : '#E5E5E5';
-				parts.push(
-					'<svg class="rec-star" width="11" height="11" viewBox="0 0 24 24" aria-hidden="true">' +
-					'<path fill="' + fill + '" d="' + STAR_PATH + '"/></svg>'
-				);
-			}
-			return '<span class="stars">' + parts.join('') + '</span>';
-		}
-
-		function pickScore(item) {
-			var x =
-				item.scoreAvg != null ? Number(item.scoreAvg)
-					: item.score != null ? Number(item.score)
-						: item.rating != null ? Number(item.rating)
-							: item.starScore != null ? Number(item.starScore)
-								: NaN;
-			return isNaN(x) ? null : x;
-		}
-
-		function pickReviewCount(item) {
-			var n =
-				item.commitCount != null ? Number(item.commitCount)
-					: item.commentCount != null ? Number(item.commentCount)
-						: item.reviewCount != null ? Number(item.reviewCount)
-							: item.evaluateCount != null ? Number(item.evaluateCount)
-								: NaN;
-			return isNaN(n) ? 0 : Math.max(0, Math.floor(n));
-		}
-
-		function renderRecommended(list) {
-			var wrap = document.getElementById('recList');
-			var empty = document.getElementById('recEmpty');
-			wrap.querySelectorAll('.rec-card').forEach(function (n) {
-				n.remove();
-			});
-			if (!list || !list.length) {
-				empty.style.display = 'block';
-				return;
-			}
-			empty.style.display = 'none';
-
-			list.forEach(function (item) {
-				if (!item || typeof item !== 'object') return;
-
-				var imgUrlField = item.imgUrl != null ? String(item.imgUrl).trim() : '';
-				var home = item.homeImage != null ? String(item.homeImage).trim() : '';
-				if (home && /\.mp4(\?|#|$)/i.test(home)) {
-					var vf = item.videoFirstFrame != null ? String(item.videoFirstFrame).trim() : '';
-					if (vf) home = vf;
-				}
-				var imgUrl =
-					imgUrlField ||
-					home ||
-					(item.coverUrl != null ? String(item.coverUrl).trim() : '') ||
-					(item.mainImage != null ? String(item.mainImage).trim() : '') ||
-					(item.goodsImage != null ? String(item.goodsImage).trim() : '') ||
-					(item.entranceImage != null ? String(item.entranceImage).trim() : '') ||
-					(Array.isArray(item.goodsImageList) && item.goodsImageList[0]) ||
-					(Array.isArray(item.imageList) && item.imageList[0]) ||
-					(Array.isArray(item.storeAlbumUrlList) && item.storeAlbumUrlList[0]) ||
-					'';
-
-				var name = item.title != null && String(item.title).trim() !== ''
-					? String(item.title).replace(/\r?\n/g, ' ').replace(/\s+/g, ' ').trim()
-					: (item.storeName || item.goodsName || item.secondGoodsTitle || item.name || '推荐');
-
-				var dist = formatRecDistance(item);
-
-				var scoreVal = pickScore(item);
-				var displayScore = scoreVal != null ? scoreVal.toFixed(1) : '—';
-				var starScore = scoreVal != null ? scoreVal : 0;
-
-				var rc = pickReviewCount(item);
-				var reviewLabel = rc > 0 ? rc + '条评价' : '';
-
-				var seller =
-					item.userName != null && String(item.userName).trim() !== ''
-						? String(item.userName).trim()
-						: (item.nickName != null && String(item.nickName).trim() !== ''
-							? String(item.nickName).trim()
-							: '');
-
-				var card = document.createElement('article');
-				card.className = 'rec-card';
-				card.innerHTML =
-					'<div class="rec-card__img"><img class="rec-card__cover" src="" alt="" decoding="async"></div>' +
-					'<div class="rec-card__body">' +
-					'<div class="rec-card__top">' +
-					'<span class="rec-card__name">' + escHtml(name) + '</span>' +
-					(dist ? '<span class="rec-card__dist">' + escHtml(dist) + '</span>' : '') +
-					'</div>' +
-					'<div class="rec-card__rating">' +
-					starsHtml(starScore) +
-					'<span class="rating-num">' + escHtml(displayScore) + '</span>' +
-					(reviewLabel ? '<span class="rec-meta">' + escHtml(reviewLabel) + '</span>' : '') +
-					'</div>' +
-					(seller ? '<div class="rec-card__footer">' + escHtml(seller) + '</div>' : '') +
-					'</div>';
-
-				var coverIm = card.querySelector('img.rec-card__cover');
-				if (coverIm) {
-					coverIm.src = imgUrl;
-					coverIm.onerror = function () {
-						this.onerror = null;
-						this.src = '';
-					};
-				}
-				wrap.appendChild(card);
-			});
-		}
-
-		function run() {
-			fetchStoreGlobalRecommend()
-				.then(function (res) {
-					var list = normalizeStoreRecommendList(res);
-					if (!list.length && res && res.msg) {
-						console.warn('[store-recommend]', res.msg);
-					}
-					renderRecommended(list);
-				})
-				.catch(function (e) {
-					console.error(e);
-					renderRecommended([]);
-				});
-		}
-
 		function boot() {
 		function boot() {
 			var launchTag = document.getElementById('launch-btn');
 			var launchTag = document.getElementById('launch-btn');
 			if (launchTag) launchTag.setAttribute('appid', WECHAT_OPEN_APP_ID);
 			if (launchTag) launchTag.setAttribute('appid', WECHAT_OPEN_APP_ID);
@@ -1373,7 +1012,6 @@
 			});
 			});
 
 
 			applyEmptyHeroState();
 			applyEmptyHeroState();
-			run();
 
 
 			if (isWeChatInAppBrowser()) {
 			if (isWeChatInAppBrowser()) {
 				var openBtnWx = document.getElementById('openApp');
 				var openBtnWx = document.getElementById('openApp');

+ 8 - 391
HBuilderProjects/shareDynamic.html

@@ -38,131 +38,11 @@
 			overflow-x: hidden;
 			overflow-x: hidden;
 		}
 		}
 
 
-		/* getOne 关店/暂无承载,或 getDynamicsDetail 无有效 data:隐藏 #dynPageMain,展示横幅 + 更多推荐 */
+		/* getOne 关店/暂无承载,或 getDynamicsDetail 无有效 data:隐藏 #dynPageMain,展示横幅 */
 		#dynPageMain {
 		#dynPageMain {
 			display: block;
 			display: block;
 		}
 		}
 
 
-		.closed-rec-wrap {
-			display: none;
-		}
-
-		.closed-rec-divider {
-			height: 8px;
-			background: #F7F7F7;
-			margin: 0;
-		}
-
-		.closed-rec-title {
-			padding: 8px 15px 12px;
-			font-size: 16px;
-			font-weight: 700;
-		}
-
-		.closed-rec-grid {
-			display: grid;
-			grid-template-columns: repeat(2, 1fr);
-			gap: 10px;
-			padding: 0 15px 20px;
-		}
-
-		#shareClosedRecEmpty {
-			grid-column: 1 / -1;
-		}
-
-		.closed-rec-empty {
-			padding: 12px;
-			color: var(--text-secondary);
-			font-size: 14px;
-		}
-
-		.closed-rec-card {
-			min-width: 0;
-			background: #fff;
-			border-radius: 10px;
-			overflow: hidden;
-			box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
-		}
-
-		.closed-rec-card__img {
-			aspect-ratio: 4 / 3;
-			background: #eee;
-		}
-
-		.closed-rec-card__img img {
-			width: 100%;
-			height: 100%;
-			object-fit: cover;
-			display: block;
-			border-radius: 0;
-		}
-
-		.closed-rec-card__body {
-			padding: 10px;
-		}
-
-		.closed-rec-card__top {
-			display: flex;
-			justify-content: space-between;
-			align-items: baseline;
-			gap: 8px;
-			margin-bottom: 6px;
-		}
-
-		.closed-rec-card__name {
-			font-size: 15px;
-			font-weight: 700;
-			flex: 1;
-			min-width: 0;
-			overflow: hidden;
-			text-overflow: ellipsis;
-			white-space: nowrap;
-		}
-
-		.closed-rec-card__dist {
-			font-size: 12px;
-			color: var(--text-secondary);
-			flex-shrink: 0;
-		}
-
-		.closed-rec-card__rating {
-			display: flex;
-			align-items: center;
-			flex-wrap: wrap;
-			gap: 4px 6px;
-		}
-
-		.closed-rec-card__rating .closed-rec-stars {
-			display: inline-flex;
-			align-items: center;
-			gap: 2px;
-		}
-
-		.closed-rec-card__rating .closed-rec-star {
-			display: block;
-			flex-shrink: 0;
-		}
-
-		.closed-rec-card__rating .closed-rec-rating-num {
-			font-size: 12px;
-			font-weight: 600;
-			color: var(--orange);
-		}
-
-		.closed-rec-meta {
-			font-size: 12px;
-			color: var(--text-secondary);
-		}
-
-		.closed-rec-card__footer {
-			margin-top: 8px;
-			font-size: 12px;
-			color: var(--text-secondary);
-			overflow: hidden;
-			text-overflow: ellipsis;
-			white-space: nowrap;
-		}
-
 		.share-none {
 		.share-none {
 			display: none;
 			display: none;
 			text-align: center;
 			text-align: center;
@@ -607,13 +487,6 @@
 		<img src="images/storeNone.png" alt="">
 		<img src="images/storeNone.png" alt="">
 		<p>内容已删除</p>
 		<p>内容已删除</p>
 	</div>
 	</div>
-	<div class="closed-rec-wrap" id="shareClosedRecommendWrap" aria-hidden="true">
-		<div class="closed-rec-divider"></div>
-		<h3 class="closed-rec-title">更多推荐</h3>
-		<div class="closed-rec-grid" id="shareClosedRecList">
-			<p id="shareClosedRecEmpty" class="closed-rec-empty" style="display:none;">暂无推荐</p>
-		</div>
-	</div>
 
 
 	<div id="dynPageMain">
 	<div id="dynPageMain">
 	<!-- 顶部配图:含 .mp4 时只展示首帧静图(不播放视频)、不轮播;纯图片可多图轮播。 -->
 	<!-- 顶部配图:含 .mp4 时只展示首帧静图(不播放视频)、不轮播;纯图片可多图轮播。 -->
@@ -719,7 +592,7 @@
 					</style>
 					</style>
 					<button class="wx-open-app-btn" aria-label="APP内打开">
 					<button class="wx-open-app-btn" aria-label="APP内打开">
 						<span class="fab__brand-clip" aria-hidden="true">
 						<span class="fab__brand-clip" aria-hidden="true">
-							<img class="fab__brand-img" src="https://test.ailien.shop/h5/HBuilderProjects/images/uBtn.svg" alt="" decoding="async">
+							<img class="fab__brand-img" src="https://prod.ailien.shop/h5/HBuilderProjects/images/uBtn.svg" alt="" decoding="async">
 						</span>
 						</span>
 						<span class="fab__label">APP内打开</span>
 						<span class="fab__label">APP内打开</span>
 					</button>
 					</button>
@@ -734,7 +607,7 @@
 	(function () {
 	(function () {
 		'use strict';
 		'use strict';
 
 
-		var API_BASE = 'https://test.ailien.shop/alienStore';
+		var API_BASE = 'https://prod.ailien.shop/alienStore';
 
 
 		/**
 		/**
 		 * 微信 JSSDK — 与 shareIndex.html 一致
 		 * 微信 JSSDK — 与 shareIndex.html 一致
@@ -743,25 +616,14 @@
 		var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
 		var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
 		var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
 		var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
-		var H5_PAGE_BASE_FALLBACK = 'https://test.ailien.shop/h5/HBuilderProjects/';
+		var H5_PAGE_BASE_FALLBACK = 'https://prod.ailien.shop/h5/HBuilderProjects/';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareDynamic.html';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareDynamic.html';
-		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'test.ailien.shop'];
+		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'prod.ailien.shop'];
 		var weChatJssdkConfigured = false;
 		var weChatJssdkConfigured = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxInitLastError = '';
 		var wxInitLastError = '';
 		var wxJssdkInitPromise = null;
 		var wxJssdkInitPromise = null;
 
 
-		/**
-		 * 暂无承载数据时更多推荐:POST …/ai/multimodal-services/api/v1/search/global/store-recommend
-		 * 与 shareIndex.html / shareCheckInUndefined.html 一致。
-		 */
-		var API_LIFE_AI_BASE = 'http://183.252.196.135:9100';
-		var STORE_GLOBAL_RECOMMEND_PATH =
-			'/ai/multimodal-services/api/v1/search/global/store-recommend';
-		var DEFAULT_REC_USER_LAT = 38.925747;
-		var DEFAULT_REC_USER_LNG = 121.662531;
-		var DEFAULT_REC_USER_CITY = '大连市';
-
 		var COMMENT_PAGE_NUM = 1;
 		var COMMENT_PAGE_NUM = 1;
 		var COMMENT_PAGE_SIZE = 20;
 		var COMMENT_PAGE_SIZE = 20;
 		var COMMENT_AVATAR_FALLBACK = 'images/demouser.png';
 		var COMMENT_AVATAR_FALLBACK = 'images/demouser.png';
@@ -2082,237 +1944,7 @@
 			return tip === '暂无承载数据';
 			return tip === '暂无承载数据';
 		}
 		}
 
 
-		var CLOSED_REC_STAR_PATH =
-			'M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z';
-
-		function closedRecEscHtml(s) {
-			return String(s == null ? '' : s)
-				.replace(/&/g, '&amp;')
-				.replace(/</g, '&lt;')
-				.replace(/>/g, '&gt;')
-				.replace(/"/g, '&quot;');
-		}
-
-		function closedRecStarsHtml(score) {
-			var s = Number(score);
-			if (isNaN(s)) s = 0;
-			s = Math.max(0, Math.min(5, s));
-			var rounded = Math.round(s);
-			var parts = [];
-			var i;
-			for (i = 1; i <= 5; i++) {
-				var fill = i <= rounded ? '#F58220' : '#E5E5E5';
-				parts.push(
-					'<svg class="closed-rec-star" width="11" height="11" viewBox="0 0 24 24" aria-hidden="true">' +
-					'<path fill="' + fill + '" d="' + CLOSED_REC_STAR_PATH + '"/></svg>'
-				);
-			}
-			return '<span class="closed-rec-stars">' + parts.join('') + '</span>';
-		}
-
-		function closedRecFormatDistance(item) {
-			if (item.distance != null && item.distance !== '') {
-				var km = Number(item.distance);
-				if (!isNaN(km) && km >= 0) {
-					return Math.round(km * 1000) + '米';
-				}
-				return String(item.distance).trim();
-			}
-			if (item.position != null && String(item.position).trim() !== '') {
-				return String(item.position).trim();
-			}
-			if (item.dist != null && item.dist !== '') {
-				var dn = Number(item.dist);
-				if (!isNaN(dn)) {
-					return dn >= 1 ? dn.toFixed(dn % 1 === 0 ? 0 : 1) + 'km' : Math.round(dn * 1000) + '米';
-				}
-			}
-			return '';
-		}
-
-		function closedRecPickScore(item) {
-			var x =
-				item.scoreAvg != null ? Number(item.scoreAvg)
-					: item.score != null ? Number(item.score)
-						: item.rating != null ? Number(item.rating)
-							: item.starScore != null ? Number(item.starScore)
-								: NaN;
-			return isNaN(x) ? null : x;
-		}
-
-		function closedRecPickReviewCount(item) {
-			var n =
-				item.commitCount != null ? Number(item.commitCount)
-					: item.commentCount != null ? Number(item.commentCount)
-						: item.reviewCount != null ? Number(item.reviewCount)
-							: item.evaluateCount != null ? Number(item.evaluateCount)
-								: NaN;
-			return isNaN(n) ? 0 : Math.max(0, Math.floor(n));
-		}
-
-		function normalizeClosedStoreRecommendList(res) {
-			if (!res || typeof res !== 'object') return [];
-			var raw = res.data != null ? res.data : res.result;
-			if (Array.isArray(raw)) return raw;
-			if (raw && typeof raw === 'object') {
-				if (Array.isArray(raw.list)) return raw.list;
-				if (Array.isArray(raw.records)) return raw.records;
-				if (Array.isArray(raw.rows)) return raw.rows;
-				if (Array.isArray(raw.content)) return raw.content;
-				if (Array.isArray(raw.stores)) return raw.stores;
-				if (Array.isArray(raw.storeList)) return raw.storeList;
-				if (Array.isArray(raw.storeVos)) return raw.storeVos;
-				if (Array.isArray(raw.items)) return raw.items;
-			}
-			if (Array.isArray(res.list)) return res.list;
-			if (Array.isArray(res.records)) return res.records;
-			return [];
-		}
-
-		function fetchShareClosedStoreRecommend(storeIdStr) {
-			var latRaw = (q('userLat') || q('latitude') || q('lat') || q('weidu')).trim();
-			var lngRaw = (q('userLng') || q('longitude') || q('lon') || q('jingdu')).trim();
-			var userLat =
-				latRaw !== '' && !isNaN(Number(latRaw)) ? Number(latRaw) : DEFAULT_REC_USER_LAT;
-			var userLng =
-				lngRaw !== '' && !isNaN(Number(lngRaw)) ? Number(lngRaw) : DEFAULT_REC_USER_LNG;
-
-			var page = parseInt(q('page') || '1', 10);
-			var pageSize = parseInt(q('pageSize') || '10', 10);
-			if (isNaN(page) || page < 1) page = 1;
-			if (isNaN(pageSize) || pageSize < 1) pageSize = 10;
-
-			var userCityRaw = (q('userCity') || q('city') || '').trim();
-			var userCity = userCityRaw !== '' ? userCityRaw : DEFAULT_REC_USER_CITY;
-
-			var body = {
-				page: page,
-				pageSize: pageSize,
-				storeId: String(storeIdStr || ''),
-				userCity: userCity,
-				userLat: userLat,
-				userLng: userLng
-			};
-
-			return fetch(API_LIFE_AI_BASE + STORE_GLOBAL_RECOMMEND_PATH, {
-				method: 'POST',
-				mode: 'cors',
-				credentials: 'omit',
-				headers: {
-					Accept: 'application/json',
-					'Content-Type': 'application/json;charset=UTF-8'
-				},
-				body: JSON.stringify(body)
-			}).then(function (res) {
-				if (!res.ok) throw new Error('HTTP ' + res.status);
-				return res.json();
-			});
-		}
-
-		function renderShareClosedRecommended(list) {
-			var wrap = document.getElementById('shareClosedRecList');
-			var empty = document.getElementById('shareClosedRecEmpty');
-			if (!wrap || !empty) return;
-			wrap.querySelectorAll('.closed-rec-card').forEach(function (n) {
-				n.remove();
-			});
-			if (!list || !list.length) {
-				empty.style.display = 'block';
-				return;
-			}
-			empty.style.display = 'none';
-
-			list.forEach(function (item) {
-				if (!item || typeof item !== 'object') return;
-
-				var imgUrlField = item.imgUrl != null ? String(item.imgUrl).trim() : '';
-				var home = item.homeImage != null ? String(item.homeImage).trim() : '';
-				if (home && /\.mp4(\?|#|$)/i.test(home)) {
-					var vf = item.videoFirstFrame != null ? String(item.videoFirstFrame).trim() : '';
-					if (vf) home = vf;
-				}
-				var imgUrl =
-					imgUrlField ||
-					home ||
-					(item.coverUrl != null ? String(item.coverUrl).trim() : '') ||
-					(item.mainImage != null ? String(item.mainImage).trim() : '') ||
-					(item.goodsImage != null ? String(item.goodsImage).trim() : '') ||
-					(item.entranceImage != null ? String(item.entranceImage).trim() : '') ||
-					(Array.isArray(item.goodsImageList) && item.goodsImageList[0]) ||
-					(Array.isArray(item.imageList) && item.imageList[0]) ||
-					(Array.isArray(item.storeAlbumUrlList) && item.storeAlbumUrlList[0]) ||
-					'';
-
-				var name = item.title != null && String(item.title).trim() !== ''
-					? String(item.title).replace(/\r?\n/g, ' ').replace(/\s+/g, ' ').trim()
-					: (item.storeName || item.goodsName || item.secondGoodsTitle || item.name || '推荐');
-
-				var dist = closedRecFormatDistance(item);
-
-				var scoreVal = closedRecPickScore(item);
-				var displayScore = scoreVal != null ? scoreVal.toFixed(1) : '—';
-				var starScore = scoreVal != null ? scoreVal : 0;
-
-				var rc = closedRecPickReviewCount(item);
-				var reviewLabel = rc > 0 ? rc + '条评价' : '';
-
-				var seller =
-					item.userName != null && String(item.userName).trim() !== ''
-						? String(item.userName).trim()
-						: (item.nickName != null && String(item.nickName).trim() !== ''
-							? String(item.nickName).trim()
-							: '');
-
-				var card = document.createElement('article');
-				card.className = 'closed-rec-card';
-				card.innerHTML =
-					'<div class="closed-rec-card__img"><img class="closed-rec-card__cover" src="" alt="" decoding="async"></div>' +
-					'<div class="closed-rec-card__body">' +
-					'<div class="closed-rec-card__top">' +
-					'<span class="closed-rec-card__name">' + closedRecEscHtml(name) + '</span>' +
-					(dist ? '<span class="closed-rec-card__dist">' + closedRecEscHtml(dist) + '</span>' : '') +
-					'</div>' +
-					'<div class="closed-rec-card__rating">' +
-					closedRecStarsHtml(starScore) +
-					'<span class="closed-rec-rating-num">' + closedRecEscHtml(displayScore) + '</span>' +
-					(reviewLabel ? '<span class="closed-rec-meta">' + closedRecEscHtml(reviewLabel) + '</span>' : '') +
-					'</div>' +
-					(seller ? '<div class="closed-rec-card__footer">' + closedRecEscHtml(seller) + '</div>' : '') +
-					'</div>';
-
-				var coverIm = card.querySelector('img.closed-rec-card__cover');
-				if (coverIm) {
-					coverIm.src = imgUrl;
-					coverIm.onerror = function () {
-						this.onerror = null;
-						this.src = '';
-					};
-				}
-				wrap.appendChild(card);
-			});
-		}
-
-		function loadDynNoCarryRecommendations() {
-			var sid = resolveStoreIdForDeleteFlagApi();
-			if (!sid) {
-				renderShareClosedRecommended([]);
-				return;
-			}
-			fetchShareClosedStoreRecommend(sid)
-				.then(function (res) {
-					var list = normalizeClosedStoreRecommendList(res);
-					if (!list.length && res && res.msg) {
-						console.warn('[store-recommend]', res.msg);
-					}
-					renderShareClosedRecommended(list);
-				})
-				.catch(function (e) {
-					console.error(e);
-					renderShareClosedRecommended([]);
-				});
-		}
-
-		/** 关店横幅 + 更多推荐区显隐(与 shareIndex applyShareIndexClosedMerchantUi 的 banner / content 对应关系一致) */
+		/** 关店/无数据横幅显隐(与 shareIndex applyShareIndexClosedMerchantUi 的 banner / content 对应关系一致) */
 		function setShareDynamicClosedSurfaceDom(visible) {
 		function setShareDynamicClosedSurfaceDom(visible) {
 			var main = document.getElementById('dynPageMain');
 			var main = document.getElementById('dynPageMain');
 			if (main) {
 			if (main) {
@@ -2320,38 +1952,23 @@
 				main.setAttribute('aria-hidden', visible ? 'true' : 'false');
 				main.setAttribute('aria-hidden', visible ? 'true' : 'false');
 			}
 			}
 			var banner = document.getElementById('shareClosedBanner');
 			var banner = document.getElementById('shareClosedBanner');
-			var recWrap = document.getElementById('shareClosedRecommendWrap');
 			if (banner) {
 			if (banner) {
 				banner.style.display = visible ? 'block' : 'none';
 				banner.style.display = visible ? 'block' : 'none';
 				banner.setAttribute('aria-hidden', visible ? 'false' : 'true');
 				banner.setAttribute('aria-hidden', visible ? 'false' : 'true');
 			}
 			}
-			if (recWrap) {
-				recWrap.style.display = visible ? 'block' : 'none';
-				recWrap.setAttribute('aria-hidden', visible ? 'false' : 'true');
-			}
 		}
 		}
 
 
 		/**
 		/**
 		 * store/info/getOne 返回 businessStatus=99:与 shareIndex.html 一致,置 closedMerchantFlag、隐藏 #dynPageMain、
 		 * store/info/getOne 返回 businessStatus=99:与 shareIndex.html 一致,置 closedMerchantFlag、隐藏 #dynPageMain、
-		 * 展示 #shareClosedBanner / #shareClosedRecommendWrap 并拉更多推荐
+		 * 展示 #shareClosedBanner。
 		 */
 		 */
 		function applyShareDynamicClosedMerchantUi(closed) {
 		function applyShareDynamicClosedMerchantUi(closed) {
-			var wasClosed = closedMerchantFlag;
 			closedMerchantFlag = closed;
 			closedMerchantFlag = closed;
-			if (closed) {
-				setShareDynamicClosedSurfaceDom(true);
-				if (!wasClosed) {
-					loadDynNoCarryRecommendations();
-				}
-			} else {
-				setShareDynamicClosedSurfaceDom(false);
-				renderShareClosedRecommended([]);
-			}
+			setShareDynamicClosedSurfaceDom(closed);
 		}
 		}
 
 
 		function showDynNoCarryingDataState() {
 		function showDynNoCarryingDataState() {
 			setShareDynamicClosedSurfaceDom(true);
 			setShareDynamicClosedSurfaceDom(true);
-			loadDynNoCarryRecommendations();
 		}
 		}
 
 
 		function pushUniqueUrl(list, u) {
 		function pushUniqueUrl(list, u) {

+ 5 - 389
HBuilderProjects/shareIndex.html

@@ -315,126 +315,6 @@
 		}
 		}
 
 
 		/* businessStatus===99 时仅展示关店提示并隐藏 .share-content;底部 FAB 仍在 #shareBelowContentEl */
 		/* businessStatus===99 时仅展示关店提示并隐藏 .share-content;底部 FAB 仍在 #shareBelowContentEl */
-		.closed-rec-wrap {
-			display: none;
-		}
-
-		.closed-rec-divider {
-			height: 8px;
-			background: #F7F7F7;
-			margin: 0;
-		}
-
-		.closed-rec-title {
-			padding: 8px 15px 12px;
-			font-size: 16px;
-			font-weight: 700;
-		}
-
-		.closed-rec-grid {
-			display: grid;
-			grid-template-columns: repeat(2, 1fr);
-			gap: 10px;
-			padding: 0 15px 20px;
-		}
-
-		#shareClosedRecEmpty {
-			grid-column: 1 / -1;
-		}
-
-		.closed-rec-empty {
-			padding: 12px;
-			color: var(--text-secondary);
-			font-size: 14px;
-		}
-
-		.closed-rec-card {
-			min-width: 0;
-			background: #fff;
-			border-radius: 10px;
-			overflow: hidden;
-			box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
-		}
-
-		.closed-rec-card__img {
-			aspect-ratio: 4 / 3;
-			background: #eee;
-		}
-
-		.closed-rec-card__img img {
-			width: 100%;
-			height: 100%;
-			object-fit: cover;
-			display: block;
-			border-radius: 0;
-		}
-
-		.closed-rec-card__body {
-			padding: 10px;
-		}
-
-		.closed-rec-card__top {
-			display: flex;
-			justify-content: space-between;
-			align-items: baseline;
-			gap: 8px;
-			margin-bottom: 6px;
-		}
-
-		.closed-rec-card__name {
-			font-size: 15px;
-			font-weight: 700;
-			flex: 1;
-			min-width: 0;
-			overflow: hidden;
-			text-overflow: ellipsis;
-			white-space: nowrap;
-		}
-
-		.closed-rec-card__dist {
-			font-size: 12px;
-			color: var(--text-secondary);
-			flex-shrink: 0;
-		}
-
-		.closed-rec-card__rating {
-			display: flex;
-			align-items: center;
-			flex-wrap: wrap;
-			gap: 4px 6px;
-		}
-
-		.closed-rec-card__rating .closed-rec-stars {
-			display: inline-flex;
-			align-items: center;
-			gap: 2px;
-		}
-
-		.closed-rec-card__rating .closed-rec-star {
-			display: block;
-			flex-shrink: 0;
-		}
-
-		.closed-rec-card__rating .closed-rec-rating-num {
-			font-size: 12px;
-			font-weight: 600;
-			color: var(--orange);
-		}
-
-		.closed-rec-meta {
-			font-size: 12px;
-			color: var(--text-secondary);
-		}
-
-		.closed-rec-card__footer {
-			margin-top: 8px;
-			font-size: 12px;
-			color: var(--text-secondary);
-			overflow: hidden;
-			text-overflow: ellipsis;
-			white-space: nowrap;
-		}
-
 		.share-none {
 		.share-none {
 			display: none;
 			display: none;
 			text-align: center;
 			text-align: center;
@@ -938,13 +818,6 @@
 		<img src="images/storeNone.png" alt="">
 		<img src="images/storeNone.png" alt="">
 		<p>抱歉商户已关闭,看看别的吧</p>
 		<p>抱歉商户已关闭,看看别的吧</p>
 	</div>
 	</div>
-	<div class="closed-rec-wrap" id="shareClosedRecommendWrap" aria-hidden="true">
-		<div class="closed-rec-divider"></div>
-		<h3 class="closed-rec-title">更多推荐</h3>
-		<div class="closed-rec-grid" id="shareClosedRecList">
-			<p id="shareClosedRecEmpty" class="closed-rec-empty" style="display:none;">暂无推荐</p>
-		</div>
-	</div>
 	<div class="share-content" id="shareContentEl">
 	<div class="share-content" id="shareContentEl">
 		<div class="hero" id="hero">
 		<div class="hero" id="hero">
 			<div class="hero__track" id="heroTrack">
 			<div class="hero__track" id="heroTrack">
@@ -1101,7 +974,7 @@
 					</style>
 					</style>
 					<button class="wx-open-app-btn" aria-label="APP内打开">
 					<button class="wx-open-app-btn" aria-label="APP内打开">
 						<span class="fab__brand-clip" aria-hidden="true">
 						<span class="fab__brand-clip" aria-hidden="true">
-							<img class="fab__brand-img" src="https://test.ailien.shop/h5/HBuilderProjects/images/uBtn.svg" alt="" decoding="async">
+							<img class="fab__brand-img" src="https://prod.ailien.shop/h5/HBuilderProjects/images/uBtn.svg" alt="" decoding="async">
 						</span>
 						</span>
 						<span class="fab__label">APP内打开</span>
 						<span class="fab__label">APP内打开</span>
 					</button>
 					</button>
@@ -1118,7 +991,7 @@
 		 * 与 group_user sharePopup 复制链接时携带的 query 一致,例如:
 		 * 与 group_user sharePopup 复制链接时携带的 query 一致,例如:
 		 * ?id=436&storeId=436&userId=628&businessSection=3&lat=...&lon=...&jingdu=...&weidu=...&storeName=...&coverUrl=...&desc=...
 		 * ?id=436&storeId=436&userId=628&businessSection=3&lat=...&lon=...&jingdu=...&weidu=...&storeName=...&coverUrl=...&desc=...
 		 *
 		 *
-		 * 进入页先 GET .../store/info/getOne?id=(与 shareDynamic.html 一致);data.businessStatus===99 时先展示关店区(#shareClosedBanner、#shareClosedRecommendWrap)。
+		 * 进入页先 GET .../store/info/getOne?id=(与 shareDynamic.html 一致);data.businessStatus===99 时先展示关店区(#shareClosedBanner)。
 		 * 关店时点「APP内打开」:深链为 shopro://pages/index/login?…(与 group_user pages/index/login),不再进八区详情。
 		 * 关店时点「APP内打开」:深链为 shopro://pages/index/login?…(与 group_user pages/index/login),不再进八区详情。
 		 * 店铺头图/名称/评分/地址等(#mainSection、.loc-wrap):GET .../store/info/getClientStoreDetail?id=&userId=&jingdu=&weidu=
 		 * 店铺头图/名称/评分/地址等(#mainSection、.loc-wrap):GET .../store/info/getClientStoreDetail?id=&userId=&jingdu=&weidu=
 		 * 经纬度:URL 可用 jingdu/weidu;若无则用 lon/lng、lat(与分享链一致)
 		 * 经纬度:URL 可用 jingdu/weidu;若无则用 lon/lng、lat(与分享链一致)
@@ -1129,7 +1002,7 @@
 		 * 注意:用 file:// 打开本页时,浏览器可能因 CORS 拦截跨域请求。
 		 * 注意:用 file:// 打开本页时,浏览器可能因 CORS 拦截跨域请求。
 		 * 请用本地 HTTP 打开(如 VS Code Live Server、npx serve)或让后端为 H5 域名配置 Access-Control-Allow-Origin。
 		 * 请用本地 HTTP 打开(如 VS Code Live Server、npx serve)或让后端为 H5 域名配置 Access-Control-Allow-Origin。
 		 */
 		 */
-		var API_BASE = 'https://test.ailien.shop/alienStore';
+		var API_BASE = 'https://prod.ailien.shop/alienStore';
 
 
 		/**
 		/**
 		 * 微信 JSSDK(服务号「麦丽恩严U店」)— 仅用于 wx.config 签名,Secret 只放后端
 		 * 微信 JSSDK(服务号「麦丽恩严U店」)— 仅用于 wx.config 签名,Secret 只放后端
@@ -1147,36 +1020,15 @@
 		var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
 		var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
 		/** 仅 file:// 或无法读取 location.href 时的联调兜底,微信内真实环境不应走到此处 */
 		/** 仅 file:// 或无法读取 location.href 时的联调兜底,微信内真实环境不应走到此处 */
-		var H5_PAGE_BASE_FALLBACK = 'https://test.ailien.shop/h5/HBuilderProjects/';
+		var H5_PAGE_BASE_FALLBACK = 'https://prod.ailien.shop/h5/HBuilderProjects/';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareIndex.html';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareIndex.html';
-		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'test.ailien.shop'];
+		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'prod.ailien.shop'];
 		var weChatJssdkConfigured = false;
 		var weChatJssdkConfigured = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxInitLastError = '';
 		var wxInitLastError = '';
 		var wxJssdkInitPromise = null;
 		var wxJssdkInitPromise = null;
 
 
 		/**
 		/**
-		 * 关店(businessStatus=99)更多推荐:POST …/ai/multimodal-services/api/v1/search/global/store-recommend
-		 * 与 shareCheckInUndefined.html 一致;请求体 userCity/userLat/userLng 优先取 URL:userCity、lat、lon(兼认 userLat/userLng、weidu/jingdu 等)。
-		 */
-		var API_LIFE_AI_BASE = 'http://183.252.196.135:9100';
-		var STORE_GLOBAL_RECOMMEND_PATH =
-			'/ai/multimodal-services/api/v1/search/global/store-recommend';
-		/** 关店推荐用户位置:优先 URL 的 lat、lon、userCity;缺省再用大连默认值 */
-		function getClosedRecommendUserLocation() {
-			var latRaw = (q('lat') || q('userLat') || q('latitude') || q('weidu') || '').trim();
-			var lonRaw = (q('lon') || q('userLng') || q('longitude') || q('lng') || q('jingdu') || '').trim();
-			var cityRaw = (q('userCity') || q('city') || '').trim();
-			return {
-				userLat:
-					latRaw !== '' && !isNaN(Number(latRaw)) ? Number(latRaw) : 38.925747,
-				userLng:
-					lonRaw !== '' && !isNaN(Number(lonRaw)) ? Number(lonRaw) : 121.662531,
-				userCity: cityRaw !== '' ? cityRaw : '大连市'
-			};
-		}
-
-		/**
 		 * 与 group_user 一致:
 		 * 与 group_user 一致:
 		 * - manifest:app-plus.distribute.android.schemes、ios.urltypes → shopro(即 shopro://)
 		 * - manifest:app-plus.distribute.android.schemes、ios.urltypes → shopro(即 shopro://)
 		 * - Android 包名:manifest 未写 packagename 时与 App.vue 升级配置 androidPackageName 一致(云打包以 HBuilderX 为准)
 		 * - Android 包名:manifest 未写 packagename 时与 App.vue 升级配置 androidPackageName 一致(云打包以 HBuilderX 为准)
@@ -2551,228 +2403,6 @@
 			return n != null && !isNaN(n) ? Number(n).toFixed(1) : null;
 			return n != null && !isNaN(n) ? Number(n).toFixed(1) : null;
 		}
 		}
 
 
-		var CLOSED_REC_STAR_PATH =
-			'M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z';
-
-		function closedRecEscHtml(s) {
-			return String(s == null ? '' : s)
-				.replace(/&/g, '&amp;')
-				.replace(/</g, '&lt;')
-				.replace(/>/g, '&gt;')
-				.replace(/"/g, '&quot;');
-		}
-
-		function closedRecStarsHtml(score) {
-			var s = Number(score);
-			if (isNaN(s)) s = 0;
-			s = Math.max(0, Math.min(5, s));
-			var rounded = Math.round(s);
-			var parts = [];
-			var i;
-			for (i = 1; i <= 5; i++) {
-				var fill = i <= rounded ? '#F58220' : '#E5E5E5';
-				parts.push(
-					'<svg class="closed-rec-star" width="11" height="11" viewBox="0 0 24 24" aria-hidden="true">' +
-					'<path fill="' + fill + '" d="' + CLOSED_REC_STAR_PATH + '"/></svg>'
-				);
-			}
-			return '<span class="closed-rec-stars">' + parts.join('') + '</span>';
-		}
-
-		function closedRecFormatDistance(item) {
-			if (item.distance != null && item.distance !== '') {
-				var km = Number(item.distance);
-				if (!isNaN(km) && km >= 0) {
-					return Math.round(km * 1000) + '米';
-				}
-				return String(item.distance).trim();
-			}
-			if (item.position != null && String(item.position).trim() !== '') {
-				return String(item.position).trim();
-			}
-			if (item.dist != null && item.dist !== '') {
-				var dn = Number(item.dist);
-				if (!isNaN(dn)) {
-					return dn >= 1 ? dn.toFixed(dn % 1 === 0 ? 0 : 1) + 'km' : Math.round(dn * 1000) + '米';
-				}
-			}
-			return '';
-		}
-
-		function closedRecPickScore(item) {
-			var x =
-				item.scoreAvg != null ? Number(item.scoreAvg)
-					: item.score != null ? Number(item.score)
-						: item.rating != null ? Number(item.rating)
-							: item.starScore != null ? Number(item.starScore)
-								: NaN;
-			return isNaN(x) ? null : x;
-		}
-
-		function closedRecPickReviewCount(item) {
-			var n =
-				item.commitCount != null ? Number(item.commitCount)
-					: item.commentCount != null ? Number(item.commentCount)
-						: item.reviewCount != null ? Number(item.reviewCount)
-							: item.evaluateCount != null ? Number(item.evaluateCount)
-								: NaN;
-			return isNaN(n) ? 0 : Math.max(0, Math.floor(n));
-		}
-
-		function normalizeClosedStoreRecommendList(res) {
-			if (!res || typeof res !== 'object') return [];
-			var raw = res.data != null ? res.data : res.result;
-			if (Array.isArray(raw)) return raw;
-			if (raw && typeof raw === 'object') {
-				if (Array.isArray(raw.list)) return raw.list;
-				if (Array.isArray(raw.records)) return raw.records;
-				if (Array.isArray(raw.rows)) return raw.rows;
-				if (Array.isArray(raw.content)) return raw.content;
-				if (Array.isArray(raw.stores)) return raw.stores;
-				if (Array.isArray(raw.storeList)) return raw.storeList;
-				if (Array.isArray(raw.storeVos)) return raw.storeVos;
-				if (Array.isArray(raw.items)) return raw.items;
-			}
-			if (Array.isArray(res.list)) return res.list;
-			if (Array.isArray(res.records)) return res.records;
-			return [];
-		}
-
-		function fetchShareClosedStoreRecommend(storeIdStr) {
-			var loc = getClosedRecommendUserLocation();
-
-			var page = parseInt(q('page') || '1', 10);
-			var pageSize = parseInt(q('pageSize') || '10', 10);
-			if (isNaN(page) || page < 1) page = 1;
-			if (isNaN(pageSize) || pageSize < 1) pageSize = 10;
-
-			var body = {
-				page: page,
-				pageSize: pageSize,
-				storeId: String(storeIdStr || ''),
-				userCity: loc.userCity,
-				userLat: loc.userLat,
-				userLng: loc.userLng
-			};
-
-			return fetch(API_LIFE_AI_BASE + STORE_GLOBAL_RECOMMEND_PATH, {
-				method: 'POST',
-				mode: 'cors',
-				credentials: 'omit',
-				headers: {
-					Accept: 'application/json',
-					'Content-Type': 'application/json;charset=UTF-8'
-				},
-				body: JSON.stringify(body)
-			}).then(function (res) {
-				if (!res.ok) throw new Error('HTTP ' + res.status);
-				return res.json();
-			});
-		}
-
-		function renderShareClosedRecommended(list) {
-			var wrap = document.getElementById('shareClosedRecList');
-			var empty = document.getElementById('shareClosedRecEmpty');
-			if (!wrap || !empty) return;
-			wrap.querySelectorAll('.closed-rec-card').forEach(function (n) {
-				n.remove();
-			});
-			if (!list || !list.length) {
-				empty.style.display = 'block';
-				return;
-			}
-			empty.style.display = 'none';
-
-			list.forEach(function (item) {
-				if (!item || typeof item !== 'object') return;
-
-				var imgUrlField = item.imgUrl != null ? String(item.imgUrl).trim() : '';
-				var home = item.homeImage != null ? String(item.homeImage).trim() : '';
-				if (home && /\.mp4(\?|#|$)/i.test(home)) {
-					var vf = item.videoFirstFrame != null ? String(item.videoFirstFrame).trim() : '';
-					if (vf) home = vf;
-				}
-				var imgUrl =
-					imgUrlField ||
-					home ||
-					(item.coverUrl != null ? String(item.coverUrl).trim() : '') ||
-					(item.mainImage != null ? String(item.mainImage).trim() : '') ||
-					(item.goodsImage != null ? String(item.goodsImage).trim() : '') ||
-					(item.entranceImage != null ? String(item.entranceImage).trim() : '') ||
-					(Array.isArray(item.goodsImageList) && item.goodsImageList[0]) ||
-					(Array.isArray(item.imageList) && item.imageList[0]) ||
-					(Array.isArray(item.storeAlbumUrlList) && item.storeAlbumUrlList[0]) ||
-					'';
-
-				var name = item.title != null && String(item.title).trim() !== ''
-					? String(item.title).replace(/\r?\n/g, ' ').replace(/\s+/g, ' ').trim()
-					: (item.storeName || item.goodsName || item.secondGoodsTitle || item.name || '推荐');
-
-				var dist = closedRecFormatDistance(item);
-
-				var scoreVal = closedRecPickScore(item);
-				var displayScore = scoreVal != null ? scoreVal.toFixed(1) : '—';
-				var starScore = scoreVal != null ? scoreVal : 0;
-
-				var rc = closedRecPickReviewCount(item);
-				var reviewLabel = rc > 0 ? rc + '条评价' : '';
-
-				var seller =
-					item.userName != null && String(item.userName).trim() !== ''
-						? String(item.userName).trim()
-						: (item.nickName != null && String(item.nickName).trim() !== ''
-							? String(item.nickName).trim()
-							: '');
-
-				var card = document.createElement('article');
-				card.className = 'closed-rec-card';
-				card.innerHTML =
-					'<div class="closed-rec-card__img"><img class="closed-rec-card__cover" src="" alt="" decoding="async"></div>' +
-					'<div class="closed-rec-card__body">' +
-					'<div class="closed-rec-card__top">' +
-					'<span class="closed-rec-card__name">' + closedRecEscHtml(name) + '</span>' +
-					(dist ? '<span class="closed-rec-card__dist">' + closedRecEscHtml(dist) + '</span>' : '') +
-					'</div>' +
-					'<div class="closed-rec-card__rating">' +
-					closedRecStarsHtml(starScore) +
-					'<span class="closed-rec-rating-num">' + closedRecEscHtml(displayScore) + '</span>' +
-					(reviewLabel ? '<span class="closed-rec-meta">' + closedRecEscHtml(reviewLabel) + '</span>' : '') +
-					'</div>' +
-					(seller ? '<div class="closed-rec-card__footer">' + closedRecEscHtml(seller) + '</div>' : '') +
-					'</div>';
-
-				var coverIm = card.querySelector('img.closed-rec-card__cover');
-				if (coverIm) {
-					coverIm.src = imgUrl;
-					coverIm.onerror = function () {
-						this.onerror = null;
-						this.src = '';
-					};
-				}
-				wrap.appendChild(card);
-			});
-		}
-
-		function loadShareClosedRecommendations() {
-			var sid = getStoreId();
-			if (!sid) {
-				renderShareClosedRecommended([]);
-				return;
-			}
-			fetchShareClosedStoreRecommend(sid)
-				.then(function (res) {
-					var list = normalizeClosedStoreRecommendList(res);
-					if (!list.length && res && res.msg) {
-						console.warn('[store-recommend]', res.msg);
-					}
-					renderShareClosedRecommended(list);
-				})
-				.catch(function (e) {
-					console.error(e);
-					renderShareClosedRecommended([]);
-				});
-		}
-
 		function applyShareIndexClosedMerchantUi(closed) {
 		function applyShareIndexClosedMerchantUi(closed) {
 			var wasClosed = closedMerchantFlag;
 			var wasClosed = closedMerchantFlag;
 			closedMerchantFlag = closed;
 			closedMerchantFlag = closed;
@@ -2782,7 +2412,6 @@
 			var banner = document.getElementById('shareClosedBanner');
 			var banner = document.getElementById('shareClosedBanner');
 			var contentEl = document.getElementById('shareContentEl');
 			var contentEl = document.getElementById('shareContentEl');
 			var belowEl = document.getElementById('shareBelowContentEl');
 			var belowEl = document.getElementById('shareBelowContentEl');
-			var recWrap = document.getElementById('shareClosedRecommendWrap');
 			if (banner) {
 			if (banner) {
 				banner.style.display = closed ? 'block' : 'none';
 				banner.style.display = closed ? 'block' : 'none';
 				banner.setAttribute('aria-hidden', closed ? 'false' : 'true');
 				banner.setAttribute('aria-hidden', closed ? 'false' : 'true');
@@ -2795,19 +2424,6 @@
 				belowEl.style.display = '';
 				belowEl.style.display = '';
 				belowEl.setAttribute('aria-hidden', 'false');
 				belowEl.setAttribute('aria-hidden', 'false');
 			}
 			}
-			if (recWrap) {
-				if (closed) {
-					recWrap.style.display = 'block';
-					recWrap.setAttribute('aria-hidden', 'false');
-					if (!wasClosed) {
-						loadShareClosedRecommendations();
-					}
-				} else {
-					recWrap.style.display = 'none';
-					recWrap.setAttribute('aria-hidden', 'true');
-					renderShareClosedRecommended([]);
-				}
-			}
 		}
 		}
 
 
 		function renderDetail(d) {
 		function renderDetail(d) {

+ 4 - 366
HBuilderProjects/shareUndefined.html

@@ -308,117 +308,6 @@
 			color: var(--orange);
 			color: var(--orange);
 		}
 		}
 
 
-		/* More */
-		.more-title {
-			padding: 8px 15px 12px;
-			font-size: 16px;
-			font-weight: 700;
-		}
-
-		.more-scroll {
-			display: grid;
-			grid-template-columns: repeat(2, 1fr);
-			gap: 10px;
-			padding: 0 15px 20px;
-		}
-
-		#recEmpty {
-			grid-column: 1 / -1;
-		}
-
-		.rec-card {
-			min-width: 0;
-			background: #fff;
-			border-radius: 8px;
-			overflow: hidden;
-			box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
-		}
-
-		.rec-card__img {
-			aspect-ratio: 4 / 3;
-			background: #eee;
-		}
-
-		.rec-card__img img {
-			width: 100%;
-			height: 100%;
-			object-fit: cover;
-		}
-
-		.rec-card__body {
-			padding: 10px;
-		}
-
-		.rec-card__top {
-			display: flex;
-			justify-content: space-between;
-			align-items: baseline;
-			gap: 8px;
-			margin-bottom: 6px;
-		}
-
-		.rec-card__name {
-			font-size: 15px;
-			font-weight: 700;
-			flex: 1;
-			min-width: 0;
-			overflow: hidden;
-			text-overflow: ellipsis;
-			white-space: nowrap;
-		}
-
-		.rec-card__dist {
-			font-size: 12px;
-			color: var(--text-secondary);
-			flex-shrink: 0;
-		}
-
-		.rec-card__rating {
-			display: flex;
-			align-items: center;
-			flex-wrap: wrap;
-			gap: 4px 8px;
-		}
-
-		.rec-card__rating .stars .star {
-			width: 11px;
-			height: 11px;
-		}
-
-		.rec-card__rating .rating-num {
-			font-size: 12px;
-		}
-
-		.rec-meta {
-			font-size: 12px;
-			color: var(--text-secondary);
-		}
-
-		.rec-card__seller {
-			display: flex;
-			align-items: center;
-			gap: 8px;
-			margin-top: 8px;
-			min-width: 0;
-		}
-
-		.rec-card__avatar {
-			width: 22px;
-			height: 22px;
-			border-radius: 50%;
-			object-fit: cover;
-			flex-shrink: 0;
-			background: #eee;
-		}
-
-		.rec-card__seller-name {
-			font-size: 12px;
-			color: var(--text-secondary);
-			overflow: hidden;
-			text-overflow: ellipsis;
-			white-space: nowrap;
-		}
-
 		/* FAB */
 		/* FAB */
 		.fab-wrap {
 		.fab-wrap {
 			position: fixed;
 			position: fixed;
@@ -555,15 +444,6 @@
 		<p class="hero--empty__tip">商品已删除/下架/卖出</p>
 		<p class="hero--empty__tip">商品已删除/下架/卖出</p>
 	</div>
 	</div>
 
 
-	
-
-	<div class="divider"></div>
-
-	<h3 class="more-title">更多推荐</h3>
-	<div class="more-scroll" id="recList">
-		<p id="recEmpty" style="padding:12px;color:#999;font-size:14px;display:none;">暂无推荐</p>
-	</div>
-
 	<div id="openAppToast" role="status" aria-live="polite"></div>
 	<div id="openAppToast" role="status" aria-live="polite"></div>
 	<div class="fab-wrap">
 	<div class="fab-wrap">
 		<div class="fab-dock__slot">
 		<div class="fab-dock__slot">
@@ -620,7 +500,7 @@
 					</style>
 					</style>
 					<button class="wx-open-app-btn" aria-label="APP内打开">
 					<button class="wx-open-app-btn" aria-label="APP内打开">
 						<span class="fab__brand-clip" aria-hidden="true">
 						<span class="fab__brand-clip" aria-hidden="true">
-							<img class="fab__brand-img" src="https://test.ailien.shop/h5/HBuilderProjects/images/uBtn.svg" alt="" decoding="async">
+							<img class="fab__brand-img" src="https://prod.ailien.shop/h5/HBuilderProjects/images/uBtn.svg" alt="" decoding="async">
 						</span>
 						</span>
 						<span class="fab__label">APP内打开</span>
 						<span class="fab__label">APP内打开</span>
 					</button>
 					</button>
@@ -635,19 +515,13 @@
 	(function () {
 	(function () {
 		'use strict';
 		'use strict';
 		/**
 		/**
-		 * 更多推荐:POST http://124.93.18.180:9100/ai/life-manager/api/v1/second_hand/global-recommend
-		 * 常用 query:userId、userLat/userLng 或 lat/weidu、lon/jingdu、radiusKm、page、pageSize、categoryOneId、categoryTwoId
-		 *
 		 * 商品不可用占位页;底部「APP内打开」始终可唤起 App:
 		 * 商品不可用占位页;底部「APP内打开」始终可唤起 App:
 		 * 有 goodsId/id/sourceId → 二手详情页(带 goodsUnavailable 等参数,由 App 展示已删除态);
 		 * 有 goodsId/id/sourceId → 二手详情页(带 goodsUnavailable 等参数,由 App 展示已删除态);
 		 * 无商品 id → pages/index/login。
 		 * 无商品 id → pages/index/login。
 		 *
 		 *
 		 * 注意:用 file:// 打开本页时,浏览器可能因 CORS 拦截跨域请求。
 		 * 注意:用 file:// 打开本页时,浏览器可能因 CORS 拦截跨域请求。
 		 */
 		 */
-		var API_BASE = 'https://test.ailien.shop/alienStore';
-		var API_LIFE_AI_BASE = 'http://183.252.196.135:9100';
-		var SECOND_GLOBAL_RECOMMEND_PATH = '/ai/life-manager/api/v1/second_hand/global-recommend';
-		var DEFAULT_REC_RADIUS_KM = 195.69;
+		var API_BASE = 'https://prod.ailien.shop/alienStore';
 
 
 		/**
 		/**
 		 * 微信 JSSDK — 与 shareIndex.html 一致
 		 * 微信 JSSDK — 与 shareIndex.html 一致
@@ -656,9 +530,9 @@
 		var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
 		var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
 		var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
 		var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
-		var H5_PAGE_BASE_FALLBACK = 'https://test.ailien.shop/h5/HBuilderProjects/';
+		var H5_PAGE_BASE_FALLBACK = 'https://prod.ailien.shop/h5/HBuilderProjects/';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareUndefined.html';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareUndefined.html';
-		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'test.ailien.shop'];
+		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'prod.ailien.shop'];
 		var weChatJssdkConfigured = false;
 		var weChatJssdkConfigured = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxInitLastError = '';
 		var wxInitLastError = '';
@@ -712,18 +586,6 @@
 			return v == null ? '' : String(v);
 			return v == null ? '' : String(v);
 		}
 		}
 
 
-		/** 推荐用户位置:优先 URL 的 longitude/latitude,未带时用默认坐标 */
-		var DEFAULT_REC_USER_LAT = (function () {
-			var raw = (q('latitude') || q('lat') || q('weidu') || '').trim();
-			var n = raw !== '' ? Number(raw) : NaN;
-			return !isNaN(n) ? n : 38.925756;
-		})();
-		var DEFAULT_REC_USER_LNG = (function () {
-			var raw = (q('longitude') || q('lon') || q('jingdu') || '').trim();
-			var n = raw !== '' ? Number(raw) : NaN;
-			return !isNaN(n) ? n : 121.662543;
-		})();
-
 		function rawQueryHasGoodsId(qs) {
 		function rawQueryHasGoodsId(qs) {
 			return /(?:^|&)(goodsId|id|sourceId)=/i.test('&' + String(qs || '') + '&');
 			return /(?:^|&)(goodsId|id|sourceId)=/i.test('&' + String(qs || '') + '&');
 		}
 		}
@@ -1536,84 +1398,6 @@
 			return c === 200 || c === '200' || Number(c) === 200;
 			return c === 200 || c === '200' || Number(c) === 200;
 		}
 		}
 
 
-		function fetchSecondGlobalRecommend() {
-			var userIdRaw = q('userId').trim();
-			var userId =
-				userIdRaw !== '' && !isNaN(Number(userIdRaw)) ? Number(userIdRaw) : null;
-
-			var latRaw = (q('userLat') || q('latitude') || q('lat') || q('weidu')).trim();
-			var lngRaw = (q('userLng') || q('longitude') || q('lon') || q('jingdu')).trim();
-			var userLat =
-				latRaw !== '' && !isNaN(Number(latRaw)) ? Number(latRaw) : DEFAULT_REC_USER_LAT;
-			var userLng =
-				lngRaw !== '' && !isNaN(Number(lngRaw)) ? Number(lngRaw) : DEFAULT_REC_USER_LNG;
-
-			var rkRaw = q('radiusKm').trim();
-			var radiusKm =
-				rkRaw !== '' && !isNaN(Number(rkRaw)) ? Number(rkRaw) : DEFAULT_REC_RADIUS_KM;
-
-			var page = parseInt(q('page') || '1', 10);
-			var pageSize = parseInt(q('pageSize') || '20', 10);
-			if (isNaN(page) || page < 1) page = 1;
-			if (isNaN(pageSize) || pageSize < 1) pageSize = 20;
-
-			var c1Raw = q('categoryOneId').trim();
-			var c2Raw = q('categoryTwoId').trim();
-			var categoryOneId =
-				c1Raw === '' || c1Raw.toLowerCase() === 'null'
-					? null
-					: isNaN(Number(c1Raw))
-						? null
-						: Number(c1Raw);
-			var categoryTwoId =
-				c2Raw === '' || c2Raw.toLowerCase() === 'null'
-					? null
-					: isNaN(Number(c2Raw))
-						? null
-						: Number(c2Raw);
-
-			var body = {
-				categoryOneId: categoryOneId,
-				categoryTwoId: categoryTwoId,
-				page: page,
-				pageSize: pageSize,
-				radiusKm: radiusKm,
-				userLat: userLat,
-				userLng: userLng,
-				userId: userId
-			};
-
-			return fetch(API_LIFE_AI_BASE + SECOND_GLOBAL_RECOMMEND_PATH, {
-				method: 'POST',
-				mode: 'cors',
-				credentials: 'omit',
-				headers: {
-					Accept: 'application/json',
-					'Content-Type': 'application/json;charset=UTF-8'
-				},
-				body: JSON.stringify(body)
-			}).then(function (res) {
-				if (!res.ok) throw new Error('HTTP ' + res.status);
-				return res.json();
-			});
-		}
-
-		function normalizeGlobalRecommendList(res) {
-			if (!res || typeof res !== 'object') return [];
-			var raw = null;
-			if (isApiOk(res)) {
-				raw = res.data != null ? res.data : res.result;
-			}
-			if (Array.isArray(raw)) return raw;
-			if (raw && typeof raw === 'object') {
-				if (Array.isArray(raw.list)) return raw.list;
-				if (Array.isArray(raw.records)) return raw.records;
-				if (Array.isArray(raw.rows)) return raw.rows;
-				if (Array.isArray(raw.content)) return raw.content;
-			}
-			return [];
-		}
-
 		function buildHeroSlides(urls) {
 		function buildHeroSlides(urls) {
 			var track = document.getElementById('heroTrack');
 			var track = document.getElementById('heroTrack');
 			var dotsWrap = document.getElementById('heroDots');
 			var dotsWrap = document.getElementById('heroDots');
@@ -1831,150 +1615,6 @@
 			buildHeroSlides(imgs);
 			buildHeroSlides(imgs);
 		}
 		}
 
 
-		function formatRecDist(m) {
-			if (m == null || m === '') return '';
-			var n = Number(m);
-			if (isNaN(n)) return String(m);
-			return n >= 1000 ? (n / 1000).toFixed(1) + 'km' : Math.round(n) + 'm';
-		}
-
-		function escHtml(s) {
-			return String(s == null ? '' : s)
-				.replace(/&/g, '&amp;')
-				.replace(/</g, '&lt;')
-				.replace(/>/g, '&gt;')
-				.replace(/"/g, '&quot;');
-		}
-
-		/** global-recommend records:homeImage、title、position、dist、price、amount、likeCount、collectCount、userName、userImage */
-		function renderRecommended(list) {
-			var wrap = document.getElementById('recList');
-			var empty = document.getElementById('recEmpty');
-			wrap.querySelectorAll('.rec-card').forEach(function (n) {
-				n.remove();
-			});
-			if (!list || !list.length) {
-				empty.style.display = 'block';
-				return;
-			}
-			empty.style.display = 'none';
-			list.forEach(function (item) {
-				if (!item || typeof item !== 'object') return;
-				var card = document.createElement('article');
-				card.className = 'rec-card';
-				var home = item.homeImage != null ? String(item.homeImage).trim() : '';
-				if (home && /\.mp4(\?|#|$)/i.test(home)) {
-					var vf = item.videoFirstFrame != null ? String(item.videoFirstFrame).trim() : '';
-					if (vf) home = vf;
-				}
-				var imgUrl =
-					home ||
-					(item.coverUrl != null ? String(item.coverUrl).trim() : '') ||
-					(item.mainImage != null ? String(item.mainImage).trim() : '') ||
-					(item.goodsImage != null ? String(item.goodsImage).trim() : '') ||
-					(Array.isArray(item.goodsImageList) && item.goodsImageList[0]) ||
-					(Array.isArray(item.imageList) && item.imageList[0]) ||
-					'images/hero.png';
-				var name = item.title != null && String(item.title).trim() !== ''
-					? String(item.title).replace(/\r?\n/g, ' ').replace(/\s+/g, ' ').trim()
-					: (item.goodsName ||
-							item.secondGoodsTitle ||
-							item.name ||
-							'商品');
-				var dist = '';
-				if (item.position != null && String(item.position).trim() !== '') {
-					dist = String(item.position).trim();
-				} else if (item.dist != null && item.dist !== '') {
-					var dn = Number(item.dist);
-					if (!isNaN(dn)) {
-						dist = dn.toFixed(dn % 1 === 0 ? 0 : 2) + 'km';
-					}
-				} else if (item.distance != null && item.distance !== '') {
-					var d2 = Number(item.distance);
-					dist = !isNaN(d2) ? d2.toFixed(d2 % 1 === 0 ? 0 : 2) + 'km' : String(item.distance);
-				}
-				var priceStr = '';
-				if (item.price != null && String(item.price).trim() !== '') {
-					var ps = String(item.price).trim();
-					var pNum = parseFloat(ps.replace(/[^\d.]/g, ''));
-					priceStr = !isNaN(pNum) ? pNum.toFixed(2) : ps;
-				} else if (item.amount != null && item.amount !== '') {
-					var an = Number(item.amount);
-					priceStr = !isNaN(an) ? an.toFixed(2) : String(item.amount);
-				} else {
-					priceStr = '—';
-				}
-				var seller =
-					item.userName != null && String(item.userName).trim() !== ''
-						? String(item.userName).trim()
-						: '';
-				var userImg =
-					item.userImage != null && String(item.userImage).trim() !== ''
-						? String(item.userImage).trim()
-						: '';
-				var likeN = item.likeCount != null ? Number(item.likeCount) : NaN;
-				var colN = item.collectCount != null ? Number(item.collectCount) : NaN;
-				var metaBits = [];
-				// if (!isNaN(likeN)) metaBits.push(likeN + '赞');
-				// if (!isNaN(colN)) metaBits.push(colN + '想要');
-				var metaRight = metaBits.join(' · ');
-				var showSellerRow = !!(seller || userImg);
-
-				card.innerHTML =
-					'<div class="rec-card__img"><img class="rec-card__cover" src="" alt=""></div>' +
-					'<div class="rec-card__body">' +
-					'<div class="rec-card__top">' +
-					'<span class="rec-card__name">' + escHtml(name) + '</span>' +
-					(dist ? '<span class="rec-card__dist">' + escHtml(dist) + '</span>' : '') +
-					'</div>' +
-					'<div class="rec-card__rating">' +
-					'<span class="rec-meta" style="color:#E62E2E;font-weight:600;">¥' + escHtml(priceStr) + '</span>' +
-					(metaRight
-						? '<span class="rec-meta">' + escHtml(metaRight) + '</span>'
-						: '') +
-					'</div>' +
-					(showSellerRow
-						? '<div class="rec-card__seller">' +
-							'<img class="rec-card__avatar" src="" alt="" width="22" height="22" decoding="async">' +
-							(seller ? '<span class="rec-card__seller-name">' + escHtml(seller) + '</span>' : '') +
-							'</div>'
-						: '') +
-					'</div>';
-				var coverIm = card.querySelector('img.rec-card__cover');
-				if (coverIm) {
-					coverIm.src = imgUrl;
-					coverIm.onerror = function () {
-						this.onerror = null;
-						this.src = 'images/hero.png';
-					};
-				}
-				var avIm = card.querySelector('img.rec-card__avatar');
-				if (avIm) {
-					avIm.src = userImg || 'images/demouser.png';
-					avIm.onerror = function () {
-						this.onerror = null;
-						this.src = 'images/demouser.png';
-					};
-				}
-				wrap.appendChild(card);
-			});
-		}
-
-		function run() {
-			fetchSecondGlobalRecommend()
-				.then(function (res) {
-					var list = normalizeGlobalRecommendList(res);
-					if (!list.length && res && res.msg) {
-						console.warn('[global-recommend]', res.msg);
-					}
-					renderRecommended(list);
-				})
-				.catch(function (e) {
-					console.error(e);
-					renderRecommended([]);
-				});
-		}
-
 		function boot() {
 		function boot() {
 			var launchTag = document.getElementById('launch-btn');
 			var launchTag = document.getElementById('launch-btn');
 			if (launchTag) launchTag.setAttribute('appid', WECHAT_OPEN_APP_ID);
 			if (launchTag) launchTag.setAttribute('appid', WECHAT_OPEN_APP_ID);
@@ -2002,8 +1642,6 @@
 				showFabToast(em || '微信开放标签不可用,请升级微信后重试');
 				showFabToast(em || '微信开放标签不可用,请升级微信后重试');
 			});
 			});
 
 
-			run();
-
 			if (isWeChatInAppBrowser()) {
 			if (isWeChatInAppBrowser()) {
 				var openBtnWx = document.getElementById('openApp');
 				var openBtnWx = document.getElementById('openApp');
 				if (openBtnWx) {
 				if (openBtnWx) {