基于java+ssm+jsp的北关村基本办公管理系统

本文介绍了北关村基本办公管理系统的设计与实现,该系统基于Java语言,使用MySQL数据库和SSM框架,实现了考勤打卡、公告信息、日程、通讯录和用户管理等功能,提升了信息处理的效率和规范性。管理员和用户具有不同的操作权限,系统还支持公告类型和日程类型的管理。通过这个系统,实现了办公信息的系统化和绿色化管理。
摘要由CSDN通过智能技术生成

项目介绍

在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对北关村基本办公信息管理的提升,也为了对北关村基本办公信息进行更好的维护,北关村基本办公管理系统的出现就变得水到渠成不可缺少。通过对北关村基本办公管理系统的开发,不仅仅可以学以致用,让学到的知识变成成果出现,也强化了知识记忆,扩大了知识储备,是提升自我的一种很好的方法。通过具体的开发,对整个软件开发的过程熟练掌握,不论是前期的设计,还是后续的编码测试,都有了很深刻的认知。

北关村基本办公管理系统通过MySQL数据库与idea工具进行开发,北关村基本办公管理系统能够实现考勤打卡管理,公告信息管理,日程信息管理,通讯录管理,用户管理,基础数据管理,其中基础数据管理包括公告类型管理和日程类型管理子功能模块。

通过北关村基本办公管理系统对相关信息的处理,让信息处理变的更加的系统,更加的规范,这是一个必然的结果。已经处理好的信息,不管是用来查找,还是分析,在效率上都会成倍的提高,让计算机变得更加符合生产需要,变成人们不可缺少的一种信息处理工具,实现了绿色办公,节省社会资源,为环境保护也做了力所能及的贡献。

4.2功能结构设计
本系统主要是基于数据的增加,修改,删除等操作,使用者能够通过提前设定的登录功能进入指定的操作区,这里对使用者设计的功能进行结构展示。

管理员功能结构图的绘制结果见图4-1。管理员登录进入本系统操作的功能包括对用户的考勤打卡信息进行增删改查,以及查看用户自己添加的考勤打卡信息,管理员也能增删改查公告内容,日程信息以及通讯录信息,可以管理用户,管理管理基础数据信息,其中基础数据管理包括公告类型管理,日程类型管理,主要是实现对公告类型和日程类型的增删改查管理。
在这里插入图片描述
用户功能结构图的绘制结果见图4-2。用户登录进入本系统操作的功能包括添加用户自己的考勤打卡信息,可以查看日程信息,公告信息,通讯录信息以及自己添加的考勤打卡信息,可以更改用户的个人信息,还有更改登录北关村基本办公管理系统的密码。
在这里插入图片描述

开发环境

编程语言:Java
数据库 :Mysql
系统架构:B/S
后端框架:SSM
编译工具:idea或者eclipse,jdk1.8,maven
支持定做:java/php/python/android/小程序/vue/爬虫/c#/asp.net

系统实现

5.1管理员功能实现
5.1.1 考勤打卡管理
管理员进入如图5-1所示的考勤打卡管理界面之后,管理员点击信息显示栏中最右侧的修改,删除按钮可依次完成考勤打卡信息的修改,删除操作。管理员提供用户姓名可以实现对用户考勤打卡信息的查询,以及可以添加用户的考勤打卡信息。考勤打卡信息有考勤时间,用户姓名,手机号等信息。
在这里插入图片描述

图5-1 考勤打卡管理界面

5.1.2 公告信息管理
管理员进入如图5-2所示的公告信息管理界面之后,管理员点击信息显示栏中最右侧的修改,删除按钮可依次完成公告信息的修改,删除等操作。管理员也能添加公告的类型,公告图片,公告内容等信息,可以通过公告类型筛选公告信息。
在这里插入图片描述

图5-2 公告信息管理界面

5.1.3 日程信息管理
管理员进入如图5-3所示的日程信息管理界面之后,管理员点击信息显示栏中最右侧的修改,删除按钮可依次完成日程信息的修改,删除等操作。管理员也能添加日程类型,日期等信息,可以通过日程类型筛选日程信息。
在这里插入图片描述

图5-3 日程信息管理界面

5.1.4 通讯录管理
管理员进入如图5-4所示的通讯录管理界面之后,管理员点击信息显示栏中最右侧的修改,删除按钮可依次完成通讯录信息的修改,删除等操作。管理员也能添加联系方式,类型,备注,名称等信息,可以通过名称实现对通讯录信息的查询。
在这里插入图片描述

图5-4 通讯录管理界面

5.1.5 用户管理
管理员进入如图5-5所示的用户管理界面之后,管理员点击信息显示栏中最右侧的修改,删除按钮可依次完成用户信息的修改,删除等操作。管理员也能添加手机号,电子邮箱,性别,用户姓名等用户信息,可以通过用户姓名实现对用户数据的筛选。
在这里插入图片描述

图5-5 用户管理界面

5.1.6 日程类型管理
管理员进入如图5-6所示的日程类型管理界面之后,管理员点击信息显示栏中最右侧的修改,删除按钮可依次完成日程类型信息的修改,删除等操作。管理员也能添加日程类型名称,通过日程类型名称实现对日程类型信息的查询。
在这里插入图片描述

图5-6 日程类型管理界面

5.1.7 公告类型管理
管理员进入如图5-7所示的公告类型管理界面之后,管理员点击信息显示栏中最右侧的修改,删除按钮可依次完成公告类型信息的修改,删除等操作。管理员也能添加公告类型名称,通过公告类型名称实现对公告类型信息的查询。
在这里插入图片描述

图5-7 公告类型管理界面

5.2用户功能实现
5.2.1 考勤打卡管理
用户进入如图5-8所示的考勤打卡管理界面之后,用户点击信息显示栏中最右侧的查看按钮可以查看自己的考勤打卡信息,用户可以添加自己的考勤打卡信息。
在这里插入图片描述

图5-8 考勤打卡管理界面

5.2.2 公告信息查看
用户进入如图5-9所示的公告信息查看界面之后,用户点击信息显示栏中最右侧的查看按钮可以查看公告内容,用户查询公告需要在查询编辑框中登记公告标题就可以实现对公告内容的查询。
在这里插入图片描述

图5-9 公告信息查看界面

5.2.3 日程信息查看
用户进入如图5-10所示的日程信息查看界面之后,用户点击信息显示栏中最右侧的查看按钮可以查看日程信息。用户查询日程需要在查询编辑框中登记日程标题就可以实现对日程信息的查询。
在这里插入图片描述

图5-10 日程信息查看界面

5.2.4 通讯录查看
用户进入如图5-11所示的通讯录查看界面之后,用户点击信息显示栏中最右侧的通讯录查看按钮可以查看通讯录信息,用户查询通讯录信息需要在查询编辑框中登记通讯录名称就可以实现对通讯录信息的查询。
在这里插入图片描述

图5-11 通讯录查看界面

5.2.5 个人信息
用户进入如图5-12所示的个人信息界面之后,用户更改头像,更改头像时,需要重新上传新的头像文件才可以替换当前的头像,同时可以更改手机号,电子邮箱等已经发生变化的数据,修改完成之后,需要点击修改按钮对当前的已修改的数据及时保存。
在这里插入图片描述

图5-12 个人信息界面

核心代码

package com.controller;

import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;

import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;

/**
 * 考勤打卡
 * 后端接口
 * @author
 * @email
*/
@RestController
@Controller
@RequestMapping("/kaoqin")
public class KaoqinController {
    private static final Logger logger = LoggerFactory.getLogger(KaoqinController.class);

    @Autowired
    private KaoqinService kaoqinService;


    @Autowired
    private TokenService tokenService;
    @Autowired
    private DictionaryService dictionaryService;

    //级联表service
    @Autowired
    private YonghuService yonghuService;



    /**
    * 后端列表
    */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永不会进入");
        else if("用户".equals(role))
            params.put("yonghuId",request.getSession().getAttribute("userId"));
        if(params.get("orderBy")==null || params.get("orderBy")==""){
            params.put("orderBy","id");
        }
        PageUtils page = kaoqinService.queryPage(params);

        //字典表数据转换
        List<KaoqinView> list =(List<KaoqinView>)page.getList();
        for(KaoqinView c:list){
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(c, request);
        }
        return R.ok().put("data", page);
    }

    /**
    * 后端详情
    */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        KaoqinEntity kaoqin = kaoqinService.selectById(id);
        if(kaoqin !=null){
            //entity转view
            KaoqinView view = new KaoqinView();
            BeanUtils.copyProperties( kaoqin , view );//把实体数据重构到view中

                //级联表
                YonghuEntity yonghu = yonghuService.selectById(kaoqin.getYonghuId());
                if(yonghu != null){
                    BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setYonghuId(yonghu.getId());
                }
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(view, request);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }

    }

    /**
    * 后端保存
    */
    @RequestMapping("/save")
    public R save(@RequestBody KaoqinEntity kaoqin, HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,kaoqin:{}",this.getClass().getName(),kaoqin.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永远不会进入");
        else if("用户".equals(role))
            kaoqin.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));

            kaoqin.setInsertTime(new Date());
            kaoqin.setCreateTime(new Date());
            kaoqinService.insert(kaoqin);
            return R.ok();
    }

    /**
    * 后端修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody KaoqinEntity kaoqin, HttpServletRequest request){
        logger.debug("update方法:,,Controller:{},,kaoqin:{}",this.getClass().getName(),kaoqin.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
//        if(false)
//            return R.error(511,"永远不会进入");
//        else if("用户".equals(role))
//            kaoqin.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
        //根据字段查询是否有相同数据
        Wrapper<KaoqinEntity> queryWrapper = new EntityWrapper<KaoqinEntity>()
            .notIn("id",kaoqin.getId())
            .andNew()
            .eq("yonghu_id", kaoqin.getYonghuId())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        KaoqinEntity kaoqinEntity = kaoqinService.selectOne(queryWrapper);
        if(kaoqinEntity==null){
            kaoqinService.updateById(kaoqin);//根据id更新
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }



    /**
    * 删除
    */
    @RequestMapping("/delete")
    public R delete(@RequestBody Integer[] ids){
        logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
        kaoqinService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }


    /**
     * 批量上传
     */
    @RequestMapping("/batchInsert")
    public R save( String fileName, HttpServletRequest request){
        logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
        Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            List<KaoqinEntity> kaoqinList = new ArrayList<>();//上传的东西
            Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
            Date date = new Date();
            int lastIndexOf = fileName.lastIndexOf(".");
            if(lastIndexOf == -1){
                return R.error(511,"该文件没有后缀");
            }else{
                String suffix = fileName.substring(lastIndexOf);
                if(!".xls".equals(suffix)){
                    return R.error(511,"只支持后缀为xls的excel文件");
                }else{
                    URL resource = this.getClass().getClassLoader().getResource("../../upload/" + fileName);//获取文件路径
                    File file = new File(resource.getFile());
                    if(!file.exists()){
                        return R.error(511,"找不到上传文件,请联系管理员");
                    }else{
                        List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
                        dataList.remove(0);//删除第一行,因为第一行是提示
                        for(List<String> data:dataList){
                            //循环
                            KaoqinEntity kaoqinEntity = new KaoqinEntity();
//                            kaoqinEntity.setYonghuId(Integer.valueOf(data.get(0)));   //用户 要改的
//                            kaoqinEntity.setKaoqinContent("");//详情和图片
//                            kaoqinEntity.setInsertTime(date);//时间
//                            kaoqinEntity.setCreateTime(date);//时间
                            kaoqinList.add(kaoqinEntity);


                            //把要查询是否重复的字段放入map中
                        }

                        //查询是否重复
                        kaoqinService.insertBatch(kaoqinList);
                        return R.ok();
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            return R.error(511,"批量插入数据异常,请联系管理员");
        }
    }






}

论文参考

在这里插入图片描述

目 录
第一章 绪论 1
1.1 选题背景 1
1.2 选题意义 1
1.3 研究内容 2
第二章 开发环境 3
2.1 Java语言 3
2.2 MYSQL数据库 3
2.3 Eclipse开发工具 4
2.4 SSM框架 4
2.5 B/S架构 5
第三章 系统分析 6
3.1可行性分析 6
3.1.1技术可行性 6
3.1.2操作可行性 6
3.1.3经济可行性 6
3.2系统流程分析 7
3.3系统性能分析 10
3.3.1系统安全性 10
3.3.2数据完整性 11
3.3.3系统可扩展性 11
3.4系统功能分析 11
第四章 系统设计 14
4.1 系统设计目标 14
4.2功能结构设计 15
4.3数据库设计 16
4.3.1 数据库概念设计 16
4.3.2 数据库物理设计 19
第五章 系统实现 22
5.1管理员功能实现 22
5.1.1 考勤打卡管理 22
5.1.2 公告信息管理 22
5.1.3 日程信息管理 23
5.1.4 通讯录管理 23
5.1.5 用户管理 24
5.1.6 日程类型管理 25
5.1.7 公告类型管理 25
5.2用户功能实现 26
5.2.1 考勤打卡管理 26
5.2.2 公告信息查看 26
5.2.3 日程信息查看 27
5.2.4 通讯录查看 27
5.2.5 个人信息 28
第六章 系统测试 29
6.1 测试任务 29
6.2 测试目标 29
6.3 测试方案 29
6.4系统测试的特点 31
6.5 系统功能测试 31
6.5.1 用户登录测试 32
6.5.2 通讯录查询功能测试 32
6.6 系统测试结果 32
结 论 33
致 谢 35
参考文献 36

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q_2781179521

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值