| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- /**
- * 分享页「更多推荐」AI 接口请求(HTTPS 页在 iOS 微信内不能直连 HTTP:9100,须走同源 alienStore 网关)。
- * URL 可用 lifeAiBase 覆盖,例如 lifeAiBase=https://test.ailien.shop/alienStore
- */
- (function (global) {
- 'use strict';
- var API_LIFE_AI_HTTP = 'http://183.252.196.135:9100';
- function isPageHttps() {
- return (location.protocol || '').toLowerCase() === 'https:';
- }
- function isIosWxBrowser() {
- var ua = navigator.userAgent || '';
- return /iphone|ipad|ipod/i.test(ua) && /micromessenger/i.test(ua);
- }
- function readQueryParam(name) {
- var params = new URLSearchParams(location.search || '');
- var v = params.get(name);
- if (v != null) return String(v);
- var hash = location.hash || '';
- var qi = hash.indexOf('?');
- if (qi >= 0) {
- var hp = new URLSearchParams(hash.slice(qi + 1));
- var hv = hp.get(name);
- if (hv != null) return String(hv);
- }
- return '';
- }
- /**
- * @param {string} [alienStoreBase] 页面内 API_BASE,如 https://test.ailien.shop/alienStore
- */
- function resolveLifeAiApiBases(alienStoreBase) {
- var out = [];
- var seen = {};
- function push(base) {
- base = String(base || '').trim().replace(/\/+$/, '');
- if (!base || seen[base]) return;
- seen[base] = true;
- out.push(base);
- }
- var custom = readQueryParam('lifeAiBase').trim();
- if (custom) push(custom);
- var host = (location.hostname || '').toLowerCase();
- if (host === 'test.ailien.shop' || host === 'uat.ailien.shop') {
- push('https://' + host + '/alienStore');
- } else if (alienStoreBase) {
- push(String(alienStoreBase).replace(/\/+$/, ''));
- }
- /* iOS+HTTPS 会拦截明文 fetch;Android 微信常仍可回落直连 IP */
- if (!isPageHttps() || !isIosWxBrowser()) {
- push(API_LIFE_AI_HTTP);
- }
- return out;
- }
- function isLifeAiApiOk(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 extractRecommendList(res) {
- if (!res || typeof res !== 'object') return [];
- if (!isLifeAiApiOk(res)) return [];
- var raw = res.data != null ? res.data : res.result;
- if (Array.isArray(raw)) return raw;
- if (raw && typeof raw === 'object') {
- var keys = [
- 'list',
- 'records',
- 'rows',
- 'content',
- 'stores',
- 'storeList',
- 'storeVos',
- 'items'
- ];
- for (var i = 0; i < keys.length; i++) {
- if (Array.isArray(raw[keys[i]])) return raw[keys[i]];
- }
- }
- if (Array.isArray(res.list)) return res.list;
- if (Array.isArray(res.records)) return res.records;
- return [];
- }
- /**
- * 按顺序尝试多个 API 根地址,401/404/网络失败时换下一个。
- */
- function fetchLifeAiPostJson(alienStoreBase, apiPath, body) {
- var bases = resolveLifeAiApiBases(alienStoreBase);
- var idx = 0;
- function next(err) {
- if (idx >= bases.length) {
- return Promise.reject(err || new Error('lifeAi recommend failed'));
- }
- var url = bases[idx++] + apiPath;
- return fetch(url, {
- 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) {
- if (res.status === 401 || res.status === 403 || res.status === 404) {
- return next(new Error('HTTP ' + res.status));
- }
- throw new Error('HTTP ' + res.status);
- }
- return res.json();
- })
- .then(function (json) {
- if (json && (json.code === 401 || json.code === '401')) {
- return next(new Error('code 401'));
- }
- return json;
- })
- .catch(function (e) {
- return next(e);
- });
- }
- return next();
- }
- /**
- * @param {function(string): string} getParam 如 getMergedParam / mergedQ
- */
- function getMergedRecommendUserLocation(getParam, defaults) {
- defaults = defaults || {};
- var defLat = defaults.lat != null ? defaults.lat : 38.925747;
- var defLng = defaults.lng != null ? defaults.lng : 121.662531;
- var defCity = defaults.city || '大连市';
- var gp =
- typeof getParam === 'function'
- ? getParam
- : function (n) {
- return readQueryParam(n);
- };
- function pick() {
- var args = arguments;
- var i;
- for (i = 0; i < args.length; i++) {
- var v = String(gp(args[i]) || '').trim();
- if (v) return v;
- }
- return '';
- }
- var latRaw = pick('userLat', 'latitude', 'lat', 'weidu');
- var lngRaw = pick('userLng', 'longitude', 'lon', 'lng', 'jingdu');
- var cityRaw = pick('userCity', 'city');
- return {
- userLat:
- latRaw !== '' && !isNaN(Number(latRaw)) ? Number(latRaw) : defLat,
- userLng:
- lngRaw !== '' && !isNaN(Number(lngRaw)) ? Number(lngRaw) : defLng,
- userCity: cityRaw !== '' ? cityRaw : defCity
- };
- }
- global.LifeAiFetch = {
- API_LIFE_AI_HTTP: API_LIFE_AI_HTTP,
- isPageHttps: isPageHttps,
- isIosWxBrowser: isIosWxBrowser,
- resolveLifeAiApiBases: resolveLifeAiApiBases,
- isLifeAiApiOk: isLifeAiApiOk,
- extractRecommendList: extractRecommendList,
- fetchLifeAiPostJson: fetchLifeAiPostJson,
- getMergedRecommendUserLocation: getMergedRecommendUserLocation
- };
- })(typeof window !== 'undefined' ? window : this);
|