• 【vue实战项目】通用管理系统:登录页


    目录

    1.前言

    2.表单

    3.容器

    4.路由

    5.校验

    6.请求后端接口


    1.前言

    本文是博主vue实战项目系列文章的第一篇,本系列将清晰的从搭建环境开始一步步开发一个vue的通用管理系统,项目规模不大,较为小巧,但是覆盖了目前常用的前端开发技术。很适合作为一个前端的练习项目,也特别适合后端的小伙伴用来熟悉前端。整个系列走完,会对当前的前端开发的技术栈有了较为大致的了解,不会再打开现在的一个前端项目两眼一抹黑。

    本项目会先用vue2来开发,然后升级成vue3,前置的环境准备等相关内容请移步:

    从0开始搭建一个前端项目的架子-CSDN博客

    2.表单

    一个登录页由哪些东西构成?无非就是最核心的输入用户名密码的输入框,再加上一些杂七杂八的修饰元素。比如我们常见的QQ邮箱的页面:

    输入用户名密码的地方很明显是一个表单,作为整个登录页的核心,这个输入框表单当然是我们要首先写出来的。要是用原生HTML来写的话,还要自己手动编写很多关于样式的内容,太麻烦了,UI框架的好处就体现出来了,自带的一系列带样式的组件,拿来就用,既然本项目选择了elementUI来作为UI框架,直接去elementUI官网上去拿一个自己看得上的表单组件即可:

    我看上了这个表单:

    于是直接展开它的代码,把其中要的表单组件的代码拷贝出来新建一个Login组件即可。

    我们要拷贝的代码:

    1. <el-form :label-position="labelPosition" label-width="80px" :model="formLabelAlign">
    2. <el-form-item label="名称">
    3. <el-input v-model="formLabelAlign.name">el-input>
    4. el-form-item>
    5. <el-form-item label="活动区域">
    6. <el-input v-model="formLabelAlign.region">el-input>
    7. el-form-item>
    8. <el-form-item label="活动形式">
    9. <el-input v-model="formLabelAlign.type">el-input>
    10. el-form-item>
    11. el-form>
    12. <script>
    13. export default {
    14. data() {
    15. return {
    16. labelPosition: 'right',
    17. formLabelAlign: {
    18. name: '',
    19. region: '',
    20. type: ''
    21. }
    22. };
    23. }
    24. }
    25. script>

    新建一个Login组件:

    稍微调整一下Login组件的内容,将这个表单组件调整为,我们要的输入用户名、密码的输入框,主要就是改一下输入框的名字,改一下数据的名字:

    1. <template>
    2. <el-form
    3. label-width="80px"
    4. :model="form"
    5. ref="form"
    6. :rules="rules"
    7. >
    8. <el-form-item label="用户名" prop="username">
    9. <el-input v-model="form.username">el-input>
    10. el-form-item>
    11. <el-form-item label="密码" prop="password">
    12. <el-input type="password" v-model="form.password">el-input>
    13. el-form-item>
    14. <el-form-item>
    15. <el-button type="primary" @click="login('form')">登录el-button>
    16. el-form-item>
    17. el-form>
    18. template>
    19. <script>
    20. export default {
    21. data() {
    22. return {
    23. form: {
    24. username: "",
    25. password: "",
    26. }
    27. }
    28. }
    29. };
    30. script>

    3.容器

    光有了输入框表单,我们可以启动来看看是什么样子:

    组件直接铺满了屏幕,这显然不是我们想要的是前面看到的那种类似于QQ邮箱登录页那种输入框的效果。我们需要找一个容器来将输入框表单装起来,elementUI提供了卡片容器可以实现这种效果:

    把代码扣下来,将输入框放进卡片容器中。

    代码示例:

    1. <template>
    2. <div class="login">
    3. <el-card class="box-card">
    4. <div slot="header" class="clearfix">
    5. <span>通用后台管理系统span>
    6. div>
    7. <el-form
    8. label-width="80px"
    9. :model="form"
    10. ref="form"
    11. :rules="rules"
    12. >
    13. <el-form-item label="用户名" prop="username">
    14. <el-input v-model="form.username">el-input>
    15. el-form-item>
    16. <el-form-item label="密码" prop="password">
    17. <el-input type="password" v-model="form.password">el-input>
    18. el-form-item>
    19. <el-form-item>
    20. <el-button type="primary" @click="login('form')">登录el-button>
    21. el-form-item>
    22. el-form>
    23. el-card>
    24. div>
    25. template>

    效果:

    调整一下整体的CSS:

    效果:

    4.路由

    登录页应该作为系统的默认首页,所以我们需要配置好路由:

    让访问/和/login的请求都转跳到登录页上。

    5.校验

    登录页的输入框应该有合理的输入校验,对输入的用户名、密码进行校验,对于不合法的输入,应该弹出提示。elementUI的表单组件是允许在标签上配置校验规则的:

    1. <template>
    2. <div class="login">
    3. <el-card class="box-card">
    4. <div slot="header" class="clearfix">
    5. <span>通用后台管理系统span>
    6. div>
    7. <el-form
    8. label-width="80px"
    9. :model="form"
    10. ref="form"
    11. >
    12. <el-form-item label="用户名" prop="username"
    13. :rules="[{required:true,message:'请输入用户名',trigger:'blur'}]">
    14. <el-input v-model="form.username">el-input>
    15. el-form-item>
    16. <el-form-item label="密码" prop="password"
    17. :rules="[{required:true,message:'请输入用户名',trigger:'blur'}]"
    18. >
    19. <el-input type="password" v-model="form.password">el-input>
    20. el-form-item>
    21. <el-form-item>
    22. <el-button type="primary" @click="login('form')">登录el-button>
    23. el-form-item>
    24. el-form>
    25. el-card>
    26. div>
    27. template>
    28. <script>
    29. export default {
    30. data() {
    31. return {
    32. form: {
    33. username: "",
    34. password: "",
    35. },
    36. };
    37. },
    38. methods:{
    39. login(form){
    40. this.$refs[form].validate((valid)=>{
    41. if(valid){
    42. console.log(this.form)
    43. }else{
    44. console.error(this.form)
    45. }
    46. })
    47. }
    48. }
    49. };
    50. script>
    51. <style lang="less">
    52. .login{
    53. width: 100%;
    54. height:100%;
    55. position: absolute;
    56. background: #409EFF;
    57. .box-card{
    58. width:450px;
    59. margin: 200px auto;
    60. .el-card__header{
    61. font-size: 30px;
    62. }
    63. .el-button{
    64. width: 100%;
    65. }
    66. }
    67. }
    68. style>

    优化校验规则:

    原来的校验规则是在输入框上单独写,这样代码不好维护,elementUI支持将校验规则抽出来,在表单上以:rules="rules"的方式来引用,这样可以将规则集中写在数据域里,便于维护。这些elementUI支持的校验规则和标签上的扩展属性可以翻看elementUI的官方文档。

    1. <template>
    2. <div class="login">
    3. <el-card class="box-card">
    4. <div slot="header" class="clearfix">
    5. <span>通用后台管理系统span>
    6. div>
    7. <el-form
    8. label-width="80px"
    9. :model="form"
    10. ref="form"
    11. :rules="rules"
    12. >
    13. <el-form-item label="用户名" prop="username">
    14. <el-input v-model="form.username">el-input>
    15. el-form-item>
    16. <el-form-item label="密码" prop="password">
    17. <el-input type="password" v-model="form.password">el-input>
    18. el-form-item>
    19. <el-form-item>
    20. <el-button type="primary" @click="login('form')">登录el-button>
    21. el-form-item>
    22. el-form>
    23. el-card>
    24. div>
    25. template>
    26. <script>
    27. export default {
    28. data() {
    29. //elementUI支持在数据校验时传三个参数,规则、输入参数、回调函数
    30. const validData=(rule,value,callback)=>{
    31. if(value===''){
    32. callback(new Error('输入不能为空'))
    33. }else{
    34. callback()
    35. }
    36. }
    37. return {
    38. form: {
    39. username: "",
    40. password: "",
    41. },
    42. rules:{
    43. username:[{validator:validData,trigger:'blur'}],
    44. password:[{validator:validData,trigger:'blur'}]
    45. }
    46. };
    47. },
    48. methods:{
    49. login(form){
    50. this.$refs[form].validate((valid)=>{
    51. if(valid){
    52. console.log(this.form)
    53. }else{
    54. console.error(this.form)
    55. }
    56. })
    57. }
    58. }
    59. };
    60. script>
    61. <style lang="less">
    62. .login{
    63. width: 100%;
    64. height:100%;
    65. position: absolute;
    66. background: #409EFF;
    67. .box-card{
    68. width:450px;
    69. margin: 200px auto;
    70. .el-card__header{
    71. font-size: 30px;
    72. }
    73. .el-button{
    74. width: 100%;
    75. }
    76. }
    77. }
    78. style>

    效果:

    6.请求后端接口

    最后我们使用axios加上对后端接口的请求,home页面暂时还未开发,直接转跳到HelloWorld组件上去即可:

    1. <template>
    2. <div class="login">
    3. <el-card class="box-card">
    4. <div slot="header" class="clearfix">
    5. <span>通用后台管理系统span>
    6. div>
    7. <el-form
    8. label-width="80px"
    9. :model="form"
    10. ref="form"
    11. :rules="rules"
    12. >
    13. <el-form-item label="用户名" prop="username">
    14. <el-input v-model="form.username">el-input>
    15. el-form-item>
    16. <el-form-item label="密码" prop="password">
    17. <el-input type="password" v-model="form.password">el-input>
    18. el-form-item>
    19. <el-form-item>
    20. <el-button type="primary" @click="login('form')">登录el-button>
    21. el-form-item>
    22. el-form>
    23. el-card>
    24. div>
    25. template>
    26. <script>
    27. export default {
    28. data() {
    29. //elementUI支持在数据校验时传三个参数,规则、输入参数、回调函数
    30. const validData=(rule,value,callback)=>{
    31. if(value===''){
    32. callback(new Error('输入不能为空'))
    33. }else{
    34. callback()
    35. }
    36. }
    37. return {
    38. form: {
    39. username: "",
    40. password: "",
    41. },
    42. rules:{
    43. username:[{validator:validData,trigger:'blur'}],
    44. password:[{validator:validData,trigger:'blur'}]
    45. }
    46. };
    47. },
    48. methods:{
    49. login(form){
    50. this.$refs[form].validate((valid)=>{
    51. if(valid){
    52. console.log(this.form)
    53. this.$router.push('/home')
    54. this.axios.post('https://rapserver.sunmi.com/app/moc/340/login',this.form)
    55. .then(res=>{
    56. console.log(res)
    57. if(res.data.status===200){
    58. localStorage.setItem('username',res.data.username)
    59. this.$message({message:res.data.message,type:'success'})
    60. this.$router.push('/home')
    61. }
    62. })
    63. }else{
    64. console.error(this.form)
    65. }
    66. })
    67. }
    68. }
    69. };
    70. script>
    71. <style lang="less">
    72. .login{
    73. width: 100%;
    74. height:100%;
    75. position: absolute;
    76. background: #409EFF;
    77. .box-card{
    78. width:450px;
    79. margin: 200px auto;
    80. .el-card__header{
    81. font-size: 30px;
    82. }
    83. .el-button{
    84. width: 100%;
    85. }
    86. }
    87. }
    88. style>

  • 相关阅读:
    golang gin ShouldBindJSON绑定form表单数据:application/x-www-form-urlencoded对应form
    IT专业入门,高考假期预习指南
    【51单片机系列】C51基础
    MySQL中符号@的作用
    express学习5-构建模块化路由2
    PHP毕业设计源代码计算机学院师生招聘系统
    tegra nvidia agx xaiver 系统开机自动启动风扇配置方法
    开放式无线运动耳机哪个好,几款最好的运动耳机推荐
    DolphinDB Python API 离线安装教程
    数据结构复习之图论
  • 原文地址:https://blog.csdn.net/Joker_ZJN/article/details/134279231