vue-d2admin前端axio异步请求详情

  • d2admin>src>api>sys.login.js 设计axio api
import request from '@/plugin/axios'export function AccountLogin (data) {return request({url: '/login',method: 'post',data})
}

  • d2admin>src>store>d2admin>modules>account.js 创建使用API模块
import { Message, MessageBox } from 'element-ui'
import util from '@/libs/util.js'
import router from '@/router'
import { AccountLogin } from '@api/sys.login'export default {namespaced: true,actions: {/*** @description 登录* @param {Object} param context* @param {Object} param username {String} 用户账号* @param {Object} param password {String} 密码* @param {Object} param route {Object} 登录成功后定向的路由对象 任何 vue-router 支持的格式*/login ({ dispatch }, {username = '',password = ''} = {}) {return new Promise((resolve, reject) => {// 开始请求登录接口
        AccountLogin({username,password}).then(async res => {// 设置 cookie 一定要存 uuid 和 token 两个 cookie// 整个系统依赖这两个数据进行校验和存储// uuid 是用户身份唯一标识 用户注册的时候确定 并且不可改变 不可重复// token 代表用户当前登录状态 建议在网络请求中携带 token// 如有必要 token 需要定时更新,默认保存一天util.cookies.set('uuid', res.uuid)util.cookies.set('token', res.token)// 设置 vuex 用户信息await dispatch('d2admin/user/set', {name: res.name}, { root: true })// 用户登录后从持久化数据加载一系列的设置await dispatch('load')// 结束
            resolve()}).catch(err => {console.log('err: ', err)reject(err)})})},/*** @description 注销用户并返回登录页面* @param {Object} param context* @param {Object} param confirm {Boolean} 是否需要确认*/logout ({ commit, dispatch }, { confirm = false } = {}) {/*** @description 注销*/async function logout () {// 删除cookieutil.cookies.remove('token')util.cookies.remove('uuid')// 清空 vuex 用户信息await dispatch('d2admin/user/set', {}, { root: true })// 跳转路由
        router.push({name: 'login'})}// 判断是否需要确认if (confirm) {commit('d2admin/gray/set', true, { root: true })MessageBox.confirm('注销当前账户吗?  打开的标签页和用户设置将会被保存。', '确认操作', {confirmButtonText: '确定注销',cancelButtonText: '放弃',type: 'warning'}).then(() => {commit('d2admin/gray/set', false, { root: true })logout()}).catch(() => {commit('d2admin/gray/set', false, { root: true })Message({message: '放弃注销用户'})})} else {logout()}},/*** @description 用户登录后从持久化数据加载一系列的设置* @param {Object} state vuex state*/load ({ dispatch }) {return new Promise(async resolve => {// DB -> store 加载用户名await dispatch('d2admin/user/load', null, { root: true })// DB -> store 加载主题await dispatch('d2admin/theme/load', null, { root: true })// DB -> store 加载页面过渡效果设置await dispatch('d2admin/transition/load', null, { root: true })// DB -> store 持久化数据加载上次退出时的多页列表await dispatch('d2admin/page/openedLoad', null, { root: true })// DB -> store 持久化数据加载侧边栏折叠状态await dispatch('d2admin/menu/asideCollapseLoad', null, { root: true })// DB -> store 持久化数据加载全局尺寸await dispatch('d2admin/size/load', null, { root: true })// end
        resolve()})}}
}

  • d2admin>src>views>system>login>page.vue 通过模块调用API使用axio
methods: {...mapActions('d2admin/account', ['login']),

<template><div class="page-login"><div class="page-login--layer page-login--layer-area"><ul class="circles"><li v-for="n in 10" :key="n"></li></ul></div><divclass="page-login--layer page-login--layer-time"flex="main:center cross:center">{{time}}</div><div class="page-login--layer"><divclass="page-login--content"flex="dir:top main:justify cross:center box:justify"><div class="page-login--content-header"><p class="page-login--content-header-motto">时间是一切财富中最宝贵的财富。 <span>—— 德奥弗拉斯多</span></p></div><divclass="page-login--content-main"flex="dir:top main:center cross:center"><!-- logo --><img class="page-login--logo" src="./image/logo@2x.png"><!-- 表单 --><div class="page-login--form"><el-card shadow="never"><el-form ref="loginForm" label-position="top" :rules="rules" :model="formLogin" size="default"><el-form-item prop="username"><el-input type="text" v-model="formLogin.username" placeholder="用户名"><i slot="prepend" class="fa fa-user-circle-o"></i></el-input></el-form-item><el-form-item prop="password"><el-input type="password" v-model="formLogin.password" placeholder="密码"><i slot="prepend" class="fa fa-keyboard-o"></i></el-input></el-form-item><el-form-item prop="code"><el-input type="text" v-model="formLogin.code" placeholder="- - - -"><template slot="prepend">验证码</template><template slot="append"><img class="login-code" src="./image/login-code.png"></template></el-input></el-form-item><el-button size="default" @click="submit" type="primary" class="button-login">登录</el-button></el-form></el-card><pclass="page-login--options"flex="main:justify cross:center"><span><d2-icon name="question-circle"/> 忘记密码</span><span>注册用户</span></p><!-- 快速登录按钮 --><el-button class="page-login--quick" size="default" type="info" @click="dialogVisible = true">快速选择用户(测试功能)</el-button></div></div><div class="page-login--content-footer"><p class="page-login--content-footer-options"><a href="#">帮助</a><a href="#">隐私</a><a href="#">条款</a></p><p class="page-login--content-footer-copyright">Copyright <d2-icon name="copyright"/> 2018 D2 Projects 开源组织出品 <a href="https://github.com/FairyEver">@FairyEver</a></p></div></div></div><el-dialogtitle="快速选择用户":visible.sync="dialogVisible"width="400px"><el-row :gutter="10" style="margin: -20px 0px -10px 0px;"><el-col v-for="(user, index) in users" :key="index" :span="8"><div class="page-login--quick-user" @click="handleUserBtnClick(user)"><d2-icon name="user-circle-o"/><span>{{user.name}}</span></div></el-col></el-row></el-dialog></div>
</template><script>
import dayjs from 'dayjs'
import { mapActions } from 'vuex'
export default {data () {return {timeInterval: null,time: dayjs().format('HH:mm:ss'),// 快速选择用户dialogVisible: false,users: [{name: '管理员',username: 'admin',password: 'admin'},{name: '编辑',username: 'editor',password: 'editor'},{name: '用户1',username: 'user1',password: 'user1'}],// 表单
      formLogin: {username: 'admin',password: 'admin',code: 'v9am'},// 校验
      rules: {username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],password: [{ required: true, message: '请输入密码', trigger: 'blur' }],code: [{ required: true, message: '请输入验证码', trigger: 'blur' }]}}},mounted () {this.timeInterval = setInterval(() => {this.refreshTime()}, 1000)},beforeDestroy () {clearInterval(this.timeInterval)},methods: {...mapActions('d2admin/account', ['login']),refreshTime () {this.time = dayjs().format('HH:mm:ss')},/*** @description 接收选择一个用户快速登录的事件* @param {Object} user 用户信息*/handleUserBtnClick (user) {this.formLogin.username = user.usernamethis.formLogin.password = user.passwordthis.submit()},/*** @description 提交表单*/// 提交登录信息
    submit () {this.$refs.loginForm.validate((valid) => {if (valid) {// 登录// 注意 这里的演示没有传验证码// 具体需要传递的数据请自行修改代码this.login({username: this.formLogin.username,password: this.formLogin.password}).then(() => {// 重定向对象不存在则返回顶层路径this.$router.replace(this.$route.query.redirect || '/')})} else {// 登录表单校验失败this.$message.error('表单校验失败')}})}}
}
</script><style lang="scss">
.page-login {@extend %unable-select;$backgroundColor: #F0F2F5;// ---background-color: $backgroundColor;height: 100%;position: relative;// 层.page-login--layer {@extend %full;overflow: auto;}.page-login--layer-area {overflow: hidden;}// 时间.page-login--layer-time {font-size: 24em;font-weight: bold;color: rgba(0, 0, 0, 0.03);overflow: hidden;}// 登陆页面控件的容器.page-login--content {height: 100%;min-height: 500px;}// header.page-login--content-header {padding: 1em 0;.page-login--content-header-motto {margin: 0px;padding: 0px;color: $color-text-normal;text-align: center;font-size: 12px;span {color: $color-text-sub;}}}// main.page-login--logo {width: 240px;margin-bottom: 2em;margin-top: -2em;}// 登录表单.page-login--form {width: 280px;// 卡片.el-card {margin-bottom: 15px;}// 登录按钮.button-login {width: 100%;}// 输入框左边的图表区域缩窄.el-input-group__prepend {padding: 0px 14px;}.login-code {height: 40px - 2px;display: block;margin: 0px -20px;border-top-right-radius: 2px;border-bottom-right-radius: 2px;}// 登陆选项.page-login--options {margin: 0px;padding: 0px;font-size: 14px;color: $color-primary;margin-bottom: 15px;font-weight: bold;}.page-login--quick {width: 100%;}}// 快速选择用户面板.page-login--quick-user {@extend %flex-center-col;padding: 10px 0px;border-radius: 4px;&:hover {background-color: $color-bg;i {color: $color-text-normal;}span {color: $color-text-normal;}}i {font-size: 36px;color: $color-text-sub;}span {font-size: 12px;margin-top: 10px;color: $color-text-sub;}}// footer.page-login--content-footer {padding: 1em 0;.page-login--content-footer-options {padding: 0px;margin: 0px;margin-bottom: 10px;font-size: 14px;text-align: center;a {color: $color-text-normal;margin: 0 1em;}}.page-login--content-footer-copyright {padding: 0px;margin: 0px;font-size: 12px;color: $color-text-normal;a {color: $color-text-normal;}}}// 背景
  .circles {position: absolute;top: 0;left: 0;width: 100%;height: 100%;overflow: hidden;li {position: absolute;display: block;list-style: none;width: 20px;height: 20px;background: #FFF;animation: animate 25s linear infinite;bottom: -200px;@keyframes animate {0%{transform: translateY(0) rotate(0deg);opacity: 1;border-radius: 0;}100%{transform: translateY(-1000px) rotate(720deg);opacity: 0;border-radius: 50%;}}&:nth-child(1) {left: 15%;width: 80px;height: 80px;animation-delay: 0s;}&:nth-child(2) {left: 5%;width: 20px;height: 20px;animation-delay: 2s;animation-duration: 12s;}&:nth-child(3) {left: 70%;width: 20px;height: 20px;animation-delay: 4s;}&:nth-child(4) {left: 40%;width: 60px;height: 60px;animation-delay: 0s;animation-duration: 18s;}&:nth-child(5) {left: 65%;width: 20px;height: 20px;animation-delay: 0s;}&:nth-child(6) {left: 75%;width: 150px;height: 150px;animation-delay: 3s;}&:nth-child(7) {left: 35%;width: 200px;height: 200px;animation-delay: 7s;}&:nth-child(8) {left: 50%;width: 25px;height: 25px;animation-delay: 15s;animation-duration: 45s;}&:nth-child(9) {left: 20%;width: 15px;height: 15px;animation-delay: 2s;animation-duration: 35s;}&:nth-child(10) {left: 85%;width: 150px;height: 150px;animation-delay: 0s;animation-duration: 11s;}}}
}
</style>

跨域问题,在vue.config.js里面配置

https://cli.vuejs.org/zh/config/#devserver-proxy

vue-d2admin前端axio异步请求详情相关推荐

  1. [vue] 如果将axios异步请求同步化处理?

    [vue] 如果将axios异步请求同步化处理? // 统一处理axios请求async getHistoryData (data) {try {let res = await axios.get(' ...

  2. vue一个页面发出多个异步请求_vue(6)—— vue中向后端异步请求

    异步请求 其实什么是异步请求已经不用多说了,通俗的说,就是整个页面不会刷新,需要更新的部分数据做局部刷新,其他数据不变. 学到这里,你应该用过jquery里的ajax了,所以很能理解了,不多说了.详细 ...

  3. 简单了解Vue的异步请求,axios-0.18.0.js插件实现异步

    Vue的异步请求 Vue 异步操作 在 Vue 中发送异步请求,本质上还是 AJAX.我们可以使用 axios 这个插件来简化操作! 使用步骤 引入 axios 核心 js 文件. 调用 axios ...

  4. vue一个页面发出多个异步请求_Vue异步请求最佳实践

    一.当前存在的问题 目前项目前端请求后台数据的方式是这样的: 页面中method中dispatch到action action调用mutation,请求axios 请求到数据后存储到state中 页面 ...

  5. 尚硅谷VUE项目-前端项目问题总结07--产品详情页【vuex-排他操作foreach-放大镜-轮播图-兄弟组件通信$bus-购物车-路由跳转传参-路由传参+会话存储】-游客身份-节流

    尚硅谷VUE项目-前端项目问题总结07---产品详情页 1.静态组件(详情页还未注册为路由组件) 2.发请求 3.vuex-获取产品详情信息 3.1放大镜 3.2 属性值[排他操作] 3.3轮播图[j ...

  6. 前端异步请求数据未获取导致报错解决办法

    我们在编写前端程序的时候,往往需要异步请求后端数据,然后拿着得到的数据重现渲染页面.有的时候,数据还没有获取到,这个时候会是undefined形式.比如说,let test = "123&q ...

  7. vue 请求时方法执行顺序问题,异步请求无法同时处理多个接口,使用同步顺序执行:async/await使用

    vue 请求时方法执行顺序问题,异步请求无法同时处理多个接口,使用同步顺序执行:async/await使用 异步解决方案:async/await 多个await,同步拿到数据再处理 多个接口处理拿到数 ...

  8. 前端异步请求解决方案

    前端异步请求解决方案 前言 一.回调函数 二.promise对象 三.async await 前言 JavaScript是一门单线程的语言,同一时间节点只能做一个任务,默认是从前往后一次执行. 同步任 ...

  9. 【vue其他相关】欢迎讨论!异步请求放在生命周期中的created还是mounted,已填坑

    文章目录 前言 两个生命周期 场景1 场景2 场景3 结论 如何处理场景一和场景二的问题 最后 前言 曾经在百度上搜这个问题,看到的答案都是相互复制粘贴的,而且个人觉得并没具体场景举例说明,并没有好的 ...

  10. Vue生命周期,Vue中在哪个生命周期阶段调用异步请求最佳

    Vue生命周期 beforeCreate(创建前): 在数据观测和初始化事件还未开始,data.watcher.methods都还不存在,但是$route已存在,可以根据路由信息进行重定向等操作. c ...

最新文章

  1. C# 批处理制作静默安装程序包
  2. 如何阅读JAVA 字节码(一)
  3. 解决数据库里表字段带下划线,实体类转小驼峰,Mapper的映射问题
  4. python爬虫实例-python使用百度进行爬虫简单学习例子
  5. 一文解决new/delete与malloc/free相关问题:区别?注意事项?使用方式?
  6. STM32开发 -- UCOSII
  7. 在 Mac 安装Docker
  8. 50行Python代码,教你获取公众号全部文章
  9. Linux下输出不同颜色的字体详解
  10. linux基础学习(十)
  11. .NET Core 3.0之深入源码理解HttpClientFactory(一)
  12. spring—配置数据源
  13. 无法打开用户默认数据库,登录失败,用户‘sa’登录失败,错误:4064的解决方法...
  14. php 模拟请求工具,http-mock-master模拟HTTP请求库
  15. 圆 最小外包矩形_【OpenCV3图像处理】提取轮廓的凸包、外包矩形、最小外包矩形、最小外包圆...
  16. 闭包,作用域链,垃圾回收,内存泄露
  17. java读取配置文件和获得项目根目录
  18. JDK帮助文档(中文版)
  19. word特殊符号汇总
  20. win10安装PyPESQ库

热门文章

  1. C# PDF转图片(JPG,Png)
  2. pdf照片显示正常打印时被翻转_【20考研】现场确认完没事了?!准考证打印别大意!...
  3. PHP利用SMTP发送邮件,测试ok
  4. android 菜鸟面单打印_关于菜鸟的圆通电子面单打印
  5. Ubuntu16.0.4 桌面美化 终端透明
  6. php获取网页内指定内容,PHP中获取某个网页或文件内容的方法
  7. 加域电脑如何取消锁屏
  8. java多个文件压缩成zip文件
  9. 8086/8088 CPU的段寻址方式,段地址和偏移地址
  10. 把汇总报表页面生成 pdf文件方案!