配置环境变量和axios,完善首页轮播效果和全局查询

main
zjlnb666 4 days ago
parent 655ecc7a9e
commit d3bfe7a66e

@ -0,0 +1,5 @@
# 开发环境配置
NODE_ENV=development # 环境标识
VITE_BASE_URL=http://localhost:3000 # API基础URL根据你的后端服务地址调整
VITE_API_TIMEOUT=50000 # API请求超时时间毫秒
VITE_APP_NAME="音视频门户" # 应用名称

@ -5,12 +5,12 @@ import router from "@/router/index.js";
import {useRoute} from "vue-router"; import {useRoute} from "vue-router";
import Mask from "@/components/Mask.vue"; import Mask from "@/components/Mask.vue";
const activeMenuIndex=ref(localStorage.getItem('activeMenu') || null) const activeMenuIndex=ref(sessionStorage.getItem('activeMenu') || null)
const menuKey = ref(0) const menuKey = ref(0)
const route=useRoute() const route=useRoute()
// //
const handleSelect = (key, keyPath) => { const handleSelect = (key, keyPath) => {
localStorage.setItem('activeMenu',key) sessionStorage.setItem('activeMenu',key)
} }
const loadActiveMenu=()=>{ const loadActiveMenu=()=>{
@ -58,7 +58,7 @@ const searchEvent=()=>{
activeMenuIndex.value=null activeMenuIndex.value=null
menuKey.value += 1 // menuKey.value += 1 //
router.push({path:'/search',query:{keyword:input1.value}}).then(()=>{ router.push({path:'/search',query:{keyword:input1.value}}).then(()=>{
localStorage.setItem('activeMenu',route.fullPath) sessionStorage.setItem('activeMenu',route.fullPath)
}) })
} }

@ -1,6 +1,6 @@
<script setup> <script setup>
// //
import {onMounted, reactive, ref} from "vue"; import {nextTick, onMounted, reactive, ref} from "vue";
import img from '/src/assets/img/tc-img1.png' import img from '/src/assets/img/tc-img1.png'
const tcSwiperItem=reactive([ const tcSwiperItem=reactive([
{ {
@ -55,6 +55,7 @@ const tcSwiperItem=reactive([
let hoverTime = null let hoverTime = null
const tcSwiperRef = ref() const tcSwiperRef = ref()
const currentIndex = ref(0) const currentIndex = ref(0)
const isAutoplay = ref(true)
const showSwiper = (index) => { const showSwiper = (index) => {
// //
if (hoverTime) { if (hoverTime) {
@ -74,7 +75,13 @@ const goToSlide = (index) => {
// //
if (tcSwiperRef.value && tcSwiperRef.value.setActiveItem) { if (tcSwiperRef.value && tcSwiperRef.value.setActiveItem) {
tcSwiperRef.value.setActiveItem(index) tcSwiperRef.value.setActiveItem(index)
isAutoplay.value = false;
// 使nextTickDOM
nextTick(() => {
isAutoplay.value = true;
});
} }
} }
} }
onMounted(() => { onMounted(() => {
@ -112,7 +119,7 @@ const tcSwiperChange=(current,perv)=>{
<el-col :offset="3" :span="12"> <el-col :offset="3" :span="12">
<div class="tc-right"> <div class="tc-right">
<div class="img"> <div class="img">
<el-carousel ref="tcSwiperRef" v-model:current-index="currentIndex" class="tc-swiper" indicator-position="outside" height="635px" :autoplay="false" :arrow="'never'" @change="tcSwiperChange"> <el-carousel ref="tcSwiperRef" class="tc-swiper" indicator-position="outside" height="635px" :autoplay="isAutoplay" :arrow="'never'" @change="tcSwiperChange" :interval="3000">
<el-carousel-item v-for="(item,index) in tcSwiperItem" :key="index"> <el-carousel-item v-for="(item,index) in tcSwiperItem" :key="index">
<img :src=item.src alt=""> <img :src=item.src alt="">
<div class="content"> <div class="content">

@ -0,0 +1,41 @@
import axios from 'axios'
import * as logger from "echarts/types/src/util/log.js";
const request =axios.create({
baseURL: import.meta.env.BASE_URL,
timeout: import.meta.env.VITE_API_TIMEOUT || 50000,
headers: {
'Content-Type': 'application/json',
},
})
// 请求拦截器
request.interceptors.request.use(function (config) {
const token = localStorage.getItem('token')
if(token){
config.headers['Authorization'] = token
}
// 在发送请求之前做些什么
return config;
}, function (error) {
logger.error('请求错误:', error);
// 对请求错误做些什么
return Promise.reject(error);
})
// 响应拦截器
request.interceptors.response.use(function (res) {
// 对响应数据做点什么
if(res.data.code === 401){
logger.error('未授权,请重新登录');
// 清除token
localStorage.removeItem('token');
// 跳转到登录页
window.location.href = '/login';
//刷新当前页面
window.location.reload();
}
return res;
})
export default request

@ -1,7 +1,7 @@
<script setup> <script setup>
import {Search} from "@element-plus/icons-vue"; import {Search} from "@element-plus/icons-vue";
import {nextTick, ref} from "vue"; import {nextTick, onBeforeUnmount, ref, watch} from "vue";
import {useRouter,useRoute} from "vue-router"; import {useRouter,useRoute} from "vue-router";
import ResultItem from "@/components/SearchResults/ResultItem.vue"; import ResultItem from "@/components/SearchResults/ResultItem.vue";
import img from "@/assets/img/search1.png" import img from "@/assets/img/search1.png"
@ -11,31 +11,71 @@ import Classify from "@/components/SearchResults/Classify.vue";
const router=useRouter() const router=useRouter()
const route=useRoute() const route=useRoute()
const searchKey=ref(route.query.keyword ||sessionStorage.getItem('searchKey') || '')
const searchKey=ref(route.query.keyword ||localStorage.getItem('searchKey') || '')
if(route.query.keyword){
localStorage.setItem('searchKey',route.query.keyword)
}
const input=ref(searchKey.value) const input=ref(searchKey.value)
const searchEvent=()=>{ // 2.
if(input.value){ const activeClassify = ref(route.query.classify || sessionStorage.getItem('activeClassify') || '全部');
// const currentPage = ref(Number(route.query.page) || Number(sessionStorage.getItem('currentPage')) || 1);
console.log(route)
// 4.
watch(() => route.query, (newQuery) => {
if (newQuery.keyword) {
searchKey.value = newQuery.keyword;
input.value = newQuery.keyword;
// 使sessionStorage
sessionStorage.setItem('searchKey', newQuery.keyword);
}
localStorage.setItem('searchKey',input.value) if (newQuery.classify) {
activeClassify.value = newQuery.classify;
sessionStorage.setItem('activeClassify', newQuery.classify);
}
if (newQuery.page) {
currentPage.value = Number(newQuery.page);
sessionStorage.setItem('currentPage', newQuery.page);
}
}, { immediate: true });
//
const changeClassify=(classify)=>{
currentPage.value = 1;
router.push({
path: '/search',
query: {
keyword: searchKey.value,
classify: classify,
page: '1'
}
});
}
const searchEvent=()=>{
if(input.value){
currentPage.value = 1;
// //
router.push({ router.push({
path:'/search', path:'/search',
query:{keyword:input.value} query: {
keyword: input.value,
classify: '全部',
page: '1'
}
}).then(()=>{ }).then(()=>{
localStorage.setItem('activeMenu',route.fullPath) sessionStorage.setItem('activeMenu',route.fullPath)
}) })
} }
} }
// 7.
const handlePageChange = (page) => {
router.push({
path: '/search',
query: {
keyword: searchKey.value,
classify: activeClassify.value,
page: page.toString()
}
});
};
// //
const searchResults=ref([ const searchResults=ref([
@ -76,10 +116,8 @@ const classifyList=ref([
{label:'服务交流',value:'关于我们',count:16}, {label:'服务交流',value:'关于我们',count:16},
{label:'公司&新闻',value:'公司&新闻',count:8}, {label:'公司&新闻',value:'公司&新闻',count:8},
]) ])
const activeClassify=ref('全部')
const changeClassify=(classify)=>{
activeClassify.value=classify
}
</script> </script>
<template> <template>
@ -104,7 +142,7 @@ const changeClassify=(classify)=>{
<div class="total">256条结果</div> <div class="total">256条结果</div>
<ResultItem v-for="item in searchResults" :key="item.href" :item="item" :searchKey="input"></ResultItem> <ResultItem v-for="item in searchResults" :key="item.href" :item="item" :searchKey="input"></ResultItem>
<el-empty description="暂时还没有数据呢" v-if="searchResults.length === 0"/> <el-empty description="暂时还没有数据呢" v-if="searchResults.length === 0"/>
<el-pagination default-page-size="5" class="pagination" layout="prev, pager, next" :total="256" /> <el-pagination v-model:current-page="currentPage" @current-change="handlePageChange" default-page-size="5" class="pagination" layout="prev, pager, next" :total="256" />
</div> </div>
</div> </div>

@ -15,6 +15,16 @@ export default defineConfig({
babelPlugins: [] babelPlugins: []
}) })
], ],
// server:{
// proxy: {
// '/api': {
// target: process.env.VITE_BASE_URL,
// changeOrigin: true,
// secure: false,
// rewrite: (path) => path.replace(/^\/api/, ''),
// },
// },
// },
build: { build: {
chunkSizeWarningLimit: Infinity, // 完全禁用警告 chunkSizeWarningLimit: Infinity, // 完全禁用警告
}, },

Loading…
Cancel
Save