• vue3后台管理系统之登录界面和业务的实现


    1.静态页面的搭建

    1. <script setup lang="ts">
    2. import { Lock, User } from '@element-plus/icons-vue'
    3. import { reactive, ref } from 'vue'
    4. //引入用户相关的小仓库
    5. // import useUserStore from '@/store/moudules/user'
    6. // const useStore = useUserStore()
    7. //获取el-form组件
    8. const loginForms = ref()
    9. //获取路由器
    10. //定义变量控制按钮加载效果
    11. const loading = ref(false)
    12. //收集账号与密码的数据
    13. const loginForm = reactive({ username: 'admin', password: '111111' })
    14. //自定义校验规则函数
    15. const validatorUserName = (value: any, callback: any) => {
    16. //rule:即为校验规则对象
    17. //value:即为表单元素文本内容
    18. //函数:如果符合条件callBack放行通过即为
    19. //如果不符合条件callBack方法,注入错误提示信息
    20. if (value.length >= 5) {
    21. callback()
    22. } else {
    23. callback(new Error('账号长度至少五位'))
    24. }
    25. }
    26. const validatorPassword = (value: any, callback: any) => {
    27. if (value.length >= 6) {
    28. callback()
    29. } else {
    30. callback(new Error('密码长度至少六位'))
    31. }
    32. }
    33. //定义表单校验需要配置对象
    34. const rules = {
    35. //规则对象属性:
    36. //required,代表这个字段务必要校验的
    37. //min:文本长度至少多少位
    38. //max:文本长度最多多少位
    39. //message:错误的提示信息
    40. //trigger:触发校验表单的时机 change->文本发生变化触发校验,blur:失去焦点的时候触发校验规则
    41. username: [
    42. // { required: true, min: 6, max: 10, message: '账号长度至少六位', trigger: 'change' }
    43. { trigger: 'change', validator: validatorUserName }
    44. ],
    45. password: [
    46. // { required: true, min: 6, max: 15, message: '密码长度至少6位', trigger: 'change' }
    47. { trigger: 'change', validator: validatorPassword }
    48. ]
    49. }
    50. //登录请求
    51. const login = () => {
    52. console.log(111)
    53. // useStore.userLogin(loginForm)
    54. }
    55. script>
    56. <style scoped lang="scss">
    57. .login_container {
    58. width: 100%;
    59. height: 100vh;
    60. background: url('@/assets/images/background.jpg') no-repeat;
    61. background-size: cover;
    62. .login_form {
    63. position: relative;
    64. width: 80%;
    65. top: 30vh;
    66. background: url('@/assets/images/login_form.png') no-repeat;
    67. background-size: cover;
    68. padding: 40px;
    69. h1 {
    70. color: white;
    71. font-size: 40px;
    72. }
    73. h2 {
    74. font-size: 20px;
    75. color: white;
    76. margin: 20px 0px;
    77. }
    78. .login_btn {
    79. width: 100%;
    80. }
    81. }
    82. }
    83. style>

    2.登录业务逻辑处理

    1. // 创建用户仓库
    2. import { defineStore } from 'pinia'
    3. // 引入接口
    4. import { reqLogin } from '@/api/user'
    5. // u引入数据类型
    6. import type { loginForm, loginResponseData } from '@/api/user/type'
    7. import type { UserState } from './types/type'
    8. // 引入操作本地存储
    9. import { SET_TOKEN, GET_TOKEN } from '@/utils/token'
    10. const useUserStore = defineStore('User', {
    11. // 小仓库存储数据
    12. state: (): UserState => {
    13. return {
    14. token: GET_TOKEN(),
    15. }
    16. },
    17. // 异步逻辑
    18. actions: {
    19. async userLogin(data: loginForm) {
    20. // 登录请求
    21. const res: loginResponseData = await reqLogin(data)
    22. console.log(res)
    23. if (res.code === 200) {
    24. this.token = res.data.token as string
    25. SET_TOKEN(res.data.token as string)
    26. return 'ok'
    27. } else {
    28. return Promise.reject(new Error(res.data.message))
    29. }
    30. },
    31. },
    32. getters: {},
    33. })
    34. export default useUserStore

    定义token数据类型

    修改登录返回结果数据类型

    封装本地存储数据和读取数据的方法

    完善登录界面

    封装判断时间函数

    1. //封装一个函数:获取一个结果:当前早上|上午|下午|晚上
    2. export const getTime = () => {
    3. let message = ''
    4. //通过内置构造函数Date
    5. const hours = new Date().getHours()
    6. //情况的判断
    7. if (hours <= 9) {
    8. message = '早上'
    9. } else if (hours < 12) {
    10. message = '上午'
    11. } else if (hours <= 18) {
    12. message = '下午'
    13. } else {
    14. message = '晚上'
    15. }
    16. return message
    17. }
    1. <script setup lang="ts">
    2. import { Lock, User } from '@element-plus/icons-vue'
    3. import { reactive, ref } from 'vue'
    4. import { ElNotification } from 'element-plus'
    5. // 引入获取当前时间的函数
    6. import { getTime } from '@/utils/time'
    7. //引入用户相关的小仓库
    8. import useUserStore from '@/store/moudules/user'
    9. import { useRouter } from 'vue-router'
    10. let useStore = useUserStore()
    11. //获取el-form组件
    12. let loginForms = ref()
    13. //获取路由器
    14. let $router = useRouter()
    15. //定义变量控制按钮加载效果
    16. let loading = ref(false)
    17. //收集账号与密码的数据
    18. let loginForm = reactive({ username: 'admin', password: '111111' })
    19. //自定义校验规则函数
    20. const validatorUserName = (value: any, callback: any) => {
    21. //rule:即为校验规则对象
    22. //value:即为表单元素文本内容
    23. //函数:如果符合条件callBack放行通过即为
    24. //如果不符合条件callBack方法,注入错误提示信息
    25. if (value.length >= 5) {
    26. callback()
    27. } else {
    28. callback(new Error('账号长度至少五位'))
    29. }
    30. }
    31. const validatorPassword = (value: any, callback: any) => {
    32. if (value.length >= 6) {
    33. callback()
    34. } else {
    35. callback(new Error('密码长度至少六位'))
    36. }
    37. }
    38. //定义表单校验需要配置对象
    39. const rules = {
    40. //规则对象属性:
    41. //required,代表这个字段务必要校验的
    42. //min:文本长度至少多少位
    43. //max:文本长度最多多少位
    44. //message:错误的提示信息
    45. //trigger:触发校验表单的时机 change->文本发生变化触发校验,blur:失去焦点的时候触发校验规则
    46. username: [
    47. // { required: true, min: 6, max: 10, message: '账号长度至少六位', trigger: 'change' }
    48. { trigger: 'change', validator: validatorUserName },
    49. ],
    50. password: [
    51. // { required: true, min: 6, max: 15, message: '密码长度至少6位', trigger: 'change' }
    52. { trigger: 'change', validator: validatorPassword },
    53. ],
    54. }
    55. //登录请求
    56. const login = async () => {
    57. // 加载效果
    58. loading.value = true
    59. try {
    60. await useStore.userLogin(loginForm)
    61. $router.push('/')
    62. ElNotification({
    63. type: 'success',
    64. message: '登录成功',
    65. title: ` HI,${getTime()}好 `,
    66. })
    67. loading.value = false
    68. } catch (error) {
    69. // 登录失败
    70. loading.value = false
    71. ElNotification({
    72. type: 'error',
    73. message: '账号和密码不正确',
    74. })
    75. }
    76. }
    77. script>
    78. <style scoped lang="scss">
    79. .login_container {
    80. width: 100%;
    81. height: 100vh;
    82. background: url('@/assets/images/background.jpg') no-repeat;
    83. background-size: cover;
    84. .login_form {
    85. position: relative;
    86. width: 80%;
    87. top: 30vh;
    88. background: url('@/assets/images/login_form.png') no-repeat;
    89. background-size: cover;
    90. padding: 40px;
    91. h1 {
    92. color: white;
    93. font-size: 40px;
    94. }
    95. h2 {
    96. font-size: 20px;
    97. color: white;
    98. margin: 20px 0px;
    99. }
    100. .login_btn {
    101. width: 100%;
    102. }
    103. }
    104. }
    105. style>

  • 相关阅读:
    可视化学习:如何生成简单动画让图形动起来
    ​标签体系、用户画像、用户分群的区别?​
    高压放大器在3D打印中的应用
    断点测试怎么做?一文教你用Charles 工具做好接口测试!
    1.3.20 交换机端口安全
    Vite2.0+Vue3.0+Element-Plus+TypeScript 项目配置及初始化
    学习-Java输入输出之字符缓冲IO流之往文件中插入分隔符
    【网络安全】关于CTF那些事儿你都知道吗?
    同时安装Vue2和Vue3
    血液代谢组学炎症相关的线粒体功能失调慢加急性肝衰竭的潜在机制
  • 原文地址:https://blog.csdn.net/m0_52704461/article/details/133916534