vue+element-ui商城后台管理系统(day01-day02)

项目介绍

目录

一. 需要用到的技术

二. 项目初始化

三. 登录与退出

四. 格式化的配置问题

五. 设置主页头部与侧边栏

六. 用户列表

七. 自己写发现的错误


一. 需要用到的技术

在这里插入图片描述

二. 项目初始化

2.1 项目初始化步骤

在这里插入图片描述

  • 安装elementUI插件与axios

    • 设置elementUI按需导入
    {
      "presets": [["es2015", { "modules": false }]],
      "plugins": [
        [
          "component",
          {
            "libraryName": "element-ui",
            "styleLibraryName": "theme-chalk"
          }
        ]
      ]
    }
    
  • 申请码云账号并配置ssh公钥

  • 把本地项目上传到码云

2.2 后台环境与配置

在这里插入图片描述

  • 安装mysql
  • 这里要导入数据库
  • 这里使用的是phpstudy
  • 建议phpstudy2018
  • 开启服务并测试API

三. 登录与退出

3.1 登录业务流程
  • 在登录页面输入用户名和密码
  • 调用后台接口进行验证
  • 通过验证后, 根据后台的响应状态跳转到项目主页
3.2 如何保持登录状态
  • cookie 在客户端记录
  • session 在服务端记录
  • token 可跨域
    • token工作原理
      在这里插入图片描述
3.3 利用分支去开发login功能
  • git checkout -b login
3.4 引入elementUI
  • element.js中按需注册
  • 更改label相关属性
    • label-width
  • 更改form-item的box-sizing(默认content-box)
  • 添加字体图标(两种方法 1. 添加prifix-icon属性 2. 添加slot)
    • 1.直接在elementUI组件中找自带的字体图标(search)
    • 2.引入阿里图标库(css文件)
    • 根据demo文档为el-input添加prefix-icon="iconfont icon-user"
3.5 实现表单的数据绑定
  • el-form中添加:model="data"(data需要在组件的data(){}中定义 用于子组件获取其属性)
  • 子组件el-input中双向绑定(v-model)data的值
  • 在密码框对应的input中添加type="password"
3.6 检验与重置与提交预验证表单数据
  • 校验表单
    • el-form绑定一个校验规则对象 使:rules=rules
    • 用props为子组件配置上相应的rule :prop="name"
rules: {
    name: [
        { required: true, message: '请输入活动名称', trigger: 'blur' },
        { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
],
  • 重置表单
    • 为表单添加ref
    • 给充值按钮绑定事件this.$refs.loginFormRef.resetFields()
  • 预验证表单
    • 加ref
    • 给提交按钮绑定事件this.$refs.login.validate(callback( Boolean ))
3.7 处理登录返回的数据
  • 在3.6的login方法中判断valid的值
  • vue全局加上axios
axios.defaults.baseURL = ~
vue.prototype.$http = axios
  • 这时候返回的士一个promise可以用asyncawait直接返回res
  • 并通过状态码来判断登录是否成功
login () {
	this.$refs.loginFormRef.validate(async valid => {
		if (!valid) return
		const { data: res } = await this.$http.post('login', this.loginForm)
		if (res.meta.status !== 200) return console.log('登录失败')
		console.log('登录成功')
	})
}
3.8 给登录状态返回一个弹窗
  • Message全局导入 用prototype来配置$message
  • 在状态码不等于200的时候 this.$message.error( 错误信息 )
3.9 使用sessionStorage保存登录的token

在这里插入图片描述

3.10 每次更改router.path的时候验证是否有token(增加拦截器)在这里插入图片描述
  • token放行(window.sessionStorage.getItem('key'))来获取是否有token
  • 无token强制回到login
3.11 退出清除token
  • 绑定退出方法window.sessionStorage.removeItem('key')
  • 然后再进行$router.push
3.12 提交代码至码云
  • login上提交
  • 切换成master并合并login git merge login
  • push到云代码的master
  • 切换回login使用git push -u origin login (实现上传分支)

四. 格式化配置问题

  • alt+shift+f格式化出来的的东西与eslint不匹配, 发出警告
4.1 配置prettierrc来改变编译软件的格式化工具
  • {
        // 结束后面加分号
        "semi": false, 
        // 单引号
        "singleQuote": true
    }
    
4.2 配置editorcongi改变eslint的检查规则
  • 在rules中添加'space-before-function-paren': 0可以改变方法函数名离后面括号之间要加空格的机制

五. 设置主页头部与侧边栏

5.1 实现基本的页面布局
  • elementUI主件库按模板添加需要用到的组件
  • 标签名如el-header会自动添加上class为class="el-header"所以可以直接使用标签名作为类名
5.2 运用flex布局完成header的实现
  • justify-content 教程链接
    • flex-start: 同行左侧对齐
    • flex-end: 同行右侧对齐
    • flex-center: 同行中间对齐, 相邻没有间隙, 未填满会在两侧补充空格
    • space-between: 平均分配在一行中, 左右两边贴边
    • space-around: 平均分配在一行中, 左右两边没贴边
    • initial: 默认值
    • inherit: 从父元素继承该属性。
5.3 axios拦截器
  • 为了演示用以后的API(验证是否含有token)
axios.interceptors.request.use(config => {
    // 为请求头对象, 天机Token验证的Authorization字段
    config.headers.Authorization = window.sessionStorage.getItem('token')
    return config
})
5.4 获取左侧菜单数据
5.5 通过for循环填写左侧菜单栏
  • index属性是elementUI的一个代表菜单栏的唯一值, 相同的话点击一个会使index相同的菜单都发生点击事件
    • index可以设置router的跳转
  • 添加字体颜色并且添加字体图标
    • 字体图标可以另外设置一个data然后每个id对应着他的class(第三方字体图标库)
  • 给menu添加unique-opened属性可使点击一个扩展开来的时候其他的都关上
  • 边框不齐问题
    • el-menu中设置border属性为none可以解决
5.6 侧边栏的折叠与展开
  • 添加|||来设置是否触发
  • collapse: 是否水平折叠收起菜单(仅在 mode 为 vertical 时可用)设置为true
  • 之后发生的问题
    • 宽度固定在200px很丑
      • v-bind动态修改width(根据sollapse是否为true)
    • 动画效果不好看
      • collapse-transition设置为false
5.7 实现首页路由的重定向效果
{
    path: '/home',
    component: Home,
    redirect: '/welcome',
    children: [{ path: '/welcome', component: Welcome }]
}
  • el-main中放路由占位符router-view
5.8 侧边栏路由链接的改造
  • menu设置router为true
  • 这样之后点击侧边栏的时候会直接跳转到该项的index(前面把它设置为id)
    • 把它设置为path就可以了
      • 不要忘记前面加'/'
5.9 点击user没有高亮显示
  • 给menu增加default-active
  • 并用sessionStorage来记录当前的path

六. 用户列表

6.1 栅格系统+面包屑+卡片
  • 可以在base.css中修改基础样式
  • el-rowel-col
  • 通过:gutterel-col设置间隙
  • 通过:spanel-col设定宽度(例如flex 总宽24 )
6.2 获取用户列表
  • /users
  • data () {}中设定一个param(整合到url上面的数据)
  • 获取成功保存
6.3 绘制用户列表
  • 使用table tablie-colum
  • table的data为依照的数据
  • label为每列名称
  • prop为对应value的key
  • 添加索引列
    • table-colum中加入type="index"
  • 渲染状态与操作(按需渲染)
    • 使用v-slot 此时会覆盖prop所指向的值
    • 放三个按钮注意能不能再一行上面显示
    • 加入鼠标移到上面时会出提示框
  • 分页效果显示
    • 每次调整每页显示数量重新发送请求
6.4 用户状态修改
  • 接口中:id的意思是该值需要更改传递
  • @change事件
  • 修改失败(status不为200)应该把原来的值改回去
6.5 搜索用户
  • 通过修改table的获取用户列表的params数据的query还有点击事件更新用户列表的数据来实现
6.6 清空搜索框与清空后重新获取用户数据
  • 增加clearable属性实现添加一件清空功能
  • 绑定@clear对应的事件(一件清空后触发)
6.7 添加用户功能
  • 增加dialog组件
  • 定义:visible.sync="addDialogVisible"属性 增加时间修改addDialogVisible即可
  • 添加信息表单
  • 邮箱与手机号等特殊校验规则
    • validator: 校验方法(在data中定义)
data() {
    // 验证邮箱的规则
    var checkEmail = (rule, value, cb) => {
      // 验证邮箱的正则表达式
      const regEmail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/
      if (regEmail.test(value)) {
        // 合法的邮箱
        return cb()
      }
      cb(new Error('请输入合法的邮箱'))
    }
    // 验证手机号的规则
    var checkMobile = (rule, value, cb) => {
      // 验证手机号的正则表达式
      const regMobile = /^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/
      if (regMobile.test(value)) {
        return cb()
      }
      cb(new Error('请输入合法的手机号'))
    }
    return {
      // 添加表单的验证规则对象
      addFormRules: {
        email: [
          { required: true, message: '请输入邮箱', trigger: 'blur' },
          { validator: checkEmail, trigger: 'blur' }
        ],
        mobile: [
          { required: true, message: '请输入手机号', trigger: 'blur' },
          { validator: checkMobile, trigger: 'blur' }
        ]
      }
    }
  }
  • 增加@close事件关闭的时候resetFields()
  • 添加用户的步骤 校验 -> 调用API -> 判断status -> $message -> 隐藏对话框 -> 重新获取用户数据

七. 自己写遇到的错误

7.1 input不能填写
  • 要添加双向绑定之后才能填入
  • form中的model属性是方便提取表单数据而用的?
    • 为了resetFields()而绑定model
      • resetFields()要有prop属性才会生效
      • 而有rules才会有错误信息显示
7.2 字体图标
  • 可以通过 prefix-iconsuffix-icon 属性在 input 组件首部尾部增加显示图标,也可以通过 slot 来放置图标。
7.3 rules的使用
  • form绑定rules
  • form-item绑定rulse的值
7.4 if (!valid) return 有eslint报错
  • 解决方法
    • if (!valid) return false
7.5 collapse问题
  • 无法获得this.$refs.homeMenu.isCollapse?
  • 解决方法:
    • $emit的时候并把Home.vue也设置一个isCollapase
7.6 服务器上做接口问题
  • 需要配置config对应的host(ip)属性
  • 云服务器上的nodejs可以用localhost访问云服务器上的数据库(同一IP)
  • 所有操作都需要放行端口, 宝塔与阿里云要同时放行
7.7 使用table组件
  • 自定义表头
    • 去掉prop属性
    • 添加v-slot="自定义名字"
    • 后面引用的时候要用.row不然报错
  • 表格边框不对齐
    • base.css文件加上
.el-table th.gutter {
  display: table-cell !important;
}
7.8 element按需导入eslint报错
  • 错误原因: import后面大括号有换行
  • .eslintrc.js中加入属性
    • 'object-curly-newline': 'off'
posted @ 2020-08-11 16:26  叻仔猪  阅读(292)  评论(0编辑  收藏  举报