vue-d2admin前端axio异步请求详情
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异步请求详情相关推荐
- [vue] 如果将axios异步请求同步化处理?
[vue] 如果将axios异步请求同步化处理? // 统一处理axios请求async getHistoryData (data) {try {let res = await axios.get(' ...
- vue一个页面发出多个异步请求_vue(6)—— vue中向后端异步请求
异步请求 其实什么是异步请求已经不用多说了,通俗的说,就是整个页面不会刷新,需要更新的部分数据做局部刷新,其他数据不变. 学到这里,你应该用过jquery里的ajax了,所以很能理解了,不多说了.详细 ...
- 简单了解Vue的异步请求,axios-0.18.0.js插件实现异步
Vue的异步请求 Vue 异步操作 在 Vue 中发送异步请求,本质上还是 AJAX.我们可以使用 axios 这个插件来简化操作! 使用步骤 引入 axios 核心 js 文件. 调用 axios ...
- vue一个页面发出多个异步请求_Vue异步请求最佳实践
一.当前存在的问题 目前项目前端请求后台数据的方式是这样的: 页面中method中dispatch到action action调用mutation,请求axios 请求到数据后存储到state中 页面 ...
- 尚硅谷VUE项目-前端项目问题总结07--产品详情页【vuex-排他操作foreach-放大镜-轮播图-兄弟组件通信$bus-购物车-路由跳转传参-路由传参+会话存储】-游客身份-节流
尚硅谷VUE项目-前端项目问题总结07---产品详情页 1.静态组件(详情页还未注册为路由组件) 2.发请求 3.vuex-获取产品详情信息 3.1放大镜 3.2 属性值[排他操作] 3.3轮播图[j ...
- 前端异步请求数据未获取导致报错解决办法
我们在编写前端程序的时候,往往需要异步请求后端数据,然后拿着得到的数据重现渲染页面.有的时候,数据还没有获取到,这个时候会是undefined形式.比如说,let test = "123&q ...
- vue 请求时方法执行顺序问题,异步请求无法同时处理多个接口,使用同步顺序执行:async/await使用
vue 请求时方法执行顺序问题,异步请求无法同时处理多个接口,使用同步顺序执行:async/await使用 异步解决方案:async/await 多个await,同步拿到数据再处理 多个接口处理拿到数 ...
- 前端异步请求解决方案
前端异步请求解决方案 前言 一.回调函数 二.promise对象 三.async await 前言 JavaScript是一门单线程的语言,同一时间节点只能做一个任务,默认是从前往后一次执行. 同步任 ...
- 【vue其他相关】欢迎讨论!异步请求放在生命周期中的created还是mounted,已填坑
文章目录 前言 两个生命周期 场景1 场景2 场景3 结论 如何处理场景一和场景二的问题 最后 前言 曾经在百度上搜这个问题,看到的答案都是相互复制粘贴的,而且个人觉得并没具体场景举例说明,并没有好的 ...
- Vue生命周期,Vue中在哪个生命周期阶段调用异步请求最佳
Vue生命周期 beforeCreate(创建前): 在数据观测和初始化事件还未开始,data.watcher.methods都还不存在,但是$route已存在,可以根据路由信息进行重定向等操作. c ...
最新文章
- C# 批处理制作静默安装程序包
- 如何阅读JAVA 字节码(一)
- 解决数据库里表字段带下划线,实体类转小驼峰,Mapper的映射问题
- python爬虫实例-python使用百度进行爬虫简单学习例子
- 一文解决new/delete与malloc/free相关问题:区别?注意事项?使用方式?
- STM32开发 -- UCOSII
- 在 Mac 安装Docker
- 50行Python代码,教你获取公众号全部文章
- Linux下输出不同颜色的字体详解
- linux基础学习(十)
- .NET Core 3.0之深入源码理解HttpClientFactory(一)
- spring—配置数据源
- 无法打开用户默认数据库,登录失败,用户‘sa’登录失败,错误:4064的解决方法...
- php 模拟请求工具,http-mock-master模拟HTTP请求库
- 圆 最小外包矩形_【OpenCV3图像处理】提取轮廓的凸包、外包矩形、最小外包矩形、最小外包圆...
- 闭包,作用域链,垃圾回收,内存泄露
- java读取配置文件和获得项目根目录
- JDK帮助文档(中文版)
- word特殊符号汇总
- win10安装PyPESQ库
热门文章
- C# PDF转图片(JPG,Png)
- pdf照片显示正常打印时被翻转_【20考研】现场确认完没事了?!准考证打印别大意!...
- PHP利用SMTP发送邮件,测试ok
- android 菜鸟面单打印_关于菜鸟的圆通电子面单打印
- Ubuntu16.0.4 桌面美化 终端透明
- php获取网页内指定内容,PHP中获取某个网页或文件内容的方法
- 加域电脑如何取消锁屏
- java多个文件压缩成zip文件
- 8086/8088 CPU的段寻址方式,段地址和偏移地址
- 把汇总报表页面生成 pdf文件方案!