src/
build/ webpack相关代码
config/ 本地服务器配置
.eslintignore eslint排除文件
.eslintrc eslint配置文件
结尾有 ;
if(a==b){} ===> if(a===b){} 必须用全等
不允许出现未使用的变量
不允许超过2个空行
使用单引号 ''
在 package.json 中 自定义指令 : 指令很长
npm run + [自定义指令名]
自动打开浏览器 dev: 'webpack-dev-server --inline --progress --config build/webpack.dev.conf.js--open'
element-ui 是饿了吗团队开发
适用于vue项目
npm 安装 npm i element-ui -s
引入element-ui 在 main.js 入口文件中写入:
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
删除模板中 用不到的文件
~ git/svn 管理代码
git init --> .git
git status
git add .
git commit -m '注释'
在代码托管平台(github) 新建远程仓库
git remote add origin '***.git'
git push -u origin master (之后再推送 就 git push)
git branch
checkout -b dev-login
新建组件 + 配置路由
注意:commit每完成一个小功能 就commit一次
push 操作master去完成
el-form-item
调整标签
label-position="top"
height 100%
注意: div #app height:100%
axios不是vue插件 --->Vue.use(**)
// 自定义开发插件
import axios from 'axios'
const MyHttpServer = {}
MyHttpServer.install = Vue => {
Vue.prototype.$http = axios
}
export default MyHttpServer
在main.js中
import http from '@/plugins/http' // 自定义全局样式
// 使用axios自定义开发插件
Vue.use(http)
Login.vue methods handleLogin()
this.$http.post('login', this.formdata)
.then(res => {
})
对象结构解析 res.data<br
const { data,
meta: {
msg,
status
}
} = res.data
this.$message.success('登录成功')
js编程式导航 this.$router.push({ name: 'home' })
App.vue router-view
新建home组件 配置路由
async handleLogin () {
const res = await this.$http.post('login', this.formdata)
const { data, meta: { msg, status } } = res.data
if (status === 200) {
console.log(JSON.stringify(data))
this.$message.success('登录成功')
} else {
this.$message.warning(msg)
}
}
目的:如果用户没登录 -> url直接到home组件->
在登录成功时 保存正确用户的token值
localStorage.setItem('access-token', data.token)
引入布局容器
layout 布局
el-row 行
el-col 列
注意: 24栏
el-menu
router 开启路由模式 true index==path值
unique-opened 是否只保持一个子菜单的展开
调整el-menu
index 不能一样
如果登陆过 就不能进入到home组件
beforeCreate () {
// 获取token
// if token --> yes-->继续渲染组件 不能写在mounted 要写在组件出现之前
// else --> 返回登录页面
const accessToken = localStorage.getItem('access-token')
if (!accessToken) {
this.$router.push({ name: 'login' })
}
}
handleSignout () {
// 清除token
localStorage.clear()
// localStorage.removeItem('access-token')
this.$message.success('退出成功')
this.$router.push({ name: 'login' })
}
home.vue 开启了路由模式 index值 --> path值
home.vue main-> router-view
新建users.vue
router/index.js 配置
{
path: '/home',
name: 'home',
component: () => import('@/components/home/Home.vue'),
children: [
{
path: '/users',
name: 'users',
component: () => import('@/components/users/Users.vue')
}
]
el-card 小容器
面包屑
el-row>el-col>input+el-button
调整样式
el-table[data--数据源] > el-table-column[label--表头/prop=“数据"] > 字符串类型数据
<!-- 表格 -->
<el-table :data="tableData"
style="width: 100%">
<el-table-column prop="date"
label="日期"
width="180">
</el-table-column>
<el-table-column prop="name"
label="姓名"
width="180">
</el-table-column>
<el-table-column prop="address"
label="地址">
</el-table-column>
</el-table>
按照效果 调整了表头的数量和label
type="index" 该列的每个单元格的内容从1开始
通过axios中关于请求头的设置
除了登录之外的所有请求都需要进行授权->设置请求头 Authorization
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
methods: {
// query 查询参数 可以为空
// pagenum 当前页 不能为空
// pagesiz 每页显示条 不能为空
// 获取用户列表
async getUserList () {
// 需要授权的 API ,必须在请求头中使用 Authorization 字段提供 token 令牌
const AUTH_TOKEN = localStorage.getItem('access-token')
this.$http.defaults.headers.common['Authorization'] = AUTH_TOKEN
const res = await this.$http.get(`users?query=${this.query}&pagenum=${this.pagenum}&pagesize=${this.pagesize}`)
console.log(res)
}
},
created () { // 页面加载前
this.getUserList()
}
解析赋值
const { data: { users, total }, meta: { msg, status } } = res.data
if (status === 200) {
this.userList = users
this.total = total
} else {
this.$message.error(msg)
}
不同组件的数据不是共享的 而是独立作用域
<!-- template
内部要用数据 设置slot=scope属性
该属性的值是要用数据create_time的数据源userList
slot-scope的值userList其实就是el-table绑定的数据userList
userList.row->数组中的每个对象
-->
Users.vue中
<template slot-scope="scope">
{{scope.row.create_time|fmtdate}}
</template>
引入moment 在main.js设置全局过滤器 进行日期控制
import moment from 'moment'
Vue.filter('fmtdate', v => {
return moment(v).format('YYYY-MM-DD')
})
el-switch v-model="[bool值]"
<el-table-column label="用户状态">
<template slot-scope="scope">
<el-switch v-model="scope.row.mg_state"
active-color="#13ce66"
inactive-color="#ff4949">
</el-switch>
</template>
</el-table-column>
操作里面不是字符
template容器
el-button[size="mini"&plain]
该接口支持分页
@size-change 每页显示条数 变化时 触发
@current-change 当前页改变时 触发
:current-page 设置当前页
:page-sizes [10,20,30,40] 每页多少条的数组
:page-size 设置每页显示多少条
:total 数据总数
<!-- 分页 -->
<el-pagination @size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pagenum"
:page-sizes="[2, 4, 6, 8]"
:page-size="pagesize"
layout="total, sizes, pre
v, pager, next, jumper"
:total="total">
</el-pagination>
每页显示条数改变 -> this.pagesize= val -> this.getUserList()
页码改变时 -> this,pagenum = val -> this.getUserList()
每页显示条数改变: 从第一页开始显示 this.pagenum = 1 -> currentpage = 1
给搜索框绑定query v-model="query"
点击搜索按钮 发送请求
一键清除 clearable
点击清除按钮 重新获取数据 @clear=""
<!-- 搜索 -->
<el-row class="searchRow">
<el-col>
<el-input @clear="loadUserList()"
placeholder="请输入内容"
v-model="query"
class="inputSearch"
clearable>
<el-button slot="append"
@click="searchUser()"
icon="el-icon-search">
</el-button>
</el-input>
<el-button type="success"
plain>添加用户</el-button>
</el-col>
</el-row>
引入对话框 el-form
点击添加用户的按钮 显示对话框 dialogFormVisibleAdd = false -> true
配置对话框
:model-form 添加用户所需要的数据
form: {
username: '',
password: '',
email: '',
mobile: ''
}// 添加用户对象
el-form>el-input v-model="form.xxx"
post this.form
关闭对话框
清空文本框 this.form = {}
更新视图
// 添加用户
async addUser () {
const res = await this.$http.post('users', this.form)
const { meta: { msg, status } } = res.data
if (status === 201) {
this.dialogFormVisibleAdd = false // 关闭对话框
this.$message.success('添加成功') // 提示添加成功
this.getUserList() // 更新视图
this.form = {} // 清空form
} else {
this.$message.warning(msg)
}
},
this.$confirm
点击确定 -> then
点击取消 -> catch
this.$confirm('确定要删除此用户吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$message.success('删除成功')
}).catch(() => {
this.$message.info('已取消删除')
})
点击确定 -> 发送 delete 请求
提示
更新视图 返回第一页
注意 async的位置 then(async () => {})
const res = await this.$http.delete(`users/${id}`)
const { meta: { msg, status } } = res.data
if (status === 200) {
this.pagenum = 1 // 回到第一页
this.$message.success('删除成功')
this.getUserList()
} else {
this.$message.warning(msg)
}
点击操作中的编辑按钮 打开编辑对话框
提示对话框显示/隐藏的控制属性 dialogFormVisibleEdit
找到编辑按钮 绑定@click -> 打开对话框 @click="dialogFormVisibleEdit=true"
form用的是之前添加时候用的
点击编辑按钮 scope.row @click="showEditUserDialog(scope.row)"
showEditUserDialog(user) 方法中 this.form = user 其中 user = scope.row
找到对话框的确定按钮 -> editUser() -> 发送请求
this.form = user
id = this.form.id
关闭对话框
更新视图
async editUser () {
const res = await this.$http.put(`users/${this.form.id}`, this.form)
const { meta: { msg, status } } = res.data
if (status === 200) {
this.dialogFormVisibleEdit = false
this.$message.success('更新成功')
this.getUserList()
} else {
this.$message.warning(msg)
}
},
先点编辑 再点添加 会残留缓存数据
打开添加对话框之前 清除残留数据
showAddUserDialog () {
// 清除表格之前的缓存
this.form = {}
this.dialogFormVisibleAdd = true
},
找到开关 @change 事件 changeMgState(scope.row) scope.row --> user
双向绑定 v-model="scope.row.mg_state"
<el-switch v-model="scope.row.mg_state"
active-color="#13ce66"
@change="changeMgState(scope.row)"
inactive-color="#ff4949">
</el-switch>
点击按钮->打开对话框
对话框 中有下拉框
修改当前用户的角色
每个角色的权限
显示操作中的按钮 -> 打开对话框
引入下拉框 如果select的绑定的数据的值 和 option 的value一样 就会显示该option的label的值
分成两类 请选择 和 v-for动态生成的 option
data中提供了el-select 的 v-model 所绑定的数据
<el-select v-model="curRoleId">
<el-option label="请选择"
:value="-1"></el-option>
<!-- <el-option label="管理员"
value="shanghai"></el-option> -->
</el-select>
当改变label时->label显示->改变了value->el-select v-model绑定的数据 自动关联
获取所有角色 roleList
v-for el-option :label="item.roleName" :value="item.id"
通过请求获取当前用户的id
给el-select 中 v-model绑定的数据赋值 this,curRoleId = res.data.data.rid
通过视图操作->修改了label->value值变化->el-select v-model绑定的数据 变化
在setUserRole方法中要使用用户id 在data声明curUserId
在打开对话框时候 curUserId 赋值 user.id