• 使用ant-design-vue


    官网 https://www.antdv.com/docs/vue/introduce-cn/

    1. 简单使用

      1. src/components/layout

      2. <template>
          <div style=" 200px">
            <a-menu
              :default-selected-keys="['1']"
              :default-open-keys="['sub1']"
              mode="inline"
              theme="dark"
              :inline-collapsed="collapsed"
              :selected-keys="[current]"
              @click="handleClick"
            >
        
        
              <a-sub-menu key="sub1">
                <span slot="title"><a-icon type="mail" /><span>用户模块</span></span>
                    <a-menu-item key="test">
                      测试
                    </a-menu-item>
                    <a-menu-item key="usermanage">
                      用户管理
                    </a-menu-item>
              </a-sub-menu>
            </a-menu>
        
          </div>
        </template>
        
        <script>
        export default {
          data() {
            return {
              collapsed: false,
              current: '1',
            };
          },
          methods: {
            toggleCollapsed() {
              this.collapsed = !this.collapsed;
            },
            handleClick(e) {
              this.current = e.key;
              this.$router.push({path:this.current});
            },
          },
        };
        </script>
        
      3. src/views/user-manage/UserManage

      4. <template>
          <div>
            <div id="components-layout-demo-basic">
              <a-layout>
                <a-layout-header style="background: #F0F2F5">
                  <Crumbs></Crumbs>
                  <h4 class="h3">用户管理</h4>
                </a-layout-header>
        
                <a-layout-content>
                  <SearchComponent></SearchComponent>
                  <ButtonComponent></ButtonComponent>
                </a-layout-content>
                <a-layout-footer>
                  <TableComponent>
        
                  </TableComponent>
                </a-layout-footer>
              </a-layout>
        
            </div>
        
        
          </div>
        </template>
        
        <script>
        import Crumbs from "./componentes/Crumbs";
        import SearchComponent from "./componentes/SearchComponent";
        import ButtonComponent from "./componentes/ButtonComponent";
        import TableComponent from "./componentes/TableComponent";
        import {getUser} from "../../http/apis";
        
        export default {
          components: {
            Crumbs,
            SearchComponent,
            ButtonComponent,
            TableComponent,
          },
          name: "UserManage",
          data() {
            return {
              visible: false,
            }
          },
          methods: {
          },
        
        
          //钩子方法
          mounted() {
          },
          created() {
        
          },
          //监听属性
          watch: {},
          //计算属性
          computed: {}
        }
        </script>
        
        <style scoped>
        .h3 {
          font-weight: 800;
          margin-left: -70px;
          margin-top: -20px;
        }
        
        </style>
        
      5. 组件嵌套使用 注意路径

      6. 按钮弹窗组件src/views/user-manage/componentes/ButtonComponentes.vue

        1. <template>
          
            <div>
              <a-button type="primary" @click="showModal">
                + 创建用户
              </a-button>
              <a-modal v-model="visible" title="Basic Modal" @ok="handleOk">
                用户名
                <a-input placeholder="" v-model="username"/>
                密码
                <a-input placeholder="" v-model="password"/>
                手机号
                <a-input placeholder="" v-model="mobile"/>
                电子邮箱
                <a-input placeholder="" v-model="email"/>
              </a-modal>
            </div>
          
          </template>
          
          <script>
          import {postRegister} from "../../../http/apis";
          
          export default {
            name: "ButtonComponent",
            data() {
              return {
                visible: false,
                username: '',
                password: '',
                mobile: '',
                email: '',
              }
            },
            methods: {
              showModal() {
                this.visible = true;
              },
              handleOk() {
                let params = {
                  username: this.username,
                  password: this.password,
                  mobile: this.mobile,
                  email: this.email,
                }
                postRegister(params).then(res => {
                  console.log(res)
                  this.$router.go(0)
                })
                this.visible = false;
          
              },
            },
          
          
            //钩子方法
            mounted() {
            },
            created() {
          
            },
            //监听属性
            watch: {},
            //计算属性
            computed: {}
          }
          </script>
          
          <style scoped>
          
          </style>
          
          
      7. 面包屑src/views/user-manage/componentes/Crumbs.vue

        1. <template>
            <div>
              <a-breadcrumb separator="" class="a-breadcrumb">
                <a-breadcrumb-item>
                  Home
                </a-breadcrumb-item>
                <a-breadcrumb-separator>:</a-breadcrumb-separator>
                <a-breadcrumb-item href="">
                  用户模块
                </a-breadcrumb-item>
                <a-breadcrumb-separator/>
                <a-breadcrumb-item href="">
                  用户管理
                </a-breadcrumb-item>
              </a-breadcrumb>
            </div>
          </template>
          
          <script>
          export default {
            name: "Crumbs",
            data() {
              return {}
            },
            methods: {},
          
          
            //钩子方法
            mounted() {
            },
            created() {
          
            },
            //监听属性
            watch: {},
            //计算属性
            computed: {}
          }
          </script>
          
          <style scoped>
          .a-breadcrumb {
            /*background:red;*/
            color: #1890ff;
            margin-top: -15px;
            margin-left: -70px;
          }
          </style>
          
          
      8. 输入框搜索src/views/user-manage/componentes/SearchComponentes.vue

        1. <template>
            <div>
              <div>
                <a-input-search class="a-input-search" placeholder="请输入用户名" enter-button @search="onSearch"/>
                <br/><br/>
                {{user_list}}
              </div>
            </div>
          
          </template>
          
          <script>
          import {postSearch} from "../../../http/apis";
          
          export default {
            name: "SearchComponent",
            data() {
              return {
                user_list:[],
              }
            },
            methods: {
              onChange(date, dateString) {
                console.log(date, dateString);
              },
              onSearch(value) {
                console.log(value);
                postSearch({search_name: value}).then(res => {
                  console.log(res)
                  this.user_list = res
                })
              },
            },
          
          
            //钩子方法
            mounted() {
            },
            created() {
          
            },
            //监听属性
            watch: {},
            //计算属性
            computed: {}
          }
          </script>
          
          <style scoped>
          .a-input-search {
             400px;
            margin-left: 40%;
          
          }
          
          .components-input-demo-size .ant-input {
             200px;
            margin: 0 30px 30px 0;
          }
          </style>
          
      9. 表格展示src/views/user-manage/componentes/TableComponentes.vue

        1. <template>
          
            <div>
              <a-table :columns="columns" :data-source="data" :rowKey="record => record.id">
                <a slot="name" slot-scope="text">{{ text }}</a>
                <span slot="customTitle"><a-icon type="smile-o"/> 名字</span>
                <span slot="tags" slot-scope="tags">
          
              </span>
                <span slot="action" slot-scope="text, record">
                      <a-button type="primary">修改</a-button>
                     <a-button type="danger" @click="delUser(text.id)">删除</a-button>
              </span>
              </a-table>
            </div>
          
          </template>
          <script>
          import {delUser, getUser} from "../../../http/apis";
          
          const columns = [
            {
              dataIndex: 'username',
              // key: 'username',
              slots: {title: 'customTitle'},
              scopedSlots: {customRender: 'name'},
            },
            {
              title: '手机号',
              dataIndex: 'mobile',
              // key: 'mobile',
            },
            {
              title: '电子邮箱',
              dataIndex: 'email',
              // key: 'email',
            },
            {
              title: '最后一次登录',
              // key: 'last_login',
              dataIndex: 'last_login',
              // scopedSlots: {customRender: 'tags'},
            },
            {
              title: '操作',
              // key: 'last_login',
              scopedSlots: {customRender: 'action'},
            },
          ];
          
          // const data = [
          //   {
          //     key: '1',
          //     username: '战三',
          //     mobile: 18548789043,
          //     email: '515@qq.com',
          //     is_superuser: '0',
          //     last_login:'2020-12-09'
          //   },
          // ];
          
          export default {
            name: "TableComponent",
            data() {
              return {
                data: [],
                columns,
              }
            },
            methods: {
              showUser() {
                getUser().then(res => {
                  console.log(res)
                  this.data = res.results
                })
              },
              delUser(text) {
                console.log(text)
                delUser({id:text}).then(res => {
                  console.log(res)
                  this.$router.go(0)
                }).catch(err => {
                  this.$router.go(0)
          
                })
              },
            },
          
          
            //钩子方法
            mounted() {
            },
            created() {
              this.showUser()
            },
            //监听属性
            watch: {},
            //计算属性
            computed: {}
          }
          </script>
          <style scoped>
          </style>
          
      10. 路由src/router/index.js

        1. import Vue from 'vue'
          import Router from 'vue-router'
          import Home from "../components/layout/Home";
          
          Vue.use(Router)
          const page = name => () => import('@/views/' + name)
          
          
          export default new Router({
            mode: 'history',
            routes: [
              {path: '/login', component: page('Login'), name: '登录'},
              {
                path: '/', name: 'Home', component: Home,
                children: [
                  {path: '/test', component: page('test/Test'), name: '测试页面'},
                  {path: '/usermanage', component: page('user-manage/UserManage'), name: '测试页面'},
                ]
              },
            ]
          })
          
          #避免路由循环冗余
          import VueRouter from 'vue-router'
          //import HelloWorld from '@/components/HelloWorld'
          const originalPush = VueRouter.prototype.push
          VueRouter.prototype.push = function push(location) {
            return originalPush.call(this, location).catch(err => err)
          }
          
          
      11. 登录src/views/Login.vue

        1. <template>
            <div width=300>
          
              <center><h1>登录</h1></center>
          
              <a-form-item label="用户名" v-bind="formlayout">
          
                <a-input v-model="username"/>
          
              </a-form-item>
              <a-form-item label="密码" v-bind="formlayout">
                <a-input-password v-model="password" placeholder="input password" />
              </a-form-item>
          
              <a-form-item v-bind="buttonlayout">
          
                <a-button type="primary"  @click="submit">登录</a-button>
          
              </a-form-item>
          
            </div>
          </template>
          
          <script type="text/javascript">
          import { postLogin } from '../http/apis';
          
          export default{
          
            data(){
              return{
                username:"",
                password:'',
                //表单样式
                formlayout:{
                  //标签
                  labelCol:{
                    xs:{span:24},
                    sm:{span:8}
                  },
                  //文本框
                  wrapperCol:{
                    xs:{span:14},
                    sm:{span:6}
                  }
                },
                //按钮样式
                buttonlayout:{
                  //按钮
                  wrapperCol:{
                    xs:{
                      span:24,
                      offset:0
                    },
                    sm:{span:16,offset:8}
                  }
                }
              }
          
            },
            //自定义方法
            methods:{
              submit:function(){
                var data={'username':this.username,'password':this.password}
                postLogin(data).then(resp => {
                  console.log(resp)
                  if(resp.token){
                    localStorage.setItem('token',resp.token)
                    localStorage.setItem('username',resp.username)
                    localStorage.setItem('uid',resp.id)
                    this.$router.push('/')
                  }
                }).catch(err=>{
                  console.log(err)
                  alert('登录失败')
                })
          
              }
            }
          };
          
          
          </script>
          
          <style type="text/css">
          
          
          </style>
          
      12. axios请求接口src/http/apis.js

        1. //将我们http.js中封装好的  get,post.put,delete  导过来
          import {axios_get, axios_post, axios_delete, axios_put} from './index.js'
          
          
          // 书籍管理接口
          // export const getBookList = (params, headers) => axios_get("/books/book/", params, headers)
          
          //用户
          //获取用户信息
          export const getUser = (params, headers) => axios_get("/user/user/", params, headers)
          //登录接口
          export const postLogin = (params, headers) => axios_post("/user/login/", params, headers)
          //注册接口
          export const postRegister = (params, headers) => axios_post("/user/register/", params, headers)
          //搜索
          export const postSearch = (params, headers) => axios_post("/user/search/", params, headers)
          //删除
          export const delUser = (params, headers) => axios_delete("/user/user/" + params.id + '/', headers)
          
        2. 封装axios index.js

        3. import axios from 'axios'
          
          // 第一步:设置axios
          axios.defaults.baseURL = "http://192.168.56.100:8888/"
          
          //全局设置网络超时
          axios.defaults.timeout = 10000;
          
          //设置请求头信息
          axios.defaults.headers.post['Content-Type'] = 'application/json';
          axios.defaults.headers.put['Content-Type'] = 'application/json';
          
          
          // 第二:设置拦截器
          /**
           * 请求拦截器(当前端发送请求给后端前进行拦截)
           * 例1:请求拦截器获取token设置到axios请求头中,所有请求接口都具有这个功能
           * 例2:到用户访问某一个页面,但是用户没有登录,前端页面自动跳转 /login/ 页面
           */
          axios.interceptors.request.use(
              config => {
                  // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
                  const token = localStorage.getItem("token")
                      // console.log(token)
                  if (token) {
                      config.headers.Authorization = 'JWT ' + token
                  }
                  return config;
              },
              error => {
                  return Promise.error(error);
              })
          
          axios.interceptors.response.use(
              // 请求成功
              res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res),
              // 请求失败
              error => {
                  if (error.response) {
                      // 判断一下返回结果的status == 401?  ==401跳转登录页面。  !=401passs
                      // console.log(error.response)
                      if (error.response.status === 401) {
                          // 跳转不可以使用this.$router.push方法、
                          // this.$router.push({path:'/login'})
                          window.location.href = "http://127.0.0.1:8888/"
                      } else {
                          // errorHandle(response.status, response.data.message);
                          return Promise.reject(error.response);
                      }
                      // 请求已发出,但是不在2xx的范围
                  } else {
                      // 处理断网的情况
                      // eg:请求超时或断网时,更新state的network状态
                      // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
                      // 关于断网组件中的刷新重新获取数据,会在断网组件中说明
                      // store.commit('changeNetwork', false);
                      return Promise.reject(error.response);
                  }
              });
          
          
          // 第三:封装axios请求
          // 3.1 封装get请求
          export function axios_get(url, params) {
              return new Promise(
                  (resolve, reject) => {
                      axios.get(url, {params:params})
                          .then(res => {
                              // console.log("封装信息的的res", res)
                              resolve(res.data)
                          }).catch(err => {
                              reject(err.data)
                          })
                  }
              )
          }
          
          // 3.2 封装post请求
          export function axios_post(url, data) {
              return new Promise(
                  (resolve, reject) => {
                      // console.log(data)
                      axios.post(url, JSON.stringify(data))
                          .then(res => {
                              // console.log("封装信息的的res", res)
                              resolve(res.data)
                          }).catch(err => {
                              reject(err.data)
                          })
                  }
              )
          }
          
          // 3.3 封装put请求
          export function axios_put(url, data) {
              return new Promise(
                  (resolve, reject) => {
                      // console.log(data)
                      axios.put(url, JSON.stringify(data))
                          .then(res => {
                              // console.log("封装信息的的res", res)
                              resolve(res.data)
                          }).catch(err => {
                              reject(err.data)
                          })
                  }
              )
          }
          
          // 3.4 封装delete请求
          export function axios_delete(url, data) {
              return new Promise(
                  (resolve, reject) => {
                      // console.log(data)
                      axios.delete(url, { params: data })
                          .then(res => {
                              // console.log("封装信息的的res", res)
                              resolve(res.data)
                          }).catch(err => {
                              reject(err.data)
                          })
                  }
              )
          }
          
          
  • 相关阅读:
    php递归无限分类、根据子类获取所有顶类
    PHP+Redis 有序集合实现 24 小时排行榜实时更新
    php操作redis常用方法代码示例
    Mysql 数据库默认值选 ''" 、Null和Empty String的区别
    linux查看端口占用情况
    php获取微信openid
    phpstorm 删除空行
    git常用操作命令归纳
    Redis数据类型
    渴求式加载指定字段、加载多个关联关系、嵌套的渴求式加载、带条件约束的渴求式加载
  • 原文地址:https://www.cnblogs.com/wyx-zy/p/14032084.html
Copyright © 2020-2023  润新知