实战项目-10(添加课程分类前端实现)

添加课程分类前端实现

1. 添加课程分类路由

image

{
    path: '/subject',
    component: Layout,
    redirect: '/subject/list',
    name: '课程分类管理',
    meta: { title: '课程分类管理', icon: 'example' },
    children: [
      {
        path: 'list',
        name: '课程分类列表',
        component: () => import('@/views/edu/subject/list'),
        meta: { title: '课程分类列表', icon: 'table' }
      },
      {
        path: 'save',
        name: '添加课程分类',
        component: () => import('@/views/edu/subject/save'),
        meta: { title: '添加课程分类', icon: 'tree' }
      },
    ]
  },

2. 创建课程分类页面

image

3. 在api中创建方法

image

import request from '@/utils/request'
export default {
    //1 课程分类列表
    getSubjectList() {
        return request({
            url: '/eduservice/subject/getAllSubject',
            method: 'get'
          })
    }
}

4. 完善两个页面

  1. save页面(用于下载模板和上传到excel文件制作数据库中的对应文件)
 <template> 
  <div class="app-container">
       <el-form label-width="120px">
            <el-form-item label="信息描述">
                 <el-tag type="info">excel模版说明</el-tag> 
                  <el-tag> 
                    <i class="el-icon-download"/>
                     <a :href="'/static/easyexcel.xls'">点击下载模版</a> 
                   </el-tag>
        </el-form-item>
            <el-form-item label="选择Excel">
                <el-upload
                    ref="upload"
                    :auto-upload="false"
                    :on-success="fileUploadSuccess"
                    :on-error="fileUploadError"
                    :disabled="importBtnDisabled"
                    :limit="1"
                    :action="BASE_API+'/eduservice/subject/addSuject'"
                    name="file"
                    accept="application/vnd.ms-excel">
                    <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
                    <el-button
                    :loading="loading"
                    style="margin-left: 10px;"
                    size="small"
                    type="success"
                    @click="submitUpload">上传到服务器</el-button>
                </el-upload>
            </el-form-item>
        </el-form>
    </div>
 </template>

<script>
    export default{
        data(){
            return {
                BASE_API: process.env.BASE_API,//接口的api地址
                importBtnDisabled:false,
                loading:false
            }
        },
        created(){

        },
        methods:{
            //上传文件到接口
            submitUpload(){
                this.importBtnDisabled = true
                this.loading = true
                this.$refs.upload.submit()
            },
            //上传成功
            fileUploadSuccess(){
                //提示信息
                this.loading = false
                this.$message({
                    type: 'success', 
                    message: "添加课程分类成功"
                })
                //跳转到分类列表
                this.$router.push({path:'/subject/list'})
                },
            //上传失败
            fileUploadError(){
                this.loading = false
                this.$message({
                    type: 'error',
                    message: "添加课程分类失败"
                })
            } 
        }
    }
</script>
 
  1. list页面,用于展示树形的课程分类页面
<template>
  <div class="app-container">
    <el-input
      v-model="filterText"
      placeholder="Filter keyword"
      style="margin-bottom: 30px"
    />

    <el-tree
      ref="tree2"
      :data="data2"
      :props="defaultProps"
      :filter-node-method="filterNode"
      class="filter-tree"
      default-expand-all
    />
  </div>
</template>

<script>
import subject from "@/api/edu/subject";
export default {
  data() {
    return {
      filterText: "",
      data2: [], //返回所有分类数据
      defaultProps: {
        children: "children",
        label: "title",
      },
    };
  },
  created() {
    this.getAllSubjectList();
  },
  watch: {
    filterText(val) {
      this.$refs.tree2.filter(val);
    },
  },

  methods: {
    getAllSubjectList() {
      subject.getSubjectList().then((response) => {
        this.data2 = response.data.list;
      });
    },
    filterNode(value, data) {
      if (!value) return true;
      return data.title.toLowerCase().indexOf(value.toLowerCase()) !== -1;
    },
  },
};
</script>

5. 因为要在前端展示list树状页面,后端的实现

  1. 创建vo.subject.OneSubject和TwoSubject
//一级分类
@Data
public class OneSubject {

    private String id;

    private String title;

    //一个一级里面有多个二级(所以使用数组来放)
    private List<TwoSubject> children = new ArrayList<>();
}
====================================================================
//二级分类
@Data
public class TwoSubject {

    private String id;

    private String title;
}
  1. 增加controller中的方法
   //课程分类列表功能(树形结构)
    //这种格式的封装步骤(1. 类似R那种,创建两个实体类(一个为一级,一个为二级)  2. 在两个实体类中表示关系(一个一级包含多个二级)
    @ApiOperation(value = "嵌套数据列表")
    @GetMapping("getAllSubject")
    public R getAllSubject(){
        //list集合中的泛型是一级分类,因为一级分类里面有二级的数组
        List<OneSubject> list = subjectService.getAllOneTwoSubject();

        return R.ok().data("list",list);
    }
  1. 创建service接口中的方法
  //课程分类列表(树形)
    List<OneSubject> getAllOneTwoSubject();
  1. 增加service接口的impl实现类中的方法
   //课程分类列表
    @Override
    public List<OneSubject> getAllOneTwoSubject() {

        //1.查询所有的一级分类
        QueryWrapper<EduSubject> wrapperOne = new QueryWrapper<>();

        wrapperOne.eq("parent_id","0");

        List<EduSubject> oneSubjectList = baseMapper.selectList(wrapperOne);

        //2.查询所有的二级分类
        QueryWrapper<EduSubject> wrapperTwo = new QueryWrapper<>();

        wrapperTwo.ne("parent_id","0");

        List<EduSubject> twoSubjectList = baseMapper.selectList(wrapperTwo);

        //创建list集合用于存储最后的封装
        List<OneSubject> finalSubjectList = new ArrayList<>();

        //3.封装一级分类
        //将查询到的list集合遍历,得到每一个一级分类的对象,获取每一个分类对象值,封装到要求的list集合中(finalSubjectList)

        for (int i = 0 ; i < oneSubjectList.size() ; i++) {
            //得到每个oneSubjectList每个eduSubject对象
            EduSubject eduSubject = oneSubjectList.get(i);

            OneSubject oneSubject = new OneSubject();

//            oneSubject.setId(eduSubject.getId());
//            oneSubject.setTitle(eduSubject.getTitle());
            //简写(spring包中的beanutils)以下这一行代码作用于上面一样,只是被封装了
            BeanUtils.copyProperties(eduSubject,oneSubject);

            finalSubjectList.add(oneSubject);

            //4.封装二级分类(在一级分类的for里面遍历所有的二级)
            //创建list集合,封装二级分类
            List<TwoSubject> twoFinalSubjectList = new ArrayList<>();
            //遍历封装
            for (int m = 0; m < twoSubjectList.size(); m++) {
                //获取每个二级分类
                EduSubject tSubject = twoSubjectList.get(m);

                //判断二级分类的parentid和一级的id是否相同

                if (tSubject.getParentId().equals(eduSubject.getId())){
                    //把tSubject放到twoSubject中,放到twoFinalSubjectList里面
                    TwoSubject twoSubject = new TwoSubject();
                    BeanUtils.copyProperties(tSubject,twoSubject);
                    twoFinalSubjectList.add(twoSubject);
                }
            }
            //将一级下面的所有的二级分类放到一级里面
            oneSubject.setChildren(twoFinalSubjectList);
        }
        return finalSubjectList;
    }

6. 开启前后端测试->成功

posted @ 2021-11-02 15:14  1_f  阅读(160)  评论(0)    收藏  举报