SSM02

news2024/12/27 16:39:10

SSM02

此时我们已经做好了登录模块接下来可以做一下学生管理系统的增删改查操作

首先,我们应当有一个登录成功后的主界面

在webapp下新建

1.main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
    <script src="js/jquery.min.js"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>

    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .el-header {
            background-color: #B3C0D1;
            color: #333;
            line-height: 60px;
        }

        .el-tabs__header {
            margin: 0;
        }

        .el-aside {
            color: #333;
            height: 640px;
        }

        .el-main {
            padding: 0;
        }
    </style>
</head>
<body>
<div id="app">
    <el-container style="height: 500px; border: 1px solid #eee">
        <el-header style="text-align: right; font-size: 12px">
            <span>欢迎用户:</span>
            <el-dropdown>
                <i class="el-icon-setting" style="margin-right: 15px"></i>
                <el-dropdown-menu slot="dropdown">
                    <el-dropdown-item>查看</el-dropdown-item>
                    <el-dropdown-item>新增</el-dropdown-item>
                    <el-dropdown-item>删除</el-dropdown-item>
                </el-dropdown-menu>
            </el-dropdown>
            <span>{{userInfo.ename}}</span>
        </el-header>


        <el-container>
            <el-aside width="200px" style="background-color: rgb(238, 241, 246)">
                <el-menu>
                    <el-submenu v-for="p in permissionArr" :index="p.id">
                        <template slot="title"><i :class="p.icon"></i>{{p.title}}</template>
                        <el-menu-item-group>
                            <el-menu-item v-for="sp in p.subMenu" :index="sp.id"
                                          @click="addTabs(sp)">
                                {{sp.title}}
                            </el-menu-item>
                        </el-menu-item-group>
                    </el-submenu>
                </el-menu>
            </el-aside>

            <el-main>
                <el-tabs v-model="editableTabsValue" type="card" closable @tab-remove="removeTab">
                    <el-tab-pane

                            key="asd"
                            label="欢迎页"
                            name="asd"
                    >
                        <iframe src="http://www.douyu.com" style="border: none;width: 99%;height: 600px;"></iframe>
                    </el-tab-pane>
                    <el-tab-pane
                            v-for="(item, index) in editableTabs"
                            :key="item.id"
                            :label="item.title"
                            :name="item.id"
                    >
                        <iframe :src="item.content" style="border: none;width: 99%;height: 600px;"></iframe>
                    </el-tab-pane>
                </el-tabs>
            </el-main>
        </el-container>
    </el-container>
</div>
<script>
    $.get("/ssm/emp/getInfo", function (backData) {
        app.userInfo = backData.data.userInfo
        app.permissionArr = backData.data.permissionInfo
    })

    var app = new Vue({
        el: "#app",
        data: {
            tableData: [],
            editableTabsValue: "asd",
            editableTabs: [],
            userInfo: {},
            permissionArr: [],
        },
        methods: {
            addTabs(data) {
                if (this.editableTabs.indexOf(data) < 0) {
                    console.log(this.editableTabs)
                    this.editableTabs.push(data);
                }
                this.editableTabsValue = data.id;
            },
            removeTab(targetName) {
                let tabs = this.editableTabs;
                let activeName = this.editableTabsValue;
                if (activeName === targetName) {
                    tabs.forEach((tab, index) => {
                        if (tab.id === targetName) {
                            let nextTab = tabs[index + 1] || tabs[index - 1];
                            if (nextTab) {
                                activeName = nextTab.id;
                            }
                        }
                    });
                }
                this.editableTabsValue = activeName;
                this.editableTabs = tabs.filter(tab => tab.id !== targetName);
            },
        }
    })
</script>
</body>
</html>

在这个页面中,我们点击业务管理中的学生管理,就可以在右侧访问学生管理的界面。其他模块可以自行添加

进入学生管理页面,我们首先要在页面中展示学生信息

先在webapp下新建views/student/list.html

2.list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../../js/vue.js"></script>
    <script src="../../js/jquery.min.js"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
</head>
<body>
<div id="app">
    <el-input v-model="queryInfo.name" placeholder="请输入名字" style="display: inline-block;width: 200px;"></el-input>
    <el-input v-model="queryInfo.minAge" placeholder="请输入最小年龄"
              style="display: inline-block;width: 200px;"></el-input>
    <el-input v-model="queryInfo.maxAge" placeholder="请输入最大年龄"
              style="display: inline-block;width: 200px;"></el-input>
    <el-button type="primary" icon="el-icon-search" @click="searchData()">搜索</el-button>
    <el-button type="primary">上传<i class="el-icon-upload el-icon--right"></i></el-button>
    <el-button type="primary">下载<i class="el-icon-download el-icon--right"></i></el-button>
    <el-button type="success" round @click="openAddStu()">添加学生</el-button>

    <el-table
            :data="tableData"
            border
            style="width: 100%">
        <el-table-column
                prop="id"
                label="编号"
        >
        </el-table-column>
        <el-table-column
                prop="name"
                label="姓名"
        >
        </el-table-column>
        <el-table-column
                prop="age"
                label="年龄">
        </el-table-column>
        <el-table-column
                prop="address"
                label="地址">
        </el-table-column>
        <el-table-column
                label="班级">
            <template slot-scope="scope">
                {{scope.row.grade.gname}}
            </template>
        </el-table-column>
        <el-table-column
                label="头像">
            <template slot-scope="scope">
                <img v-bind:src="scope.row.headImg" width="50px"/>
            </template>
        </el-table-column>
        <el-table-column
                label="操作">
            <template slot-scope="scope">
                <el-button @click="deleteStudent(scope.row.id)" type="danger" icon="el-icon-delete" circle></el-button>
                <el-button @click="openUpdateStu(scope.row.id)" type="primary" icon="el-icon-edit" circle></el-button>
            </template>
        </el-table-column>
    </el-table>

    <el-pagination
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            :current-page="1"
            :page-sizes="[5, 10, 15, 20]"
            :page-size="5"
            layout="total, sizes, prev, pager, next, jumper"
            :total="t">
    </el-pagination>

    <el-dialog :title="titlename" :visible.sync="dialogFormVisible">
        <el-form :model="stuInfo" :rules="rules" ref="stuInfo">
            <el-form-item label="学生姓名" prop="sname">
                <el-input v-model="stuInfo.sname" autocomplete="off"></el-input>
            </el-form-item>
            <el-form-item label="学生年龄" prop="sage">
                <el-input v-model="stuInfo.sage" autocomplete="off"></el-input>
            </el-form-item>
            <el-form-item label="学生地址" prop="saddress">
                <el-input v-model="stuInfo.saddress" autocomplete="off"></el-input>
            </el-form-item>
            <el-form-item label="学生班级" prop="gid">
                <el-select placeholder="请选择班级" v-model="stuInfo.gid">
                    <el-option v-for="g in gradeArr" :label="g.gname" :value="g.id"></el-option>
                </el-select>
            </el-form-item>
        </el-form>
        <div slot="footer" class="dialog-footer">
            <el-button @click="dialogFormVisible = false">取 消</el-button>
            <el-button type="primary" @click="addStudent()">确 定</el-button>
        </div>
    </el-dialog>
</div>

<script>

    var app = new Vue({
        el: "#app",
        data: {
            titlename: "",
            dialogFormVisible: false,
            queryInfo: {},
            stuInfo: {},
            tableData: [],
            gradeArr: [],
            size: 5,
            t: 100,
            rules: {
                sname: [
                    {required: true, message: '请输入姓名', trigger: 'blur'},
                ],
                sage: [
                    {required: true, message: '请输入年龄', trigger: 'blur'},
                ],
                saddress: [
                    {required: true, message: '请输入地址', trigger: 'blur'},
                ],
                gid: [
                    {required: true, message: '请选择班级', trigger: 'blur'},
                ]
            }
        },
        methods: {
            openUpdateStu(id) {
                //请求班级的数据
                $.get("/ssm/grade/list", function (backData) {
                    app.gradeArr = backData.data
                    $.get("/ssm/stu/get/" + id, function (backData) {
                        app.stuInfo = backData.data
                        app.titlename = "修改学生"
                        app.dialogFormVisible = true
                    })
                })
            },
            addStudent() {
                this.$refs["stuInfo"].validate((valid) => {
                    if (valid) {
                        var path = app.titlename === "添加学生" ? "/ssm/stu/add" : "/ssm/stu/update"
                        //发送ajax请求到后台
                        $.post(path, app.stuInfo, function (backData) {
                            if (backData.code == 1) {
                                app.$message({
                                    type: 'success',
                                    message: '操作成功!'
                                });
                                window.location.reload()
                            } else {
                                app.$message({
                                    type: 'danger',
                                    message: '操作失败!'
                                });
                            }
                        })
                    }
                });
            },
            openAddStu() {
                //请求班级的数据
                $.get("/ssm/grade/list", function (backData) {
                    app.gradeArr = backData.data
                    app.stuInfo = {}
                    app.titlename = "添加学生"
                    app.dialogFormVisible = true
                })
            },
            deleteStudent(id) {
                this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {

                    $.get("/ssm/stu/delete/" + id, function (backData) {
                        if (backData.code === 1) {
                            app.$message({
                                type: 'success',
                                message: '删除成功!'
                            });

                            window.location.reload()
                        } else {
                            app.$message({
                                type: 'danger',
                                message: '删除失败!'
                            });
                        }

                    });
                });
            },
            handleSizeChange(val) {
                app.size = val
                getStudentData(1, app.size)
            },
            handleCurrentChange(val) {
                getStudentData(val, app.size)
            },
            searchData() {
                getStudentData(1, app.size)
            }
        }
    })
    
    function getStudentData(a, b) {
        app.queryInfo.pageNo = a;
        app.queryInfo.pageCount = b;
        $.post("/ssm/stu/query", app.queryInfo, function (backData) {
            app.tableData = backData.data.currentData
            app.t = backData.data.totalCount
        })
    }
    
    getStudentData(1, 5)
</script>
</body>
</html>

在数据正常展示时,页面效果如下

在这里插入图片描述

接下来进行数据的增删改查操作,此处只进行流程分析,源码在文章后边

3流程分析

当我们进入到学生管理界面,首先需要查询数据库中的数据,并且把他显示在页面当中

我们使用的是ElementUI提供的分页查询的代码。首先要发送post请求到"/ssm/stu/query"获取数据

  1. 在controller文件夹下创建StudentController用来处理请求的分发其中包括有
    1. 获取全部学生数据
    2. 根据ID删除学生
    3. 添加学生
    4. 根据ID获取单个学生
    5. 更新学生信息
  2. 在StudentController接收到请求时会调用service层的方法
  3. 首先有一个StudentService接口其中写了上述的五个方法
  4. 在新建StudentService的实现类,其中写的是业务处理的具体流程
  5. 在实现类中,我们想要实现业务需求,我们就要去调用mapper层中的方法去连接数据库进行数据的读取
  6. mapper层又要去找对应的mapper.xml配置文件进行sql语句的编写

所以这是一个连贯的过程,这里不再过多赘述

当获取到的数据响应到页面,这时一个完整的业务流程才算完毕

我们在实现类中可能会遇到实体类传参所以还要新建一些实体类,这些类放在pojo文件夹下

源码如下

4.controller层

4.1StudentController

package com.aaa.ssm.controller;

import com.aaa.ssm.pojo.vo.StudentQuery;
import com.aaa.ssm.pojo.vo.StudentVO;
import com.aaa.ssm.result.AjaxResult;
import com.aaa.ssm.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author Grg
 * @Date 2023/9/18 17:49
 * @PackageName:com.aaa.ssm.controller
 * @ClassName: StudentController
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */

@RestController
@RequestMapping("stu")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @RequestMapping("query")
    public AjaxResult queryStudent(StudentQuery query) {
        return studentService.queryStudent(query);
    }

    @RequestMapping("delete/{id}")
    public AjaxResult deleteStudent(@PathVariable("id") Integer id) {
        return studentService.deleteStudent(id);
    }

    @RequestMapping("add")
    public AjaxResult addStudent(StudentVO studentVO) {

        return studentService.addStudent(studentVO);
    }
    @RequestMapping("get/{id}")
    public AjaxResult getStudentById(@PathVariable("id") Integer id) {
        return studentService.getStudentById(id);
    }

    @RequestMapping("update")
    public AjaxResult updateStudent(StudentVO studentVO) {
        return studentService.updateStudent(studentVO);
    }

}

4.2EmpController

package com.aaa.ssm.controller;

import com.aaa.ssm.result.AjaxResult;
import com.aaa.ssm.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author Grg
 * @Date 2023/9/17 14:49
 * @PackageName:com.aaa.ssm.controller
 * @ClassName: EmpController
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
@RestController
@RequestMapping("emp")
public class EmpController {

    @Autowired
    private EmpService empService;


    @RequestMapping("login")
    public AjaxResult login(String username, String password) {
        return empService.login(username, password);
    }

    @RequestMapping("getInfo")
    public AjaxResult getInfo() {
        return empService.getInfo();
    }
}

4.3GradeController

package com.aaa.ssm.controller;
import com.aaa.ssm.result.AjaxResult;
import com.aaa.ssm.service.GradeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author Grg
 * @Date 2023/9/18 17:49
 * @PackageName:com.aaa.ssm.controller
 * @ClassName: StudentController
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */

@RestController
@RequestMapping("grade")
public class GradeController {

    @Autowired
    private GradeService gradeService;

    @RequestMapping("list")
    public AjaxResult queryStudent() {
        return gradeService.listAllGrade();
    }
}

5.mapper层

5.1EmpMapper

package com.aaa.ssm.mapper;
import com.aaa.ssm.pojo.dto.EmpDTO;
import com.aaa.ssm.pojo.dto.LoginDTO;
import org.apache.ibatis.annotations.Param;
/**
 * @Author Grg
 * @Date 2023/9/17 15:02
 * @PackageName:com.aaa.ssm.mapper
 * @ClassName: EmpMapper
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
public interface EmpMapper {
    LoginDTO login(@Param("username")String username,@Param("password") String password);
    EmpDTO getEmpInfoByEid(Integer eid);
}

5.2GradeMapper

package com.aaa.ssm.mapper;
import com.aaa.ssm.pojo.dto.GradeDTO;
import java.util.List;
/**
 * @Author Grg
 * @Date 2023/9/19 15:02
 * @PackageName:com.aaa.ssm.mapper
 * @ClassName: GradeMapper
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
public interface GradeMapper {
    List<GradeDTO> listAllGrades();
}

5.3PermissionMapper

package com.aaa.ssm.mapper;
import com.aaa.ssm.pojo.dto.PermissionDTO;
import java.util.List;
/**
 * @Author Grg
 * @Date 2023/9/18 15:13
 * @PackageName:com.aaa.ssm.mapper
 * @ClassName: PermissionMapper
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
public interface PermissionMapper {
    List<PermissionDTO> listSuperAdminPermissions();
    List<PermissionDTO> listNormalAdminPermissions(Integer rid);
}

5.4StudentMapper

package com.aaa.ssm.mapper;
import com.aaa.ssm.pojo.dto.StudentDTO;
import com.aaa.ssm.pojo.vo.StudentQuery;
import com.aaa.ssm.pojo.vo.StudentVO;
import java.util.List;
/**
 * @Author Grg
 * @Date 2023/9/18 17:55
 * @PackageName:com.aaa.ssm.mapper
 * @ClassName: StudentMapper
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
public interface StudentMapper {
    List<StudentDTO> queryStudentByQuery(StudentQuery query);
    Long queryStudentTotalCount(StudentQuery query);
    int deleteStudentById(Integer id);
    int addStudent(StudentVO studentVO);
    StudentVO getStudentById(Integer id);
    int uptateStudent(StudentVO studentVO);
}

6.pojo

6.1dto

6.1.1DeptDTO

package com.aaa.ssm.pojo.dto;
import lombok.Data;
import java.io.Serializable;
/**
 * @Author Grg
 * @Date 2023/9/17 15:22
 * @PackageName:com.aaa.ssm.pojo.dto
 * @ClassName: DeptDTO
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
@Data
public class DeptDTO implements Serializable {
    private Integer id;
    private String dname;
    private String other;
    private Integer state;
}

6.1.2EmpDTO

package com.aaa.ssm.pojo.dto;
import lombok.Data;
import java.io.Serializable;

/**
 * @Author Grg
 * @Date 2023/9/17 15:20
 * @PackageName:com.aaa.ssm.pojo.dto
 * @ClassName: EmpDTO
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
@Data
public class EmpDTO implements Serializable {
    private Integer id;
    private String ename;
    private String hiredate;
    private String telephone;
    private DeptDTO dept;
    private RoleDTO role;
}

6.2vo

6.2.1StudentVO

package com.aaa.ssm.pojo.vo;
import lombok.Data;
import java.io.Serializable;
/**
 * @Author Grg
 * @Date 2023/9/19 15:45
 * @PackageName:com.aaa.ssm.pojo.vo
 * @ClassName: StudentVO
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
@Data
public class StudentVO implements Serializable {
    private Integer id;
    private String sname;
    private Integer sage;
    private String saddress;
    private Integer gid;
}

当然不止这些,还有好几个(懒得写了,实在头皮发麻)这些类主要就是用来接收参数用的

这一块需要注意的是,我们的数据库中其实是有外键的,虽然是逻辑外键。我们在新建类中可以看到,在类中有私有的成员对象,我们使用这种方法来凸显外键的作用

剩下的在这里就放张截图叭

在这里插入图片描述

7.result

用来接收AJAX请求返回结果

AjaxResult

package com.aaa.ssm.result;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Author Grg
 * @Date 2023/8/28 15:58
 * @PackageName:com.grg.Result
 * @ClassName: AjaxResult
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AjaxResult {
    private Integer code;
    private String msg;
    private Object data;


    public static AjaxResult success() {
        return new AjaxResult(1,"操作成功",null);
    }
    public static AjaxResult success(Object data) {
        return new AjaxResult(1,"操作成功",data);
    }
    public static AjaxResult error() {
        return new AjaxResult(2,"操作失败",null);
    }
    public static AjaxResult error(String msg) {
        return new AjaxResult(2,msg,null);
    }

}

8.service

8.1impl实现类

8.1.1EmpServiceImpl

package com.aaa.ssm.service.impl;

import com.aaa.ssm.mapper.EmpMapper;
import com.aaa.ssm.mapper.PermissionMapper;
import com.aaa.ssm.pojo.dto.EmpDTO;
import com.aaa.ssm.pojo.dto.LoginDTO;
import com.aaa.ssm.pojo.dto.PermissionDTO;
import com.aaa.ssm.result.AjaxResult;
import com.aaa.ssm.service.EmpService;
import com.aaa.ssm.sysconst.DeptState;
import com.aaa.ssm.sysconst.EmpState;
import com.aaa.ssm.util.PermissionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @Author Grg
 * @Date 2023/9/17 15:00
 * @PackageName:com.aaa.ssm.service.impl
 * @ClassName: EmpServiceImpl
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;

    @Autowired
    private PermissionMapper permissionMapper;

    @Autowired
    private HttpSession session;

    @Override
    public AjaxResult login(String username, String password) {
        //1.验证账号密码是否正确
        LoginDTO login = empMapper.login(username, password);

        //1.5账号的状态是什么 state 0在职  1冻结  2离职
        if (login == null) {
            return AjaxResult.error("账号或者密码错误");
        }
        if (login.getState() == EmpState.EMP_DONGJIE) {
            return AjaxResult.error("账号被冻结");
        }
        if (login.getState() == EmpState.EMP_LIZHI) {
            return AjaxResult.error("员工已经离职 联系管理员");
        }
        //2.如果正确 获取员工编号 查询员工信息
        Integer eid = login.getEid();
        EmpDTO empInfo = empMapper.getEmpInfoByEid(eid);

        if (empInfo.getDept().getState() == DeptState.DEPT_STATE_BILE) {
            return AjaxResult.error("部门已倒闭 请联系主管");
        }

        //登录成功
        //将当前用户信息存储近Session中
        session.setAttribute("emp", empInfo);
        return AjaxResult.success();
    }

    @Override
    public AjaxResult getInfo() {
        EmpDTO empInfo = (EmpDTO) session.getAttribute("emp");
        HashMap<Object, Object> map = new HashMap<>();
        map.put("userInfo", empInfo);

        Integer state = empInfo.getRole().getState();
        if (state == 1) {
            return AjaxResult.success(map);
        }

        List<PermissionDTO> permissionDTOS = null;
        Integer rid = empInfo.getRole().getId();
        if (rid == 1) {
            //超级管理员权限
            permissionDTOS = permissionMapper.listSuperAdminPermissions();
        } else {
            //普通管理员
            permissionDTOS = permissionMapper.listNormalAdminPermissions(rid);
        }
        List<PermissionDTO> data = PermissionUtil.handlerData(permissionDTOS);
        map.put("permissionInfo", data);
        return AjaxResult.success(map);
    }
}

8.1.2GradeServiceImpl

package com.aaa.ssm.service.impl;

import com.aaa.ssm.mapper.GradeMapper;
import com.aaa.ssm.pojo.dto.GradeDTO;
import com.aaa.ssm.result.AjaxResult;
import com.aaa.ssm.service.GradeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author Grg
 * @Date 2023/9/19 15:00
 * @PackageName:com.aaa.ssm.service.impl
 * @ClassName: GradeServiceImpl
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
@Service
public class GradeServiceImpl implements GradeService {

    @Autowired
    private GradeMapper gradeMapper;

    @Override
    public AjaxResult listAllGrade() {
        List<GradeDTO> gradeDTOS = gradeMapper.listAllGrades();

        return AjaxResult.success(gradeDTOS);
    }
}

8.1.3StudentServiceImpl

package com.aaa.ssm.service.impl;

import com.aaa.ssm.mapper.StudentMapper;
import com.aaa.ssm.pojo.dto.StudentDTO;
import com.aaa.ssm.pojo.vo.StudentQuery;
import com.aaa.ssm.pojo.vo.StudentVO;
import com.aaa.ssm.result.AjaxResult;
import com.aaa.ssm.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;

/**
 * @Author Grg
 * @Date 2023/9/18 17:53
 * @PackageName:com.aaa.ssm.service.impl
 * @ClassName: StudentImpl
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentMapper studentMapper;

    @Override
    public AjaxResult queryStudent(StudentQuery query) {
        List<StudentDTO> studentDTOS = studentMapper.queryStudentByQuery(query);
        Long totalCount = studentMapper.queryStudentTotalCount(query);
        HashMap<Object, Object> map = new HashMap<>();
        map.put("currentData", studentDTOS);
        map.put("totalCount", totalCount);
        return AjaxResult.success(map);
    }

    @Override
    public AjaxResult deleteStudent(Integer id) {
        int i = studentMapper.deleteStudentById(id);
        if (i > 0) {
            return AjaxResult.success();
        } else {
            return AjaxResult.error("删除失败");
        }
    }

    @Override
    public AjaxResult addStudent(StudentVO studentVO) {
        System.out.println(studentVO);
        int i = studentMapper.addStudent(studentVO);
        if (i > 0) {
            return AjaxResult.success();
        } else {
            return AjaxResult.error("添加失败");
        }
    }

    @Override
    public AjaxResult getStudentById(Integer id) {
        StudentVO student = studentMapper.getStudentById(id);
        return AjaxResult.success(student);
    }

    @Override
    public AjaxResult updateStudent(StudentVO studentVO) {
        int i = studentMapper.uptateStudent(studentVO);
        if (i > 0) {
            return AjaxResult.success();
        } else {
            return AjaxResult.error("修改失败");
        }
    }
}

8.2EmpService

package com.aaa.ssm.service;

import com.aaa.ssm.result.AjaxResult;

/**
 * @Author Grg
 * @Date 2023/9/17 14:58
 * @PackageName:com.aaa.ssm.service
 * @ClassName: EmpService
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
public interface EmpService {
    AjaxResult login(String username, String password);

    AjaxResult getInfo();
}

8.3GradeService

package com.aaa.ssm.service;

import com.aaa.ssm.result.AjaxResult;

/**
 * @Author Grg
 * @Date 2023/9/19 14:59
 * @PackageName:com.aaa.ssm.service
 * @ClassName: GradeService
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
public interface GradeService {
    AjaxResult listAllGrade();
}

8.4StudentService

package com.aaa.ssm.service;

import com.aaa.ssm.pojo.vo.StudentQuery;
import com.aaa.ssm.pojo.vo.StudentVO;
import com.aaa.ssm.result.AjaxResult;

/**
 * @Author Grg
 * @Date 2023/9/18 17:52
 * @PackageName:com.aaa.ssm.service
 * @ClassName: StudentService
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
public interface StudentService {

    AjaxResult queryStudent(StudentQuery query);

    AjaxResult deleteStudent(Integer id);

    AjaxResult addStudent(StudentVO studentVO);

    AjaxResult getStudentById(Integer id);

    AjaxResult updateStudent(StudentVO studentVO);
}

9.util工具类

9.1PermissionUtil

这个是在登陆时,根据登录账号的权限不同 展示的数据和能进行的操作也不一样

package com.aaa.ssm.util;

import com.aaa.ssm.pojo.dto.PermissionDTO;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author Grg
 * @Date 2023/9/18 15:58
 * @PackageName:com.aaa.ssm.util
 * @ClassName: PermissionUtil
 * @Description: 又是码代码的一天
 * @Version plus max 宇宙无敌终极版本
 */
public class PermissionUtil {
    public static List<PermissionDTO> handlerData(List<PermissionDTO> permissionDTOS){
        ArrayList<PermissionDTO> data = new ArrayList<>();

        for (PermissionDTO permissionDTO : permissionDTOS) {
            if (permissionDTO.getPid() == 0) {
                data.add(permissionDTO);
            }
        }
        for (PermissionDTO permissionDTO : permissionDTOS) {
            Integer pid = permissionDTO.getPid();
            for (PermissionDTO datum : data) {
                if (datum.getId().equals(pid)) {
                    datum.getSubMenu().add(permissionDTO);
                }
            }
        }
        return data;
    }
}

10.mapper.xml

10.1EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.aaa.ssm.mapper.EmpMapper">

    <select id="login" resultType="com.aaa.ssm.pojo.dto.LoginDTO">
        select * from t_emp_login where username = #{username} and password = #{password};
    </select>

    <resultMap id="empInfo" type="empDTO">
        <id column="id" property="id"></id>
        <result column="ename" property="ename"></result>
        <result column="hiredate" property="hiredate"></result>
        <result column="telephone" property="telephone"></result>

        <association property="dept" javaType="deptDTO">
            <id column="did" property="id"></id>
            <result column="dname" property="dname"></result>
            <result column="dstate" property="state"></result>
        </association>
        <association property="role" javaType="roleDTO">
            <id column="rid" property="id"></id>
            <result column="rname" property="rname"></result>
            <result column="rstate" property="state"></result>
        </association>
    </resultMap>

    <select id="getEmpInfoByEid" resultMap="empInfo">
        SELECT e.id,
               e.ename,
               e.hiredate,
               e.telephone,
               d.id    did,
               d.dname,
               d.other,
               d.state dstate,
               r.id    rid,
               r.rname,
               r.state rstate
        from t_emp_info e
                 LEFT JOIN t_dept d on e.did = d.id
                 LEFT JOIN t_role r on e.rid = r.id
        where e.id = #{eid};
    </select>
</mapper>

10.2GradeMapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.aaa.ssm.mapper.GradeMapper">


    <select id="listAllGrades" resultType="com.aaa.ssm.pojo.dto.GradeDTO">
        select *
        from t_grade
        where state = 0;
    </select>
</mapper>

10.3PermissionMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.aaa.ssm.mapper.PermissionMapper">

    <select id="listSuperAdminPermissions" resultType="com.aaa.ssm.pojo.dto.PermissionDTO">
        select id, pid, type, pname title, url content, state, icon
        from t_perm
    </select>
    <select id="listNormalAdminPermissions" resultType="com.aaa.ssm.pojo.dto.PermissionDTO">
        select p.id, p.pid, p.type, p.pname title, p.url content, p.state, p.icon
        from t_rp tp
                 left join t_perm p on tp.pid = p.id
        where tp.rid = #{rid}
          and p.state = 0
    </select>
</mapper>

10.4StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.aaa.ssm.mapper.StudentMapper">


    <resultMap id="StudentMap" type="com.aaa.ssm.pojo.dto.StudentDTO">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>
        <result column="age" property="age"></result>
        <result column="address" property="address"></result>
        <result column="headImg" property="headImg"></result>

        <association property="grade" javaType="com.aaa.ssm.pojo.dto.GradeDTO">
            <id column="tid" property="id"></id>
            <result column="gname" property="gname"></result>
            <result column="state" property="state"></result>
        </association>
    </resultMap>
    <sql id="queryStu">
        <where>
            <if test="name != null and '' != name">
                and ts.name like concat('%',#{name},'%')
            </if>
            <if test="minAge != null and '' != minAge">
                and ts.age &gt; #{minAge}
            </if>
            <if test="maxAge != null and '' != maxAge">
                and ts.age &lt; #{maxAge}
            </if>
        </where>
    </sql>
    <insert id="addStudent">
        insert into t_student ( name, age, address, gid) values (#{sname},#{sage},#{saddress},#{gid})
    </insert>
    <update id="uptateStudent">
        update t_student
        SET name    = #{sname},
            age     = #{sage},
            address = #{saddress},
            gid= #{gid}
        where id = #{id}
    </update>
    <delete id="deleteStudentById">
        delete
        from t_student
        where id = #{id}
    </delete>

    <select id="queryStudentByQuery" resultMap="StudentMap">
        select ts.id,
        ts.name,
        ts.age,
        ts.address,
        ts.headImg,
        tg.id tid,
        tg.gname,
        tg.state
        from t_student ts
        left join t_grade tg
        on ts.gid = tg.id
        <include refid="queryStu"></include>
        limit #{index},#{pageCount}
    </select>
    <select id="queryStudentTotalCount" resultType="java.lang.Long">
        select count(*) from t_student ts
        <include refid="queryStu"></include>
    </select>
    <select id="getStudentById" resultType="com.aaa.ssm.pojo.vo.StudentVO">
        select id, name sname, age sage, address saddress, gid
        from t_student
        where id = #{id}
    </select>
</mapper>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1022914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

各种电机驱动原理

步进电机 步进电机参考资料 野火官方文档 步进电机驱动原理 上面参考文档中有的内容就不写了&#xff0c;写一下我自己的总结吧。 说明&#xff1a; 电机驱动器输入信号有电机转动方向信号DIR&#xff0c;电机转速信号PWM&#xff0c;电机使能信号EN&#xff1b;电机驱动器…

JVM调优工具

JVM调优工具 Jmap 查看类信息 此命令可以查看内存信息&#xff0c;实例个数以及占用内存大小。 num&#xff1a;序号instances&#xff1a;实例数量bytes&#xff1a;占用空间大小class name&#xff1a;类名称&#xff0c;[C is a char[]&#xff0c;[S is a short[]&#…

72.Linux系统下printf函数的输出问题

目录 printf函数输出问题 为啥要放到缓冲区呢&#xff1f; \n 强制刷新缓冲区 fflush 强制刷新缓冲区 printf函数输出问题 在 Linux 下&#xff0c;printf 函数通常会先将输出放入缓冲区而不是立即将其发送到终端或文件。这是为了提高性能&#xff0c;因为逐个字符或逐个…

JS 原型的原理

接下来&#xff0c;我们要说一个很重要的东西&#xff0c;就是原型&#xff0c;也就是 prototype。 原型这个东西在 js 里面是非常有用的一个东西&#xff0c;也非常的重要。 对于前端来说&#xff0c;原型肯定不会陌生。 但是有几个问题&#xff1a;这玩意到底是干啥的&…

【论文笔记】图神经网络采样相关工作整理9.19

【论文笔记】图神经网络采样相关工作整理9.19 GraphSAGE NIPS2017 论文&#xff1a;Inductive Representation Learning on Large Graphs 目前引用数&#xff1a;11628 本文提出了一种称为GraphSAGE的新的图嵌入方法&#xff0c;该方法可以在大型图上进行高效的无监督和有监…

STM32F103RCT6学习笔记1:GPIO认识—点灯

今日开始快速掌握这款STM32F103RCT6芯片的环境与编程开发&#xff0c;有关基础知识的部分不会多唠&#xff0c;直接实践与运用&#xff01;文章贴出代码测试工程与测试效果图&#xff1a; 目录 STM32F103RCT6参数解读&#xff1a; GPIO的基础认识与分类&#xff1a; 串口相…

新老用户看过来~最实用的 Milvus 迁移手册来啦!

毫无疑问&#xff0c;Milvus 已经成为全球诸多用户构建生产环境时必不可少的向量数据库。 近期&#xff0c;Milvus 发布了全新升级的 Milvus 2.3 版本&#xff0c;内核引擎加速的同时也加入了诸如支持 GPU 这样实用且强大的特性。可以说&#xff0c;以 Milvus 2.3 为代表的 Mil…

如何第一时间把DLL插件注入到目标进程

在windows下&#xff0c;把DLL插件注入到一个进程的方法有很多&#xff0c;比较常用的比如用远程线程(CreateRemoteThread)注入&#xff0c;或者用windows的API&#xff1a;SetWindowsHookEx来注入&#xff0c;如下图&#xff0c;可以用RemoteDll这个注入工具进行注入操作&…

【双分支混合CNN-transforme:Pansharpening】

DBCT-Net:A dual branch hybrid CNN-transformer network for remote sensing image fusion (DBCT-Net&#xff1a;一种用于遥感图像融合的双分支混合CNN-transformer网络) 遥感图像融合是指将高空间分辨率的单波段全色图像与光谱信息丰富的多光谱图像进行融合&#xff0c;生成…

HTTPS 的加密流程的总结

什么是HTTPS 和HTTP一样也是应用层协议,但在HTTP协议的基础上引入了一个加密层(SSL/TLS). HTTP协议内容都是按照文本的方式明文传输的这导致在传输过程第三方者能够轻易获取传输的内容&#xff0c;而HTTPS在HTTP协议基础上引入一个加密以防止传输内容泄露或被篡改。 因此HTTPS…

项目经理不容错过的一个认证——《研发效能(DevOps)工程师国家职业技术认证》

一、引言 在当今的商业环境中&#xff0c;软件研发已成为企业保持竞争力的关键因素之一。项目经理在软件研发中扮演着重要角色&#xff0c;而随着企业对于研发效率的追求&#xff0c;考取《研发效能(DevOps)工程师国家职业技术认证》对于项目经理的职业发展具有重要意义。本文…

许战海战略文库|无增长则消亡:大型制造集团增长困境

竞争环境不是匀速变化&#xff0c;而是加速变化。企业的衰退与进化、兴衰更迭在不断发生&#xff0c;这成为一种不可避免的现实。在过去的100年里,全球经济周期的时间长度明显缩短,周期内的波动也更为剧烈。联合国教科文组织的研究表明&#xff0c;18世纪知识更新的周期约为80到…

什么国产工作流引擎好?

要想提升办公协作效率&#xff0c;获得高效发展&#xff0c;可以借助低代码技术平台的力量。它的轻量级、灵活、易维护、好操作等优势特点都是现代化办公环境里的得力助手&#xff0c;也可以帮助大家打破信息孤岛&#xff0c;连接内部数据资源&#xff0c;为企业未来发展提供强…

在编译源码的环境下,搭建起Discuz!社区论坛和WordPress博客的LNMP架构

目录 一.编译安装nginx 二.编译安装MySQL 三.编译安装PHP 四.安装论坛 五.安装wordpress博客 六.yum安装LNMP架构&#xff08;简要过程参考&#xff09; 一.编译安装nginx 1&#xff09;关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下 systemctl stop fire…

Xcode15+iOS17适配以及遇到的问题

今天更新了 Xcode15&#xff0c;遇到了一些问题&#xff0c;做下记录希望大家少走点坑。 1.iOS17 SDK 安装失败 Xcode更新完成后&#xff0c;打开项目一直显示 no fund iOS17 sdk&#xff0c;根据项目不同提示可能有区别&#xff0c;根据提示下载后提示安装失败&#xff0c;…

【vue+elementUI】输入框样式、选择器样式、树形选择器和下拉框样式修改

输入框样式、选择器样式和下拉框样式修改 1、输入框和选择器的样式修改&#xff1a;2、下拉弹框样式A. 选择器的下拉弹框样式修改B. 时间选择器的下拉弹框样式修改C. vue-treeselect树形下拉框样式 1、输入框和选择器的样式修改&#xff1a; 写在style中不能加scoped&#xff0…

力扣:103. 二叉树的锯齿形层序遍历(Python3)

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 来源&#xff1a;力扣&#xff08;LeetCode&#…

远程监控电脑软件有哪些?远程桌面监控软件哪个好用

随着科技的发展&#xff0c;远程桌面监控软件已经成为企业和个人用户的重要工具。它们可以帮助用户在任何地方、任何时间监控和管理远程计算机。本文将详细介绍远程桌面监控软件是什么&#xff0c;有哪些常见的远程桌面监控软件。 首先&#xff0c;我们来了解一下什么是远程桌面…

win系统环境搭建(一)——Windows安装一些小工具

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;一&#xff09;——Windows安装一些小工具 本系列windows环境搭建开始讲解如何给win系统搭建环境&#xff0c;本人所用系统是腾讯云服务器的Windows Server 2022&#xff0c;你可以理解成就是你用的wind…

gpu cuda 数组求和优化

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 问题描述 给定1个数组&#xff0c;利用gpu求和并返回结果。 cpu 算法 #include <math.h> #include<vector> #include<time.h> #include <stdio…