spring boot+jsp实现简易会议系统

一、需求分析

1.1会议组织者

1.会议组织者登录进入系统,
2.填写会议的相关信息(时间,地点,人物,宾馆,等等),
3.选取需要参会人员填写的信息项(姓名,工作单位,身份证号,电话,参会时间,性别,是否需要安排房间,等等)这些项目组织者可以根据需要勾选,
4.自动生成会议唯一编号,
5.可以把本次参会的人员信息下载生成EXCEL文件,

1.2会议参加人员

1.登录方式(自己设定)
2.填写信息,提交

1.3系统管理员

1.查看所有会议
2.查看所有用户
3.可删除任何用户或会议

二、数据库设计

采用SqlServer数据库,数据库关系图如下:
在这里插入图片描述

三、项目框架

项目采用sprint boot框架,整合jsp实现前端界面。博主是大三在读生,上学期刚接触web开发,此系统是博主做的第一个完整的web系统,也是第一次使用sprint boot框架,因此较为生疏,框架不完善之处烦请指正。
项目框架图:
在这里插入图片描述
Entity是实体类,Service负责业务处理,dao层封装数据库操作,controller层负责前后端交互,util是工具类,实现生成二维码。

四、业务功能实现

1.登录和注册

登录:前端通过表单提交的方式将数据传递给AccountController层的login()方法,controller层与数据库交互查找该用户是否存在以及密码是否正确,验证成功后通过ModelAndView方法返回到系统首页。
注册:前端点击注册按钮调用模态窗口,通过ajax将用户填写的数据传递到Account Controller层,controller层负责将对象写入数据库并返回到前端

  public ModelAndView login(@RequestParam("loginID") String loginID, @RequestParam("loginPassword") String loginPassword) {//登录功能的实现
        ModelAndView mv = new ModelAndView();
        if (loginID.equals(accountServiceImp.selectAccount(loginID).getAccountID()) && loginPassword.equals(accountServiceImp.selectAccount(loginID).getAccountPassword())) {
            mv.setViewName("main");
            mv.addObject("ID", loginID);
            mv.addObject("Power", accountServiceImp.selectAccount(loginID).getAccountPower());
            mv.addObject("Email", accountServiceImp.selectAccount(loginID).getAccountEmail());
        }
        return mv;
}

  public String addAccount(@RequestBody Account account) {//注册功能
        accountServiceImp.addAccount(account);
        return account.getAccountID();
    }
2.会议管理

创建会议:会员可通过前端界面创建会议,前端通过ajax将用户填写的会议数据传给MeetingController层,由Controller层写入数据库并返回到前端界面

 @RequestMapping(value = "/createMeeting", method = RequestMethod.POST)
    @ResponseBody
  public String addMeeting(@RequestBody Meeting meeting) {
        meetingServiceImpl.addMeeting(meeting);
        return meetingServiceImpl.getMeetingID();
}

查找会议:用户可根据会议ID查询会议,通过ajax将用户输入的会议编号传给Controller层,从数据库中查询数据并将查询结果通过Map<K,V>的方式返回给前端

  @RequestMapping(value = "/selectMeeting", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> selectMeeting(String selectCondition) {
        List<Meeting> meetings = meetingServiceImpl.selectMeeting(selectCondition);
        Map<String, Object> map = new HashMap<String, Object>();
        if (meetings != null) {
            map.put("status", true);
            map.put("meetings", meetings);
        } else {
            map.put("status", false);
        }
        return map;
    }

删除会议:前端通过ajax将用户要删除的会议编号传到Controller层,调用deleteMeeting()方法删除数据库中对应的数据并将结果返回到前端

 @RequestMapping(value = "/deleteMeeting", method = RequestMethod.POST)
    @ResponseBody
public boolean deleteMeeting(String meetingID) {
        return accountMeetingService.deleteMeeting(meetingID);
}

查看我加入的会议:前端通过ajax将用户编ID传到Controller层,controller层调用相关方法查找数据库,获得该用户加入的会议列表,通过Map<K,V>方式将结果返回到前端

@RequestMapping(value = "/selectMyJoinMeeting", method = RequestMethod.POST)
    @ResponseBody
  public Map<String, Object> selectMyJoinMeeeting(String accountID) {
        Map<String, Object> map = new HashMap<>();
        List<Meeting> lists = accountMeetingService.selectMyJoinMeeting(accountID);
        if (lists != null && lists.size() > 0) {
            map.put("flag", true);
            map.put("meetings", lists);
        } else {
            map.put("flag", false);
        }
        return map;
}

查看我创建的会议:前端通过ajax将用户编ID传到Controller层,controller层调用相关方法查找数据库,获得该用户创建的会议列表,通过Map<K,V>方式将结果返回到前端

@RequestMapping(value = "/selectMyCreateMeeting", method = RequestMethod.POST)
@ResponseBody
 public Map<String, Object> selectMyCreateMeeeting(String accountID) {
        Map<String, Object> map = new HashMap<>();
        List<Meeting> lists = meetingServiceImpl.selectMyCreateMeeting(accountID);
        if (lists != null && lists.size() > 0) {
            map.put("flag", true);
            map.put("meetings", lists);
        } else {
            map.put("flag", false);
        }
        return map;
}

查看我的会议详细信息:通过ajax将会议编号穿给后端,controller层调用相对应的方法从数据库中查询该会议的信息并返回到前端

 @RequestMapping(value = "/selectMyMeetingInfo", method = RequestMethod.POST)
 @ResponseBody
public Map<String, Object> selectMyMeetingInfo(String meetingID) {
        Map<String, Object> map = new HashMap<>();
        List<AccountMeeting> lists = accountMeetingService.selectMyMeetingInfo(meetingID);
        if (lists != null && lists.size() > 0) {
            map.put("flag", true);
            map.put("meetingInfo", lists);
        } else {
            map.put("flag", false);
        }
        return map;
}

加入会议:前端通过ajax传递一个AccountMeeting对象到后端,controller层检查用户是否已加入该会议,若不存在该用户则将该用户信息插入数据库中,将操作结果boolean值返回到前端

    public boolean joinMeeting(@RequestBody AccountMeeting accountMeeting) {
        boolean flag;
        if (accountMeetingService.selectIsExist(accountMeeting.getMeetingID(), accountMeeting.getAccountID())) {
            flag = false;
        } else {
            accountMeetingService.addParticipant(accountMeeting);
            flag = true;
        }
        return flag;
    }

其余功能(删除会议退出会议等功能较为简单故不贴出代码)。

3.扩展功能

导出Excel表

@Controller
@RequestMapping("/export")
public class ExportTableController extends HttpServlet {
    @Autowired
    private AccountMeetingServiceImpl accountMeetingService;
    @Autowired
    private MeetingServiceImpl meetingService;

    @RequestMapping(value = "/exportExcel", method = RequestMethod.POST)
    public void exportExcel(HttpServletResponse response, @RequestParam("meetingID") String meetingID) throws IOException {
        System.out.println(meetingID);

        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("会议信息表");

        setTitle(workbook, sheet);
        // 获取用户信息
        List<AccountMeeting> list = accountMeetingService.selectMyMeetingInfo(meetingID);
        int rowNum = 1;
        for (AccountMeeting accountMeeting : list) {
            HSSFRow row = sheet.createRow(rowNum);
            row.createCell(0).setCellValue(accountMeeting.getMeetingID());
            row.createCell(1).setCellValue(accountMeeting.getAccountID());
            row.createCell(2).setCellValue(accountMeeting.getParticipantName());
            row.createCell(3).setCellValue(accountMeeting.getParticipantSex());
            row.createCell(4).setCellValue(accountMeeting.getParticipantPhone());
            row.createCell(5).setCellValue(accountMeeting.getParticipantWork());
            row.createCell(6).setCellValue(accountMeeting.getNeedHotel());
            row.createCell(7).setCellValue(accountMeeting.getParticipantIdentity());
            rowNum++;
        }
        String fileName = "会议信息.xls";
        response.reset();
        response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
        OutputStream os = new BufferedOutputStream(response.getOutputStream());
        response.setContentType("application/vnd.ms-excel; charset=utf-8");
        workbook.write(os);
        os.flush();
        os.close();
    }
    private void setTitle(HSSFWorkbook workbook, HSSFSheet sheet) {
        HSSFRow row = sheet.createRow(0);
        //设置列宽,setColumnWidth的第二个参数要乘以256,这个参数的单位是1/256个字符宽度
        sheet.setColumnWidth(0, 10 * 256);
        sheet.setColumnWidth(1, 20 * 256);
        sheet.setColumnWidth(2, 20 * 256);
        sheet.setColumnWidth(3, 20 * 256);
        sheet.setColumnWidth(4, 20 * 256);
        sheet.setColumnWidth(5, 20 * 256);
        sheet.setColumnWidth(6, 20 * 256);

        sheet.setColumnWidth(7, 100 * 256);

        //设置为居中加粗
        HSSFCellStyle style = workbook.createCellStyle();
        HSSFFont font = workbook.createFont();
        style.setFont(font);

        HSSFCell cell;
        cell = row.createCell(0);
        cell.setCellValue("会议编号");
        cell.setCellStyle(style);


        cell = row.createCell(1);
        cell.setCellValue("参会者账号");
        cell.setCellStyle(style);

        cell = row.createCell(2);
        cell.setCellValue("参会者姓名");
        cell.setCellStyle(style);


        cell = row.createCell(3);
        cell.setCellValue("参会者性别");
        cell.setCellStyle(style);

        cell = row.createCell(4);
        cell.setCellValue("参会者联系方式");
        cell.setCellStyle(style);

        cell = row.createCell(5);
        cell.setCellValue("参会者工作单位");
        cell.setCellStyle(style);

        cell = row.createCell(6);
        cell.setCellValue("参会者是否需要宾馆");
        cell.setCellStyle(style);

        cell = row.createCell(7);
        cell.setCellValue("参会者身份证号");
        cell.setCellStyle(style);
    }
}

生成会议二维码:

  @RequestMapping(value = "/getCode", method = RequestMethod.POST)
    public void getGode(HttpServletResponse response, @RequestParam("meetingID") String meetingID) throws IOException {
        Meeting meeting = meetingService.selectMeeting(meetingID).get(0);
        response.setContentType("image/jpg");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);

        OutputStream stream = response.getOutputStream();
        BitMatrix bitMatrix = QRCodeUtils.createCode(meeting.toString());
        MatrixToImageWriter.writeToStream(bitMatrix, "jpg", stream);

    }
4、前端界面

前端界面代码量较大,故不贴出详细代码,博客底部我会贴出项目github的地址,有意者可自行查看。

五、项目成品展示

在这里插入图片描述

六、想说的话

博主只是某不知名大学的在读生,虽然大三但还是个编程菜鸟。该系统是我们老师所布置的一次考核,因为是博主接触web开发之后的第一个web项目成品,觉得有些纪念意义就趁着这个假期发了出来。项目本身仍存在不少的问题,让各位大佬见笑了,如有意深入了解,可前往github查看完整的项目代码(地址如下:项目源地址),烦请各位指正^^

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值