From d7033a13b6118a38d223f7ade0deb64bafbbb6fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=8C=E7=8B=BC=E8=93=9D=E5=A4=A9?= Date: Wed, 12 Mar 2025 17:50:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(auth):=20=E7=99=BB=E5=BD=95=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E9=80=80=E5=87=BA=E7=99=BB=E5=BD=95=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 6 +- src/apis/api.js | 26 ++++ src/apis/apis_auth.js | 10 ++ src/apis/axios.js | 40 ++++++ src/pages/IndexPage.vue | 47 ++++++- src/router/index.js | 5 + src/store/index.js | 29 +++++ src/store/modules/user.js | 68 +++++++++++ src/views/AuthView.vue | 251 ++++++++++++++++++++++++++++++++++++++ vite.config.js | 22 +++- 10 files changed, 498 insertions(+), 6 deletions(-) create mode 100644 src/apis/api.js create mode 100644 src/apis/apis_auth.js create mode 100644 src/apis/axios.js create mode 100644 src/store/index.js create mode 100644 src/store/modules/user.js diff --git a/package.json b/package.json index 40b7784..bef64fa 100644 --- a/package.json +++ b/package.json @@ -11,11 +11,15 @@ "dependencies": { "@ant-design/icons-vue": "^7.0.1", "ant-design-vue": "^4.2.6", + "axios": "^1.8.2", "vue": "^3.5.13", - "vue-router": "^4.5.0" + "vue-router": "^4.5.0", + "vue3-slide-verify": "^1.1.6", + "vuex": "^4.1.0" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.1", + "path": "^0.12.7", "vite": "^6.2.0" } } diff --git a/src/apis/api.js b/src/apis/api.js new file mode 100644 index 0000000..9ce9212 --- /dev/null +++ b/src/apis/api.js @@ -0,0 +1,26 @@ + +// api.js +import axiosInstance from './axios'; // 导入在axios.js中配置好的axios实例 +export default { + +} +// 统一的get请求方法 +export function get(url, params = {}) { + return axiosInstance.get(url, { params }); +} + +// 统一的post请求方法 +export function post(url, data = {}) { + return axiosInstance.post(url, data); +} + +// 统一的put请求方法(通常用于更新资源) +export function put(url, data = {}) { + return axiosInstance.put(url, data); +} + +// 统一的delete请求方法 +export function deleteRequest(url, params = {}) { + // 注意:axios的delete方法第二个参数是config对象,如果要传递参数,通常使用params + return axiosInstance.delete(url, { params }); +} diff --git a/src/apis/apis_auth.js b/src/apis/apis_auth.js new file mode 100644 index 0000000..13179d9 --- /dev/null +++ b/src/apis/apis_auth.js @@ -0,0 +1,10 @@ +import {post} from "./api.js"; +export function auth_reg(data) { + return post("/auth/register", data) +} +export function auth_login(data) { + return post("/auth/login", data) +} +export function auth_logout() { + return post("/auth/logout"); +} diff --git a/src/apis/axios.js b/src/apis/axios.js new file mode 100644 index 0000000..daa2796 --- /dev/null +++ b/src/apis/axios.js @@ -0,0 +1,40 @@ +import axios from 'axios'; +import store from '@/store'; +import router from '@/router'; + +// 创建axios实例 +const service = axios.create({ + baseURL: '/api', // api的base_url,可以在.env文件中配置 + timeout: 5000, // 请求超时时间 +}); + +// 请求拦截器 +service.interceptors.request.use( + (config) => { + const token = localStorage.getItem('token'); + if (token) { + config.headers['Authorization'] = 'Bearer ' + token; + } + return config; + }, + (error) => { + // 处理请求错误 + console.error(error); // for debug + return Promise.reject(error); + } +); + +// 响应拦截器 +service.interceptors.response.use( + (response) => response.data, + (error) => { + if (error.response && error.response.status === 401) { + store.commit('user/CLEAR_SESSION'); + router.push('/login?expired=1'); + } + console.error('Error:', error); // 更清晰的错误日志输出 + return Promise.reject(error); + } +); + +export default service; diff --git a/src/pages/IndexPage.vue b/src/pages/IndexPage.vue index c857214..71f0be9 100644 --- a/src/pages/IndexPage.vue +++ b/src/pages/IndexPage.vue @@ -1,5 +1,35 @@ diff --git a/vite.config.js b/vite.config.js index bbcf80c..dcb6c01 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,7 +1,25 @@ import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' - -// https://vite.dev/config/ +import { resolve } from 'path' // npm install path --save-dev +// vite.config.js export default defineConfig({ plugins: [vue()], + resolve: { + alias: { + '@': resolve(__dirname, 'src') // 设置 @ 指向 src 目录 + } + }, + server: { + host: '0.0.0.0', + port: 5173, + proxy: { + '/api': { + target: 'http://127.0.0.1:10300', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, '/api'), // 保持路径不变 + secure: false, + ws: true + } + } + } })