axios的使用

打印 上一主题 下一主题

主题 1018|帖子 1018|积分 3054

1、axios的根本使用

1.1、简介

说到axios我们就不得不说下Ajax。在旧欣赏器页面在向服务器哀求数据时,由于返回的是整个页面的数据,页面都会强制刷新一下,这对于用户来讲并不是很友好。并且我们只是必要修改页面的部分数据,但是从服务器端发送的却是整个页面的数据,十分消耗网络资源。而我们只是必要修改页面的部分数据,也希望不刷新页面,因此异步网络哀求就应运而生。
Ajax(Asynchronous JavaScript and XML):
异步网络哀求。Ajax可以或许让页面无刷新的哀求数据。
实现ajax的方式有多种,如jQuery封装的ajax,原生的XMLHttpRequest,以及axios。但各种方式都有利弊:


  • 原生的XMLHttpRequest的配置和调用方式都很繁琐,实现异步哀求十分麻烦
  • jQuery的ajax相对于原生的ajax是非常好用的,但是没有必要由于要用ajax异步网络哀求而引用jQuery框架
  • Axios(ajax i/o system):
这不是一种新技能,本质上照旧对原生XMLHttpRequest的封装,可用于欣赏器和nodejs的HTTP客户端,只不外它是基于Promise的,符合最新的ES规范。
axios具备以下特点:
在欣赏器中创建XMLHttpRequest哀求
在node.js中发送http哀求
支持Promise API
拦截哀求和响应
转换哀求和响应数据
取消要求
自动转换JSON数据
1.2、安装

1.2.1、通过cdn引入

  1. <script src="https://unpkg.com/axios/dist/axios.min.js"> </script>
复制代码
1.3、根本使用

1.3.1、准备服务器

模拟服务器,这里使用json-server
(1)安装json-server

 npm install -g json-server
(2)创建数据源

在空文件夹下创建JSON文件作为数据源,例如 db.json
  1. {
  2.   "list": [
  3.     {
  4.       "id": "1",
  5.       "name": "唐僧",
  6.       "age": 20,
  7.       "address": "东土大唐"
  8.     },
  9.     {
  10.       "id": "2",
  11.       "name": "孙悟空",
  12.       "age": 500,
  13.       "address": "花果山"
  14.     },
  15.     {
  16.       "id": "3",
  17.       "name": "猪八戒",
  18.       "age": 330,
  19.       "address": "高老庄"
  20.     },
  21.     {
  22.       "id": "4",
  23.       "name": "沙悟净",
  24.       "age": 200,
  25.       "address": "流沙河"
  26.     },
  27.     {
  28.       "id": "5",
  29.       "name": "红孩儿",
  30.       "age": 10,
  31.       "address": "火焰山"
  32.     }
  33.   ]
  34. }
复制代码
(3)启动服务器

使用以下命令启动json-server,并将JSON文件作为参数通报给服务器。这将在当地计算机的3000端口上启动服务器,并将db.json文件中的数据暴露为RESTful API。
方式一、//db.json是文件名
  1. json-server  db.json
复制代码
方式二、
  1. json-server --watch db.json  
复制代码
方式三、
跟db.json同级目次,创建package.json文件,配置别名
  1. {
  2.   "scripts":{
  3.     "mock":"json-server --watch db.json --port 3001"
  4.   }
  5. }
复制代码
启动方式:npm run mock
1.3.2、各种哀求方式

1.3.2.1、get哀求

获取数据,哀求指定的信息,返回实体对象
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>Document</title>
  6.     <script src="../js/axios.js"></script>
  7.     <!-- <script src="https://unpkg.com/axios/dist/axios.min.js"></script> -->
  8.     <style>
  9.       #warp {
  10.         width: 400px;
  11.         margin: 50px auto;
  12.       }
  13.       .showUser {
  14.         width: 400px;
  15.         margin: 10px auto;
  16.         height: 260px;
  17.         border: 1px solid red;
  18.       }
  19.       li {
  20.         line-height: 2;
  21.         background-color: pink;
  22.         margin: 10px;
  23.       }
  24.     </style>
  25.   </head>
  26.   <body>
  27.     <div id="warp">
  28.       <button onclick="getInfo()">get请求</button>
  29.       <ul class="showUser"></ul>
  30.     </div>
  31.     <script>
  32.       // get请求
  33.       async function getInfo() {
  34.         // 请求结果处理方法一:
  35.         // axios.get("http://localhost:3000/list").then(
  36.         //   (res) => {
  37.         //     // 将请求到的结果进行渲染
  38.         //     render(res.data);
  39.         //   },
  40.         //   (err) => {
  41.         //     console.log(err);
  42.         //   }
  43.         // );
  44.         // 请求结果处理方法二:
  45.         // axios
  46.         //   .get("http://localhost:3000/list")
  47.         //   .then((res) => {
  48.         //     // 将请求到的结果进行渲染
  49.         //     render(res.data);
  50.         //   })
  51.         //   .catch((err) => {
  52.         //     console.log(err);
  53.         //   });
  54.         // 请求结果处理方法三:推荐使用第三种
  55.         try {
  56.           let res = await axios.get("http://localhost:3000/list");
  57.           render(res.data);
  58.         } catch (error) {
  59.           console.log(err);
  60.         }
  61.       }
  62.       // 渲染函数
  63.       function render(data) {
  64.         let showUser = document.querySelector(".showUser");
  65.         let str = "";
  66.         data.forEach((item) => {
  67.           str += `<li>${item.name}<a href='#'>删除</a></li>`;
  68.         });
  69.         showUser.innerHTML = str;
  70.       }
  71.     </script>
  72.   </body>
  73. </html>
复制代码
此外get哀求,还可以携带参数
  1. // get请求带参数方式一
  2. // try {
  3. //   let res = await axios.get("http://localhost:3000/list?id=1");
  4. //   render(res.data);
  5. // } catch (error) {
  6. //   console.log(err);
  7. // }
  8. // get请求带参数方式二
  9. try {
  10.   let res = await axios.get("http://localhost:3000/list", {
  11.     params: {
  12.       id: 2,
  13.     },
  14.   });
  15.   render(res.data);
  16. } catch (error) {
  17.   console.log(err);
  18. }
复制代码
1.3.2.2、post哀求:

向指定资源提交数据(例如表单提交或文件上传)
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>Document</title>
  6.     <script src="../js/axios.js"></script>
  7.     <style>
  8.       #warp {
  9.         width: 400px;
  10.         margin: 50px auto;
  11.       }
  12.       .showUser {
  13.         width: 400px;
  14.         margin: 10px auto;
  15.         height: 260px;
  16.         border: 1px solid red;
  17.       }
  18.       li {
  19.         line-height: 2;
  20.         background-color: pink;
  21.         margin: 10px;
  22.       }
  23.     </style>
  24.   </head>
  25.   <body>
  26.     <div id="warp">
  27.       <button onclick="postInfo()">post请求</button>
  28.       <ul class="showUser"></ul>
  29.     </div>
  30.     <script>
  31.       // post请求
  32.       async function postInfo() {
  33.         await axios.post("http://localhost:3000/list",
  34.         {
  35.           name: "蜘蛛精",
  36.           age: 200,
  37.           address: "盘丝洞",
  38.         });
  39.         // 重新获取数据,渲染
  40.         let res = await axios.get("http://localhost:3000/list");
  41.         render(res.data);
  42.         // console.log(res.data);
  43.       }
  44.       // 渲染函数
  45.       function render(data) {
  46.         let showUser = document.querySelector(".showUser");
  47.         let str = "";
  48.         data.forEach((item) => {
  49.           str += `<li>${item.name}<a href='#'>删除</a></li>`;
  50.         });
  51.         showUser.innerHTML = str;
  52.       }
  53.     </script>
  54.   </body>
  55. </html>
复制代码
1.3.2.3、put哀求:

更新数据,从客户端向服务器传送的数据取代指定的文档的内容
会把更新的数据完全替代原数据,假如只修改了部分的数据,原数据其他内容都会丢失
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>Document</title>
  6.     <script src="../js/axios.js"></script>
  7.     <style>
  8.       #warp {
  9.         width: 400px;
  10.         margin: 50px auto;
  11.       }
  12.       .showUser {
  13.         width: 400px;
  14.         margin: 10px auto;
  15.         height: 260px;
  16.         border: 1px solid red;
  17.       }
  18.       li {
  19.         line-height: 2;
  20.         background-color: pink;
  21.         margin: 10px;
  22.       }
  23.     </style>
  24.   </head>
  25.   <body>
  26.     <div id="warp">
  27.       <button onclick="putInfo()">put请求-修改数据</button>
  28.       <ul class="showUser"></ul>
  29.     </div>
  30.     <script>
  31.       // put请求
  32.       async function putInfo() {
  33.         let res = await axios.put("http://localhost:3000/list/1", {
  34.           name: "玉皇大帝",
  35.         });
  36.         // 渲染
  37.         getData()
  38.       }
  39.       // 重新获取数据,渲染
  40.       async function getData() {
  41.         let res = await axios.get("http://localhost:3000/list");
  42.         render(res.data);
  43.       }
  44.       // 渲染函数
  45.       function render(data) {
  46.         let showUser = document.querySelector(".showUser");
  47.         let str = "";
  48.         data.forEach((item) => {
  49.           str += `<li>${item.name}<a href='#'>删除</a></li>`;
  50.         });
  51.         showUser.innerHTML = str;
  52.       }
  53.     </script>
  54.   </body>
  55. </html>
复制代码
1.3.2.4、patch哀求:

更新数据,是对put方法的补充,用来对已知资源进行局部更新
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>Document</title>
  6.     <script src="../js/axios.js"></script>
  7.     <style>
  8.       #warp {
  9.         width: 400px;
  10.         margin: 50px auto;
  11.       }
  12.       .showUser {
  13.         width: 400px;
  14.         margin: 10px auto;
  15.         height: 260px;
  16.         border: 1px solid red;
  17.       }
  18.       li {
  19.         line-height: 2;
  20.         background-color: pink;
  21.         margin: 10px;
  22.       }
  23.     </style>
  24.   </head>
  25.   <body>
  26.     <div id="warp">
  27.       <button onclick="patchInfo()">patch请求-修改数据</button>
  28.       <ul class="showUser"></ul>
  29.     </div>
  30.     <script>
  31.       // patch请求
  32.       async function patchInfo() {
  33.         let res = await axios.patch("http://localhost:3000/list/2", {
  34.           name: "王母娘娘",
  35.         });
  36.         // 渲染
  37.         getData();
  38.       }
  39.       // 重新获取数据,渲染
  40.       async function getData() {
  41.         let res = await axios.get("http://localhost:3000/list");
  42.         render(res.data);
  43.       }
  44.       // 渲染函数
  45.       function render(data) {
  46.         let showUser = document.querySelector(".showUser");
  47.         let str = "";
  48.         data.forEach((item) => {
  49.           str += `<li>${item.name}<a href='#'>删除</a></li>`;
  50.         });
  51.         showUser.innerHTML = str;
  52.       }
  53.     </script>
  54.   </body>
  55. </html>
复制代码
1.3.2.5、delete哀求:

哀求服务器删除指定的数据
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>Document</title>
  6.     <script src="../js/axios.js"></script>
  7.     <style>
  8.       #warp {
  9.         width: 400px;
  10.         margin: 50px auto;
  11.       }
  12.       .showUser {
  13.         width: 400px;
  14.         margin: 10px auto;
  15.         height: 260px;
  16.         border: 1px solid red;
  17.       }
  18.       li {
  19.         line-height: 2;
  20.         background-color: pink;
  21.         margin: 10px;
  22.       }
  23.     </style>
  24.   </head>
  25.   <body>
  26.     <div id="warp">
  27.       <button onclick="deleteInfo()">delet请求-修改数据</button>
  28.       <ul class="showUser"></ul>
  29.     </div>
  30.     <script>
  31.       // delete请求
  32.       async function deleteInfo() {
  33.         let res = await axios.delete("http://localhost:3000/list/1");
  34.         // 渲染
  35.         getData();
  36.       }
  37.       // 重新获取数据,渲染
  38.       async function getData() {
  39.         let res = await axios.get("http://localhost:3000/list");
  40.         render(res.data);
  41.       }
  42.       // 渲染函数
  43.       function render(data) {
  44.         let showUser = document.querySelector(".showUser");
  45.         let str = "";
  46.         data.forEach((item) => {
  47.           str += `<li>${item.name}<a href='#'>删除</a></li>`;
  48.         });
  49.         showUser.innerHTML = str;
  50.       }
  51.     </script>
  52.   </body>
  53. </html>
复制代码
1.3.3、axios的配置

配置的优先级为:哀求配置 > 实例配置 > 全局配置
1.3.3.1、全局配置

  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>Document</title>
  6.     <script src="../js/axios.js"></script>
  7.   </head>
  8.   <body>
  9.     <button id="btn" onclick="getData()">发送请求</button>
  10.     <script>
  11.       //配置全局的超时时长
  12.       axios.defaults.timeout = 2000;
  13.       //配置全局的基本URL
  14.       axios.defaults.baseURL = "http://localhost:3000";
  15.       async function getData() {
  16.         try {
  17.           let res1 = await axios.get("/list");
  18.           let res2 = await axios.get("/user");
  19.           console.log(res1.data);
  20.           console.log(res2.data);
  21.         } catch (error) {
  22.           console.log(error);
  23.         }
  24.       }
  25.     </script>
  26.   </body>
  27. </html>
复制代码
1.3.3.2、实例配置

在一个项目中,我们会有很多不同的哀求,假如都用axios去哀求,很容易造成辩论,以是我们可以去创建axios的实例,通过不同的实例去哀求,配置
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>Document</title>
  6.     <script src="../js/axios.js"></script>
  7.   </head>
  8.   <body>
  9.     <button id="btn" onclick="getData()">发送请求</button>
  10.     <script>
  11.       async function getData() {
  12.         // 创建实例1,创建同时配置
  13.         let instance = axios.create({
  14.           baseURL: "http://localhost:3000",
  15.           timeout: 2000,
  16.         });
  17.         let res = await instance.get("/list");
  18.         console.log(res.data);
  19.         // 创建实例2,现创建,再配置
  20.         let instance2 = axios.create();
  21.         instance2.defaults.timeout = 2;
  22.         instance2.defaults.baseURL = "http://localhost:3000";
  23.         let res2 = await instance.get("/user");
  24.         console.log(res2.data);
  25.       }
  26.     </script>
  27.   </body>
  28. </html>
复制代码
axios实例常用配置:




    • baseURL 哀求的域名,基当地址,类型:String
    • timeout 哀求超时时长,单位ms,类型:Number
    • url 哀求路径,类型:String
    • method 哀求方法,类型:String
    • headers 设置哀求头,类型:Object
    • params 哀求参数,将参数拼接在URL上,类型:Object
    • data 哀求参数,将参数放到哀求体中,类型:Object

1.3.3.3、哀求配置

  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>Document</title>
  6.     <script src="../js/axios.js"></script>
  7.   </head>
  8.   <body>
  9.     <button id="btn" onclick="getData()">发送请求</button>
  10.     <script>
  11.       async function getData() {
  12.         let res = await axios.get("http://localhost:3000/list", {
  13.           timeout: 2000,
  14.         });
  15.         console.log(res.data);
  16.       }
  17.     </script>
  18.   </body>
  19. </html>
复制代码
1.3.4、axios的拦截器

axios给我们提供了两大类拦截器
哀求方向的拦截(乐成哀求,失败哀求)
响应方向的拦截(乐成的,失败的)
拦截器的作用,用于我们在网络哀求的时候,在发起哀求或者响应时对操作进行处理
例如:发送哀求时,可以添加网页加载的动画,或认证token,强制用户先登录再哀求数据
响应的时候,可以竣事网页加载的动画,或者对响应的数据进行处理

1.3.4.1、哀求拦截器

  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>Document</title>
  6.     <script src="../js/axios.js"></script>
  7.   </head>
  8.   <body>
  9.     <button id="btn" onclick="getData()">发送请求</button>
  10.     <script>
  11.       // 请求拦截器
  12.       async function getData() {
  13.         axios.interceptors.request.use(
  14.           (config) => {
  15.             // 发生请求前的一系列的处理
  16.             console.log("开启加载动画");
  17.             console.log("认证是否有token,如果没有,要去登录");
  18.             return config; //拦截后的放行
  19.           },
  20.           (err) => {
  21.             // 请求错误处理
  22.             return Promise.reject(err);
  23.           }
  24.         );
  25.         let res = await axios.get("http://localhost:3000/list");
  26.         console.log(res.data);
  27.       }
  28.     </script>
  29.   </body>
  30. </html>
复制代码
1.3.4.2、相应拦截器

  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>Document</title>
  6.     <script src="../js/axios.js"></script>
  7.   </head>
  8.   <body>
  9.     <button id="btn" onclick="getData()">发送请求</button>
  10.     <script>
  11.       // 响应拦截器
  12.       async function getData() {
  13.         axios.interceptors.response.use(
  14.           (config) => {
  15.             // 数据回来前的一系列的处理
  16.             console.log("关闭加载动画");
  17.             console.log("对数据进行一些数据");
  18.             return config.data; //拦截后的放行
  19.           },
  20.           (err) => {
  21.             // 响应错误处理
  22.             return Promise.reject(err);
  23.           }
  24.         );
  25.         let res = await axios.get("http://localhost:3000/list");
  26.         console.log(res.data);
  27.       }
  28.     </script>
  29.   </body>
  30. </html>
复制代码
1.3.4.3、取消拦截

  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <title>Document</title>
  6.     <script src="../js/axios.js"></script>
  7.   </head>
  8.   <body>
  9.     <button id="btn" onclick="getData()">发送请求</button>
  10.     <script>
  11.       // 请求拦截器
  12.       async function getData() {
  13.         let instance = axios.create();
  14.         instance.interceptors.request.use(
  15.           (config) => {
  16.             // 发生请求前的一系列的处理
  17.             console.log("开启加载动画");
  18.             console.log("认证是否有token,如果没有,要去登录");
  19.             return config; //拦截后的放行
  20.           },
  21.           (err) => {
  22.             // 请求错误处理
  23.             return Promise.reject(err);
  24.           }
  25.         );
  26.         // 取消拦截
  27.         axios.interceptors.request.eject(instance);
  28.         let res = await axios.get("http://localhost:3000/list");
  29.         console.log(res.data);
  30.       }
  31.     </script>
  32.   </body>
  33. </html>
复制代码
2、Vue中axios的使用

2.1、根本使用

2.1.1、npm安装

终端安装:
  1. npm install axios
复制代码
2.1.2、在Vue原型上配置$axios

在vue项目的main.js文件中引入axios
  1. // 导入axios
  2. import axios from 'axios'
  3. // 将axios放到Vue原型上,这样vm,vc身上就都有axios了
  4. Vue.prototype.$axios=axios
复制代码
2.1.3、在组件中使用:

  1. <button @click="getDate">点击发送请求</button>
  2. <script>
  3. export default {
  4.   name: 'App',
  5.   methods: {
  6.     async getDate() {
  7.       let res = await this.$axios.get('http://localhost:3000/list')
  8.       console.log(res.data);
  9.     }
  10.   }
  11. }
  12. </script>
复制代码
2.2、一次封装

假如是多个组件都必要发送哀求,而且每次哀求前,我们都要进行一些验证处理等,可以进行简单封装
2.2.1、封装request.js

src/utils创建request.js
  1. /* 封装axios用于发送请求 */
  2. import axios from "axios";
  3. /*
  4. (1)request 相当于 Axios 的实例对象
  5. (2)为什么要有request,而不是直接用axios
  6.   * 项目开发中,有可能会有两个基地址
  7.   * 不同的接口配置不同(有的要token,有的不要token)
  8. */
  9. const request = axios.create({
  10.   baseURL: "http://localhost:3000", // 设置基地址
  11.   timeout: 2000, // 请求超时:当2s没有响应就会结束请求
  12. });
  13. // 添加请求拦截器,一下内容是axios的拦截器,可以不用写
  14. request.interceptors.request.use(
  15.   function (config) {
  16.     // 发请求前做的一些处理,数据转化,配置请求头,设置token,设置loading等,根据需求去添加
  17.     // 例如1
  18.     config.data = JSON.stringify(config.data); // 数据转化,也可以使用qs转换
  19.     // 例如2
  20.     config.headers = {
  21.       "Content-Type": "application/x-www-form-urlencoded", // 配置请求头
  22.     };
  23.     // 例如3
  24.     //注意使用token的时候需要引入cookie方法或者用本地localStorage等方法,推荐js-cookie
  25.     const token = getCookie("名称"); // 这里取token之前,你肯定需要先拿到token,存一下
  26.     if (token) {
  27.       config.params = { token: token }; // 如果要求携带在参数中
  28.       config.headers.token = token; // 如果要求携带在请求头中
  29.     }
  30.    
  31.      return config; //拦截后的放行
  32.   },
  33.   function (error) {
  34.     // 对请求错误做些什么
  35.     return Promise.reject(error);
  36.   }
  37. );
  38. // 添加响应拦截器
  39. request.interceptors.response.use(
  40.   function (response) {
  41.     // 对响应数据做点什么
  42.     console.log('关闭请求数据动画');
  43.     console.log('对数据进行处理');
  44.     return response.data; //只要响应对象中的数据
  45.   },
  46.   function (error) {
  47.     // 对响应错误做点什么
  48.     return Promise.reject(error);
  49.   }
  50. );
  51. export default request;
复制代码
第一次封装,引入了基地址与拦截器
2.2.2、组件中使用

  1. <script>
  2.   import request from '../utils/request'
  3.   export default {
  4.     name: 'ShowList',
  5.     methods: {
  6.       async getList() {
  7.         // 基本路径已经配置过
  8.         let res = await request.get('/list')
  9.         //这里的res也是响应拦截器里处理之后的结果
  10.         console.log(res);
  11.       }
  12.     }
  13.   }
  14. </script>
复制代码
  1. <script>
  2. import request from '@/utils/request';
  3. export default {
  4.     name: 'ShowUser',
  5.     methods: {
  6.         async getUser() {
  7.             let res = await request.get('/user')
  8.             console.log(res);
  9.         }
  10.     }
  11. }
  12. </script>
复制代码
2.3、二次封装

项目当中会有很多的页面,假如每个页面中都会多次哀求,将我们的哀求都写在对应的页面中,比较难以维护,以是可以将哀求再次进行封装,类似如下效果:

src/apis/showList.js
  1. // 导入一次封装的request
  2. import request from "@/utils/request";
  3. // 请求list数据
  4. export function getListInfo1() {
  5.   return request.get("/list");
  6. }
  7. // 请求user数据
  8. export function getUserInfo1() {
  9.   return request.get("/user");
  10. }
复制代码
showList.vue
  1. <script>
  2. import { getListInfo1, getUserInfo1 } from '../apis/showList'
  3. export default {
  4.     name: 'ShowList',
  5.     methods: {
  6.         async getList1() {
  7.           //        调用请求函数
  8.             let res = await getListInfo1()
  9.             console.log(res);
  10.         },
  11.         async getUser1() {
  12.             let res = await getUserInfo1()
  13.             console.log(res);
  14.         }
  15.     }
  16. }
  17. </script>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表