前后端分离是一种架构设计方式,它将前端和后端分开进行开发,使得两者之间可以独立演化。这种方式有许多优点,例如可以使开发人员更自由地分配工作,可以使前端和后端的技术栈独立,还可以使前端和后端的更新周期独立。
在这种方式下开发学生管理系统,你可以使用 Java 框架 Spring Boot 来开发后端,使用 MySQL 和 MyBatis 来存储和操作数据,使用 HTML、CSS、JS、Vue 和 Element-UI 来开发前端页面。
对于后端开发,你需要了解 Spring Boot 的基本概念和用法,包括如何创建 Spring Boot 应用、如何使用 Spring MVC 框架进行 Web 开发、如何使用 MyBatis 进行数据持久化操作等。
对于前端开发,你需要了解 HTML、CSS 和 JS 的基本用法,以及 Vue 和 Element-UI 的基本概念和用法。你还需要学习如何使用这些工具来创建响应式的 Web 页面,并与后端通过 HTTP 进行交互。
总的来说,要使用前后端分离的方式开发学生管理系统,你需要具备一定的 Web 开发基础知识,并且熟悉相关的框架和工具。
-
准备工作:安装 JDK、Maven、MySQL 等软件,并创建数据库和数据表。
-
创建 Spring Boot 项目:使用 IDEA 或其他工具创建一个新的 Spring Boot 项目。
-
配置 MyBatis:在项目中添加 MyBatis 依赖,并配置 MyBatis 的数据源和映射文件。
-
编写实体类和 DAO 接口:创建 Student 实体类和 StudentDao 接口,并编写相应的映射文件。
-
编写服务层和控制器:创建 StudentService 接口和 StudentController 类,并在控制器中处理 HTTP 请求。
-
启动服务器:运行 Spring Boot 项目,启动服务器。
-
创建前端项目:使用 Vue CLI 或其他工具创建一个新的 Vue 项目。
-
安装并引入 Element-UI:使用 npm 命令安装 Element-UI,并在 Vue 项目中引入 Element-UI。
-
编写前端页面:使用 HTML、CSS 和 Vue 技术编写前端页面,并使用 Element-UI 组件创建学生管理系统的用户界面。
-
配置前端路由:使用 Vue Router 配置前端路由,让不同的页面能够通过 URL 进行访问。
-
编写前端业务逻辑:使用 axios 库或其他工具进行 HTTP 请求,与后端进行交互。在 Vue 组件中编写相应的业务逻辑,实现学生管理系统的功能。
-
配置跨域访问:如果前端和后端的服务器地址不同,可能需要配置跨域访问。在 Spring Boot 中,可以使用 CORS 过滤器或者注解 @CrossOrigin 来实现。
-
发布项目:在本地调试前端和后端项目,确保功能正常。然后将前端项目打包,并将打包后的文件部署到 Web 服务器上。将后端项目打包,并使用 Java 命令行工具运行。
以上是使用前后端分离的方式开发学生管理系统的基本步骤。
后端具体代码:
首先,这里给出使用 Spring Boot 和 MyBatis 实现学生管理系统后端的具体代码实现。
- 实体类:Student 实体类表示学生,包含学号、姓名、性别和年龄等属性。
public class Student { private int id; private String name; private String gender; private int age; // getter 和 setter 方法省略 }
- DAO 接口:StudentDao 接口定义了对学生数据进行操作的方法,包括查询、新增、修改和删除等。
public interface StudentDao { List<Student> getAll(); Student getById(int id); int add(Student student); int update(Student student); int delete(int id); }
- 映射文件:StudentDao.xml 文件定义了对应 StudentDao 接口的 SQL 语句。
<!-- 省略 namespace 和 mapper 标签 --> <select id="getAll" resultType="Student"> SELECT * FROM student </select> <select id="getById" resultType="Student"> SELECT * FROM student WHERE id = #{id} </select> <insert id="add" parameterType="Student"> INSERT INTO student (name, gender, age) VALUES (#{name}, #{gender}, #{age}) </insert> <update id="update" parameterType="Student"> UPDATE student SET name = #{name}, gender = #{gender}, age = #{age} WHERE id = #{id} </update> <delete id="delete" parameterType="int"> DELETE FROM student WHERE id = #{id} </delete>
- 服务层接口:StudentService 接口定义了对学生数据进行业务处理的方法,包括获取所有学生、查询指定学生、新增学生、修改学生和删除学生等。
public interface StudentService { List<Student> getAll(); Student getById(int id); void add(Student student); void update(Student student void delete(int id); }
- 服务层实现类:StudentServiceImpl 类实现了 StudentService 接口,通过调用 DAO 层的方法来实现业务逻辑。
@Service public class StudentServiceImpl implements StudentService { @Autowired private StudentDao studentDao; @Override public List<Student> getAll() { return studentDao.getAll(); } @Override public Student getById(int id) { return studentDao.getById(id); } @Override public void add(Student student) { studentDao.add(student); } @Override public void update(Student student) { studentDao.update(student); } @Override public void delete(int id) { studentDao.delete(id); } }
- 控制器:StudentController 类处理 HTTP 请求,并调用服务层的方法来完成学生管理系统的功能。
@RestController @RequestMapping("/students") public class StudentController { @Autowired private StudentService studentService; @GetMapping public List<Student> getAll() { return studentService.getAll(); } @GetMapping("/{id}") public Student getById(@PathVariable int id) { return studentService.getById(id); } @PostMapping public void add(@RequestBody Student student) { studentService.add(student); } @PutMapping public void update(@RequestBody Student student) { studentService.update(student); } @DeleteMapping("/{id}") public void delete(@PathVariable int id) { studentService.delete(id); } }
以上是使用 Spring Boot 和 MyBatis 实现学生管理系统后端的具体代码实现。
具体前端代码实现:
这里给出使用 Vue.js 和 Element-UI 实现学生管理系统前端的具体代码实现。
- 安装并引入 Element-UI:
# 安装 Element-UI npm install element-ui # 在 main.js 中引入 Element-UI import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI)
- 编写前端页面:
<template> <div class="student-list"> <!-- 搜索栏 --> <el-input v-model="searchKey" placeholder="请输入搜索内容" style="width: 200px; margin-bottom: 20px;"> <el-button slot="append" @click="search">搜索</el-button> </el-input> <!-- 数据表格 --> <el-table :data="students" border style="width: 100%"> <!-- 表格列 --> <el-table-column prop="id" label="学号" width="120"></el-table-column> <el-table-column prop="name" label="姓名" width="120"></el-table-column> <el-table-column prop="gender" label="性别" width="80"></el-table-column> <el-table-column prop="age" label="年龄" width="80"></el-table-column> <el-table-column label="操作" width="180"> <template slot-scope="scope"> <el-button size="mini" @click="edit(scope.row)">编辑</el-button> <el-button size="mini" type="danger" @click="delete(scope.row.id)">删除</el-button> </template> </el-table-column> </el-table> <!-- 分页器 --> <el-pagination v-if="total > 0" :current-page="page" :page-sizes="[10, 20, 30]" :page-size="size" :total="total" layout="total, sizes, prev, pager, next, jumper" @current-change="pageChange" @size-change="sizeChange" ></el-pagination> <!-- 新增/编辑对话框 --> <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" :before-close="closeDialog"> <el-form ref="form" :model="form" label-width="80px"> <el-form-item label="学号" prop="id"> <el-input v-model="form.id" disabled></el-input> </el-form-item> <el-form-item label="姓名" prop="name" :rules="[{ required: true, message: '请输入姓名', trigger: 'blur' }]"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item label="性别" prop="gender" :rules="[{ required: true, message: '请选择性别', trigger: 'change' }]"> <el-radio v-model="form.gender" label="男"></el-radio> <el-radio v-model="form.gender" label="女"></el-radio> </el-form-item> <el-form-item label="年龄" prop="age" :rules="[{ required: true, message: '请输入年龄', trigger: 'blur' }]"> <el-input v-model="form.age"></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">取 消</el-button> <el-button type="primary" @click="save">确 定</el-button> </div> </el-dialog> </div> </template> <script> export default { data() { return { // 搜索关键字 searchKey: '', // 分页参数 page: 1, size: 10, total: 0, // 学生列表 students: [], // 新增/编辑对话框参数 dialogTitle: '新增学生', dialogVisible: false, form: { id: '', name: '', gender: '男', age: '' } } }, // 在页面加载完成后获取学生列表 mounted() { this.getStudents() }, methods: { // 获取学生列表 async getStudents() { const res = await this.$http.get('/students', { params: { search: this.searchKey, page: this.page, size: this.size } }) this.students = res.data.students this.total = res.data.total }, // 搜索 search() { this.getStudents() }, // 分页参数变化 pageChange(page) { this.page = page this.getStudents() }, sizeChange(size) { this.size = size this.getStudents() }, // 打开新增/编辑对话框 openDialog(student) { this.form = Object.assign({}, student) if (student) { this.dialogTitle = '编辑学生' } else { this.dialogTitle = '新增学生' } this.dialogVisible = true }, // 关闭新增/编辑对话框 closeDialog() { this.$refs.form.resetFields() this.form = { id: '', name: '', gender: '男', age: '' } }, // 编辑学生 edit(student) { this.openDialog(student) }, // 删除学生 async delete(id) { await this.$confirm('此操作将永久删除该学生, 是否继续?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }) await this.$http.delete(/students/${id}) this.getStudents() }, // 保存学生 async save() { if (this.form.id) { // 编辑学生 await this.$http.put(/students/${this.form.id}, this.form) } else { // 新增学生 await this.$http.post('/students', this.form) } this.dialogVisible = false this.getStudents() } } } </script> <style> .student-list { display: flex; flex-direction: column; height: 100%; } .student-list > .el-table { flex: 1; } </style>
以上是使用 Vue.js 和 Element-UI 实现学生管理系统前端的具体代码实现。希望这些代码能够帮到你。
在实际开发中,你还需要注意以下几点:
-
前后端的数据交互可以使用 HTTP 协议的 GET、POST、PUT 和 DELETE 方法来实现。前端可以使用 Axios 或者 fetch API 来发送 HTTP 请求。
-
前端页面的布局可以使用 Element-UI 中的布局组件,如 el-row、el-col、el-card 等来实现。
-
前端页面的交互可以使用 Element-UI 中的交互组件,如 el-dialog、el-button、el-input、el-form 等来实现。
-
前端页面的样式可以使用 CSS 来调整,也可以使用 Element-UI 中的样式类来调整。
-
前端页面的路由可以使用 Vue Router 来实现,它能够帮助你实现单页应用。