backend/src/main/resources/application-dev.yml
@@ -3,11 +3,13 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: ${MYSQL_URL:jdbc:mysql://127.0.0.1:3306/tour_guide?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true} username: ${MYSQL_USERNAME:root} password: ${MYSQL_PASSWORD:123456} # password: ${MYSQL_PASSWORD:123456} password: ${MYSQL_PASSWORD:Mingdaojingjiang_2026@!.} redis: host: ${REDIS_HOST:127.0.0.1} port: ${REDIS_PORT:6379} password: ${REDIS_PASSWORD:123456} # password: ${REDIS_PASSWORD:123456} password: ${REDIS_PASSWORD:mingdaojingjiang2026@!} database: ${REDIS_DATABASE:0} timeout: 3s backend/src/main/resources/application.yml
@@ -73,4 +73,4 @@ rsa-public-key: ${HUIFU_RSA_PUBLIC_KEY:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgxOuXt1UEdZNPk6sntqiIlcs7e+0fZ3CVgKMV2Qv4ixwKmha5etL5WyIONmjoGEHePHpanYkXvm0kHkbbDkjpyHDFdEshuP1eGx5tRUTISRvXY/iFuD3xyeWSsvvjW6hS29OvqVCPcnBUC7jcRj15dJS2IpYR0iDGNS+/M0TyOFwRQME07At+qO+MSjKu4aRIjlglukjD7YbE2s35uV066nsBUCZUNpGPuju1pieUW4zyoIW6K70dyXCQy61oRI6JmA4JRCOJV1BE80N3GrLI4Pbq1C3ZBTgOPi5RWYNq1hfu807BDkPLc3dJKYt22Ea1jPJsg6e/B9Xbzh6JaUNAQIDAQAB} huifu-id: ${HUIFU_ID:6666000212191071} upper-huifu-id: ${HUIFU_UPPER_HUIFU_ID:6666000212191071} callback-path: ${HUIFU_CALLBACK_PATH:http://221.182.45.100:8011} callback-path: ${HUIFU_CALLBACK_PATH:https://www.mingdao123.com/api} frontend/src/api/http.js
@@ -3,7 +3,7 @@ /** 后台前端只读取 admin_token,避免误带小程序端或导游端 Token。 */ const http = axios.create({ baseURL: '/api/admin', baseURL: 'https://www.mingdao123.com/api/admin', timeout: 10000, }) frontend/src/components/AmapMeetingPointMap.vue
@@ -20,9 +20,13 @@ let AMap let map let autoComplete let placeSearch let markers = [] let hasFittedPoints = false let suggestTimer let suggestionRequestId = 0 let skipNextSuggestion = false const isMarking = computed(() => Number.isInteger(props.activeIndex)) const hasPosition = (point) => ( @@ -92,6 +96,34 @@ }) } const updateSearchCity = () => { const city = props.cityName || '全国' autoComplete?.setCity(city) placeSearch?.setCity(city) } const loadSuggestions = (value) => { window.clearTimeout(suggestTimer) if (skipNextSuggestion) { skipNextSuggestion = false return } const query = value.trim() const requestId = ++suggestionRequestId if (!query || !autoComplete) { searchResults.value = [] return } suggestTimer = window.setTimeout(() => { autoComplete.search(query, (status, result) => { if (requestId !== suggestionRequestId || keyword.value.trim() !== query) return searchResults.value = status === 'complete' ? (result.tips || []).filter((tip) => tip.name) : [] }) }, 300) } const searchLocation = () => { if (!placeSearch) return const value = keyword.value.trim() @@ -99,9 +131,10 @@ ElMessage.warning('请输入景区、地址或地标') return } window.clearTimeout(suggestTimer) suggestionRequestId += 1 searching.value = true searchResults.value = [] placeSearch.setCity(props.cityName || '全国') placeSearch.search(value, (status, result) => { searching.value = false if (status !== 'complete' || !result.poiList?.pois?.length) { @@ -113,9 +146,19 @@ } const locateSearchResult = (poi) => { if (!poi.location) return map.setZoomAndCenter(17, poi.location) skipNextSuggestion = true keyword.value = poi.name searchResults.value = [] if (poi.location) { map.setZoomAndCenter(17, poi.location) return } searchLocation() } const clearSearch = () => { suggestionRequestId += 1 window.clearTimeout(suggestTimer) searchResults.value = [] } @@ -130,7 +173,9 @@ }) map.addControl(new AMap.Scale()) map.addControl(new AMap.ToolBar({ position: { right: '14px', bottom: '38px' } })) autoComplete = new AMap.AutoComplete({ city: props.cityName || '全国', citylimit: Boolean(props.cityName) }) placeSearch = new AMap.PlaceSearch({ pageSize: 8, pageIndex: 1, extensions: 'base' }) updateSearchCity() map.on('click', handleMapClick) refreshMarkers() if (!markers.length) moveToCity() @@ -147,11 +192,14 @@ focusCurrentPoint() }) watch(() => props.cityName, () => { if (placeSearch) placeSearch.setCity(props.cityName || '全国') updateSearchCity() moveToCity() }) watch(keyword, loadSuggestions) onBeforeUnmount(() => { window.clearTimeout(suggestTimer) suggestionRequestId += 1 clearMarkers() map?.destroy() map = null @@ -166,13 +214,13 @@ clearable placeholder="搜索景区、地址或地标" @keyup.enter="searchLocation" @clear="searchResults = []" @clear="clearSearch" /> <el-button type="primary" :icon="Search" :loading="searching" :disabled="loading || Boolean(loadError)" @click="searchLocation">搜索</el-button> <div v-if="searchResults.length" class="search-results"> <button v-for="(poi, index) in searchResults" :key="poi.id || `${poi.name}-${index}`" type="button" @click="locateSearchResult(poi)"> <strong>{{ poi.name }}</strong> <span>{{ poi.address || poi.district }}</span> <span>{{ [poi.district, poi.address].filter(Boolean).join(' · ') || '暂无详细地址' }}</span> </button> </div> </div> frontend/src/utils/amap.js
@@ -15,7 +15,7 @@ loaderPromise = AMapLoader.load({ key: amapKey, version: '2.0', plugins: ['AMap.PlaceSearch', 'AMap.Scale', 'AMap.ToolBar'], plugins: ['AMap.AutoComplete', 'AMap.PlaceSearch', 'AMap.Scale', 'AMap.ToolBar'], }) } return loaderPromise frontend/src/views/LoginView.vue
@@ -8,7 +8,7 @@ const router = useRouter() const authStore = useAuthStore() const loading = ref(false) const form = reactive({ username: 'admin', password: 'Admin@123456' }) const form = reactive({ username: '', password: '' }) const submit = async () => { loading.value = true frontend/vite.config.js
@@ -15,7 +15,7 @@ port: 5173, proxy: { '/api': { target: 'http://127.0.0.1:8011', target: 'https://www.mingdao123.com/api', changeOrigin: true, }, }, mingdaojingjiang_guide_app/dist/build/h5/assets/agreement.Dn1TaZo5.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/auth.sSv-6BNA.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/guide-dialog.C1_h9lTz.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/guide-nav-bar-D9G7jPxG.css
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/guide-nav-bar.CdGXZ8hp.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/guide.D8_p_WZo.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/index-BDUKd0C3.css
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/index-CLuiL-s0.css
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/index-Cnzloz63.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/index-W-5OIi5y.css
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/map.eVpiEFhk.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/message.Cf-63Lua.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/order.55smtjqb.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-agreement-detail-index.D5X-TTXw.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-agreements-index.TsTpF83p.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-certification-index.BUEBPBJW.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-change-phone-new-index.BM-1cnsT.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-change-phone-old-index.DnAU5LJv.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-earnings-index.CIiX_8E2.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-feedback-index.BUUdWWVA.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-login-index.MsaXKcbF.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-meeting-point-index.C3UWuaHX.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-messages-index.aGE04O4A.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-order-detail-index.CS5Pez2t.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-orders-index.DQI49x7y.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-profile-index.BzHcbG-m.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-rating-index.DJ9dC45S.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-receiving-index.BI9ll9bX.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-register-phone-index.CNqB7vh1.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-register-profile-index.BduMZNAo.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-settings-index.BUqNtPvb.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/pages-workbench-index.Bn-hlctg.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/registration.DUS_8LO2.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/router.B6AZNmwg.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/system.97bIT92Y.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/uni-app.es.CVSLwAiy.js
File was deleted mingdaojingjiang_guide_app/dist/build/h5/assets/uni.9c680c6b.css
File was deleted mingdaojingjiang_guide_app/dist/build/h5/index.html
@@ -1,7 +1,7 @@ <!DOCTYPE html> <html lang="zh-CN"> <head> <link rel="stylesheet" href="/assets/uni.9c680c6b.css"> <link rel="stylesheet" href="/assets/uni.42d2b68e.css"> <meta charset="UTF-8" /> <script> @@ -14,7 +14,7 @@ <title>com.mingdao.guide</title> <!--preload-links--> <!--app-context--> <script type="module" crossorigin src="/assets/index-Cnzloz63.js"></script> <script type="module" crossorigin src="/assets/index-BZBMaWtC.js"></script> <link rel="stylesheet" crossorigin href="/assets/index-C1LkI29h.css"> </head> <body> mingdaojingjiang_guide_app/docs/接口文档.md
@@ -10,7 +10,7 @@ /api/guide/** ``` 前端请求层通过 `VITE_API_BASE_URL` 配置后端地址,默认值为 `http://127.0.0.1:8011/api`。 前端请求层通过 `VITE_API_BASE_URL` 配置后端地址,默认值为 `https://www.mingdao123.com/api`。 ### 1.2 响应格式 mingdaojingjiang_guide_app/utils/request.js
@@ -1,6 +1,6 @@ import { GUIDE_LOGIN_KEY } from '../constants/mock' export const API_BASE_URL = (import.meta.env.VITE_API_BASE_URL || 'http://221.182.45.100:8011/api').replace(/\/$/, '') export const API_BASE_URL = (import.meta.env.VITE_API_BASE_URL || 'https://www.mingdao123.com/api').replace(/\/$/, '') const API_ORIGIN = API_BASE_URL.replace(/\/api$/, '') const LOGIN_PAGE = '/pages/login/index' let authRedirecting = false mingdaojingjiang_uniapp/mingdaojingjiang_uniapp/config/api.js
@@ -1 +1,2 @@ export const API_BASE_URL = 'http://221.182.45.100:8011' export const API_BASE_URL = 'https://www.mingdao123.com/api' export const API_ORIGIN = API_BASE_URL.replace(/\/api\/?$/, '') mingdaojingjiang_uniapp/mingdaojingjiang_uniapp/services/profile.js
@@ -1,4 +1,4 @@ import { API_BASE_URL } from '@/config/api' import { API_ORIGIN } from '@/config/api' import { apiRequest, apiUploadFile } from '@/utils/request' export function getCurrentProfile() { @@ -35,7 +35,7 @@ export function resolveProfileAssetUrl(path) { if (!path) return '' if (/^https?:\/\//i.test(path)) return path return `${API_BASE_URL}${path.startsWith('/') ? path : `/${path}`}` return `${API_ORIGIN}${path.startsWith('/') ? path : `/${path}`}` } export function maskMobile(mobile) { mingdaojingjiang_uniapp/mingdaojingjiang_uniapp/utils/request.js
@@ -13,7 +13,8 @@ if (/^https?:\/\//i.test(url)) { return url } return `${API_BASE_URL}${url.startsWith('/') ? url : `/${url}`}` const path = url === '/api' ? '' : url.replace(/^\/api(?=\/|$)/i, '') return `${API_BASE_URL}${path.startsWith('/') || !path ? path : `/${path}`}` } export function request(options) {