cauto 2 years ago
parent
commit
9c90b3607e
6 changed files with 194 additions and 110 deletions
  1. 32 10
      src/apis/node.ts
  2. 2 1
      src/main.ts
  3. 12 0
      src/model/node.ts
  4. 116 42
      src/request/index.ts
  5. 31 56
      src/view/index/index.vue
  6. 1 1
      tsconfig.json

+ 32 - 10
src/apis/node.ts

@@ -1,17 +1,39 @@
-import httRequse from '/@/request/index'
 
+import httprequest from "/@/request/index";
 
-//定义接口参数
-interface NodeinfoParam {
+namespace Node {
+    //定义接口参数
+    export interface NodeinfoParam {
 
+    }
+
+
+    export interface NodeList {
+        id: number;
+        name: string;
+        host: string;
+        port: number;
+        url: string;
+        updateAt: string;
+        createAt: string;
+        pingType: number;
+        urlStatus: number;
+    }
 }
 
-//获取全部节点
-export function apiGetNode(patam: NodeinfoParam){
-    return httRequse({
-        url : 'api/api/v1/node/all',
-        method : 'get',
-        data : patam
-    })
+// 用户登录
+export const nodeReqUse = (params: Node.NodeinfoParam) => {
+    // 返回的数据格式可以和服务端约定
+    return httprequest.get<Node.NodeList[]>('api/api/v1/node/all', params);
 }
 
+
+// //获取全部节点
+// export function apiGetNode(patam: NodeinfoParam){
+//     return httRequse({
+//         url : 'api/api/v1/node/all',
+//         method : 'get',
+//         data : patam
+//     })
+// }
+

+ 2 - 1
src/main.ts

@@ -6,7 +6,8 @@ import 'ant-design-vue/dist/antd.css'; // 引入antdv组件库的css文件
 import router from './router'
 import App from './App.vue'
 //import App from './view/index/index.vue'
-//import axios from 'axios'
+import axios from '/@/request/index'
+
 
 
 const app = createApp(App)

+ 12 - 0
src/model/node.ts

@@ -0,0 +1,12 @@
+/*NodeList*/
+export class NodeList {
+  id: number;
+  name: string;
+  host: string;
+  port: number;
+  url: string;
+  updateAt: string;
+  createAt: string;
+  pingType: number;
+  urlStatus: number;
+}

+ 116 - 42
src/request/index.ts

@@ -1,48 +1,122 @@
-import axios from 'axios'
+import axios, {AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse} from 'axios'
+import { message } from 'ant-design-vue';
+// 数据返回的接口
+// 定义请求响应参数,不含data
+interface Result {
+	code: number;
+	message: string
+}
 
-// 创建一个 axios 实例
-const service = axios.create({
-	//baseURL: 'http://127.0.0.1:8080', // 所有的请求地址前缀部分
-	timeout: 60000, // 请求超时时间毫秒
-	withCredentials: true, // 异步请求携带cookie
-	headers: {
-		// 设置后端需要的传参类型 	'token': 'your token',
-		'Content-Type': 'application/json',
-		'X-Requested-With': 'XMLHttpRequest',
-	},
-})
+// 请求响应参数,包含data
+ interface ResultData<T = any> extends Result {
+	data?: T;
+}
+const URL: string = ''
+enum RequestEnums {
+	TIMEOUT = 20000,
+	OVERDUE = 600, // 登录失效
+	FAIL = 999, // 请求失败
+	SUCCESS = 0, // 请求成功
+}
+const config = {
+	// 默认地址
+	baseURL: URL as string,
+	// 设置超时时间
+	timeout: RequestEnums.TIMEOUT as number,
+	// 跨域时候允许携带凭证
+	withCredentials: true
+}
 
-// 添加请求拦截器
-service.interceptors.request.use(
-	function (config) {
-		// 在发送请求之前做些什么
-		return config
-	},
-	function (error) {
-		// 对请求错误做些什么
-		console.log(error)
-		return Promise.reject(error)
+class RequestHttp {
+	// 定义成员变量并指定类型
+	service: AxiosInstance;
+	public constructor(config: AxiosRequestConfig) {
+		// 实例化axios
+		this.service = axios.create(config);
+
+		/**
+		     * 请求拦截器
+		     * 客户端发送请求 -> [请求拦截器] -> 服务器
+		     * token校验(JWT) : 接受服务器返回的token,存储到vuex/pinia/本地储存当中
+		     */
+		this.service.interceptors.request.use(
+			(config: AxiosRequestConfig) => {
+				const token = localStorage.getItem('token') || '';
+				return {
+					...config,
+					headers: {
+						'x-access-token': token, // 请求头中携带token信息
+					}
+				}
+			},
+			(error: AxiosError) => {
+				// 请求报错
+				Promise.reject(error)
+			}
+		)
+
+		/**
+		     * 响应拦截器
+		     * 服务器换返回信息 -> [拦截统一处理] -> 客户端JS获取到信息
+		     */
+		this.service.interceptors.response.use(
+			(response: AxiosResponse) => {
+				const {data, config} = response; // 解构
+				if (data.code === RequestEnums.OVERDUE) {
+					// 登录信息失效,应跳转到登录页面,并清空本地的token
+					localStorage.setItem('token', '');
+					// router.replace({
+					//   path: '/login'
+					// })
+					return Promise.reject(data);
+				}
+				// 全局错误信息拦截(防止下载文件得时候返回数据流,没有code,直接报错)
+				if (data.code && data.code !== RequestEnums.SUCCESS) {
+					message.error(data); // 此处也可以使用组件提示报错信息
+					return Promise.reject(data)
+				}
+				return data;
+			},
+			(error: AxiosError) => {
+				const {response} = error;
+				if (response) {
+					this.handleCode(response.status)
+				}
+				if (!window.navigator.onLine) {
+					message.error('网络连接失败');
+					// 可以跳转到错误页面,也可以不做操作
+					// return router.replace({
+					//   path: '/404'
+					// });
+				}
+			}
+		)
+	}
+	handleCode(code: number):void {
+		switch(code) {
+			case 401:
+				message.error('登录失败,请重新登录');
+				break;
+			default:
+				message.error('请求失败');
+				break;
+		}
 	}
-)
 
-// 添加响应拦截器
-service.interceptors.response.use(
-	function (response) {
-		console.log(response)
-		// 2xx 范围内的状态码都会触发该函数。
-		// 对响应数据做点什么
-		// dataAxios 是 axios 返回数据中的 data
-		const dataAxios = response.data
-		// 这个状态码是和后端约定的
-		const code = dataAxios.reset
-		return dataAxios
-	},
-	function (error) {
-		// 超出 2xx 范围的状态码都会触发该函数。
-		// 对响应错误做点什么
-		console.log(error)
-		return Promise.reject(error)
+	// 常用方法封装
+	get<T>(url: string, params?: object): Promise<ResultData<T>> {
+		return this.service.get(url, {params});
+	}
+	post<T>(url: string, params?: object): Promise<ResultData<T>> {
+		return this.service.post(url, params);
+	}
+	put<T>(url: string, params?: object): Promise<ResultData<T>> {
+		return this.service.put(url, params);
+	}
+	delete<T>(url: string, params?: object): Promise<ResultData<T>> {
+		return this.service.delete(url, {params});
 	}
-)
+}
 
-export default service
+// 导出一个实例对象
+export default new RequestHttp(config);

+ 31 - 56
src/view/index/index.vue

@@ -1,65 +1,40 @@
 <template>
-  <a-layout class="layout">
-    <a-layout-header>
-      <div class="logo"/>
-      <a-menu
-          v-model:selectedKeys="selectedKeys"
-          theme="dark"
-          mode="horizontal"
-          :style="{ lineHeight: '64px' }"
-      >
-        <a-menu-item key="1">nav 1</a-menu-item>
-        <a-menu-item key="2">nav 2</a-menu-item>
-        <a-menu-item key="3">nav 3</a-menu-item>
-      </a-menu>
-    </a-layout-header>
-    <a-layout-content style="padding: 0 50px">
-      <!-- <a-breadcrumb style="margin: 16px 0">
-        <a-breadcrumb-item>Home</a-breadcrumb-item>
-        <a-breadcrumb-item>List</a-breadcrumb-item>
-        <a-breadcrumb-item>App</a-breadcrumb-item>
-      </a-breadcrumb> -->
-      <div :style="{ background: '#fff', padding: '24px', minHeight: '280px' }">
-
-      </div>
-    </a-layout-content>
-    <a-layout-footer style="text-align: center">
-
-    </a-layout-footer>
-  </a-layout>
+  <div>ceshi</div>
+<!--  <a-list-->
+<!--      :grid="{ gutter: 16, xs: 1, sm: 2, md: 4, lg: 4, xl: 6, xxl: 3, xxxl: 2 }"-->
+<!--      :data-source="data"-->
+<!--  >-->
+<!--    <template #renderItem="{ item }">-->
+<!--      <a-list-item>-->
+<!--        <a-card :title="item.title">Card content</a-card>-->
+<!--      </a-list-item>-->
+<!--    </template>-->
+<!--  </a-list>-->
 </template>
 
-<script setup lang="ts">
-import {defineComponent, onMounted, ref} from 'vue';
-import {apiGetNode} from '/@/apis/node'
-
-//获取节点数据
-function GetNodeInfo() {
-  apiGetNode(null).then((res) => {
-    if (res["code"] == 0) {
-      console.log(res["data"]["nodeList"])
-    } else {
-      console.log(res["message"])
+<script lang="ts">
+import {
+  defineComponent,
+  onMounted,
+  onBeforeMount,
+  onBeforeUpdate,
+  ref,
+  onUpdated,
+  onBeforeUnmount,
+  onUnmounted, onErrorCaptured
+} from 'vue';
+import { nodeReqUse } from '/@/apis/node'
+import { NodeList } from '/@/model/node'
+
+export default defineComponent({
+    setup() {
+      onMounted(async () => {
+        const nodeList = await nodeReqUse(null)
+        console.log(nodeList.data);
+      })
     }
-  })
-}
-
-onMounted(() => {
-  GetNodeInfo()
 })
 
-defineComponent({
-  setup() {
-    const state = ref({
-      selectedKeys: ['1'],
-    });
-
-
-    return {
-      state
-    };
-  },
-});
 </script>
 
 <style>

+ 1 - 1
tsconfig.json

@@ -14,7 +14,7 @@
 //     "noEmit": true
 //   },
 //   "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
-//   "references": [{ "path": "./tsconfig.node.json" }]
+//   "references": [{ "path": "./tsconfig.node.ts.json" }]
 // }
 
 {