Vue案例—学生管理系统—html版(下篇)(一)

简介: Vue案例—学生管理系统—html版(下篇)

5. 学生管理

5.1 增删改查(含条件/分页)

  • 需求

c4ed8daf17974376be0ebb14ba94aaa4.png

5.1.1 后端实现

  • 编写JavaBean:表对应 Student、条件封装 StudentVo

—— Student

package com.czxy.domain;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name = "tb_student")
@Data  //该注解作用:自动生成构造和set/get方法
public class Student {
    @Id
    @Column(name = "s_id")
    private String sid ;
    @Column(name = "sname")
    private String sname ;
    @Column(name = "age")
    private Integer age ;
    @Column(name = "birthday")
    private String birthday ;
    @Column(name = "gender")
    private String gender ;
    @Column(name = "c_id")
    private String cid ;
    @Column(name = "city_ids")
    private String city_ids ;
    private Classes classes;
}

—— StudentVo 【条件封装类】

package com.czxy.domain;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name = "tb_student")
@Data  //该注解作用:自动生成构造和set/get方法
public class Student {
    @Id
    @Column(name = "s_id")
    private String sid ;
    @Column(name = "sname")
    private String sname ;
    @Column(name = "age")
    private Integer age ;
    @Column(name = "birthday")
    private String birthday ;
    @Column(name = "gender")
    private String gender ;
    @Column(name = "c_id")
    private String cid ;
    @Column(name = "city_ids")
    private String city_ids ;
    private Classes classes;
}

—— StudentVo 【条件封装类】

package com.czxy.vo;
import lombok.Data;
@Data
public class StudentVo {
    private String cid;             //班级id
    private String sname;           //学生姓名
    private String startAge;        //开始年龄
    private String endAge;         //结束年龄
}

编写Mapper:StudentMapper

25560b8a069047eebff061b6439d2ada.png

package com.czxy.mapper;
import com.czxy.domain.Student;
import tk.mybatis.mapper.common.Mapper;
@org.apache.ibatis.annotations.Mapper
public interface StudentMapper extends Mapper<Student> {
}
  • 编写service

91bac79f7a01457b8c981366090d75cb.png

—— SetudentService接口

package com.czxy.service;
import com.czxy.domain.Student;
import com.czxy.vo.StudentVo;
import com.github.pagehelper.PageInfo;
public interface StudentService {
    //查询详情
    Student selectById(String sid);
    //添加或修改
    boolean saveOrupdate(Student student);
    //删除
    boolean delete(String sid);
    //分页条件查询
    PageInfo<Student> condition(StudentVo studentVo, Integer pageSize, Integer pageNum);
}

——StudentServiceImp实现类

package com.czxy.service.impl;
import com.czxy.domain.Classes;
import com.czxy.domain.Student;
import com.czxy.mapper.ClassesMapper;
import com.czxy.mapper.StudentMapper;
import com.czxy.service.StudentService;
import com.czxy.vo.StudentVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import javax.annotation.Resource;
import java.util.List;
@Service
@Transactional
public class StudentServiceImpl implements StudentService {
    @Resource
    private StudentMapper studentMapper;
    @Resource
    private ClassesMapper classesMapper;
    //查询详情
    @Override
    public Student selectById(String sid) {
        Student student = studentMapper.selectByPrimaryKey(sid);
        return student;
    }
    //添加或修改
    @Override
    public boolean saveOrupdate(Student student) {
        Student stu = studentMapper.selectByPrimaryKey(student.getSid());
        int result = -1 ;
        if (stu == null){
            //添加
            result = studentMapper.insert(student);
        }else {
            //修改
            result = studentMapper.updateByPrimaryKey(student);
        }
        return result==1;
    }
    //删除
    @Override
    public boolean delete(String sid) {
        int i = studentMapper.deleteByPrimaryKey(sid);
        return i==1;
    }
    //分页查询
    @Override
    public PageInfo<Student> condition(StudentVo studentVo, Integer pageSize, Integer pageNum) {
        //条件
        Example example = new Example(Student.class);
        Example.Criteria c = example.createCriteria();
        //班级id
        if(studentVo.getCid() != null && !studentVo.getCid().equals("")){
            c.andLike("cid","%"+studentVo.getCid()+"%");
        }
        //姓名
        if(studentVo.getSname() != null && !studentVo.getSname().equals("")){
            c.andEqualTo("sname",studentVo.getSname());
        }
        //开始年龄
        if(studentVo.getStartAge() != null && !studentVo.getStartAge().equals("")){
            c.andGreaterThanOrEqualTo("age",studentVo.getStartAge());
        }
        //结束年龄
        if(studentVo.getEndAge() != null && !studentVo.getEndAge().equals("")){
            c.andLessThanOrEqualTo("age",studentVo.getEndAge());
        }
        //分页
        PageHelper.startPage(pageNum,pageSize);
        //查询
        List<Student> list = studentMapper.selectByExample(example);
        //关联
        list.forEach(student -> {
            Classes classes = classesMapper.selectByPrimaryKey(student.getCid());
            student.setClasses(classes);
            //对生日进行字符串截取
            String[] s = student.getBirthday().split(" ");
            student.setBirthday(s[0]);
        });
        //封装
        PageInfo<Student> pageInfo = new PageInfo<>(list);
        return pageInfo;
    }
}
  • 编写controller

—— StudentController

7b88ddb6e72e4ab4afa457a1eddaf3c0.png

package com.czxy.controller;
import com.czxy.domain.Classes;
import com.czxy.domain.Student;
import com.czxy.service.ClassesService;
import com.czxy.service.StudentService;
import com.czxy.vo.BaseResult;
import com.czxy.vo.StudentVo;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/student")
@CrossOrigin
public class StudentController {
    @Resource
    private StudentService studentService;
    //分页条件查询
    @PostMapping("/condition/{pageSize}/{pageNum}")
    public BaseResult condition(
            @RequestBody StudentVo studentVo,
            @PathVariable("pageSize") Integer pageSize,
            @PathVariable("pageNum") Integer pageNum
            ){
        //查询
        PageInfo<Student> pageInfo = studentService.condition(studentVo,pageSize,pageNum);
        //处理
        return BaseResult.ok("查询成功",pageInfo);
    }
    @PostMapping("/saveOrupdate")
    public BaseResult addOrupdate(@RequestBody Student student) {
        try {
            boolean f = studentService.saveOrupdate(student);
            if (f){
                return BaseResult.ok("编辑成功!");
            }else {
                return BaseResult.ok("编辑失败!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return BaseResult.error(e.getMessage());
        }
    }
    //根据id查询
    @GetMapping("/{sid}")
    public BaseResult selectById(@PathVariable("sid") String sid){
        Student student = studentService.selectById(sid);
        return BaseResult.ok("查询详情",student);
    }
    //删除
    @DeleteMapping("/{sid}")
    public BaseResult delete(@PathVariable("sid") String sid){
        try {
            boolean f = studentService.delete(sid);
            if (f){
                return BaseResult.ok("删除成功");
            }
            return BaseResult.error("删除失败");
        } catch (Exception e) {
            e.printStackTrace();
            return BaseResult.error(e.getMessage());
        }
    }
}

5.1.2 前端实现 [ 采用修改和添加共用一个页面 ]

—— 静态页面编写

结构:

aa8f17ae44434ab4a3d4b5884a6bd53f.png

—— list.html  学生列表页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src = "../js/axios.js"></script>
    <script src = "../js/vue.js"></script>
</head>
<body>
<div id="app">
    <table border="1">
        <tr>
            <td>学生id</td>
            <td>
                <input type="text" :readonly = "sid != ''" v-model="student.sid"/>
            </td>
        </tr>
        <tr>
            <td>选择班级</td>
            <td>
                <select v-model="student.cid">
                    <option v-for="(classes,index) in classesList" :value="classes.cid ">{{classes.cname}}</option>
                </select>
            </td>
        </tr>
        <tr>
            <td>姓名</td>
            <td>
                <input type="text" v-model="student.sname"/>
            </td>
        </tr>
        <tr>
            <td>年龄</td>
            <td>
                <input type="text" v-model="student.age"/>
            </td>
        </tr>
        <tr>
            <td>性别</td>
            <td>
                <input type="radio" value = "0" name="gender" v-model="student.gender"/> 男
                <input type="radio" value = "1" name="gender" v-model="student.gender"/> 女
            </td>
        </tr>
        <tr>
            <td>生日</td>
            <td>
                <input type="text" v-model="student.birthday"/>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="button" :value="sid==''? '添加': '修改'" @click="saveOrupdate_stu()"/>
            </td>
        </tr>
    </table>
</div>
</body>
</html>
<script>
    new Vue({
        el : '#app',
        data :{
            classesList: [],
            sid: '',     // id值
            student: {}  //查询结果,表单绑定对象
        },
        methods: {
            async selectAll_Cls() {
                var url = `http://localhost:8080/classes`;
                let {data: baseResult } = await axios.get(url);
                if (baseResult.code == 20000 ) {
                    this.classesList = baseResult.data;
                }else {
                    alter(baseResult.message);
                }
            },
            async selectById() {
                let {data: baseResult } = await axios.get(`http://localhost:8080/student/${this.sid}`);
                if (baseResult.code == 20000) {
                    this.student = baseResult.data;
                }else {
                    alter(baseResult.message);
                }
            },
            //编辑案例事件
            async saveOrupdate_stu() {
                let {data: baseResult } = await axios.post(`http://localhost:8080/student/saveOrupdate`,this.student);
                if(baseResult.code == 20000 ) {
                    //成功-- 列表页面
                    location.href = "/stu/list.html";
                }else {
                    alter(baseResult.message);
                }
            }
        },
        mounted() {
            this.selectAll_Cls();
            //获得sid
            this.sid = location.href.split("?sid=")[1];
            //判断是否有id.有就查询
            if (this.sid) {
                //修改
                this.selectById();
            } else {
                //添加
                this.sid = '';
            }
        },
    })
</script>

—— 查询分页效果页面结果展示

98044beb712b4ff88a9ff01010b6ff9f.png

—— SaveOrUpdate.html  添加和修改页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src = "../js/axios.js"></script>
    <script src = "../js/vue.js"></script>
</head>
<body>
<div id="app">
    <table border="1">
        <tr>
            <td>学生id</td>
            <td>
                <input type="text" :readonly = "sid != ''" v-model="student.sid"/>
            </td>
        </tr>
        <tr>
            <td>选择班级</td>
            <td>
                <select v-model="student.cid">
                    <option v-for="(classes,index) in classesList" :value="classes.cid ">{{classes.cname}}</option>
                </select>
            </td>
        </tr>
        <tr>
            <td>姓名</td>
            <td>
                <input type="text" v-model="student.sname"/>
            </td>
        </tr>
        <tr>
            <td>年龄</td>
            <td>
                <input type="text" v-model="student.age"/>
            </td>
        </tr>
        <tr>
            <td>性别</td>
            <td>
                <input type="radio" value = "0" name="gender" v-model="student.gender"/> 男
                <input type="radio" value = "1" name="gender" v-model="student.gender"/> 女
            </td>
        </tr>
        <tr>
            <td>生日</td>
            <td>
                <input type="text" v-model="student.birthday"/>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="button" :value="sid==''? '添加': '修改'" @click="saveOrupdate_stu()"/>
            </td>
        </tr>
    </table>
</div>
</body>
</html>
<script>
    new Vue({
        el : '#app',
        data :{
            classesList: [],
            sid: '',     // id值
            student: {}  //查询结果,表单绑定对象
        },
        methods: {
            async selectAll_Cls() {
                var url = `http://localhost:8080/classes`;
                let {data: baseResult } = await axios.get(url);
                if (baseResult.code == 20000 ) {
                    this.classesList = baseResult.data;
                }else {
                    alter(baseResult.message);
                }
            },
            async selectById() {
                let {data: baseResult } = await axios.get(`http://localhost:8080/student/${this.sid}`);
                if (baseResult.code == 20000) {
                    this.student = baseResult.data;
                }else {
                    alter(baseResult.message);
                }
            },
            //编辑案例事件
            async saveOrupdate_stu() {
                let {data: baseResult } = await axios.post(`http://localhost:8080/student/saveOrupdate`,this.student);
                if(baseResult.code == 20000 ) {
                    //成功-- 列表页面
                    location.href = "/stu/list.html";
                }else {
                    alter(baseResult.message);
                }
            }
        },
        mounted() {
            this.selectAll_Cls();
            //获得sid
            this.sid = location.href.split("?sid=")[1];
            //判断是否有id.有就查询
            if (this.sid) {
                //修改
                this.selectById();
            } else {
                //添加
                this.sid = '';
            }
        },
    })
</script>

—— 添加页面结果展示

ead28510f6a448da90a019112e235502.png

—— 修改页面结果展示

b135e0815ae7448ba43dab7aad93ba71.png


相关文章
|
2月前
|
JavaScript 前端开发 安全
vue -- 指令 -- v-text/html/on/show/if/bind/for/model
【10月更文挑战第17天】Vue 指令是构建 Vue 应用的基础工具,掌握它们的特性和用法是成为一名优秀 Vue 开发者的重要一步。通过深入理解和熟练运用这些指令,可以打造出更加出色的前端应用。
80 50
|
1月前
|
分布式计算 JavaScript 前端开发
vue学习第8章(vue的购物车案例)
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,正向全栈进发。本篇分享一个综合练习小demo,包括目录结构、HTML、JS及CSS代码,通过增删商品实现总价计算。关注我,获取更多前端知识!🎉🎉🎉
29 1
|
2月前
|
存储 缓存 JavaScript
vue表单案例练习:vue表单创建一行数据及删除数据的实现与理解
vue表单案例练习:vue表单创建一行数据及删除数据的实现与理解
49 2
|
2月前
|
JavaScript
《进阶篇第9章》学习vuex知识点后练习:求和案例_纯vue版代码
《进阶篇第9章》学习vuex知识点后练习:求和案例_纯vue版代码
17 1
|
2月前
|
JavaScript 前端开发 容器
Vue生成PDF文件攻略:html2canvas与jspdf联手,中文乱码与自动换行难题攻克
Vue生成PDF文件攻略:html2canvas与jspdf联手,中文乱码与自动换行难题攻克
220 0
|
3月前
|
JavaScript 前端开发 API
Vue2与Vue3插槽使用的区别及案例
Vue 3在插槽功能上的改进,体现了其对开发体验的持续优化。通过简化API、加强动态特性和提升性能,Vue 3使得插槽的使用更加灵活和高效。这些改进不仅有助于减轻开发者的负担,还为组件之间的高级交互和内容复用打开了新的可能性。随着Vue生态系统的不断成熟,我们有理由相信,Vue将继续为前端开发提供强大且易用的工具。
77 3
|
3月前
|
JavaScript
vue 计算属性,实现复选框的全选和反选 【小案例】
本文通过一个Vue.js小案例,展示了如何使用计算属性实现复选框的全选和反选功能。计算属性的完整写法包括get和set两部分,分别用于获取值和设置值。在全选和反选的场景中,计算属性的get方法用于判断所有复选框是否都已选中,从而控制全选复选框的状态;计算属性的set方法则用于根据全选复选框的状态,批量更新每个复选框的选中状态。通过示例代码和效果图,文章清晰地说明了计算属性在实现这一功能中的作用和效果。
vue 计算属性,实现复选框的全选和反选 【小案例】
|
3月前
|
JavaScript 前端开发
react字符串转为dom标签,类似于Vue中的v-html
本文介绍了在React中将字符串转换为DOM标签的方法,类似于Vue中的`v-html`指令,通过使用`dangerouslySetInnerHTML`属性实现。
109 0
react字符串转为dom标签,类似于Vue中的v-html
|
2月前
|
JavaScript
【有手就行系列】Vue快速入门案例
【有手就行系列】Vue快速入门案例
30 0
|
4月前
|
资源调度 JavaScript 应用服务中间件
HTML、WebStrom和Vue使用
HTML、WebStrom和Vue使用
28 3
下一篇
DataWorks