• Vue+element 登录业务实现


    首先项目初始化+安装element-ui、在之前的文章当中已经介绍的很详细

    vue+element实现单选多选 答题的打分demo(从0-1全过程)_benlalagang的博客-CSDN博客_element 答题系统答题: vue+element答题demo 包含单选 多选 判断、打分页面https://blog.csdn.net/benlalagang/article/details/125927798之后我们进行下列步骤的操作

    布局页面

    没有什么难度、login页面默认宽高都是页面的100%,登录盒子定位left:50%,top:50%,再返回自身的50%  transform: translate(-50%,-50%);

    获取表单数据

    登录盒子用到组件 el-form  el-form-item  el-input 根据官网固定用法  v-model 数据双向绑定 便于获取数据post 到服务器 这里还有一个小点:组件库提供的表单预计验证

    组件data种定义好:

          LoginRules: {

            username: [

              { required: true, message: '请输入用户名', trigger: 'blur' }

            ],

            password: [

              { min: 6, max: 16, message: '长度在 6 到 16 个字符', trigger: 'blur' },

              { required: true, message: '请输入登录密码', trigger: 'blur' }

            ]

          }

    required 必填 min max最大值最小值 message 未通过验证时提示的消息  trigger 触发方式

    el-from 绑定 :rules="LoginRules"

    el-form-item 使用具体的prop="username"

    1. <template>
    2. <div id="login">
    3. <div class="login-box">
    4. <div class="avatar-box">
    5. <img src="http://www.wsg3096.com/gangback/pub/ava.jpg" alt="">
    6. div>
    7. <el-form id="login-form" :model="loginPost" :rules="LoginRules" ref="login">
    8. <el-form-item prop="username">
    9. <el-input prefix-icon="iconfont icon-user"
    10. placeholder="请输入用户名"
    11. v-model="loginPost.username">el-input>
    12. el-form-item>
    13. <el-form-item prop="password">
    14. <el-input prefix-icon="iconfont icon-3702mima"
    15. type="password"
    16. v-model="loginPost.password"
    17. placeholder="请输入密码">el-input>
    18. el-form-item>
    19. <el-form-item class="btns">
    20. <el-button type="primary" @click="loginIn">登录el-button>
    21. <el-button plain @click="loginRs">重置el-button>
    22. el-form-item>
    23. el-form>
    24. div>
    25. div>
    26. template>
    27. <script>
    28. export default {
    29. name: 'login',
    30. data () {
    31. return {
    32. loginPost: {
    33. username: '',
    34. password: ''
    35. },
    36. LoginRules: {
    37. username: [
    38. { required: true, message: '请输入用户名', trigger: 'blur' }
    39. ],
    40. password: [
    41. { min: 6, max: 16, message: '长度在 6 到 16 个字符', trigger: 'blur' },
    42. { required: true, message: '请输入登录密码', trigger: 'blur' }
    43. ]
    44. }
    45. }
    46. },
    47. methods: {
    48. loginRs () {
    49. // 点击重置按钮 重置登录表单 resetFields()ele重置方法 用refs找到这个表单
    50. // console.log(this.$refs)
    51. this.$refs.login.resetFields()
    52. },
    53. loginIn () {
    54. // 点击登录按钮 先看验证结果 通过预验证后 再发起POST请求 valid返回布尔值
    55. // async额森特在前 await额威特在内 简化promise 再用对象结构 接收data
    56. this.$refs.login.validate(async valid => {
    57. if (!valid) return
    58. const { data: res } = await this.$http.post(
    59. 'login',
    60. this.loginPost
    61. )
    62. if (res.meta.status !== 200) return this.$Msg.error('登录失败!')
    63. await this.$Msg.success('登录成功!')
    64. /*
    65. *将登录成功的令牌 存到 浏览器会话存储当中(只在打开期间生效)
    66. * 再跳转路由到首页
    67. * */
    68. window.sessionStorage.setItem('token', res.data.token)
    69. // 这里因为是异步 所以this 划线了 但是效果没有影响
    70. await this.$router.push('/home')
    71. })
    72. }
    73. }
    74. }
    75. script>
    76. <style lang="less" scoped>
    77. #login{
    78. background: url("http://www.wsg3096.com/articleSystem/assets/img/index1.jpg") no-repeat center;
    79. width: 100%;
    80. height: 100%;
    81. position: relative;
    82. }
    83. .login-box{
    84. width: 450px;
    85. height: 300px;
    86. background: white;
    87. border-radius: 6px;
    88. position: absolute;
    89. left: 50%;
    90. top: 50%;
    91. transform: translate(-50%,-50%);
    92. box-shadow: 2px 8px 20px rgba(30,30,30,0.3);
    93. }
    94. .avatar-box{
    95. height: 130px;
    96. width: 130px;
    97. border: 1px solid #eee;
    98. border-radius: 50%;
    99. padding: 10px;
    100. box-shadow: 0 0 10px #ddd;
    101. position: absolute;
    102. left: 50%;
    103. transform: translate(-50%,-50%);
    104. background: #fff;
    105. img{
    106. width: 100%;
    107. height: 100%;
    108. border-radius: 50%;
    109. background: #eee;
    110. }
    111. }
    112. .btns{
    113. display: flex;
    114. justify-content: flex-end;
    115. }
    116. #login-form{
    117. box-sizing: border-box;
    118. padding: 100px 20px 0px;
    119. }
    120. style>

    在router种使用导航守卫加以验证

    1. // 挂载路由导航守卫
    2. router.beforeEach((to, from, next) => {
    3. /** to 将要访问的路径
    4. * from 代表从哪个路径跳转而来
    5. * next 表示放行
    6. * **/
    7. if (to.path === '/login') return next()// 去访问登录页面 直接放行
    8. const tokenStr = window.sessionStorage.getItem('token')
    9. if (!tokenStr) return next('/login')// 访问其他页面 检验有没有 token 没有就跳转到 login
    10. next()
    11. })

  • 相关阅读:
    [异构图-论文阅读]Heterogeneous Graph Transformer
    low alpha solder paste reduce soft rate of microelectronics packaging?
    y46.第三章 Kubernetes从入门到精通 -- ceph 在k8s中的使用案例(十九)
    优炫数据库获“2022能源企业信息化产品技术创新”案例
    C/C++内存管理
    【贵阳网络安全宣传周】智安网络邀你共赴网络宣传周的奇幻之旅
    ChatGPT 如何改变科研之路
    全新UI简洁又不失美观的短视频去水印微信小程序
    浅谈面试经验
    JAVA常见基础面试问题汇集
  • 原文地址:https://blog.csdn.net/benlalagang/article/details/126398444