SSM小项目(会议管理系统)八 部门管理的编辑(图解超详细)

这是上一篇博客:https://blog.csdn.net/qq_41115379/article/details/114376776
这是下一篇博客:https://blog.csdn.net/qq_41115379/article/details/114548834
首先需要script,去这个网站https://www.bootcdn.cn/jquery/
在这里插入图片描述
直接把这个赋值到departments.ftl中

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>

再修改departments.ftl

<!DOCTYPE html>
<html>
    <head>
        <title>CoolMeeting会议管理系统</title>
        <link rel="stylesheet" href="/styles/common.css"/>
        <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
    </head>
    <body>
    <#include 'top.ftl'>
        <div class="page-body">
            <#include 'leftMenu.ftl'>
            <div class="page-content">
                <div class="content-nav">
                    人员管理 > 部门管理
                </div>
                <form action="/admin/adddepartment">
                    <fieldset>
                        <legend>添加部门</legend>
                        部门名称:
                        <input type="text" name="departmentname" id="departmentname" maxlength="20"/>
                        <input type="submit" class="clickbutton"  value="添加"/>
                    </fieldset>
                </form>
                <table class="listtable">
                    <caption>所有部门:</caption>
                    <tr class="listheader">
                        <th>部门编号</th>
                        <th>部门名称</th>
                        <th>操作</th>
                    </tr>
                    <#if deps??>
                            <#list deps as dep>
                          <tr>
                            <td>${dep.departmentid}</td>
                            <td id="depname${dep.departmentid}">${dep.departmentname}</td>
                            <td>
                                <a class="clickbutton" href="#" id="edit${dep.departmentid}" onclick="editDep(${dep.departmentid})">编辑</a>
                                <a class="clickbutton" style="display: none" href="#" id="cancel${dep.departmentid}" onclick="cancelDep(${dep.departmentid})">取消</a>
                                <a class="clickbutton" href="/admin/deletedep?departmentid=${dep.departmentid}">删除</a>
                            </td>
                        </tr>
                        </#list>
                    </#if>

                </table>
            </div>
        </div>
        <div class="page-footer">
            <hr/>
            更多问题,欢迎联系<a href="mailto:webmaster@eeg.com">管理员</a>
            <img src="/images/footer.png" alt="CoolMeeting"/>
        </div>
    <script>
        var depname;
        function  cancelDep(depid){
            var editBtn=$('#edit'+depid);
            var cancelBtn=$('#cancel'+depid);
            var ele=$('#depname'+depid);
            cancelBtn.css('display','none');
            editBtn.html('编辑');
            ele.html(depname);
        }

        function editDep(depid){
            var editBtn=$('#edit'+depid);
            var cancelBtn=$('#cancel'+depid);
            var ele=$('#depname'+depid);
            depname=ele.html();
            if(cancelBtn.css('display')=='none'){
                cancelBtn.css('display','inline');
                editBtn.html('确定');
                var depName=ele.text();
                ele.html('<input type="text" value="'+depName+'"/>')

            }else{
                var children= ele.children('input');
                var val=children.val();
                $.post('/admin/updatedep',{id:depid,name:val},function (msg){
                    if(msg=='success'){
                        cancelBtn.css('display','none');
                        editBtn.html('编辑');
                        ele.html(val);
                    }
                })


            }
        }

    </script>
    </body>
</html>

再开始写后端
departmentController

@RequestMapping("/updatedep")
//因为要返回字符串
@ResponseBody
public String updatedep(Integer id,String name){
    Integer result=departmentService.updatedep(id,name);
    if(result==1){
        //也就是成功了
        return "success";
    }
    return "error";
}

departmentService

public Integer updatedep(Integer id, String name) {
    return departmentMapper.updatedep(id,name);
}

departmentMapper

Integer updatedep(@Param("id") Integer id, @Param("name") String name);

departmentMapper.xml

<update id="updatedep">
    update department set departmentname=#{name} where departmentid=#{id};
</update>

再运行一下:
在这里插入图片描述
在这里插入图片描述
这样就编辑成功了
其中小知识点 GetMapping不能和requestBody一起用,原因是在于requestBody是接受前端传来的个Json对象,可是之前很好奇的是,我单单用GetMapping来实现添加功能的时候,也是可以的
requestBody和之前的添加到底有什么区别

首先解决第一个困惑,为什么我添加这边,能用GetMapping,而不是PostMapping
主要是在于,form表单默认是GET方法,所以要用GetMapping
当你把表单的method改成post的时候:

<form  method="post" action="/admin/adddepartment">

也就可以用PostMapping方法了

而为什么要用PostMapping 和requestBody是因为

$.post(’/admin/updatedep’,{id:depid,name:val},function (msg){

这个代码,用了post请求,而且传参数了,因为是post的,所以是在url外面的,但是post的参数是放在requestBody中的,所以可以说是,需要requestBody的存在,而为什么GET不能和requestBody放在一起,其实可以完全理解为 ,requestBody本身就是为post服务的

员工搜索
forward:/searchemployees redirect :/searchemployees searchemployees /admin/searchemployees 之间的区别 :
比较强行的可以理解为:直接return 是一个静态的,而redirect和forward则是一种动态的

我们都知道,在一般情况下,控制器方法返回的字符串都会被当做逻辑视图名来处理。
但是当字符串带有“forward”或者“redirect”前缀时,则对他们进行特殊处理。把“forward”与“redirect”当成指示符,其后的字符串
作为URL来处理。

创建一个EmployeeController

package org.javaboy.meeting.controller;

import org.apache.ibatis.annotations.Param;
import org.javaboy.meeting.model.Employee;
import org.javaboy.meeting.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

@Controller
@RequestMapping("/admin")
public class EmployeeController {
    public static final Integer PAGE_SIZE=10;
    @Autowired
    EmployeeService employeeService;
    @RequestMapping("/searchemployees")
    //这个参数的意思是 默认是第一页
    public String getAllEmployees(Employee employee, @RequestParam(defaultValue = "1")Integer page, Model model){
        //这个方法是用来搜索全部的employee 需要有这些参数
       List<Employee> emps= employeeService.getAllEmployees(employee,page,PAGE_SIZE);
       //这里用来获取总页数,参数也是employee 这个count就行了
        Long total=employeeService.getTotal(employee);
       //然后看到页面有关于各种各样的页数的消息,全都放到model里面传到前端就行了
        model.addAttribute("emps",emps);
        model.addAttribute("total",total);
        //还有第几页
        model.addAttribute("page",page);
        //关于第几页的话,可以默认页数为10 当前可以分成的多少页
        //如果取余完全的话,就直接取,如果不行的话,就还需要+1
        model.addAttribute("pageNum",(total%PAGE_SIZE==0?total/PAGE_SIZE:total/PAGE_SIZE+1));

        //然后这边是return一个 还是原来的位置吧
        //这里不确定要不要回去  这里要不要斜杠呢
        return "/searchemployees";
    }
    @RequestMapping("/updateemp")
    public String updateemp(Integer id){
        //这里就直接修改就行了
        //问题在这 empid是null 的
        System.out.println(id);
        System.out.println(employeeService.updatestatus(id,0));
           return "redirect:/admin/searchemployees?status=1";


    }


}

searchemployees.ftl

<!DOCTYPE html>
<html>
    <head>
        <title>CoolMeeting会议管理系统</title>
        <link rel="stylesheet" href="/styles/common.css"/>
        <style type="text/css">
            
        </style>
    </head>
    <body>
    <#include 'top.ftl'>
        <div class="page-body">
            <#include 'leftMenu.ftl'>
            <div class="page-content">
                <div class="content-nav">
                    会议预定 > 搜索员工
                </div>
                <form action="/admin/searchemployees" method="get">
                    <fieldset>
                        <legend>搜索会议</legend>
                        <table class="formtable">
                            <tr>
                                <td>姓名:</td>
                                <td>
                                    <input name="employeename" type="text" id="employeename" maxlength="20"/>
                                </td>
                                <td>账号名:</td>
                                <td>
                                    <input name="username" type="text" id="accountname" maxlength="20"/>
                                </td>
                                <td>状态:</td>
                                <td>
                                    <input type="radio" id="status" name="status" value="1" checked="checked"/><label>已批准</label>
                                    <input type="radio" id="status" name="status" value="0"/><label>待审批</label>
                                    <input type="radio" id="status" name="status" value="2"/><label>已关闭</label>
                                </td>
                            </tr>
                            <tr>
                                <td colspan="6" class="command">
                                    <input type="submit" class="clickbutton" value="查询"/>
                                    <input type="reset" class="clickbutton" value="重置"/>
                                </td>
                            </tr>
                        </table>
                    </fieldset>
                </form>
                <div>
                    <h3 style="text-align:center;color:black">查询结果</h3>
                    <div class="pager-header">
                        <div class="header-info"><span class="info-number">${total}</span>条结果,
                            分成<span class="info-number">${pageNum}</span>页显示,
                            当前第<span class="info-number">${page}</span></div>
                        <div class="header-nav">
                            <input type="button" class="clickbutton" value="首页"/>
                            <input type="button" class="clickbutton" value="上页"/>
                            <input type="button" class="clickbutton" value="下页"/>
                            <input type="button" class="clickbutton" value="末页"/>
                            <form action="/admin/searchemployees" style="display: inline" method="get">
                            跳到第<input type="text" id="pagenum" class="nav-number"/><input type="submit" class="clickbutton" value="跳转"/>
                             </form>
                        </div>
                    </div>
                </div>
                <table class="listtable">
                    <tr class="listheader">
                        <th>姓名</th>
                        <th>账号名</th>
                        <th>联系电话</th>
                        <th>电子邮件</th>
                        <th>操作</th>
                    </tr>
                    <#if emps??>
                        <#list emps as emp>
                            <tr>
                                <td>${emp.employeename}</td>
                                <td>${emp.username}</td>
                                <td>${emp.phone}</td>
                                <td>${emp.email}</td>
                                <td>
                                    <a name="closeName" class="clickbutton" href="/admin/updateemp?id=${emp.employeeid}">关闭账号</a>
                                </td>
                            </tr>
                        </#list>
                    </#if>
                </table>
            </div>
        </div>
        <div class="page-footer">
            <hr/>
            更多问题,欢迎联系<a href="mailto:webmaster@eeg.com">管理员</a>
            <img src="/images/footer.png" alt="CoolMeeting"/>
        </div>
    </body>
</html>

EmployeeService

public List<Employee> getAllEmployees(Employee employee, Integer page, Integer pageSize) {
    //
   page=(page-1)*pageSize;
   return  employeeMapper.getAllEmployees(employee,page,pageSize);
}

public Long getTotal(Employee employee) {
    return employeeMapper.getTotal(employee);
}

EmployMapper

List<Employee> getAllEmployees(@Param("emps") Employee employee, @Param("page") Integer page,@Param("pagesize") Integer pageSize);

Long getTotal(Employee employee);

EmployMapper.xml

<select id="getAllEmployees" resultType="org.javaboy.meeting.model.Employee">
    select * from employee where status=#{emps.status}
    <if test="emps.employeename!=null">
        and employeename like concat ('%',#{emps.employeename},'%')
    </if>
    <if test="emps.username!=null">
        and username like concat ('%',#{emps.username},'%')
    </if>
    limit #{page},#{pagesize};
</select>
<select id="getTotal" resultType="java.lang.Long">
    select count(*) from employee where status=#{status}
    <if test="employeename!=null">
        and employeename=#{employeename}
    </if>
    <if test="username!=null">
        and username=#{username}
    </if>
</select>

这里要注意:

<a name="closeName" class="clickbutton" href="/admin/updateemp?id=${emp.employeeid}">关闭账号</a>

这里的id要和

@RequestMapping("/updateemp")
public String updateemp(Integer id){
    //这里就直接修改就行了
    //问题在这 id是null 的
    System.out.println(id);
    System.out.println(employeeService.updatestatus(id,0));
       return "redirect:/admin/searchemployees?status=1";


}

这里的id一样,不然会出现问题

再运行一下
在这里插入图片描述

一.系统模块的实现 在系统中包括以下功能:系统管理、学籍信息管理、课程信息管 理、成绩信息管理、帮助。分为以下几个模块 主窗体 标 题 名 称 系统管理 sysMenu ……用户管理 Control ……退出系统 Exit 学籍管理 sInfo 课程管理 cInfo 成绩管理 rInfo 帮助 help ……使用说明 howto ……关于 about 1.1登录模块 为了系统的安全,在进入系统之前首先会出现一个登录模块,用户只有在输入正确的用户名和正确的密码之后,才能进入系统。 用户登录窗体中放置了两个文本框(Textbox),用来输入用户名和密码;两个按钮(CommandButton)用来确定或者取消登录。 设置一个SSTab控件,供不同用户登录时选择用户权限,级用户拥有一切权限(包括添加删除和修改以及对用户的管理),普通用户拥有受限制的权限(查询及修改密码),提高了数据库的安全性。 1.2系统管理模块 1.2.1添加用户窗体的创建 进入系统后,将会出现一个主窗体,选择系统管理模块下的添加用户,就可以进入添加用户窗体,可以通过该窗体增加新的用户。 在这个窗体中放置了三个文本框,用来输入用户名和密码;两个按钮用来确定是否添加用户;三个标签用来标示文本框的提示。 1.2.2修改密码窗体的创建 在系统管理模块下,进入修改密码窗体,用户可根据需要修改自己的密码。 在这个窗体中放置了两个文本框,用来输入密码和确认密码;两个按钮用来确定是否修改密码;两个标签用来标示文本框的内容。 1.3学籍管理模块 1.3.1添加学籍信息功能 选择主窗体中学籍管理模块下的添加学籍信息,就可进入添加学籍信息的窗体,在该窗体中我们可以对学生的学号、姓名、性别、出生日期、班号等学生的信息进行添加。设计时我尽可能设想各种边界条件,如记录为空,输入为空,输入出错等,当输入的信息满足这些边界条件时,将会弹出一个提示框提醒用户,以便用户能及时地做出修改。添加的信息将全部存储到数据库中。 在窗体上放置多个文本框和下拉式文本框,用来输入学籍信息;两个按钮用来确定是否输入学籍信息;一个按钮用来退出窗体;多个标签用来提示文本框中需要输入的内容。 1.3.2修改学籍信息功能 点击学籍管理模块下的修改学籍信息,就进入修改学籍信息的窗体,在该窗体中我们可以对前面添加的学籍信息进行修改。由于用户的需求不同,有的是要对学生的信息做个别的改动,有的是需要删除该条记录,所以该窗体同时包括了修改记录的功能和删除记录的功能。又考虑到用户的误操作,为了方便,我在该窗体中增添了取消修改的功能,可一次性把输入文本框的内容全部置空。 1.3.3查询学籍信息功能 进入学籍管理模块下的查询学籍信息窗体,在该窗体中可以对学生的信息进行查询,有三种查询方式。我在设计时,一方面考虑到简洁的因素,用户可以只设置一种查询方式进行查询;另一方面又为了避免数据的重复,用户可以输入详细的信息,也就是同时设置多种查询方式进行查询。进入查询窗体时,myflexgrid中会显示出所有学生的学籍信息,如果不设置查询方式就进行查询,是无效查询,系统会给出提示。在设置好查询方式后,便开始查询,将在myflexgrid中显示出用户所需的学生的学籍信息。 1.4课程管理模块 1.4.1课程信息浏览功能 点击主窗体中课程管理模块下的课程信息浏览,可进入课程信息浏览窗体。为了用户的使用方便,我使用了SSTab控件,故在该窗体中同时包含了课程信息的添加和修改的功能。并且我还在窗体上设置了myflexgrid控件。添加和修改记录后,对于数据有何变化都可以在myflexgrid中显示出来,使用户对所做的操作一目了然。 1.4.2年级课程设置功能 进入课程管理模块下的年级课程设置窗体,可以对每一个年级的课程进行设置。 1.5成绩管理模块 1.5.1成绩信息管理功能 点击成绩管理模块下的成绩信息浏览,进入成绩信息浏览窗体,考虑到美观和实用性,界面设置如下图。用Frame控件在窗体中划定一个可浏览成绩信息地方,再在Frame中添加MSFlexGrid控件,运行时将在MSFlexGrid中显示所有学生的成绩信息。使用Toolbar来建立工具条。点击工具条中的修改、添加和查询按钮就可分别进入修改成绩信息窗体、添加成绩信息窗体和查询成绩信息窗体。这三个窗体的界面设置分别类似于学籍管理下修改学籍信息窗体、添加学籍信息窗体和查询学籍信息窗体。 1.6其它 操作人员在遇到困难时即可进入帮助菜单寻求帮助。帮助菜单下的“使用说明”将解答你的疑问。帮助菜单下的“关于”详细地列出了关于作者的一些情况,关于版权的一些情况和关于系统的一些情况。进入打印菜单栏,可对你所需要的信息进行打印。 二 系统后期工程 在开发这个软件系统的漫长过程中,面对着极其错综复杂的问题,人的主观认识不可能完全符合客观现实,在本次设计过程中,我采用循环测试法,力求在每个阶段结束之前通过严格技术审查,即每完成一个功能,就进行测试,尽可能早的发现并纠正差错,完成模块测试之后再进行系统测试。 在该设计中,我偏重考虑了当用户输入的信息出错时,系统就会出现提示,以便让用户知道出错的原因,并能及时做出修改,所以我站在用户的角度考虑,尽可能设想各种边界条件,如记录为空,输入为空,输入出错等,以此来发现错误,纠正错误,取得了一定的效果。 当然,该学生信息管理系统也存在一些不足之处。在成绩管理界面,当3次改变成绩为不同的内容时,程序会出错。虽然尝试了很多方法,仍不能解决。再一点就是关于打印和年级课程信息设置都未能实现,这有待于以后的进一步提高。 一个应用系统性能的优劣,效率的高低始终应当由用户来做出判决,应用系统在运行过程中,用户会提出一些新的需求和建议,我就会根据用户需求的变化,对本系统做出一定的修改,使其进一步地得到完善和提高。 1. 概述 1.1. 目的 为了彻底解决了长期困扰教学信息化工作当中安全性、可靠性的问题;为了使管理人员可以随时看到更新的数据,极大地提高信息传递的速度;为了管理者再也不必为聘用专门的操作人员来给众多教师编辑学生成绩资料而殚精竭虑,在此,设计了学生课程成绩查询管理信息系统,使得各个使用者在操作上,从此变得那么从容简单,省时又省心。 1.2. 参考文档 [1] 张海藩.软件工程导论[M].第4版.北京:清华大学出版社.2007.25-63. [2] 赵洋,张丽,王恩东,李玉红.基于B/S结构学生成绩管理系统设计与实现[J].沈阳化工学院学报.2007,21(2).140-142. [3] 游应德.基于Intemet的学生信息管理系统—学生成绩管理系统[D].电子科技大学.成都:电子科技大学,2007. [4]郑若忠,王鸿武.数据库原理与方法.湖南科学技术出版社.  2. 总体结构设计 2.1. 层次图 2.2结构图 2.3 功能设计 学生成绩单录入部分可以对某一个学生进行成绩录入,但是一次只能录入一条成绩记录,同时可对缺考、免考、补考学生成绩进行录入。 学生成绩显示/修改部分可以对已录入的成绩进行显示和修改,但是只能对系统默认的当前学期的记录进行修改。 学生成绩显示/删除部分可以对已录入的成绩进行显示和删除,但是也只能对系统默认的当前学期的记录进行删除。 2.3. 运行环境设计 2.3.1. 硬件设计 1.服务器: CPU:P4 2.0G以上 内存:512M 硬盘:60G以上 网络:100M /1000M Ethenet 2.客户机: CPU:500Mz 内存:64M以上 硬盘:1G以上 网络:10M Ethenet 2.3.2. 软件设计 1.服务器: 操作系统:Windows 2000/XP/2003 WEB服务:IIS5.0 数据库:SQL Server 2000(建议打Service Pack 3补丁) 2.客户机: 操作系统:Windows系列之一 浏览器:IE6.0以上版本 2.3.3.网络设计 采用sql server2000网络关系型数据库,存储读取数据将同步进行。 3.详细设计 用判定树表示教师端模块 4. 数据结构设计 4.1. 数据分析 第一层:基础数据及基础数据库分析 此类报表主要反映学校教师、学生和课程等的资料情况。 此类报表是将系统中较为常用的学生、教师和课程等基础资料以报表的形式予以反映。 在本层需要设计三个主表,分别用来存储学生资料、教师资料和课程资料。 第二层:业务流程数据及业务流程数据库分析 在编辑此类表单时,可以点击相应的下拉按钮,这时所有的选项资料都会显 来,您可以根据实际情况来编制表单,使整个过程更加清晰,操作更加简便。 在本层需要设计一个学生成绩主表,用来存储学生的平时成绩表。 4.2. 数据库设计 4.2.1. 设计原则 1.密码管理:学生修改学生查询密码;教师可以修改查询密码。 2.每个教师可以查看所有学生的成绩,包括每门课程的成绩、每门课程的平均成绩、每个分数段的成绩。 3.学生根据自己的学号查询本人的成绩。 4.教师可以登记、修改、查询自己所讲授课程的学生的成绩、该课程的总分、平均成绩、各分数段成绩人数统计、不及格学生的名单、成绩等等。 4.2.2. 数据库组成 数据表3个: 学生表(5个字段: xh, xm, xb, csrq, bj),其中有各班学生的记录 课程表(4个字段:kch,kcm, js, xf),其中有课程的记录; 成绩表(3个字段:xh, kch, cj),其中有学生成绩的记录。 学生基本信息表(Student)描述如下: 学生期末成绩表(Grade)描述如下: 学生的课程管理(Course)描述如下: 4.2.3. 面向对象数据库设计方法 1)考虑对象的静态和动态属性 对象属性决定了数据库或包含具有相同类型对象的表的内容。 2)描述数据实体及其属性 包含所有静态属性的单个对象被称作数据实体。每个单独的数据实体必须唯一,这样可以与其他实体区分。包含在数据实体中的对象的性质被称作为属性。(attribute) 3)用方法来说明对象的行为 关系数据库对象的行为决定了数据对象参与事务的特征。事务的发生对应着事件,通过使用响应事件的方法来实现事务。 4)在单个表中合并不同实体 可以在单个表中包含不同对象类型的说明,只要可以按照相同方式描述属性和行为,以及区分不同对象类型即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值