IDEA+SSM+SpringBoot+Vue+Element UI实现班级管理增删改查

简介: IDEA+SSM+SpringBoot+Vue+Element UI实现班级管理增删改查

环境搭建


SQL

CREATE TABLE `tb_class` (
  `c_id` varchar(32) NOT NULL COMMENT '班级ID',
  `c_name` varchar(50) DEFAULT NULL COMMENT '班级名称',
  `desc` varchar(200) DEFAULT NULL COMMENT '班级描述',
  PRIMARY KEY (`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `tb_class` */
insert  into `tb_class`(`c_id`,`c_name`,`desc`) values ('22','22','22'),('c001','Java12班','花儿222'),('c002','Java34班','艺术223'),('c003','虚拟的班级','111');

查询


前端


  • - 需求:简单的查询所有
  • - 步骤:
  •  - 步骤1:编写查询所有班级的函数
  •  - 步骤2:页面加载成功后调用
  •  - 步骤3:展示查询结果
  • - 实现
<template>
  <div>
    <!-- 1.4 班级列表 start -->
    <el-table
      :data="classesList"
      stripe
      style="width: 100%">
      <el-table-column
        prop="cid"
        label="编号"
        width="180">
      </el-table-column>
      <el-table-column
        prop="cname"
        label="班级名称"
        width="180">
      </el-table-column>
      <el-table-column
        prop="desc"
        label="描述"
        width="280">
      </el-table-column>
      <el-table-column
        label="操作">
        <template slot-scope="scope">
          <!-- scope.$index, scope.row -->
          <el-button size="mini">编辑</el-button>
          <el-button size="mini" type="danger">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 1.4 班级列表 end -->
  </div>
</template>
<script>
// 1.0 导入axios
import axios from 'axios'
export default {
  data() {
    return {
      classesList: [],      // 1.1 班级列表
    }
  },
  methods: {
    async selectAllClasses() {  //1.2 查询班级
      // ajax 查询班级
      let url = `http://localhost:8888/classes`
      let { data:baseResult } = await axios.get(url)
      // 保存数据
      this.classesList = baseResult.data
    }
  },
  mounted() {
    // 1.3 调用班级
    this.selectAllClasses()
  },
}
</script>
<style>
</style>

后端


ClassesMapper:

package com.czxy.mapper;
import com.czxy.domain.Classes;
import tk.mybatis.mapper.common.Mapper;
@org.apache.ibatis.annotations.Mapper
public interface ClassesMapper extends Mapper<Classes> {
}

ClassesService:

package com.czxy.service;
import com.czxy.domain.Classes;
import java.util.List;
public interface ClassesService {
    /**
     * 查询所有班级
     * @return
     */
    public List<Classes> selectAllClasses();
}

ClassesServiceImpl:

package com.czxy.service.impl;
import com.czxy.domain.Classes;
import com.czxy.mapper.ClassesMapper;
import com.czxy.service.ClassesService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
@Service
@Transactional
public class ClassesServiceImpl implements ClassesService {
    @Resource
    private ClassesMapper classesMapper;
    @Override
    public List<Classes> selectAllClasses() {
        return classesMapper.selectAll();
    }
}

ClassesController:

package com.czxy.controller;
import com.czxy.domain.Classes;
import com.czxy.service.ClassesService;
import com.czxy.vo.BaseResult;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/classes")
@CrossOrigin
public class ClassesController {
    @Resource
    private ClassesService classesService;
    @GetMapping
    public BaseResult selectAll(){
        List<Classes> list = classesService.selectAllClasses();
        return BaseResult.ok("查询成功",list);
    }
}

添加:弹出框


前端


  • 需求:使用弹出框完成添加
  • 步骤:
  • 步骤1:拷贝弹出框,并调试代码(变量)
  • 步骤2:声明弹出框显示变量、表单变量(表单绑定)
  • 步骤3:添加函数,与按钮绑定
  • 实现
<template>
  <div>
    <!-- 2.4 添加按钮 -->
    <el-button type="primary" round @click="openAddDialog">添加</el-button>
    <!-- 1.4 班级列表 start -->
    <el-table
      :data="classesList"
      stripe
      style="width: 100%">
      <el-table-column
        prop="cid"
        label="编号"
        width="180">
      </el-table-column>
      <el-table-column
        prop="cname"
        label="班级名称"
        width="180">
      </el-table-column>
      <el-table-column
        prop="desc"
        label="描述"
        width="280">
      </el-table-column>
      <el-table-column
        label="操作">
        <template slot-scope="scope">
          <!-- scope.$index, scope.row -->
          <el-button size="mini">编辑</el-button>
          <el-button size="mini" type="danger">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 1.4 班级列表 end -->
    <!-- 2.1 添加弹出框 start -->
    <el-dialog title="添加班级" :visible.sync="classesAddVisible">
      <el-form :model="classes" label-width="80px">
        <el-form-item label="班级编号">
          <el-input v-model="classes.cid"></el-input>
        </el-form-item>
        <el-form-item label="班级名称">
          <el-input v-model="classes.cname"></el-input>
        </el-form-item>
        <el-form-item label="班级描述">
          <el-input type="textarea" v-model="classes.desc"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="classesAddVisible = false">取 消</el-button>
        <el-button type="primary" @click="addClasses">确 定</el-button>
      </div>
    </el-dialog>
    <!-- 2.1 添加弹出框 end -->
  </div>
</template>
<script>
// 1.0 导入axios
import axios from 'axios'
export default {
  data() {
    return {
      classesList: [],            // 1.1 班级列表
      classesAddVisible: false,    // 2.2 添加弹出框的变量
      classes: {},                // 2.3 班级表单
    }
  },
  methods: {
    async selectAllClasses() {  //1.2 查询班级
      // ajax 查询班级
      let url = `http://localhost:8888/classes`
      let { data:baseResult } = await axios.get(url)
      // 保存数据
      this.classesList = baseResult.data
    },
    openAddDialog() {       //2.5 显示弹出框
      this.classesAddVisible = true
    },
    async addClasses() {          //2.6 添加班级
      // ajax
      var url = `http://localhost:8888/classes`
      let { data: baseResult } = await axios.post(url, this.classes) 
      // 处理结果
      if(baseResult.code == 20000) {
        // 成功
        // 提示
        this.$message.success(baseResult.message)
        // 刷新页面
        this.selectAllClasses()
        // 关闭弹出框
        this.classesAddVisible = false
      } else {
        // 失败
        this.$message.error(baseResult.message)
      }
    }
  },
  mounted() {
    // 1.3 调用班级
    this.selectAllClasses()
  },
}
</script>
<style>
</style>

后端


ClassesService

package com.czxy.service;
import com.czxy.domain.Classes;
import java.util.List;
public interface ClassesService {
    /**
     * 添加 | 修改 班级
     * @return
     */
    public boolean addClasses(Classes classes);
}

ClassesServiceImpl

package com.czxy.service.impl;
import com.czxy.domain.Classes;
import com.czxy.mapper.ClassesMapper;
import com.czxy.service.ClassesService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
@Service
@Transactional
public class ClassesServiceImpl implements ClassesService {
    @Override
    public boolean addClasses(Classes classes) {
        Classes cls = classesMapper.selectByPrimaryKey(classes.getCid());
        int result;
        if(cls != null){
            result = classesMapper.updateByPrimaryKey(classes);
        }else{
            result = classesMapper.insert(classes);
        }
        return result == 1;
    }
}

ClassesController

package com.czxy.controller;
import com.czxy.domain.Classes;
import com.czxy.service.ClassesService;
import com.czxy.vo.BaseResult;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/classes")
@CrossOrigin
public class ClassesController {
    @Resource
    private ClassesService classesService;
    @PostMapping
    public BaseResult addupdateClasses(@RequestBody Classes classes){
        try {
            boolean b = classesService.addClasses(classes);
            if(b){
                return BaseResult.ok("添加 | 编辑 成功");
            }else{
                return BaseResult.error("添加 | 编辑 失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return BaseResult.error(e.getMessage());
        }
    }
}

修改:抽屉


前端


  • 需求:使用抽屉完成修改功能
  • 步骤
  • 步骤1:点击修改按钮,打开一个抽泣,通过id查询详情,需要回显表单
  • 步骤2:表单的绑定
  • 步骤3:修改确定按
  • 实现
<template>
  <div>
    <!-- 2.4 添加按钮 -->
    <el-button type="primary" round @click="openAddDialog">添加</el-button>
    <!-- 1.4 班级列表 start -->
    <el-table
      :data="classesList"
      stripe
      style="width: 100%">
      <el-table-column
        prop="cid"
        label="编号"
        width="180">
      </el-table-column>
      <el-table-column
        prop="cname"
        label="班级名称"
        width="180">
      </el-table-column>
      <el-table-column
        prop="desc"
        label="描述"
        width="280">
      </el-table-column>
      <el-table-column
        label="操作">
        <template slot-scope="scope">
          <!-- scope.$index, scope.row -->
          <!-- 3.1 打开编辑抽屉 -->
          <el-button size="mini" @click="openEditDrawer(scope.row.cid)">编辑</el-button>
          <el-button size="mini" type="danger">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 1.4 班级列表 end -->
    <!-- 2.1 添加弹出框 start -->
    <el-dialog title="添加班级" :visible.sync="classesAddVisible">
      <el-form :model="classes" label-width="80px">
        <el-form-item label="班级编号">
          <el-input v-model="classes.cid"></el-input>
        </el-form-item>
        <el-form-item label="班级名称">
          <el-input v-model="classes.cname"></el-input>
        </el-form-item>
        <el-form-item label="班级描述">
          <el-input type="textarea" v-model="classes.desc"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="classesAddVisible = false">取 消</el-button>
        <el-button type="primary" @click="addClasses">确 定</el-button>
      </div>
    </el-dialog>
    <!-- 2.1 添加弹出框 end -->
    <!-- 3.3 抽屉 start -->
    <el-drawer
      title="修改班级"
      :visible.sync="classesEditDrawerVisible"
      direction="rtl">
      <!-- 修改表单 start -->
      <el-form :model="classes" label-width="80px">
        <el-form-item label="班级编号">
          <el-input v-model="classes.cid"></el-input>
        </el-form-item>
        <el-form-item label="班级名称">
          <el-input v-model="classes.cname"></el-input>
        </el-form-item>
        <el-form-item label="班级描述">
          <el-input type="textarea" v-model="classes.desc"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="editClasses">立即创建</el-button>
          <el-button @click="classesEditDrawerVisible = false">取消</el-button>
        </el-form-item>
      </el-form>
      <!-- 修改表单 end -->
    </el-drawer>
    <!-- 3.3 抽屉 end -->
  </div>
</template>
<script>
// 1.0 导入axios
import axios from 'axios'
export default {
  data() {
    return {
      classesList: [],            // 1.1 班级列表
      classesAddVisible: false,    // 2.2 添加弹出框的变量
      classes: {},                // 2.3 班级表单
      classesEditDrawerVisible: false,  // 3.4 抽屉变量
    }
  },
  methods: {
    async selectAllClasses() {  //1.2 查询班级
      // ajax 查询班级
      let url = `http://localhost:8888/classes`
      let { data:baseResult } = await axios.get(url)
      // 保存数据
      this.classesList = baseResult.data
    },
    openAddDialog() {       //2.5 显示弹出框
      this.classesAddVisible = true
    },
    async addClasses() {          //2.6 添加班级
      // ajax
      var url = `http://localhost:8888/classes`
      let { data: baseResult } = await axios.post(url, this.classes) 
      // 处理结果
      if(baseResult.code == 20000) {
        // 成功
        // 提示
        this.$message.success(baseResult.message)
        // 刷新页面
        this.selectAllClasses()
        // 关闭弹出框
        this.classesAddVisible = false
      } else {
        // 失败
        this.$message.error(baseResult.message)
      }
    },
    async openEditDrawer(cid) {  //3.2 打开编辑抽屉函数
      // 打开抽屉
      this.classesEditDrawerVisible = true
      // 查询详情
      let url = `http://localhost:8888/classes/${cid}`
      let { data: baseResult } = await axios.get(url)
      this.classes = baseResult.data
    },
    async editClasses() {   //3.4 修改班级函数
      // ajax
      var url = `http://localhost:8888/classes`
      let { data: baseResult } = await axios.put(url, this.classes) 
      // 处理结果
      if(baseResult.code == 20000) {
        // 成功
        // 提示
        this.$message.success(baseResult.message)
        // 刷新页面
        this.selectAllClasses()
        // 关闭抽屉
        this.classesEditDrawerVisible = false
      } else {
        // 失败
        this.$message.error(baseResult.message)
      }
    }
  },
  mounted() {
    // 1.3 调用班级
    this.selectAllClasses()
  },
}
</script>
<style>
</style>

后端


ClassesService

package com.czxy.service;
import com.czxy.domain.Classes;
import java.util.List;
public interface ClassesService {
    /**
     * 添加 | 修改 班级
     * @return
     */
    public boolean addClasses(Classes classes);
    /**
     * 查询指定班级
     * @param cid
     * @return
     */
    public Classes selectById(String cid);
}

ClassesServiceImpl

package com.czxy.service.impl;
import com.czxy.domain.Classes;
import com.czxy.mapper.ClassesMapper;
import com.czxy.service.ClassesService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
@Service
@Transactional
public class ClassesServiceImpl implements ClassesService {
    @Resource
    private ClassesMapper classesMapper;
    @Override
    public boolean addClasses(Classes classes) {
        Classes cls = classesMapper.selectByPrimaryKey(classes.getCid());
        int result;
        if(cls != null){
            result = classesMapper.updateByPrimaryKey(classes);
        }else{
            result = classesMapper.insert(classes);
        }
        return result == 1;
    }
    @Override
    public Classes selectById(String cid) {
        Classes classes = classesMapper.selectByPrimaryKey(cid);
        return classes;
    }
}

ClassesServiceController

1.package com.czxy.controller;
import com.czxy.domain.Classes;
import com.czxy.service.ClassesService;
import com.czxy.vo.BaseResult;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * @Author 刘嘉俊
 * @Date 2022/3/21
 */
@RestController
@RequestMapping("/classes")
@CrossOrigin
public class ClassesController {
    @Resource
    private ClassesService classesService;
    @PostMapping
    public BaseResult addupdateClasses(@RequestBody Classes classes){
        try {
            boolean b = classesService.addClasses(classes);
            if(b){
                return BaseResult.ok("添加 | 编辑 成功");
            }else{
                return BaseResult.error("添加 | 编辑 失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return BaseResult.error(e.getMessage());
        }
    }
    @GetMapping("/{cid}")
    public BaseResult selectById(@PathVariable("cid") String cid){
        System.out.println(cid);
        Classes classes = classesService.selectById(cid);
        return BaseResult.ok("查询成功",classes);
    }
}

删除


基本功能


  • 需求:点击删除按钮,完成删除操作
  • 实现
<template>
  <div>
    <!-- 2.4 添加按钮 -->
    <el-button type="primary" round @click="openAddDialog">添加</el-button>
    <!-- 1.4 班级列表 start -->
    <el-table
      :data="classesList"
      stripe
      style="width: 100%">
      <el-table-column
        prop="cid"
        label="编号"
        width="180">
      </el-table-column>
      <el-table-column
        prop="cname"
        label="班级名称"
        width="180">
      </el-table-column>
      <el-table-column
        prop="desc"
        label="描述"
        width="280">
      </el-table-column>
      <el-table-column
        label="操作">
        <template slot-scope="scope">
          <!-- scope.$index, scope.row -->
          <!-- 3.1 打开编辑抽屉 -->
          <el-button size="mini" @click="openEditDrawer(scope.row.cid)">编辑</el-button>
          <!-- 4.1 删除 -->
          <el-button size="mini" @click="deleteClasses(scope.row.cid)" type="danger">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 1.4 班级列表 end -->
    <!-- 2.1 添加弹出框 start -->
    <el-dialog title="添加班级" :visible.sync="classesAddVisible">
      <el-form :model="classes" label-width="80px">
        <el-form-item label="班级编号">
          <el-input v-model="classes.cid"></el-input>
        </el-form-item>
        <el-form-item label="班级名称">
          <el-input v-model="classes.cname"></el-input>
        </el-form-item>
        <el-form-item label="班级描述">
          <el-input type="textarea" v-model="classes.desc"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="classesAddVisible = false">取 消</el-button>
        <el-button type="primary" @click="addClasses">确 定</el-button>
      </div>
    </el-dialog>
    <!-- 2.1 添加弹出框 end -->
    <!-- 3.3 抽屉 start -->
    <el-drawer
      title="修改班级"
      :visible.sync="classesEditDrawerVisible"
      direction="rtl">
      <!-- 修改表单 start -->
      <el-form :model="classes" label-width="80px">
        <el-form-item label="班级编号">
          <el-input v-model="classes.cid"></el-input>
        </el-form-item>
        <el-form-item label="班级名称">
          <el-input v-model="classes.cname"></el-input>
        </el-form-item>
        <el-form-item label="班级描述">
          <el-input type="textarea" v-model="classes.desc"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="editClasses">立即创建</el-button>
          <el-button @click="classesEditDrawerVisible = false">取消</el-button>
        </el-form-item>
      </el-form>
      <!-- 修改表单 end -->
    </el-drawer>
    <!-- 3.3 抽屉 end -->
  </div>
</template>
<script>
// 1.0 导入axios
import axios from 'axios'
export default {
  data() {
    return {
      classesList: [],            // 1.1 班级列表
      classesAddVisible: false,    // 2.2 添加弹出框的变量
      classes: {},                // 2.3 班级表单
      classesEditDrawerVisible: false,  // 3.4 抽屉变量
    }
  },
  methods: {
    async selectAllClasses() {  //1.2 查询班级
      // ajax 查询班级
      let url = `http://localhost:8888/classes`
      let { data:baseResult } = await axios.get(url)
      // 保存数据
      this.classesList = baseResult.data
    },
    openAddDialog() {       //2.5 显示弹出框
      this.classesAddVisible = true
    },
    async addClasses() {          //2.6 添加班级
      // ajax
      var url = `http://localhost:8888/classes`
      let { data: baseResult } = await axios.post(url, this.classes) 
      // 处理结果
      if(baseResult.code == 20000) {
        // 成功
        // 提示
        this.$message.success(baseResult.message)
        // 刷新页面
        this.selectAllClasses()
        // 关闭弹出框
        this.classesAddVisible = false
      } else {
        // 失败
        this.$message.error(baseResult.message)
      }
    },
    async openEditDrawer(cid) {  //3.2 打开编辑抽屉函数
      // 打开抽屉
      this.classesEditDrawerVisible = true
      // 查询详情
      let url = `http://localhost:8888/classes/${cid}`
      let { data: baseResult } = await axios.get(url)
      this.classes = baseResult.data
    },
    async editClasses() {   //3.4 修改班级函数
      // ajax
      var url = `http://localhost:8888/classes`
      let { data: baseResult } = await axios.put(url, this.classes) 
      // 处理结果
      if(baseResult.code == 20000) {
        // 成功
        // 提示
        this.$message.success(baseResult.message)
        // 刷新页面
        this.selectAllClasses()
        // 关闭抽屉
        this.classesEditDrawerVisible = false
      } else {
        // 失败
        this.$message.error(baseResult.message)
      }
    },
    deleteClasses(cid) {    // 4.2 删除功能
      // 询问
      this.$confirm('您确定要删除么?', '删除提示', {
        type: 'warning'
      }).then(async () => {
        // 确认
        let url = `http://localhost:8888/classes/${cid}`
        let { data:baseResult } = await axios.delete(url)
        if(baseResult.code == 20000) {
          // 成功
          this.$message.success(baseResult.message)
          // 刷新
          this.selectAllClasses()
        } else {
          // 失败
          this.$message.error(baseResult.message)
        }
      }).catch(() => {
        // 
        this.$message.info('用户已取消')         
      });
    }
  },
  mounted() {
    // 1.3 调用班级
    this.selectAllClasses()
  },
}
</script>
<style>
</style>

校验关联信息


  • 需求:如果有关联数据,先查询,再给出提示
  • 步骤:

          步骤1:修改student mapper ,提供查询指定班级的学生

          步骤2:修改classes serivce,进行数据校验

  • 步骤1:修改student mapper ,提供查询指定班级的学生

微信图片_20220527232803.png

package com.czxy.mapper;
import com.czxy.domain.Student;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;
@org.apache.ibatis.annotations.Mapper
public interface StudentMapper extends Mapper<Student> {
    /**
     * 通过班级id查询
     * @param classesId
     * @return
     */
    @Select("SELECT *,s_id AS sid , c_id AS cid FROM tb_student WHERE c_id = #{classesId}")
    public List<Student> selectAllByCid(@Param("classesId") String classesId);
}

步骤2:修改classes serivce,进行数据校验

微信图片_20220527232841.png

    @Override
    public boolean delete(String cid) {
        // 校验:查询,如果有数据抛异常
        List<Student> studentList = studentMapper.selectAllByCid(cid);
        if(studentList.size() > 0 ) {
            // 有关联数据,不允许删除
            throw new RuntimeException("班级关联学生,请先删除学生!");
        }
        // 删除班级
        int delete = classesMapper.deleteByPrimaryKey(cid);
        return delete == 1;
    }

配置类


BaseResult

package com.czxy.vo;
import java.util.HashMap;
import java.util.Map;
public class BaseResult<T> {
    //成功状态码
    public static final int OK = 20000;
    //失败状态码
    public static final int ERROR = 0;
    //返回码
    private Integer code;
    //返回消息
    private String message;
    //存放数据
    private T data;
    //其他数据
    private Map<String,Object> other = new HashMap<>();
    public BaseResult() {
    }
    public BaseResult(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
    public BaseResult(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }
    /**
     * 快捷成功BaseResult对象
     * @param message
     * @return
     */
    public static BaseResult ok(String message){
        return new BaseResult<>(BaseResult.OK , message);
    }
    public static BaseResult ok(String message, Object data){
        return new BaseResult<>(BaseResult.OK , message, data );
    }
    /**
     * 快捷失败BaseResult对象
     * @param message
     * @return
     */
    public static BaseResult error(String message){
        return new BaseResult(BaseResult.ERROR , message);
    }
    /**
     * 自定义数据区域
     * @param key
     * @param msg
     * @return
     */
    public BaseResult append(String key , Object msg){
        other.put(key , msg);
        return this;
    }
    public Integer getCode() {
        return code;
    }
    public String getMessage() {
        return message;
    }
    public T getData() {
        return data;
    }
    public Map<String, Object> getOther() {
        return other;
    }
}


相关文章
|
2月前
|
API UED 容器
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
在这篇博客中,我们将深入探讨 Element UI 中的自定义滚动条及弹出层管理技巧。文章详细介绍了 el-scrollbar 组件的使用和参数设置,以及 PopupManager 如何有效管理弹出层的 z-index。我们还将探讨如何实现灵活的全屏组件,利用 vue-popper 创建自定义弹出层,最后介绍 ClickOutside 指令的用法。这些高级技巧将帮助你提升 Element UI 应用程序的用户体验与交互灵活性。
312 1
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
|
3月前
|
JavaScript
Vue使用element中table组件实现单选一行
如何在Vue中使用Element UI的table组件实现单选一行的功能。
217 5
Vue使用element中table组件实现单选一行
|
3月前
|
JavaScript
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
这篇文章介绍了如何使用Ant Design Vue UI框架创建一个简单的后台管理模板,包括创建Vue项目、安装和使用ant-design-vue、以及编写后台管理通用页面的代码和样式。
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
|
4月前
|
JavaScript
vue element-ui 中el-message重复弹出问题解决 el-message重复弹出解决办法
vue element-ui 中el-message重复弹出问题解决 el-message重复弹出解决办法
284 49
|
2月前
|
JavaScript 索引
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
200 0
|
2月前
|
资源调度 JavaScript PHP
Vue3+ element plus 前后分离admin项目安装教程
Vue3+ element plus 前后分离admin项目安装教程
75 0
|
4月前
|
JavaScript 前端开发 安全
[译] 在 Vue 组件中分离 UI 和业务逻辑。
[译] 在 Vue 组件中分离 UI 和业务逻辑。
|
4月前
|
开发者 C# Android开发
明白吗?Xamarin与Native的终极对决:究竟哪种开发方式更适合您的项目需求,让我们一探究竟!
【8月更文挑战第31天】随着移动应用开发的普及,开发者面临多种技术选择。本文对比了跨平台解决方案Xamarin与原生开发方式的优势与劣势。Xamarin使用C#进行跨平台开发,代码复用率高,可大幅降低开发成本;但因基于抽象层,可能影响性能。原生开发则充分利用平台特性,提供最佳用户体验,但需维护多套代码库,增加工作量。开发者应根据项目需求、团队技能和预算综合考量,选择最适合的开发方式。
136 0
|
4月前
|
JavaScript 前端开发 开发者
决战前端之巅!Element UI与Vuetify谁才是Vue.js组件界的霸主?一场关于颜值与实力的较量!
【8月更文挑战第30天】本文对比了两款热门的Vue.js组件库——Element UI与Vuetify。Element UI由饿了么团队打造,提供多种高质量UI组件,设计简洁大方。Vuetify基于Material Design规范,支持Vue.js 2.0及3.0版本,具备前瞻性。两者均涵盖表单、导航、数据展示等组件,Element UI配置选项丰富,而Vuetify则提供了更深层的样式定制功能。开发者可根据项目需求及个人偏好选择合适的组件库。
369 0
|
4月前
|
JavaScript 开发者 UED
Vue.js组件库大对决:Element UI与Vuetify,开发者的罗密欧与朱丽叶!
【8月更文挑战第30天】Element UI和Vuetify是Vue.js开发中的热门组件库,前者简洁高效,后者遵循Material Design,国际化程度高。两者均提供丰富的组件支持,但Vuetify组件更多样,设计更灵活;Element UI在性能和中文支持上更优。文档方面,Element UI更直观易懂,而Vuetify配置灵活但学习成本稍高。选择时需综合考虑项目需求、团队背景及设计风格,以达到最佳开发效果。
247 0