前端vue,后端springboot,实现动态表格样式,(表格List
下面我将提供一个完整的解决方案,包括前端Vue和后端SpringBoot的实现。
java
// Student.java
public class Student {
private String grade; // 年级
private String className; // 班级
private String subjectType; // 文理科分类
private String name; // 姓名
private String studentId; // 学号
// 构造方法、getter和setter
public Student() {}
public Student(String grade, String className, String subjectType, String name, String studentId) {
this.grade = grade;
this.className = className;
this.subjectType = subjectType;
this.name = name;
this.studentId = studentId;
}
// getter和setter方法
// ...
}
java
// TableRow.java
public class TableRow {
private String grade; // 年级
private String subjectType; // 文理科分类
private String className; // 班级
private String studentId; // 学号
private String studentName; // 姓名
private int gradeRowSpan; // 年级合并行数
private int subjectRowSpan; // 文理科合并行数
private int classRowSpan; // 班级合并行数
// 构造方法、getter和setter
// ...
}
java
// StudentController.java
@RestController
@RequestMapping("/api/students")
public class StudentController {
@Autowired
private StudentService studentService;
@GetMapping("/table-data")
public ResponseEntity> getTableData() {
List tableData = studentService.generateTableData();
return ResponseEntity.ok(tableData);
}
}
java
// StudentService.java
@Service
public class StudentService {
// 模拟数据 - 实际应用中可以从数据库获取
private List mockStudents = Arrays.asList(
new Student("高一", "一班", "理科", "张三", "2023001"),
new Student("高一", "一班", "理科", "李四", "2023002"),
new Student("高一", "二班", "文科", "王五", "2023003"),
new Student("高二", "三班", "理科", "赵六", "2023004"),
new Student("高二", "三班", "理科", "钱七", "2023005"),
new Student("高二", "四班", "文科", "孙八", "2023006"),
new Student("高三", "五班", "理科", "周九", "2023007"),
new Student("高三", "六班", "文科", "吴十", "2023008")
);
public List generateTableData() {
// 1. 按年级、文理科、班级分组
Map>>> groupedData = mockStudents.stream()
.collect(Collectors.groupingBy(
Student::getGrade,
Collectors.groupingBy(
Student::getSubjectType,
Collectors.groupingBy(Student::getClassName)
)
));
// 2. 构建表格行数据
List tableRows = new ArrayList<>();
groupedData.forEach((grade, subjectMap) -> {
// 计算年级合并行数
int gradeCount = subjectMap.values().stream()
.mapToInt(classMap -> classMap.size())
.sum();
subjectMap.forEach((subjectType, classMap) -> {
// 计算文理科合并行数
int subjectCount = classMap.size();
classMap.forEach((className, students) -> {
// 每个学生或空行(用于合并)
if (students.isEmpty()) {
// 空行处理(如果有需要)
} else {
// 添加学生行
students.forEach(student -> {
TableRow row = new TableRow();
row.setGrade(grade);
row.setSubjectType(subjectType);
row.setClassName(className);
row.setStudentId(student.getStudentId());
row.setStudentName(student.getName());
// 计算合并行数(只在第一行设置)
if (tableRows.isEmpty() ||
!tableRows.get(tableRows.size() - 1).getGrade().equals(grade)) {
row.setGradeRowSpan(countGradeRows(groupedData, grade));
}
if (tableRows.isEmpty() ||
!tableRows.get(tableRows.size() - 1).getGrade().equals(grade) ||
!tableRows.get(tableRows.size() - 1).getSubjectType().equals(subjectType)) {
row.setSubjectRowSpan(countSubjectRows(groupedData, grade, subjectType));
}
if (tableRows.isEmpty() ||
!tableRows.get(tableRows.size() - 1).getGrade().equals(grade) ||
!tableRows.get(tableRows.size() - 1).getSubjectType().equals(subjectType) ||
!tableRows.get(tableRows.size() - 1).getClassName().equals(className)) {
row.setClassRowSpan(students.size());
}
tableRows.add(row);
});
}
});
});
});
return tableRows;
}
private int countGradeRows(Map>>> groupedData, String grade) {
return groupedData.get(grade).values().stream()
.mapToInt(Map::size)
.sum();
}
private int countSubjectRows(Map>>> groupedData, String grade, String subjectType) {
return groupedData.get(grade).get(subjectType).size();
}
}
确保已安装Vue和axios:
bash
npm install axios
vue
学校名称
分班信息
学生信息
年级
文理科
班级
学号
姓名
{{ row.grade }}
{{ row.subjectType }}
{{ row.className }}
{{ row.studentId }}
{{ row.studentName }}
javascript
// main.js
import Vue from 'vue';
import App from './App.vue';
import axios from 'axios';
Vue.config.productionTip = false;
// 设置axios基础URL
axios.defaults.baseURL = 'http://localhost:8080'; // 根据实际后端地址调整
new Vue({
render: h => h(App),
}).$mount('#app');
Student
实体类存储学生信息TableRow
类来表示表格行数据,包含合并行数信息StudentService
处理业务逻辑,将学生数据按年级、文理科、班级分组shouldShowGrade
、shouldShowSubject
、shouldShowClass
方法判断是否显示单元格rowspan
属性实现单元格合并这个实现提供了完整的动态表格功能,包括合并单元格、点击交互和样式美化。根据实际需求,您可以进一步调整和扩展。