{"version":3,"mappings":"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","names":["usePostCategoryStore","defineStore","state","postCategory","actions","fetchCategories","response","postApi","getPostCategorys","this","error","routes","path","redirect","component","__vitePreload","import","__VITE_PRELOAD__","meta","title","children","name","requiresAuth","router","createRouter","history","createWebHistory","beforeEach","async","to","from","next","document","fromCreate","sessionStorage","getItem","removeItem","userStore","useUserStore","initUserInfo","postCategoryStore","length","params","category","some","cat","slug","isLoggedIn","setItem","fullPath","redirectPath","requestCount","hideLoading","closeToast","service","axios","create","baseURL","timeout","headers","interceptors","request","use","config","noLoading","showLoadingToast","message","forbidClick","duration","token","localStorage","Promise","reject","res","data","code","noSuccessMsg","errorMsg","_b","_a","errors","msg","showToast","type","push","Error","indexOf","status","get","url","post","put","patch","delete","upload","file","formData","FormData","append","uploadMultiple","files","forEach","transformRequest","download","responseType","adApi","getHomeAds","getAdsCategorys","getCategoryAd","updateAdClick","id","userApi","login","register","getUserInfo","uploadAvatar","updateUserInfo","getUserPostList","logout","updatePost","deletePost","getList","updatePostClick","uploadImage","uploadImages","deleteImage","encodedUrl","encodeURIComponent","userInfo","ref","_id","username","nickname","avatar","isAdmin","userPosts","list","total","currentPage","pageSize","hasInitialized","clearUserInfo","value","setUserInfo","info","JSON","stringify","storedInfo","parse","getUserPosts","page","userId","posts","clearUserPosts","onMounted","components","VanImage","Loading","Swipe","SwipeItem","FloatingBubble","Popover","Tab","Tabs","Icon","List","Cell","CellGroup","ConfigProvider","Field","Button","Form","Popup","Toast","Picker","Uploader","Dialog","Col","Row","Empty","Area","Sticky","useAdsStore","bannerAds","ads","loading","lastUpdateDate","adsCategory","currentAd","categoryAdCache","pagination","hasMore","fetchAds","Date","toDateString","checkForUpdates","today","adId","map","ad","clickCount","updateBannerAdClick","updateCategoryAdClick","findAdById","bannerAd","find","setCategoryAdList","updateCategoryPagination","clearCategoryCache","getCachedCategoryAds","appendToCategoryCache","newAds","reset","setCurrentAd","persist","key","storage","paths","app","createApp","App","pinia","createPinia","piniaPluginPersistedstate","Locale","zhCN","mount"],"ignoreList":[],"sources":["../../src/stores/postCategory.js","../../src/router/index.js","../../src/utils/request.js","../../src/api/index.js","../../src/stores/user.js","../../src/App.vue","../../src/utils/vant.js","../../src/stores/ads.js","../../src/main.js"],"sourcesContent":["import { defineStore } from \"pinia\";\nimport { postApi } from \"@/api\";\n\nexport const usePostCategoryStore = defineStore(\"postCategory\", {\n state: () => ({\n postCategory: [],\n }),\n\n actions: {\n async fetchCategories() {\n try {\n const response = await postApi.getPostCategorys();\n this.postCategory = response;\n } catch (error) {\n console.error(\"获取分类失败:\", error);\n }\n },\n },\n}); ","import { createRouter, createWebHistory } from 'vue-router'\nimport { usePostCategoryStore } from '@/stores/postCategory'\nimport { useUserStore } from '@/stores/user'\n\nconst routes = [\n {\n path: '',\n redirect: '/ads',\n component: () => import('@/views/home/home.vue'),\n meta: { title: '华蒙驿站-首页' },\n children: [\n // 特殊布局的页面单独配置\n {\n path: 'ads',\n component: () => import('@/views/home/ads.vue'),\n meta: { title: '华蒙驿站-推荐' }\n },\n // 动态路由配置,用于list布局的页面\n {\n path: ':category', // 动态路径参数\n component: () => import('@/views/home/ListLayout.vue'), // 通用list布局\n meta: { title: '华蒙驿站-信息列表' }\n }\n ]\n },\n {\n path: '/info/:id',\n name: 'info',\n component: () => import('@/views/post/info.vue'),\n meta: { title: '华蒙驿站-信息详情' }\n },\n {\n path: '/login',\n name: 'login',\n component: () => import('@/views/user/Login.vue'),\n meta: { title: '华蒙驿站-登录' }\n },\n {\n path: '/register',\n name: 'register',\n component: () => import('@/views/user/Register.vue'),\n meta: { title: '华蒙驿站-注册' }\n },\n {\n path: '/user',\n name: 'user',\n component: () => import('@/views/user/User.vue'),\n meta: { title: '华蒙驿站-个人中心', requiresAuth: true }\n },\n {\n path: '/create',\n name: 'create',\n component: () => import('@/views/post/create.vue'),\n meta: { title: '华蒙驿站-发布信息', requiresAuth: true }\n },\n {\n path: '/createAds',\n name: 'createAds',\n component: () => import('@/views/ads/createAds.vue'),\n meta: { title: '华蒙驿站-发布广告', requiresAuth: true }\n },\n {\n path:'/adsInfo/:id',\n name:'adsInfo',\n component:()=>import('@/views/ads/adsInfo.vue'),\n meta:{title:'华蒙驿站-广告详情'}\n },\n {\n path:'/adsList',\n name:'adsList',\n component:()=>import('@/views/ads/adsList.vue'),\n meta:{title:'华蒙驿站-广告列表'}\n },\n {\n path: '/:pathMatch(.*)*',\n name: 'notFound',\n component: () => import('@/views/NotFound.vue'),\n meta: { title: '页面未找到' }\n }\n]\n\nconst router = createRouter({\n history: createWebHistory(),\n routes\n})\n\n// 路由守卫\nrouter.beforeEach(async (to, from, next) => {\n // 设置页面标题\n document.title = to.meta.title || '本地信息网'\n\n // 检查是否从 create 页面来的\n const fromCreate = sessionStorage.getItem('fromCreate')\n \n \n // 如果用户在用户页面并尝试返回到 create 页面,且是从创建成功后跳转来的\n if (from.path === '/user' && \n to.path === '/create' && \n fromCreate === 'true') {\n // 清除标记\n sessionStorage.removeItem('fromCreate')\n // 阻止返回到 create 页面,而是返回到首页或其他合适的页面\n next('/')\n return\n }\n\n // 初始化用户信息\n const userStore = useUserStore()\n userStore.initUserInfo()\n // 初始化分类 store\n const postCategoryStore = usePostCategoryStore()\n\n // 如果还没有加载分类数据,加载分类数据\n if (postCategoryStore.postCategory.length === 0) {\n try {\n await postCategoryStore.fetchCategories()\n \n \n // 如果当前路由包含 category 参数,验证其有效性\n if (to.params.category) {\n const isValidCategory = postCategoryStore.postCategory.some(\n cat => cat.slug === to.params.category\n )\n\n if (!isValidCategory) {\n // 无效分类重定向到首页\n next('/')\n return\n }\n }\n } catch (error) {\n console.error('加载分类失败:', error)\n // 可以选择重定向到错误页面\n next('/error')\n return\n }\n }\n\n // 检查是否需要登录\n if (to.meta.requiresAuth) {\n // 使用 store 中的 isLoggedIn 方法检查登录状态\n if (!userStore.isLoggedIn()) {\n // 保存原始路径到 sessionStorage\n sessionStorage.setItem('redirectPath', to.fullPath)\n\n next({\n path: '/login'\n })\n return\n }\n }\n // 如果用户已登录且试图访问登录页\n if (to.path === '/login' && userStore.isLoggedIn()) {\n // 如果有重定向路径,跳转到重定向路径\n const redirectPath = sessionStorage.getItem('redirectPath')\n if (redirectPath) {\n sessionStorage.removeItem('redirectPath')\n next(redirectPath)\n } else {\n // 否则跳转到首页\n next('/')\n }\n return\n }\n\n next()\n})\n\nexport default router","// src/utils/request.js\nimport axios from 'axios'\nimport { showToast, showLoadingToast, closeToast } from 'vant'\nimport router from '@/router'\n\n// 请求计数器\nlet requestCount = 0\n\n// 显示加载提示\nconst showLoading = () => {\n if (requestCount === 0) {\n showLoadingToast({\n message: '加载中...',\n forbidClick: true,\n duration: 0\n })\n }\n requestCount++\n}\n// 隐藏加载提示\nconst hideLoading = () => {\n requestCount--\n if (requestCount === 0) {\n closeToast()\n }\n}\n\n\n// 创建 axios 实例\nconst service = axios.create({\n baseURL: import.meta.env.VITE_API_URL,\n timeout: 15000,\n headers: {\n 'Content-Type': 'application/json'\n },\n})\n\n// 请求拦截器\nservice.interceptors.request.use(\n config => {\n // 不显示加载提示的请求配置\n if (!config.noLoading) {\n showLoading()\n }\n\n // 从 localStorage 获取 token\n const token = localStorage.getItem('token')\n if (token) {\n config.headers['Authorization'] = `Bearer ${token}`\n }\n return config\n },\n error => {\n hideLoading()\n return Promise.reject(error)\n }\n)\n\n// 响应拦截器\nservice.interceptors.response.use(\n response => {\n // 如果请求没有配置 noLoading,则隐藏加载提示\n if (!response.config.noLoading) {\n hideLoading()\n }\n \n const res = response.data\n // console.log(res);\n \n // 修改判断逻辑,处理所有 2xx 状态码\n if (res.code >= 200 && res.code < 300) {\n // 如果需要显示成功提示\n if (res.message && !response.config.noSuccessMsg) {\n // showToast({\n // message: res.message,\n // type: 'success'\n // })\n }\n return res.data\n }\n\n // 统一错误提示\n const errorMsg = res.message || (res.errors?.[0]?.msg) || '请求失败'\n showToast({\n message: errorMsg,\n type: 'error'\n })\n\n // 401 处理\n if (res.code === 401) {\n localStorage.removeItem('token')\n router.push('/login')\n }\n\n return Promise.reject(new Error(errorMsg))\n },\n error => {\n // 隐藏加载提示\n if (!error.config.noLoading) {\n hideLoading()\n }\n // 处理请求超时\n if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {\n showToast({\n message: '请求超时,请重试',\n type: 'error'\n })\n return Promise.reject(error)\n }\n // 处理网络错误\n if (!error.response) {\n showToast({\n message: '网络异常,请检查网络连接',\n type: 'error'\n })\n return Promise.reject(error)\n }\n // 处理 HTTP 状态码错误\n const status = error.response.status\n if (status === 401) {\n // 未授权,清除用户信息并跳转到登录页\n localStorage.removeItem('token')\n localStorage.removeItem('userInfo')\n router.push('/login')\n showToast({\n message: '登录已过期,请重新登录',\n type: 'error'\n })\n } else if (status === 500) {\n showToast({\n message: '服务器错误,请稍后重试',\n type: 'error'\n })\n } else {\n // 其他错误\n const errorMsg = error.response.data?.message || '请求失败,请重试'\n showToast({\n message: errorMsg,\n type: 'error'\n })\n }\n\n return Promise.reject(error)\n }\n)\n// 封装请求方法\nexport const request = {\n get(url, params = null, config = {}) {\n return service.get(url, {\n ...config,\n params\n })\n },\n post(url, data = null, config = {}) {\n return service.post(url, data, config)\n },\n put(url, data = null, config = {}) {\n return service.put(url, data, config)\n },\n patch(url, data = null, config = {}) {\n return service.patch(url, data, config)\n },\n delete(url, params = null, config = {}) {\n return service.delete(url, {\n ...config,\n params\n })\n },\n\n // 上传文件\n upload(url, file, config = {}) {\n const formData = new FormData()\n formData.append('image', file)\n\n return service.post(url, formData, {\n headers: {\n 'Content-Type': 'multipart/form-data'\n },\n ...config\n })\n },\n\n // 批量上传文件\n uploadMultiple(url, files, config = {}) {\n const formData = new FormData();\n\n // 这里是关键:保持和 Postman 一样的字段名\n files.forEach(file => {\n formData.append('images', file);\n });\n return service.post(url, formData, {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n transformRequest: [(data) => data], // 防止 axios 转换 FormData\n ...config\n });\n },\n\n // 下载文件\n download(url, params, config = {}) {\n return service.get(url, {\n params,\n responseType: 'blob',\n ...config\n })\n }\n}\n\nexport default request","\nimport request from '@/utils/request'\n\n// 广告相关接口\nexport const adApi = {\n // 获取首页广告\n getHomeAds() {\n return request.get('/ads/home', null, { noLoading: true })\n },\n // 获取广告分类列表 - 暂时用不到\n getAdsCategorys() {\n return request.get('/ad-category/list', null, { noLoading: true })\n },\n // 获取分类广告\n getCategoryAd(category, params) {\n return request.get(`/ads/${category}`, params)\n },\n // 记录广告点击\n updateAdClick(id) {\n return request.patch(`/ads/click/${id}` , {} , { noLoading: true })\n },\n}\n\n// 用户相关接口\nexport const userApi = {\n // 登录接口\n login(data) {\n return request.post('/user/login', data)\n },\n // 注册接口\n register(data) {\n return request.post('/user/register', data)\n },\n // 获取用户信息\n getUserInfo() {\n return request.get('/user/profile')\n },\n // 上传头像\n uploadAvatar(file) {\n return request.upload('/images/upload-image', file )\n },\n // 更新用户信息\n updateUserInfo(data) {\n return request.put('/user/profile', data)\n },\n // 获取用户发布过的信息\n getUserPostList(params) {\n return request.get('user/posts', params)\n },\n // 退出登陆\n logout: () => {\n return request.post('/user/logout')\n },\n}\n\n// 信息相关接口\nexport const postApi = {\n // 获取信息分类\n getPostCategorys() {\n return request.get('/category/list', null, { noLoading: true })\n },\n // 发布信息\n create(data) {\n return request.post('/post/create', data)\n },\n // 修改信息\n updatePost(id, data) {\n return request.put(`/post/update/${id}`, data)\n },\n // 删除信息\n deletePost(id) {\n return request.delete(`/post/${id}`)\n },\n // 获取信息列表\n getList(params) {\n return request.get('/post/list', params)\n },\n // 记录信息点击次数\n updatePostClick(id) {\n return request.patch(`/post/click/${id}`,{},{ noLoading: true })\n },\n // 单图上传\n uploadImage(file , config) {\n return request.upload('/images/upload-image', file , config)\n },\n // 多图上传\n uploadImages(files , config) {\n return request.uploadMultiple('/images/upload-multiple', files , config)\n },\n deleteImage(url) {\n const encodedUrl = encodeURIComponent(url)\n return request.delete(`/images/delete-image/${encodedUrl}`, null)\n }\n}\n\n// 评论相关接口\nexport const commentApi = {\n // 发布评论\n createComent(data) {\n return request.post('/comment/create', data)\n },\n // 获取评论列表\n getList(params) {\n return request.get('/comment/list', params)\n },\n // 删除评论\n deleteComment(id) {\n return request.delete(`/comment/${id}`)\n },\n}","// src/stores/user.js\nimport { defineStore } from \"pinia\";\nimport { ref } from \"vue\";\nimport { userApi, postApi } from \"@/api\";\nimport { showToast, showLoadingToast, closeToast } from 'vant'\nimport { jwtDecode } from 'jwt-decode';\nimport router from \"@/router\";\n\nexport const useUserStore = defineStore(\"user\", () => {\n // 状态\n const userInfo = ref({\n _id: \"\",\n username: \"\",\n nickname: \"\",\n avatar: \"\",\n token: \"\",\n isAdmin: false,\n });\n \n\n\n // 用户发布的帖子列表状态\n const userPosts = ref({\n list: [],\n total: 0,\n currentPage: 1,\n pageSize: 10,\n hasInitialized: false,\n });\n // 获取本地存储的用户信息\n const initUserInfo = () => {\n const storedInfo = localStorage.getItem(\"userInfo\");\n if (storedInfo) {\n userInfo.value = JSON.parse(storedInfo);\n }\n };\n\n // 设置用户信息\n const setUserInfo = (info) => {\n userInfo.value = info;\n // 存储到本地\n localStorage.setItem(\"userInfo\", JSON.stringify(info));\n // 单独存储 token,方便请求拦截器使用\n localStorage.setItem(\"token\", info.token);\n };\n\n // 更新用户部分信息\n const updateUserInfo = (info) => {\n userInfo.value = {\n ...userInfo.value,\n ...info,\n };\n localStorage.setItem(\"userInfo\", JSON.stringify(userInfo.value));\n };\n\n // 清除用户信息\n const clearUserInfo = () => {\n userInfo.value = {\n _id: \"\",\n username: \"\",\n nickname: \"\",\n avatar: \"\",\n token: \"\",\n };\n localStorage.removeItem(\"userInfo\");\n localStorage.removeItem(\"token\");\n };\n\n // 判断是否登录\n const isLoggedIn = () => {\n return !!userInfo.value.token;\n };\n\n // 获取用户发布的帖子列表\n const getUserPosts = async (page = 1, pageSize = 10) => {\n try {\n const params = {\n page,\n pageSize,\n category: \"all\",\n userId: userInfo.value._id,\n };\n const response = await postApi.getList(params);\n // console.log(response);\n\n userPosts.value = {\n list: page === 1 ? response.posts : [...userPosts.value.list, ...response.posts],\n total: response.total,\n currentPage: response.currentPage,\n pageSize: response.pageSize,\n hasInitialized: true,\n };\n return response;\n } catch (error) {\n console.error(\"获取用户帖子列表失败:\", error);\n throw error;\n }\n };\n // 清除用户帖子列表\n const clearUserPosts = () => {\n userPosts.value = {\n list: [],\n total: 0,\n currentPage: 1,\n pageSize: 10,\n };\n };\n // 添加退出登录方法\n const logout = async () => {\n try {\n // 先清除本地状态,确保用户可以退出\n clearUserInfo()\n\n // 调用退出登录接口\n await userApi.logout()\n\n // 跳转到首页\n router.push(\"/\")\n\n // 显示成功提示\n showToast({\n message: '退出登录成功',\n type: 'success'\n })\n } catch (error) {\n console.error(\"退出登录失败:\", error);\n // 已经清除了本地状态,所以继续跳转\n router.push(\"/\");\n }\n };\n\n return {\n userInfo,\n setUserInfo,\n updateUserInfo,\n clearUserInfo,\n initUserInfo,\n isLoggedIn,\n logout,\n userPosts,\n getUserPosts,\n clearUserPosts,\n };\n});\n","\n\n\n\n\n\n\n","import { \n Image as VanImage, Loading, Swipe, SwipeItem, FloatingBubble,\n Popover, Tab, Tabs, Icon, List, Cell, CellGroup ,ConfigProvider, Field, Button,Form,Popup,Toast,Picker,Uploader,Dialog,Col,Row,\n Empty,Area,Sticky,Locale\n} from 'vant'\n\nimport 'vant/lib/index.css'\nimport { zhCN } from 'vant/lib/locale/lang/zh-CN'\n\n// 需要使用的组件列表\nconst components = [\n VanImage, Loading, Swipe, SwipeItem, FloatingBubble, \n Popover, Tab, Tabs, Icon, List, Cell, CellGroup, ConfigProvider, Field, Button,Form,Popup,Toast,Picker,Uploader,Dialog,Col,Row,\n Empty,Area,Sticky\n]\n\n// 导出一个 Vue 插件\nexport function setupVant(app) {\n // 设置语言\n Locale.use('zh-CN', zhCN)\n\n // 注册组件\n components.forEach(component => {\n app.use(component)\n })\n\n}","// src/stores/ads.js\nimport { defineStore } from 'pinia'\nimport { adApi } from '@/api'\n\nexport const useAdsStore = defineStore('ads', {\n state: () => ({\n bannerAds: [],\n ads: [],\n loading: false,\n lastUpdateDate: null,\n adsCategory: [],\n currentAd: null,\n categoryAdCache: {\n list: null, // 缓存的广告列表\n category: null, // 当前缓存的分类\n pagination: { // 分页信息\n currentPage: 1,\n hasMore: true,\n pageSize: 10\n }\n }\n }),\n\n actions: {\n // 获取广告数据\n async fetchAds() {\n this.loading = true\n try {\n const res = await adApi.getHomeAds()\n this.bannerAds = res.bannerAds\n this.ads = res.ads\n this.lastUpdateDate = new Date().toDateString()\n } catch (error) {\n console.error('获取广告失败:', error)\n } finally {\n this.loading = false\n }\n },\n // 获取分类\n async getAdsCategorys() {\n try {\n const response = await adApi.getAdsCategorys();\n this.adsCategory = response;\n } catch (error) {\n console.error(\"获取分类失败:\", error);\n }\n },\n // 检查是否需要更新\n async checkForUpdates() {\n await this.fetchAds()\n await this.getAdsCategorys()\n const today = new Date().toDateString()\n if (this.lastUpdateDate !== today) {\n await this.fetchAds()\n }\n },\n\n \n\n // 新增: 更新广告点击数\n async updateAdClick(adId) {\n try {\n // 调用 API 更新数据库\n await adApi.updateAdClick(adId)\n \n // 更新本地 store 中的点击数\n this.ads = this.ads.map(category => ({\n ...category,\n ads: category.ads.map(ad => {\n if (ad._id === adId) {\n return {\n ...ad,\n clickCount: (ad.clickCount || 0) + 1\n }\n }\n return ad\n })\n }))\n } catch (error) {\n console.error('更新点击数失败:', error)\n }\n },\n // 新增: 更新 banner 广告点击数\n async updateBannerAdClick(adId) {\n try {\n await adApi.updateAdClick(adId)\n \n // 只更新 bannerAds 中的点击数\n this.bannerAds = this.bannerAds.map(ad => {\n if (ad._id === adId) {\n return {\n ...ad,\n clickCount: (ad.clickCount || 0) + 1\n }\n }\n return ad\n })\n } catch (error) {\n console.error('更新banner广告点击数失败:', error)\n }\n },\n // 更新分类缓存中广告的点击数\n async updateCategoryAdClick(adId) {\n try {\n // 调用 API 更新数据库\n await adApi.updateAdClick(adId)\n \n // 只更新缓存中的点击数\n if (this.categoryAdCache.list) {\n this.categoryAdCache.list = this.categoryAdCache.list.map(ad => {\n if (ad._id === adId) {\n return {\n ...ad,\n clickCount: (ad.clickCount || 0) + 1\n }\n }\n return ad\n })\n }\n } catch (error) {\n console.error('更新分类广告点击数失败:', error)\n }\n },\n // 新增: 根据 ID 查找广告\n // 在组件中使用时,根据广告类型调用对应的方法\n findAdById(adId) {\n // 先在 bannerAds 中查找\n const bannerAd = this.bannerAds.find(ad => ad._id === adId)\n if (bannerAd) return bannerAd\n \n // 再在普通广告中查找\n for (const category of this.ads) {\n const ad = category.ads.find(ad => ad._id === adId)\n if (ad) return ad\n }\n return null\n },\n\n \n\n // 新增: 缓存相关的 actions\n setCategoryAdList(list, category) {\n this.categoryAdCache.list = list\n this.categoryAdCache.category = category\n },\n\n updateCategoryPagination(currentPage, hasMore) {\n this.categoryAdCache.pagination = {\n ...this.categoryAdCache.pagination,\n currentPage,\n hasMore\n }\n },\n clearCategoryCache() {\n this.categoryAdCache = {\n list: null,\n category: null,\n pagination: {\n currentPage: 1,\n hasMore: true,\n pageSize: 10\n }\n }\n },\n // 获取缓存的分类广告列表\n getCachedCategoryAds(category) {\n if (this.categoryAdCache.category === category) {\n return {\n list: this.categoryAdCache.list,\n pagination: this.categoryAdCache.pagination\n }\n }\n return null\n },\n\n // 添加新广告到缓存列表\n appendToCategoryCache(newAds) {\n if (this.categoryAdCache.list) {\n this.categoryAdCache.list = [...this.categoryAdCache.list, ...newAds]\n }\n },\n // 重置状态\n reset() {\n this.bannerAds = []\n this.ads = []\n this.loading = false\n this.lastUpdateDate = null\n this.clearCategoryCache()\n },\n // 新增: 设置当前广告\n setCurrentAd(ad) {\n this.currentAd = ad\n },\n },\n\n persist: {\n key: 'ads',\n storage: localStorage,\n paths: [\n 'bannerAds', \n 'ads', \n 'lastUpdateDate',\n 'categoryAdCache' // 添加缓存到持久化列表\n ]\n }\n})","import { createApp } from 'vue'\nimport './style.css'\nimport App from './App.vue'\nimport router from './router'\nimport { setupVant } from './utils/vant'\nimport { useAdsStore } from './stores/ads'\n\n// 引入 pinia\nimport { createPinia } from 'pinia'\nimport piniaPluginPersistedstate from 'pinia-plugin-persistedstate'\n\n// 创建应用\nconst app = createApp(App)\n\n// 创建 pinia 实例\nconst pinia = createPinia()\npinia.use(piniaPluginPersistedstate)\n\n// 注册插件\nsetupVant(app)\napp.use(pinia)\napp.use(router)\n\n// 初始化检查更新 广告 和 分类\nconst adsStore = useAdsStore()\nadsStore.checkForUpdates()\n\n// 挂载应用\napp.mount('#app')\n\n"],"file":"assets/index-G-m34wDG.js"}