四、用户列表

添加用户列表组件并配置路由表

  1. 分别创建下面的四个文件
  • src/components/user-list/user-list.vue
  • src/components/user-list/template.html
  • src/components/user-list/script.js
  • src/components/user-list/style.css

src/components/user-list/template.html:

  1. <div>
  2. <p>user-list component</p>
  3. </div>

src/components/user-list/user-list.vue:

  1. <template src="./template.html"></template>
  2. <script src="./script.js"></script>
  3. <style src="./style.css"></style>
  1. 配置路由表

src/router/index.js:

  1. // ... 代码略
  2. const router = new Router({
  3. routes: [
  4. {
  5. path: '/',
  6. component: Home,
  7. // 当渲染 children 组件的时候会先把 Home 组件渲染出来
  8. // Home 组件找到根组件中的 router-view 出口替换渲染
  9. // Home 组件的 children 子路由会渲染到 Home 组件内部的 router-view 出口
  10. // 参考文档:https://router.vuejs.org/zh-cn/essentials/nested-routes.html
  11. children: [
  12. {
  13. path: '/users',
  14. component: UserList
  15. }
  16. ]
  17. },
  18. {
  19. path: '/login',
  20. component: Login
  21. }
  22. ]
  23. })
  24. // ... 代码略
  1. 访问 /users 测试。

在用户列表中使用表格组件

参考链接:

src/components/user-list/template.html:

  1. <div>
  2. <!--
  3. 表格组件的使用:
  4. el-table 组件
  5. data 用来绑定表格数据,是一个数组
  6. 表格组件会根据 data 自动循环渲染
  7. el-table-column 组件就是表格列
  8. label 属性用来指定列的标题
  9. prop 属性用来指定 data 数组中元素项的某个属性
  10. width 用来设定表格列的宽度,默认单位是 px
  11. -->
  12. <el-table
  13. :data="tableData"
  14. style="width: 100%">
  15. <el-table-column
  16. prop="date"
  17. label="日期"
  18. width="180">
  19. </el-table-column>
  20. <el-table-column
  21. prop="name"
  22. label="姓名"
  23. width="180">
  24. </el-table-column>
  25. <el-table-column
  26. prop="address"
  27. label="地址">
  28. </el-table-column>
  29. </el-table>
  30. </div>

src/components/user-list/script.js:

  1. export default {
  2. data() {
  3. return {
  4. tableData: [{
  5. date: '2016-05-02',
  6. name: '王小虎',
  7. address: '上海市普陀区金沙江路 1518 弄'
  8. }, {
  9. date: '2016-05-04',
  10. name: '王小虎',
  11. address: '上海市普陀区金沙江路 1517 弄'
  12. }, {
  13. date: '2016-05-01',
  14. name: '王小虎',
  15. address: '上海市普陀区金沙江路 1519 弄'
  16. }, {
  17. date: '2016-05-03',
  18. name: '王小虎',
  19. address: '上海市普陀区金沙江路 1516 弄'
  20. }]
  21. }
  22. }
  23. }

在请求头中加入 token 请求用户列表

src/components/user-list/script.js

  1. import axios from 'axios'
  2. export default {
  3. // ... 代码略
  4. created () {
  5. // 1. 除了登陆接口,其它接口都需要 token 认证
  6. // 2. 我们要做的就是按照服务器接口的要求,把 token 放到请求头的 Authorization 字段中
  7. // 3. 对于接口中的查询字符串,我们可以通过 axios 请求的可选参数 params 来指定传递
  8. // params 对象就类似于我们之前使用的 $.ajax 中的 data 选项
  9. // params 对象最终会被转换为 key=value&key=value 的格式字符串然后以 ? 分隔拼接到请求地址后面发起请求
  10. // 这样做的好处就是不需要我们自己去 url 中拼 ?key=value&key=value
  11. // 服务器 API 除了登陆的接口是可以直接请求处理
  12. // 其它所有的接口都必须提供登陆成功交换到的 token 发送给服务器才可以
  13. // 我们这里服务器接口要求必须在请求头中通过一个名字为 Authorization 字段提供 token 令牌
  14. axios.get('http://localhost:8888/api/private/v1/users', {
  15. headers: { // headers 是 axios 的 API,固定的
  16. // 需要授权的 API ,必须在请求头中使用 Authorization 字段提供 token 令牌
  17. // Authorization 是服务器接口的要求,我们不能乱写
  18. // 也就是说如果接口要求在头里面放一个 a 值为 token
  19. // 则我们就要
  20. // a: window.localStorage.getItem('token')
  21. Authorization: window.localStorage.getItem('token')
  22. },
  23. params: { // params 可以用来指定请求的查询字符串
  24. pagenum: 1, // 告诉接口服务器,我要获取第 1 页的数据
  25. pagesize: 5 // 告诉接口服务器,每页5条数据
  26. }
  27. })
  28. .then(res => {
  29. console.log(res.data)
  30. })
  31. }
  32. // ... 代码略
  33. }

将请求得到的数据更新到用户列表表格中

src/components/user-list/template.html:

  1. <div>
  2. <el-table
  3. :data="tableData"
  4. style="width: 100%">
  5. <el-table-column
  6. prop="username"
  7. label="用户名"
  8. width="180">
  9. </el-table-column>
  10. <el-table-column
  11. prop="email"
  12. label="邮箱"
  13. width="180">
  14. </el-table-column>
  15. <el-table-column
  16. prop="mobile"
  17. label="电话"
  18. width="180">
  19. </el-table-column>
  20. </el-table>
  21. </div>

src/components/user-list/script.js:

  1. import axios from 'axios'
  2. export default {
  3. created () {
  4. axios.get('http://localhost:8888/api/private/v1/users', {
  5. headers: {
  6. Authorization: window.localStorage.getItem('token')
  7. },
  8. params: {
  9. pagenum: 1,
  10. pagesize: 5
  11. }
  12. })
  13. .then(res => {
  14. const {data, meta} = res.data
  15. if (meta.status === 200) {
  16. this.tableData = data.users
  17. }
  18. })
  19. },
  20. data () {
  21. return {
  22. tableData: []
  23. }
  24. }
  25. }

分页展示用户列表

src/components/user-list/template.html:

  1. <div>
  2. <!-- 表格列表 -->
  3. ... 代码略
  4. <!-- /表格列表 -->
  5. <!-- 数据分页 -->
  6. <el-pagination
  7. background
  8. layout="prev, pager, next"
  9. :page-size="2"
  10. :total="total"
  11. @current-change="handleCurrentChange">
  12. </el-pagination>
  13. <!-- /数据分页 -->
  14. </div>

src/components/user-list/script.js:

  1. import axios from 'axios'
  2. export default {
  3. created () {
  4. // 页码第一次加载,显示第1页数据
  5. this.loadUsersByPage(1)
  6. },
  7. data () {
  8. return {
  9. tableData: [],
  10. total: 0
  11. }
  12. },
  13. methods: {
  14. handleCurrentChange (page) {
  15. // 在页码改变的时候,请求加载该页码对应的数据
  16. this.loadUsersByPage(page)
  17. },
  18. loadUsersByPage (page) {
  19. axios.get('http://localhost:8888/api/private/v1/users', {
  20. headers: {
  21. Authorization: window.localStorage.getItem('token')
  22. },
  23. params: {
  24. pagenum: page,
  25. pagesize: 2
  26. }
  27. }).then(res => {
  28. const {data, meta} = res.data
  29. if (meta.status === 200) {
  30. this.tableData = data.users
  31. this.total = data.total
  32. }
  33. })
  34. }
  35. }
  36. }

用户列表搜索

src/components/user-list/template.html:

  1. <div>
  2. <el-row>
  3. <el-col :span="6">
  4. <el-input placeholder="请输入内容" v-model="searchText" class="input-with-select">
  5. <el-button slot="append" icon="el-icon-search" @click="handleSearch"></el-button>
  6. </el-input>
  7. </el-col>
  8. </el-row>
  9. <!-- 表格列表 -->
  10. ... 代码略
  11. <!-- /表格列表 -->
  12. <!-- 数据分页 -->
  13. ... 代码略
  14. <!-- /数据分页 -->
  15. </div>

src/components/user-list/script.js:

  1. import axios from 'axios'
  2. export default {
  3. created () {
  4. // 页码第一次加载,显示第1页数据
  5. this.loadUsersByPage(1)
  6. },
  7. data () {
  8. return {
  9. tableData: [],
  10. total: 0,
  11. searchText: ''
  12. }
  13. },
  14. methods: {
  15. handleCurrentChange (page) {
  16. // 在页码改变的时候,请求加载该页码对应的数据
  17. this.loadUsersByPage(page)
  18. },
  19. loadUsersByPage (page) {
  20. axios.get('http://localhost:8888/api/private/v1/users', {
  21. headers: {
  22. Authorization: window.localStorage.getItem('token')
  23. },
  24. params: {
  25. pagenum: page,
  26. pagesize: 2,
  27. query: this.searchText // query 参数可选,用来指定查询的筛选条件,这里的筛选条件是用户名
  28. }
  29. }).then(res => {
  30. const {data, meta} = res.data
  31. if (meta.status === 200) {
  32. this.tableData = data.users
  33. this.total = data.total
  34. }
  35. })
  36. },
  37. /**
  38. * 处理搜索
  39. */
  40. handleSearch () {
  41. // 点击搜索,调用请求方法加载数据列表
  42. // 请求方法中会去根据输入框中的内容进行搜索
  43. this.loadUsersByPage(1)
  44. }
  45. }
  46. }

添加用户

shop-admin/src/components/user-list/template.html:

  1. <div>
  2. <!-- 面包屑 -->
  3. ... 代码略
  4. <!-- /面包屑 -->
  5. <!-- 搜索 -->
  6. <el-row :gutter="20">
  7. <el-col :span="6">
  8. <el-input placeholder="请输入内容" v-model="searchText">
  9. <el-button slot="append" icon="el-icon-search" @click="handleSearch"></el-button>
  10. </el-input>
  11. </el-col>
  12. <el-col :span="2">
  13. <el-button type="primary" @click="dialogFormVisible = true">添加用户</el-button>
  14. </el-col>
  15. </el-row>
  16. <!-- /搜索 -->
  17. <!-- 表格列表 -->
  18. ... 代码略
  19. <!-- /表格列表 -->
  20. <!-- 数据分页 -->
  21. ... 代码略
  22. <!-- /数据分页 -->
  23. <!-- 添加用户对话框 -->
  24. <!--
  25. el-dialog 是对话框组件
  26. visible 属性需要绑定一个布尔值,对话框会根据布尔值的真假来决定显示与隐藏
  27. -->
  28. <el-dialog title="添加用户" :visible.sync="dialogFormVisible">
  29. <el-form ref="form" :model="addUserForm" label-position="left" size="small" :rules="formRule">
  30. <el-form-item label="用户名" label-width="80px" prop="username">
  31. <el-input v-model="addUserForm.username" auto-complete="off"></el-input>
  32. </el-form-item>
  33. <el-form-item label="密码" label-width="80px" prop="password">
  34. <el-input v-model="addUserForm.password" auto-complete="off"></el-input>
  35. </el-form-item>
  36. <el-form-item label="邮箱" label-width="80px" prop="email">
  37. <el-input v-model="addUserForm.email" auto-complete="off"></el-input>
  38. </el-form-item>
  39. <el-form-item label="电话" label-width="80px" prop="mobile">
  40. <el-input v-model="addUserForm.mobile" auto-complete="off"></el-input>
  41. </el-form-item>
  42. </el-form>
  43. <div slot="footer" class="dialog-footer">
  44. <el-button @click="dialogFormVisible = false">取 消</el-button>
  45. <el-button type="primary" @click="handleAddUser">确 定</el-button>
  46. </div>
  47. </el-dialog>
  48. <!-- 添加用户对话框 -->
  49. </div>

src/components/user-list/script.js:

  1. import axios from 'axios'
  2. export default {
  3. created () {
  4. this.loadUsersByPage(1)
  5. },
  6. data () {
  7. return {
  8. tableData: [],
  9. total: 0,
  10. searchText: '',
  11. dialogFormVisible: false,
  12. addUserForm: {
  13. username: '',
  14. password: '',
  15. email: '',
  16. mobile: ''
  17. },
  18. formRule: {
  19. username: [
  20. {required: true, message: '请输入用户名', trigger: 'blur'}
  21. ],
  22. password: [
  23. {required: true, message: '请输入密码', trigger: 'blur'},
  24. {min: 3, max: 16, message: '密码为 3 - 16 位长度', trigger: 'blur'}
  25. ],
  26. email: [
  27. { required: true, message: '请输入用户名', trigger: 'blur' },
  28. { type: 'email', message: '请输入正确的邮箱', trigger: 'blur' }
  29. ],
  30. mobile: [
  31. { required: true, message: '请输入手机号', trigger: 'blur' }
  32. ]
  33. }
  34. }
  35. },
  36. methods: {
  37. // ... 代码略
  38. // ... 代码略
  39. /**
  40. * 添加用户
  41. */
  42. handleAddUser () {
  43. axios({
  44. method: 'post',
  45. url: 'http://localhost:8888/api/private/v1/users',
  46. data: this.addUserForm,
  47. headers: {
  48. Authorization: window.localStorage.getItem('token')
  49. }
  50. }).then(res => {
  51. if (res.data.meta.status === 201) {
  52. this.$message({
  53. type: 'success',
  54. message: '添加用户成功'
  55. })
  56. // 关闭对话框
  57. this.dialogFormVisible = false
  58. // 清空表单
  59. this.$refs['form'].resetFields()
  60. }
  61. })
  62. }
  63. // ... 代码略
  64. // ... 代码略
  65. }
  66. }

修改用户状态

删除用户

编辑用户