• 【vue实战项目】通用管理系统:作业列表


    目录

    目录

    1.前言

    2.后端API

    3.前端API

    4.组件

    5.分页

    6.封装组件


    1.前言

    本文是博主前端Vue实战系列中的一篇文章,本系列将会带大家一起从0开始一步步完整的做完一个小项目,让你找到Vue实战的技巧和感觉。

    专栏地址:

    https://blog.csdn.net/joker_zjn/category_12469788.html?spm=1001.2014.3001.5482

    前文中我们依次安装好了插件、依赖,搭建好了环境,搭好了项目的架子,实现了登录页、首页、菜单栏、导航栏、学生列表模块这些功能。接下来我们要做的是作业管理模块,该模块用来对学生的作业进行管理,主要是实现一个作业管理列表+后端分页的功能。

    2.后端API

    URL:

    api/getWorkList

    返回值:

    参数类型说明
    idint用户ID
    userIdint所属班级
    titlestring作业名称
    completedboolean完成情况,是否完成

    请求:

    method:GET

    参数名类型说明
    pageint当前页数
    sizeint每页条数

    这是作者用Spring Boot写的一个后端接口实现,可以作为一个参考:

    1. @RestController
    2. @RequestMapping("/api/work")
    3. public class WorkController {
    4. @RequestMapping("getWorkList")
    5. public ResultBean getWorkList(int index, int rows) {
    6. return new ResultBean(200,"success",workService.getWorkListCount(index,rows),workService.getWorkList(index,rows));
    7. }
    8. }

    3.前端API

    之前我们以及在table.js里封装好了前端的api,所以这里我们直接在table.js里面追加api即可:

    1. //获取作业列表
    2. export function getTableData(root,method,url,params,arr){
    3. root.service[method](url+"?index="+params.index+"&rows="+params.rows)
    4. .then(res=>{
    5. if(res.data.code===200){
    6. root.tableData=res.data.data
    7. root.total=res.data.total
    8. root.tableData.map(item=>{
    9. arr.map(aItem=>[
    10. item[aItem]?item[aItem+'_text']='是':item[aItem+'_text']='否'
    11. ])
    12. })
    13. }
    14. })
    15. }

    4.组件

    直接用前面学生列表的StudentList.vue来改一下:

    1. <template>
    2. <div>
    3. <el-table :data="tableData" border style="width: 100%">
    4. <el-table-column prop="id" label="用户ID" align="center">
    5. el-table-column>
    6. <el-table-column prop="userId" label="所属班级" align="center">
    7. el-table-column>
    8. <el-table-column prop="title" label="作业名称" align="center">
    9. el-table-column>
    10. <el-table-column prop="completed_text" label="完成情况" align="center">
    11. el-table-column>
    12. el-table>
    13. div>
    14. template>
    15. <script>
    16. import {getTableData} from '@/utils/table'
    17. export default ({
    18. data(){
    19. return{
    20. tableData:[]
    21. }
    22. },
    23. created(){
    24. getTableData(this,'get','/work/getWorkList',{},['completed'])
    25. }
    26. })
    27. script>

    5.分页

    这里要注意的是前面我们采用的都是前端分页,但是在实际项目中都是采用后端分页的。因为前端分页的话要先把所有数据请求过来再分页显示,数据量大了的话是搞不定的,所以从这里以及后面的分页我们都采用后端分页。前面的前端分页的地方就不去管他了,作为一个演示放在那里。

    我们先把学生列表组件里面的分页组件照搬过来,需要注意的是将current-page和page-size分别设置为后端分页的参数

    1. data(){
    2. return{
    3. tableData:[],
    4. total:0,
    5. index:0,
    6. rows:10
    7. }
    8. },
    1. <template>
    2. <div>
    3. <el-table :data="tableData" border style="width: 100%">
    4. <el-table-column prop="id" label="用户ID" align="center">
    5. el-table-column>
    6. <el-table-column prop="userId" label="所属班级" align="center">
    7. el-table-column>
    8. <el-table-column prop="title" label="作业名称" align="center">
    9. el-table-column>
    10. <el-table-column prop="completed_text" label="完成情况" align="center">
    11. el-table-column>
    12. el-table>
    13. <el-pagination
    14. @size-change="handleSizeChange"
    15. @current-change="handleCurrentChange"
    16. :current-page="index"
    17. :page-sizes="[5, 10, 15, 20]"
    18. :page-size="rows"
    19. layout="total, sizes, prev, pager, next, jumper"
    20. :total="total"
    21. >
    22. el-pagination>
    23. div>
    24. template>

    最终组件:

    1. <template>
    2. <div class="workList">
    3. <el-table :data="tableData" border style="width: 100%">
    4. <el-table-column prop="id" label="用户ID" align="center">
    5. el-table-column>
    6. <el-table-column prop="userId" label="所属班级" align="center">
    7. el-table-column>
    8. <el-table-column prop="title" label="作业名称" align="center">
    9. el-table-column>
    10. <el-table-column prop="completed_text" label="完成情况" align="center">
    11. el-table-column>
    12. el-table>
    13. <el-pagination
    14. @size-change="handleSizeChange"
    15. @current-change="handleCurrentChange"
    16. :current-page="index"
    17. :page-sizes="[5, 10, 15, 20]"
    18. :page-size="rows"
    19. layout="total, sizes, prev, pager, next, jumper"
    20. :total="total"
    21. >
    22. el-pagination>
    23. div>
    24. template>
    25. <script>
    26. import {getTableData} from '@/utils/table'
    27. export default ({
    28. data(){
    29. return{
    30. tableData:[],
    31. total:0,
    32. index:1,
    33. rows:10
    34. }
    35. },
    36. created(){
    37. getTableData(this,'get','/work/getWorkList',{index:this.index,rows:this.rows},['completed'])
    38. },
    39. methods:{
    40. //分页方法
    41. handleSizeChange(val) {
    42. this.index = val;
    43. this.rows = 1;
    44. getTableData(this,'get','/work/getWorkList',{},['completed']);
    45. },
    46. handleCurrentChange(val) {
    47. this.rows = val;
    48. getTableData(this,'get','/work/getWorkList',{},['completed']);
    49. },
    50. }
    51. })
    52. script>
    53. <style lang="less">
    54. .workList{
    55. .el-pagination{
    56. text-align: left;
    57. margin-top: 20px;
    58. }
    59. }
    60. style>

    6.封装组件

    分页组件到处都会用到,所以我们应该考虑把这个组件单独封装成一个组件,以后该项目中其它地方也用这个我们封装好的走后端分页逻辑的组件。

    公共组件都放common包下面:

    有两个地方需要注意:

    1.因为要操作的数据是父组件的,所以原来的前端api要改为:

    1. //获取作业列表
    2. export function getTableData(root,method,url,params,arr){
    3. root.service[method](url+"?index="+params.index+"&rows="+params.rows)
    4. .then(res=>{
    5. if(res.data.code===200){
    6. root.$parent.tableData=res.data.data
    7. root.total=res.total
    8. root.$parent.tableData.map(item=>{
    9. arr.map(aItem=>[
    10. item[aItem]?item[aItem+'_text']='是':item[aItem+'_text']='否'
    11. ])
    12. })
    13. }
    14. })
    15. }

    2.为了保证路由的灵活度,分页方法具体访问哪个后端接口,需要从父组件传过来,所以这里加一个url参数:

    1. <template>
    2. <div>
    3. <el-pagination
    4. @size-change="handleSizeChange"
    5. @current-change="handleCurrentChange"
    6. :current-page="index"
    7. :page-sizes="[5, 10, 15, 20]"
    8. :page-size="rows"
    9. layout="total, sizes, prev, pager, next, jumper"
    10. :total="total"
    11. :url="url"
    12. >
    13. el-pagination>
    14. div>
    15. template>
    16. <script>
    17. import {getTableData} from '@/utils/table'
    18. export default ({
    19. props:{
    20. "url": String
    21. },
    22. data(){
    23. return {
    24. total:0,
    25. index:1,//当前页数
    26. rows:10,//每页显示条数
    27. }
    28. },
    29. created(){
    30. getTableData(this,'get',this.url,{index:this.index,rows:this.rows},['completed'])
    31. },
    32. methods:{
    33. //分页方法
    34. handleSizeChange(val) {
    35. this.index = val;
    36. this.rows = 1;
    37. getTableData(this,'get',this.url,{index:this.index,rows:this.rows},['completed'])
    38. },
    39. handleCurrentChange(val) {
    40. this.rows = val;
    41. getTableData(this,'get',this.url,{index:this.index,rows:this.rows},['completed'])
    42. },
    43. }
    44. })
    45. script>

    最终在父组件中调用上面的分页组件即可,所以最终的作业列表组件长这样:

    1. <template>
    2. <div>
    3. <el-pagination
    4. @size-change="handleSizeChange"
    5. @current-change="handleCurrentChange"
    6. :current-page="index"
    7. :page-sizes="[5, 10, 15, 20]"
    8. :page-size="rows"
    9. layout="total, sizes, prev, pager, next, jumper"
    10. :total="total"
    11. :url="url"
    12. >
    13. el-pagination>
    14. div>
    15. template>
    16. <script>
    17. import {getTableData} from '@/utils/table'
    18. export default ({
    19. props:{
    20. "url": String
    21. },
    22. data(){
    23. return {
    24. total:0,
    25. index:1,//当前页数
    26. rows:10,//每页显示条数
    27. }
    28. },
    29. created(){
    30. getTableData(this,'get',this.url,{index:this.index,rows:this.rows},['completed'])
    31. },
    32. methods:{
    33. //分页方法
    34. handleSizeChange(val) {
    35. this.index = val;
    36. this.rows = 1;
    37. getTableData(this,'get',this.url,{index:this.index,rows:this.rows},['completed'])
    38. },
    39. handleCurrentChange(val) {
    40. this.rows = val;
    41. getTableData(this,'get',this.url,{index:this.index,rows:this.rows},['completed'])
    42. },
    43. }
    44. })
    45. script>

  • 相关阅读:
    Java 查漏补缺
    算法提高: 使用归并实现范围和问题(Count of Range Sum)
    Unity shader time
    BootstrapBlazor企业级组件库:前端开发的革新之路
    数据结构:反射
    面试:List 如何根据对象的属性去重?
    TCP/UDP协议
    LVS+Keepalived群集
    算法——链表篇
    Halcon 光度立体 缺陷检测
  • 原文地址:https://blog.csdn.net/Joker_ZJN/article/details/139390616