SSM框架实现OA系统

该博客介绍了如何利用SSM(Spring、SpringMVC、MyBatis)框架结合MySQL数据库实现一个线上办公系统,包括在线信息管理功能,并详细阐述了各模块的代码配置,如spring配置文件、Controller、Service、Mapper等。还提到了全文索引的设置,并提供了项目源码的gitee链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SSM+MySQL实现线上办公系统


开发时间:2019.5-2019.7

项目模块

在这里插入图片描述

一、在线信息模块

包括:发送信息、删除信息、草稿箱管理、查询信息

二、代码

1.spring配置文件

applicationContext.xml文件作为系统的父容器,用来处理除了controller以外的内容。


```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
		http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">



	<!-- 引入资源文件用于在java中注入属性值 -->
	<bean id="prop" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
		<property name="locations">
			<array>
				<value>classpath:db_config.properties</value>
			</array>
		</property>
	</bean>
	
	<!-- 加载属性文件 -->
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<array>
				<value>classpath:db_config.properties</value>
			</array>
		</property>
	</bean>

	<!-- 扫描注解,排除控制器扫描 -->
	<context:component-scan base-package="com.icss.oa">
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
	</context:component-scan>

	<!-- 数据源 c3p0连接池 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${driver}" />
		<property name="jdbcUrl" value="${url}" />
		<property name="user" value="${username}" />
		<property name="password" value="${password}" />
		<property name="maxPoolSize" value="15" />
		<property name="minPoolSize" value="5" />
		<property name="initialPoolSize" value="5" />
		<property name="acquireIncrement" value="5" />
	</bean>

	<!-- sessionFactory 将spring和mybatis整合 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:mybatis-config.xml" />
		<!-- 自动扫描mapping.xml文件 -->
		<property name="mapperLocations" value="classpath:com/icss/oa/*/mapper/*.xml" />
	</bean>

	<!-- DAO接口扫描 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 扫描包路径,如果需要扫描多个包中间用半角逗号隔开 -->
		<property name="basePackage" value="com.icss.oa.*.dao" />
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
	</bean>

	<!-- 事务管理器 -->
	<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!-- 事务注解支持,需要在要切入事务的类中加入@Transactional注解 -->
	<tx:annotation-driven transaction-manager="txManager" />

</beans>

2.SpringMVC配置文件

用来处理与浏览器相关的操作,在扫描组件的时候只扫描控制器。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">


	<!-- 扫描注解,只扫描控制器 -->
	<context:component-scan base-package="com.icss.oa">
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>
	
	<!-- 视图解析器 ,自动给转发地址加上前缀和后缀-->
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
	
	<!-- springMVC注解驱动,mvc:annotation-driven处理动态资源 -->
	<mvc:annotation-driven>
		<mvc:message-converters>
			<bean
				class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
				<property name="objectMapper">
					<bean class="com.fasterxml.jackson.databind.ObjectMapper">
						<property name="dateFormat">
							<bean class="java.text.SimpleDateFormat">
								<constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />
							</bean>
						</property>
					</bean>
				</property>
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>
	
	<!-- 默认请求处理,处理静态资源 -->
	<mvc:default-servlet-handler/>
	
	<!-- 文件上传设置 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 默认编码  -->
		<property name="defaultEncoding" value="utf-8"/>
		<!-- 最大文件上传大小限制,当前设置10M -->
		<property name="maxUploadSize" value="10485760"/>
		<!-- 最大内存临时文件限制,当前设置4k -->
		<property name="maxInMemorySize" value="4096"/>
	</bean>

</beans>

3、MessageController.java

控制器层。

package com.icss.oa.message.controller;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.icss.oa.common.Pager;
import com.icss.oa.message.pojo.Message;
import com.icss.oa.message.service.MessageService;
import com.icss.oa.system.pojo.Employee;
import com.icss.oa.system.service.EmployeeService;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;

/**
 * 信息控制器
 * 
 * @author Administrator
 *
 */
@Controller
public class MessageController {

	@Autowired
	private MessageService service;

	@Autowired
	private EmployeeService empService;

	/**
	 * 增加信息
	 * 
	 * @param request
	 * @param response
	 * @param dept
	 */
	@RequestMapping("/mes/addMes")
	public void addMes(HttpServletRequest request, HttpServletResponse response, Message Message) {
		service.addMes(Message);
	}

	/**
	 * 增加信息,根据登录名增加,已发信息
	 * 
	 * @param request
	 * @param response
	 * @param dept
	 */
	@RequestMapping("/mes/addMesByLoginName")
	public void addMesByLoginName(HttpServletRequest request, HttpServletResponse response, Integer[] emp,
			Message mes) {

		for (int i = 0; i < emp.length; i++) {

			Date mesSendDate = new Date();

			HttpSession session = request.getSession();

			String empLoginName = (String) session.getAttribute("empLoginName");
			Employee employee = empService.queryEmpByLoginName(empLoginName);
			employee.setEmpId(empService.getId(empLoginName));

			Integer empId = employee.getEmpId();

			Employee mesSender = new Employee();
			mesSender.setEmpId(empId);
			mes.setMesSender(mesSender);

			Employee mesReciver = empService.getById(emp[i]);

			mes.setMesReciver(mesReciver);

			mes.setMesSendConfirm("已发");
			mes.setMesReadConfirm("未读");
			mes.setMesSendDate(mesSendDate);

			service.addMes(mes);
		}
	}
	
	/**
	 * 发件群发到草稿箱
	 * @param request
	 * @param response
	 * @param emp
	 * @param mes
	 */
	@RequestMapping("/mes/addDraftByLoginNameNew")
	public void addDraftByLoginNameNew(HttpServletRequest request, HttpServletResponse response, Integer[] emp,
			Message mes) {

		for (int i = 0; i < emp.length; i++) {

			Date mesSendDate = new Date();

			HttpSession session = request.getSession();

			String empLoginName = (String) session.getAttribute("empLoginName");
			Employee employee = empService.queryEmpByLoginName(empLoginName);
			employee.setEmpId(empService.getId(empLoginName));

			Integer empId = employee.getEmpId();

			Employee mesSender = new Employee();
			mesSender.setEmpId(empId);
			mes.setMesSender(mesSender);

			Employee mesReciver = empService.getById(emp[i]);

			mes.setMesReciver(mesReciver);

			mes.setMesSendConfirm("未发");
			mes.setMesReadConfirm("未读");
			mes.setMesSendDate(mesSendDate);

			service.addMes(mes);
		}
	}

	/**
	 * 增加信息,根据登录名增加,草稿箱
	 * 
	 * @param request
	 * @param response
	 * @param dept
	 */
	@RequestMapping("/mes/addDraftByLoginName")
	public void addDraftByLoginName(HttpServletRequest request, HttpServletResponse response, Message mes) {

		Date mesSendDate = new Date();

		HttpSession session = request.getSession();

		String empLoginName = (String) session.getAttribute("empLoginName");
		Employee emp = empService.queryEmpByLoginName(empLoginName);
		emp.setEmpId(empService.getId(empLoginName));

		Integer empId = emp.getEmpId();

		Employee mesSender = new Employee();
		mesSender.setEmpId(empId);
		mes.setMesSender(mesSender);

		mes.setMesSendConfirm("未发");
		mes.setMesReadConfirm("未读");
		mes.setMesSendDate(mesSendDate);

		service.addMes(mes);
	}

	/**
	 * 删除信息
	 * 
	 * @param request
	 * @param response
	 * @param Message
	 */
	@RequestMapping("/mes/deleteMes")
	public void delete(HttpServletRequest request, HttpServletResponse response, Integer mesId) {
		service.deleteMes(mesId);
	}

	/**
	 * 修改信息
	 * 
	 * @param request
	 * @param response
	 * @param Message
	 */
	@RequestMapping("/mes/updateMes")
	public void update(HttpServletRequest request, HttpServletResponse response, Message mes) {

		Date mesSendDate = new Date();

		HttpSession session = request.getSession();

		String empLoginName = (String) session.getAttribute("empLoginName");
		Employee employee = empService.queryEmpByLoginName(empLoginName);
		employee.setEmpId(empService.getId(empLoginName));

		Integer empId = employee.getEmpId();

		Employee mesSender = new Employee();
		mesSender.setEmpId(empId);
		mes.setMesSender(mesSender);
		mes.setMesSendDate(mesSendDate);

		service.updateMes(mes);

	}
	
	/**
	 * 修改信息
	 * @param request
	 * @param response
	 * @param mes
	 */
	@RequestMapping("/mes/updateMesNew")
	public void updateNew(HttpServletRequest request, HttpServletResponse response, Message mes) {

		Date mesSendDate = new Date();

		HttpSession session = request.getSession();

		String empLoginName = (String) session.getAttribute("empLoginName");
		Employee employee = empService.queryEmpByLoginName(empLoginName);
		employee.setEmpId(empService.getId(empLoginName));

		Integer empId = employee.getEmpId();

		Employee mesSender = new Employee();
		mesSender.setEmpId(empId);
		mes.setMesSender(mesSender);
		mes.setMesSendDate(mesSendDate);
		mes.setMesSendConfirm("已发");

		service.updateMes(mes);

	}

	/**
	 * 把未读消息点开变成已读消息
	 * 
	 * @param request
	 * @param response
	 * @param mes
	 */
	@RequestMapping("/mes/updateUnread")
	public void updateUnread(HttpServletRequest request, HttpServletResponse response, Message mes) {
		
//		HttpSession session = request.getSession();
//
//		String empLoginName = (String) session.getAttribute("empLoginName");
//		Employee employee = empService.queryEmpByLoginName(empLoginName);
//		employee.setEmpId(empService.getId(empLoginName));
//
//		Integer empId = employee.getEmpId();

//		Employee mesSender = new Employee();
//		mesSender.setEmpId(empId);
//		mes.setMesSendDate(mesSendDate);
		
		HttpSession session = request.getSession();

		String empLoginName = (String) session.getAttribute("empLoginName");
		Employee employee = empService.queryEmpByLoginName(empLoginName);
		employee.setEmpId(empService.getId(empLoginName));

		Integer empId = employee.getEmpId();

		Employee mesSender = new Employee();
		mesSender.setEmpId(empId);
		mes.setMesSender(mesSender);

		mes.setMesReadConfirm("已读");

		service.updateMes(mes);

	}

	/**
	 * 条件查询
	 * 
	 * @param request
	 * @param response
	 * @param start
	 * @param pageSize
	 * @param mesSendDate
	 * @param empEmail
	 * @param mesTitle
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	@RequestMapping("/mes/queryByCondition")
	@ResponseBody
	public HashMap<String, Object> queryByCondition(HttpServletRequest request, HttpServletResponse response,
			Integer pageNum, Integer pageSize, String mesSendDate, String empEmail, String mesTitle, Integer empId,
			String mesInfo) throws UnsupportedEncodingException {

		if (pageNum == null) {
			pageNum = 0;
		}

		if (pageSize == null) {
			pageSize = 5;
		}

		Pager pager = new Pager(service.getMesCountByCondition(mesSendDate, empEmail, mesTitle, empId, mesInfo),
				pageSize, pageNum);

		List<Message> list = service.queryMesByCondition(pager, mesSendDate, empEmail, mesTitle, empId, mesInfo);

		// 在Map集合中存储分页数据和信息数据
		HashMap<String, Object> map = new HashMap<>();
		map.put("pager", pager);
		map.put("list", list);

		return map;
	}

	/**
	 * 条件查询 没有收件人
	 * 
	 * @param request
	 * @param response
	 * @param start
	 * @param pageSize
	 * @param mesSendDate
	 * @param empEmail
	 * @param mesTitle
	 * @return
	 */
	@RequestMapping("/mes/queryByCondition1")
	@ResponseBody
	public HashMap<String, Object> queryByCondition1(HttpServletRequest request, HttpServletResponse response,
			Integer pageNum, Integer pageSize, String mesSendDate, String empEmail, String mesTitle) {

		if (pageNum == null) {
			pageNum = 0;
		}

		if (pageSize == null) {
			pageSize = 5;
		}

		Pager pager = new Pager(service.getMesCount(), pageSize, pageNum);

		List<Message> list = service.queryMesByCondition1(pager, mesSendDate, empEmail, mesTitle);

		// 在Map集合中存储分页数据和信息数据
		HashMap<String, Object> map = new HashMap<>();
		map.put("pager", pager);
		map.put("list", list);

		return map;
	}

	/**
	 * 根据登录名查询
	 * 
	 * @param request
	 * @param response
	 * @param pageNum
	 * @param pageSize
	 * @param empLoginName
	 * @return
	 */
	@RequestMapping("/mes/queryByEmpLoginName")
	@ResponseBody
	public HashMap<String, Object> queryByEmpLoginName(HttpServletRequest request, HttpServletResponse response,
			Integer pageNum, Integer pageSize, String empLoginName, String mesSendDate, String empEmail,
			String mesTitle, Integer empId, String mesInfo) {

		HttpSession session = request.getSession();

		empLoginName = (String) session.getAttribute("empLoginName");
		Employee emp = empService.queryEmpByLoginName(empLoginName);
		session.setAttribute("empId", emp.getEmpId()); // 记录用户id

		if (pageNum == null) {
			pageNum = 0;
		}

		if (pageSize == null) {
			pageSize = 5;
		}

		Pager pager = new Pager(
				service.getMesCountByEmpLoginName(empLoginName, mesSendDate, empEmail, mesTitle, empId, mesInfo),
				pageSize, pageNum);

		List<Message> list = service.queryMesByLoginName(empLoginName, pager, mesSendDate, empEmail, mesTitle, empId,
				mesInfo);

		// 在Map集合中存储分页数据和信息数据
		HashMap<String, Object> map = new HashMap<>();
		map.put("pager", pager);
		map.put("list", list);

		return map;
	}

	/**
	 * 查询草稿箱
	 * 
	 * @param request
	 * @param response
	 * @param mesSendConfirm
	 * @param pageNum
	 * @param pageSize
	 * @param empLoginName
	 * @return
	 */
	@RequestMapping("/mes/queryDraft")
	@ResponseBody
	public HashMap<String, Object> queryDraft(HttpServletRequest request, HttpServletResponse response,
			String mesSendConfirm, Integer pageNum, Integer pageSize, String empLoginName) {

		HttpSession session = request.getSession();

		empLoginName = (String) session.getAttribute("empLoginName");
		Employee emp = empService.queryEmpByLoginName(empLoginName);
		session.setAttribute("empId", emp.getEmpId()); // 记录用户id

		if (pageNum == null) {
			pageNum = 0;
		}

		if (pageSize == null) {
			pageSize = 5;
		}

		Pager pager = new Pager(service.getMesDraftCount("未发", empLoginName), pageSize, pageNum);

		List<Message> list = service.queryMesDraft("未发", pager, empLoginName);

		// 在Map集合中存储分页数据和信息数据
		HashMap<String, Object> map = new HashMap<>();
		map.put("pager", pager);
		map.put("list", list);

		return map;
	}

	/**
	 * 查询发件箱
	 * 
	 * @param request
	 * @param response
	 * @param mesSendConfirm
	 * @param pageNum
	 * @param pageSize
	 * @param empLoginName
	 * @return
	 */
	@RequestMapping("/mes/queryOutbox")
	@ResponseBody
	public HashMap<String, Object> queryOutbox(HttpServletRequest request, HttpServletResponse response,
			String mesSendConfirm, Integer pageNum, Integer pageSize, String empLoginName) {

		HttpSession session = request.getSession();

		empLoginName = (String) session.getAttribute("empLoginName");
		Employee emp = empService.queryEmpByLoginName(empLoginName);
		session.setAttribute("empId", emp.getEmpId()); // 记录用户id

		if (pageNum == null) {
			pageNum = 0;
		}

		if (pageSize == null) {
			pageSize = 5;
		}

		Pager pager = new Pager(service.getMesDraftCount("已发", empLoginName), pageSize, pageNum);

		List<Message> list = service.queryMesDraft("已发", pager, empLoginName);

		// 在Map集合中存储分页数据和信息数据
		HashMap<String, Object> map = new HashMap<>();
		map.put("pager", pager);
		map.put("list", list);

		return map;
	}

	/**
	 * 查询收件箱
	 * 
	 * @param request
	 * @param response
	 * @param pageNum
	 * @param pageSize
	 * @param empLoginName
	 * @return
	 */
	@RequestMapping("/mes/queryInbox")
	@ResponseBody
	public HashMap<String, Object> queryInbox(HttpServletRequest request, HttpServletResponse response, Integer pageNum,
			Integer pageSize, String empLoginName) {

		HttpSession session = request.getSession();

		empLoginName = (String) session.getAttribute("empLoginName");
		Employee emp = empService.queryEmpByLoginName(empLoginName);
		session.setAttribute("empId", emp.getEmpId()); // 记录用户id

		if (pageNum == null) {
			pageNum = 0;
		}

		if (pageSize == null) {
			pageSize = 5;
		}

		Pager pager = new Pager(service.getMesInboxCount(empLoginName), pageSize, pageNum);

		List<Message> list = service.queryMesInbox(pager, empLoginName);

		// 在Map集合中存储分页数据和信息数据
		HashMap<String, Object> map = new HashMap<>();
		map.put("pager", pager);
		map.put("list", list);

		return map;
	}

	/**
	 * 未读消息
	 * 
	 * @param request
	 * @param response
	 * @param mesSendConfirm
	 * @param mesReadConfirm
	 * @param pageNum
	 * @param pageSize
	 * @param empLoginName
	 * @return
	 */
	@RequestMapping("/mes/queryUnread")
	@ResponseBody
	public HashMap<String, Object> queryUnread(HttpServletRequest request, HttpServletResponse response,
			String mesSendConfirm, String mesReadConfirm, Integer pageNum, Integer pageSize, String empLoginName) {

		HttpSession session = request.getSession();

		empLoginName = (String) session.getAttribute("empLoginName");
		Employee emp = empService.queryEmpByLoginName(empLoginName);
		session.setAttribute("empId", emp.getEmpId()); // 记录用户id

		if (pageNum == null) {
			pageNum = 0;
		}

		if (pageSize == null) {
			pageSize = 5;
		}

		Pager pager = new Pager(service.getMesUnreadCount("已发", "未读", empLoginName), pageSize, pageNum);

		List<Message> list = service.queryMesUnread("已发", "未读", pager, empLoginName);

		// 在Map集合中存储分页数据和信息数据
		HashMap<String, Object> map = new HashMap<>();
		map.put("pager", pager);
		map.put("list", list);

		return map;
	}

	/**
	 * 根据id查询信息
	 * 
	 * @param request
	 * @param response
	 * @param mesId
	 * @return
	 */
	@RequestMapping("/mes/queryById")
	@ResponseBody
	public Message queryById(HttpServletRequest request, HttpServletResponse response, Integer mesId) {

		Message mes = service.queryMesById(mesId);

		return mes;
	}

	/**
	 * 全文检索信息
	 * 
	 * @throws IOException
	 * @throws ParseException
	 * @throws InvalidTokenOffsetsException
	 */
	@RequestMapping("mes/queryByIndex")
	@ResponseBody
	public List<Message> queryByIndex(HttpServletRequest request, HttpServletResponse response, String queryStr)
			throws ParseException, IOException, InvalidTokenOffsetsException {

		return service.queryMesByIndex(queryStr);
	}

	/**
	 * 批量删除
	 */
	@RequestMapping("mes/deleteMany")
	public void deleteMany(HttpServletRequest request, HttpServletResponse response, Integer[] ids)
			throws ParseException, IOException, InvalidTokenOffsetsException {

		for (int i = 0; i < ids.length; i++) {
			service.deleteMes(ids[i]);
		}

	}

	/**
	 * 群发邮件
	 */
	@RequestMapping("mes/addMany")
	public void insertMany(HttpServletRequest request, HttpServletResponse response, Integer[] emp, Message mes) {
		for (int i = 0; i < emp.length; i++) {

			Employee employee = empService.getById(emp[i]);

			mes.setMesReciver(employee);

			service.addMes(mes);
		}
	}

	/**
	 * 获得未读消息的数量
	 * 
	 * @param request
	 * @param response
	 * @param count
	 */
	@RequestMapping("mes/getUnreadCount")
	@ResponseBody
	public Integer getUnreadCount(HttpServletRequest request, HttpServletResponse response, Integer count,
			String empLoginName) {

		HttpSession session = request.getSession();

		empLoginName = (String) session.getAttribute("empLoginName");
		Employee emp = empService.queryEmpByLoginName(empLoginName);
		session.setAttribute("empId", emp.getEmpId()); // 记录用户id

		count = service.getMesUnreadCount("已发", "未读", empLoginName);

		return count;

	}

	/**
	 * 获得收件箱个数
	 * 
	 * @param request
	 * @param response
	 * @param count
	 * @param empLoginName
	 * @return
	 */
	@RequestMapping("mes/getInboxCount")
	@ResponseBody
	public Integer getInboxCount(HttpServletRequest request, HttpServletResponse response, Integer count,
			String empLoginName) {
		HttpSession session = request.getSession();

		empLoginName = (String) session.getAttribute("empLoginName");
		Employee emp = empService.queryEmpByLoginName(empLoginName);
		session.setAttribute("empId", emp.getEmpId()); // 记录用户id

		count = service.getMesInboxCount(empLoginName);

		return count;
	}

	/**
	 * 获得发件箱个数
	 * 
	 * @param request
	 * @param response
	 * @param count
	 * @param empLoginName
	 * @return
	 */
	@RequestMapping("mes/getOutboxCount")
	@ResponseBody
	public Integer getOutboxCount(HttpServletRequest request, HttpServletResponse response, Integer count,
			String empLoginName) {
		HttpSession session = request.getSession();

		empLoginName = (String) session.getAttribute("empLoginName");
		Employee emp = empService.queryEmpByLoginName(empLoginName);
		session.setAttribute("empId", emp.getEmpId()); // 记录用户id

		count = service.getMesDraftCount("已发", empLoginName);

		return count;
	}

	/**
	 * 获得草稿箱个数
	 * 
	 * @param request
	 * @param response
	 * @param count
	 * @param empLoginName
	 * @return
	 */
	@RequestMapping("mes/getDraftCount")
	@ResponseBody
	public Integer getDraftCount(HttpServletRequest request, HttpServletResponse response, Integer count,
			String empLoginName) {
		HttpSession session = request.getSession();

		empLoginName = (String) session.getAttribute("empLoginName");
		Employee emp = empService.queryEmpByLoginName(empLoginName);
		session.setAttribute("empId", emp.getEmpId()); // 记录用户id

		count = service.getMesDraftCount("未发", empLoginName);

		return count;
	}

	/**
	 * 总数
	 * 
	 * @param request
	 * @param response
	 * @param count
	 * @param empLoginName
	 * @return
	 */
	@RequestMapping("mes/getCount")
	@ResponseBody
	public Integer getCount(HttpServletRequest request, HttpServletResponse response, Integer count,
			String empLoginName) {
		HttpSession session = request.getSession();

		empLoginName = (String) session.getAttribute("empLoginName");
		Employee emp = empService.queryEmpByLoginName(empLoginName);
		session.setAttribute("empId", emp.getEmpId()); // 记录用户id

		count = service.getMesCountByEmpLoginName(empLoginName, null, null, null, null, null);

		return count;
	}

}

4、MessageService.java

package com.icss.oa.message.service;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.Term;
import org.apache.lucene.document.TextField;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.util.Version;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.icss.oa.common.Pager;
import com.icss.oa.message.dao.MessageMapper;
import com.icss.oa.message.index.MessageIndexDao;
import com.icss.oa.message.pojo.Message;
import com.icss.oa.system.dao.EmployeeMapper;
import com.icss.oa.system.pojo.Employee;

/**
 * 在线信息业务层
 * 
 * @author bhl
 *
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class MessageService {

	@Autowired
	private MessageMapper mapper;
	
	@Autowired
	private EmployeeMapper empMapper;
	
	@Autowired
	private MessageIndexDao indexDao;

	/**
	 * 根据id查询信息
	 * 
	 * @param mesId
	 * @return
	 */
	public Message queryMesById(Integer mesId) {
		return mapper.queryById(mesId);
	}

	/**
	 * 添加信息
	 * 
	 * @param mes
	 */
	public void addMes(Message mes) {
		mapper.insert(mes);

		// 获得插入员工的自动编号
		int mesId = mapper.getLastInsertId();

		try {
			/********** 生成索引 *************/
			// 创建索引文档
			Document document = new Document();
			document.add(new TextField("mesId", String.valueOf(mesId), Store.YES));
			document.add(new TextField("mesTitle", mes.getMesTitle(), Store.YES));
			document.add(new TextField("mesInfo", mes.getMesInfo(), Store.YES));

			// 调用索引dao
			indexDao.create(document);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 删除信息
	 * 
	 * @param mesId
	 */
	public void deleteMes(Integer mesId) {
		mapper.delete(mesId);

		// 索引
		try {
			Term term = new Term("mesId", String.valueOf(mesId));
			// 调用索引dao
			indexDao.delete(term);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 修改信息
	 * 
	 * @param mes
	 */
	public void updateMes(Message mes) {
		mapper.update(mes);

		// 索引
		try {
			Term term = new Term("mesId", String.valueOf(mes.getMesId()));

			// 创建索引文档
			Document document = new Document();
			document.add(new TextField("empId", String.valueOf(mes.getMesId()), Store.YES));
			document.add(new TextField("mesTitle", mes.getMesTitle(), Store.YES));
			document.add(new TextField("mesInfo", mes.getMesInfo(), Store.YES));

			// 调用索引dao
			indexDao.update(term, document);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 返回信息总记录数
	 * 
	 * @return
	 */
	@Transactional(readOnly = true)
	public int getMesCount() {
		return mapper.getCount();
	}

	/**
	 * 全部的模糊查询
	 * 
	 * @param pager
	 * @param mesSendDate
	 * @param empEmail
	 * @param mesTitle
	 * @param mesReciver
	 * @param mesInfo
	 * @return
	 */
	@Transactional(readOnly = true)
	public List<Message> queryMesByCondition(Pager pager, String mesSendDate, String empEmail, String mesTitle,
			Integer mesReciver, String mesInfo) {
		return mapper.queryByCondition(pager.getStart(), pager.getPageSize(), mesSendDate, empEmail, mesTitle,
				mesReciver, mesInfo);
	}

	/**
	 * 全部的模糊查询 没有收件人
	 * 
	 * @param pager
	 * @param mesSendDate
	 * @param empEmail
	 * @param mesTitle
	 * @return
	 */
	@Transactional(readOnly = true)
	public List<Message> queryMesByCondition1(Pager pager, String mesSendDate, String empEmail, String mesTitle) {
		return mapper.queryByCondition1(pager.getStart(), pager.getPageSize(), mesSendDate, empEmail, mesTitle);
	}

	/**
	 * 根据条件查询总记录数
	 * 
	 * @param mesSendDate
	 * @param empEmail
	 * @param mesTitle
	 * @param mesReciver
	 * @param mesInfo
	 * @return
	 */
	@Transactional(readOnly = true)
	public Integer getMesCountByCondition(String mesSendDate, String empEmail, String mesTitle, Integer mesReciver,
			String mesInfo) {
		return mapper.getCountByCondition(mesSendDate, empEmail, mesTitle, mesReciver, mesInfo);
	}

	/**
	 * 全文检索员工
	 * 
	 * @throws ParseException
	 * @throws IOException
	 * @throws InvalidTokenOffsetsException
	 */
	@Transactional(readOnly = true)
	public List<Message> queryMesByIndex(String queryStr)
			throws IOException, InvalidTokenOffsetsException, ParseException {

		// 设置常见停用词(的,么,啊,着之类的东东)
		String[] self_stop_words = { "的", "着", "啊", "么", "嘛", "是" };
		CharArraySet cas = new CharArraySet(Version.LUCENE_47, 0, true);
		for (int i = 0; i < self_stop_words.length; i++) {
			cas.add(self_stop_words[i]);
		}

		// 加入系统默认停用词
		Iterator<Object> itor = StandardAnalyzer.STOP_WORDS_SET.iterator();
		while (itor.hasNext()) {
			cas.add(itor.next());
		}

		// 中文分词器(设置停用词)
		Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_47, cas);

		// 创建查询解析器对象,多字段搜索
		QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_47,
				new String[] { "mesId", "mesTitle", "mesInfo" }, analyzer);

		// 创建查询对象
		Query query = queryParser.parse(queryStr);

		// 调用索引dao
		List<Message> list = indexDao.search(query);

		return list;
	}

	/**
	 * 根据登录名查询信息
	 * 
	 * @param empLoginName
	 * @param pager
	 * @return
	 */
	@Transactional(readOnly = true)
	public List<Message> queryMesByLoginName(String empLoginName, Pager pager, String mesSendDate, String empEmail,
			String mesTitle, Integer mesReciver, String mesInfo) {
		return mapper.queryByLoginName(empLoginName, pager.getStart(), pager.getPageSize(), mesSendDate, empEmail,
				mesTitle, mesReciver, mesInfo);
	}

	/**
	 * 根据登录名查询响应的总记录数
	 * 
	 * @param empLoginName
	 * @return
	 */
	@Transactional(readOnly = true)
	public int getMesCountByEmpLoginName(String empLoginName, String mesSendDate, String empEmail, String mesTitle,
			Integer mesReciver, String mesInfo) {
		return mapper.getCountByEmpLoginName(empLoginName, mesSendDate, empEmail, mesTitle, mesReciver, mesInfo);
	}

	/**
	 * 草稿箱和发件箱查询
	 * 
	 * @param mesSendConfirm
	 * @param start
	 * @param pageSize
	 * @param empLoginName
	 * @return
	 */
	@Transactional(readOnly = true)
	public List<Message> queryMesDraft(String mesSendConfirm, Pager pager, String empLoginName) {
		return mapper.queryDraft(mesSendConfirm, pager.getStart(), pager.getPageSize(), empLoginName);
	}

	/**
	 * 草稿箱和发件箱个数
	 * 
	 * @param mesSendConfirm
	 * @param empLoginName
	 * @return
	 */
	@Transactional(readOnly = true)
	public Integer getMesDraftCount(String mesSendConfirm, String empLoginName) {
		return mapper.getCountDraft(mesSendConfirm, empLoginName);
	}

	/**
	 * 收件箱查询
	 * 
	 * @param start
	 * @param pageSize
	 * @param empLoginName
	 * @return
	 */
	@Transactional(readOnly = true)
	public List<Message> queryMesInbox(Pager pager, String empLoginName) {
		return mapper.queryInbox(pager.getStart(), pager.getPageSize(), empLoginName);
	}

	/**
	 * 收件箱个数
	 * 
	 * @param empLoginName
	 * @return
	 */
	@Transactional(readOnly = true)
	public Integer getMesInboxCount(String empLoginName) {
		return mapper.getCountInbox(empLoginName);
	}

	/**
	 * 未读消息查询
	 * 
	 * @param pager
	 * @param empLoginName
	 * @param mesSendConfirm
	 * @param mesReadConfirm
	 * @return
	 */
	@Transactional(readOnly = true)
	public List<Message> queryMesUnread(String mesSendConfirm, String mesReadConfirm, Pager pager,
			String empLoginName) {
		return mapper.queryUnread(mesSendConfirm, mesReadConfirm, pager.getStart(), pager.getPageSize(), empLoginName);
	}

	/**
	 * 未读消息查询
	 * 
	 * @param empLoginName
	 * @param mesSendConfirm
	 * @param mesReadConfirm
	 * @return
	 */
	@Transactional(readOnly = true)
	public Integer getMesUnreadCount(String mesSendConfirm, String mesReadConfirm, String empLoginName) {
		return mapper.getCountUnread(mesSendConfirm, mesReadConfirm, empLoginName);
	}

	/**
	 * 群发邮件
	 * 
	 * @param mes
	 * @param ids
	 */
	public void groupSend(Message mes, Integer[] ids,String empLoginName) {
		
		Employee sender = empMapper.queryByLoginName(empLoginName);
		mes.setMesSender(sender);
		
		for (int i = 0; i < ids.length; i++) {
			
			Employee mesReciver = new Employee();
			mesReciver.setEmpId(ids[i]);
			mes.setMesReciver(mesReciver);
			
			mapper.insert(mes);
			
			// 获得插入信息的自动编号
			int mesId = mapper.getLastInsertId();

			try {
				/********** 生成索引 *************/
				// 创建索引文档
				Document document = new Document();
				document.add(new TextField("mesId", String.valueOf(mesId), Store.YES));
				document.add(new TextField("mesTitle", mes.getMesTitle(), Store.YES));
				document.add(new TextField("mesInfo", mes.getMesInfo(), Store.YES));

				// 调用索引dao
				indexDao.create(document);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

5、MessageMapper.java

package com.icss.oa.message.dao;

import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.icss.oa.message.pojo.Message;

/**
 * 在线信息dao层
 * 
 * @author bhl
 *
 */
public interface MessageMapper {

	void insert(Message mes); // 增加信息

	void update(Message mes); // 修改信息

	void delete(Integer mesId); // 删除信息

	Message queryById(Integer mesId); // 根据id查询信息

	int getCount(); // 获得总数

	// 条件查询个数
	int getCountByCondition(@Param("mesSendDate") String mesSendDate, // 日期
			@Param("empEmail") String empEmail, // 邮箱
			@Param("mesTitle") String mesTitle, // 题目
			@Param("mesReciver") Integer mesReciver, // 收件人
			@Param("mesInfo") String mesInfo // 邮件信息
	); // 根据条件获得总记录数

	// 条件查询
	List<Message> queryByCondition(@Param("start") Integer start, @Param("pageSize") Integer pageSize, // 分页
			@Param("mesSendDate") String mesSendDate, // 日期
			@Param("empEmail") String empEmail, // 邮箱
			@Param("mesTitle") String mesTitle, // 题目
			@Param("mesReciver") Integer mesReciver, // 收件人
			@Param("mesInfo") String mesInfo // 邮件信息
	);

	// 条件查询1
	List<Message> queryByCondition1(@Param("start") Integer start, @Param("pageSize") Integer pageSize, // 分页
			@Param("mesSendDate") String mesSendDate, // 日期
			@Param("empEmail") String empEmail, // 邮箱
			@Param("mesTitle") String mesTitle // 题目
	);

	// 获得最后一个添加的信息的id
	int getLastInsertId();

	// 根据登录名获得信息
	List<Message> queryByLoginName(@Param("empLoginName") String empLoginName, @Param("start") Integer start,
			@Param("pageSize") Integer pageSize,
			@Param("mesSendDate") String mesSendDate, // 日期
			@Param("empEmail") String empEmail, // 邮箱
			@Param("mesTitle") String mesTitle, // 题目
			@Param("mesReciver") Integer mesReciver, // 收件人
			@Param("mesInfo") String mesInfo // 邮件信息
			);

	// 根据登录名获得个数
	int getCountByEmpLoginName(@Param("empLoginName") String empLoginName,
			@Param("mesSendDate") String mesSendDate, // 日期
			@Param("empEmail") String empEmail, // 邮箱
			@Param("mesTitle") String mesTitle, // 题目
			@Param("mesReciver") Integer mesReciver, // 收件人
			@Param("mesInfo") String mesInfo // 邮件信息
			);
	
	// 草稿箱以及发件箱
	List<Message> queryDraft(@Param("mesSendConfirm") String mesSendConfirm, // 是否发送
			@Param("start") Integer start, @Param("pageSize") Integer pageSize,
			@Param("empLoginName") String empLoginName);

	// 草稿箱以及发件箱的个数
	int getCountDraft(@Param("mesSendConfirm") String mesSendConfirm, @Param("empLoginName") String empLoginName);

	// 收件箱
	List<Message> queryInbox(@Param("start") Integer start, @Param("pageSize") Integer pageSize,
			@Param("empLoginName") String empLoginName);

	// 收件箱的个数
	int getCountInbox(@Param("empLoginName") String empLoginName);

	// 未读消息查询
	List<Message> queryUnread(@Param("mesSendConfirm") String mesSendConfirm, // 是否发送
			@Param("mesReadConfirm") String mesReadConfirm, @Param("start") Integer start,
			@Param("pageSize") Integer pageSize, @Param("empLoginName") String empLoginName);

	// 未读消息的个数
	int getCountUnread(@Param("mesSendConfirm") String mesSendConfirm, @Param("mesReadConfirm") String mesReadConfirm,
			@Param("empLoginName") String empLoginName);

}

6、MessageMapping.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.icss.oa.message.dao.MessageMapper">

	<!-- 结果集映射 -->
	<resultMap id="BaseResultMap" type="com.icss.oa.message.pojo.Message">
		<id column="mes_id" property="mesId" jdbcType="INTEGER" />
		<result column="mes_send_confirm" property="mesSendConfirm"
			jdbcType="VARCHAR" />
		<result column="mes_read_confirm" property="mesReadConfirm"
			jdbcType="VARCHAR" />
		<result column="mes_send_date" property="mesSendDate" jdbcType="TIMESTAMP" />
		<result column="mes_info" property="mesInfo" jdbcType="VARCHAR" />
		<result column="mes_title" property="mesTitle" jdbcType="VARCHAR" />

		<association property="mesSender" javaType="com.icss.oa.system.pojo.Employee">
			<id column="mes_sender" property="empId" jdbcType="INTEGER" />
			<result column="sender_name" property="empName" jdbcType="VARCHAR" />
			<result column="sender_login_name" property="empLoginName"
				jdbcType="VARCHAR" />
			<result column="sender_email" property="empEmail" jdbcType="VARCHAR" />
		</association>

		<association property="mesReciver" javaType="com.icss.oa.system.pojo.Employee">
			<id column="mes_reciver" property="empId" jdbcType="INTEGER" />
			<result column="reciver_name" property="empName" jdbcType="VARCHAR" />
			<result column="reciver_login_name" property="empLoginName"
				jdbcType="VARCHAR" />
			<result column="reciver_email" property="empEmail" jdbcType="VARCHAR" />
		</association>

	</resultMap>

	<!-- 插入信息,已经发送的方法发件箱,没有发送成功的放到草稿箱 -->
	<insert id="insert" parameterType="com.icss.oa.message.pojo.Message">
		insert into message
		values(default, #{mesTitle}, #{mesSendConfirm},
		#{mesReadConfirm},
		#{mesSendDate}, #{mesInfo},
		#{mesSender.empId},#{mesReciver.empId})
	</insert>

	<!-- 修改信息,在草稿箱才可以用到,发件箱不可以用到 -->
	<update id="update" parameterType="com.icss.oa.message.pojo.Message">
		update message set mes_title =
		#{mesTitle},
		mes_sender = #{mesSender.empId},
		mes_reciver =
		#{mesReciver.empId},
		mes_send_confirm = #{mesSendConfirm},
		mes_read_confirm =
		#{mesReadConfirm},
		mes_send_date = #{mesSendDate},
		mes_info = #{mesInfo}
		where mes_id=#{mesId}
	</update>

	<!-- 删除信息 -->
	<delete id="delete" parameterType="java.lang.Integer">
		delete from message
		where
		mes_id = #{mesId}
	</delete>

	<!-- 根据id查询信息 -->
	<select id="queryById" resultMap="BaseResultMap" parameterType="java.lang.Integer">
		SELECT m.*,e1.emp_id mes_sender,e2.emp_id
		mes_reciver,e1.emp_name
		sender_name,e2.emp_name reciver_name,
		e1.emp_email sender_email,
		e2.emp_email reciver_email
		FROM message m
		LEFT OUTER JOIN employee as e1
		ON m.`mes_sender` = e1.`emp_id`
		LEFT OUTER JOIN employee as e2
		ON
		m.`mes_reciver` = e2.`emp_id`
		where mes_id=#{mesId}
		order by
		mes_send_date desc
	</select>

	<!-- 查询全部信息 -->
	<select id="query" resultMap="BaseResultMap">
		SELECT m.*,e1.emp_id
		mes_sender,e2.emp_id
		mes_reciver,e1.emp_name
		sender_name,e2.emp_name
		reciver_name,
		e1.emp_email sender_email,
		e2.emp_email reciver_email
		FROM
		message m
		LEFT OUTER JOIN employee as e1
		ON m.`mes_sender` = e1.`emp_id`
		LEFT OUTER JOIN employee as e2
		ON
		m.`mes_reciver` = e2.`emp_id`
		order by
		mes_send_date desc
	</select>

	<!-- 简单的查询,把查询结果分页 -->
	<select id="queryByPage" resultMap="BaseResultMap"
		parameterType="java.util.HashMap">
		SELECT m.*,e1.emp_id mes_sender,e2.emp_id
		mes_reciver,e1.emp_name sender_name,e2.emp_name reciver_name,
		e1.emp_email sender_email, e2.emp_email reciver_email
		FROM message m
		LEFT OUTER JOIN employee as e1
		ON m.`mes_sender` = e1.`emp_id`
		LEFT
		OUTER JOIN employee as e2
		ON m.`mes_reciver` = e2.`emp_id`
		order by
		mes_send_date desc
		LIMIT
		#{start}, #{pageSize}
	</select>

	<!-- 另一个分页查询 -->
	<select id="queryByPage1" resultMap="BaseResultMap"
		parameterType="java.util.HashMap">
		SELECT m.*,e1.emp_id mes_sender,e2.emp_id
		mes_reciver,e1.emp_name sender_name,e2.emp_name reciver_name,
		e1.emp_email sender_email, e2.emp_email reciver_email
		FROM message m
		LEFT OUTER JOIN employee as e1
		ON m.`mes_sender` = e1.`emp_id`
		LEFT
		OUTER JOIN employee as e2
		ON m.`mes_reciver` = e2.`emp_id`
		order by
		mes_send_date desc
		LIMIT
		#{start}, #{pageSize}
	</select>

	<!-- 整合的模糊查询 -->
	<select id="queryByCondition" parameterType="com.icss.oa.message.pojo.Message"
		resultMap="BaseResultMap">
		SELECT m.*,e1.emp_id mes_sender,e2.emp_id mes_reciver,e1.emp_name
		sender_name,e2.emp_name reciver_name,
		e1.emp_email sender_email,
		e2.emp_email reciver_email
		FROM message m
		LEFT OUTER JOIN employee as e1
		ON m.`mes_sender` = e1.`emp_id`
		LEFT OUTER JOIN employee as e2
		ON
		m.`mes_reciver` = e2.`emp_id`
		<where>
			<if test="mesTitle != null and mesTitle != '' ">
				and mes_title like
				concat('%',#{mesTitle,jdbcType=VARCHAR},'%')
			</if>
			<if test="empEmail != null and empEmail != '' ">
				and e2.`emp_email` like
				concat('%',#{empEmail,jdbcType=VARCHAR},'%')
			</if>
			<if test="mesSendDate != null and mesSendDate != '' ">
				and mes_send_date like concat('%', #{mesSendDate}, '%')
			</if>
			<if test="mesReciver != null and mesReciver != '' ">
				and mes_reciver = #{mesReciver}
			</if>
			<if test="mesInfo != null and mesInfo != '' ">
				and mes_info like
				concat('%',#{mesInfo,jdbcType=VARCHAR},'%')
			</if>
		</where>
		order by mes_send_date desc
		LIMIT #{start}, #{pageSize}
	</select>

	<!-- 整合的模糊查询 没有收件人 -->
	<select id="queryByCondition1" parameterType="com.icss.oa.message.pojo.Message"
		resultMap="BaseResultMap">
		SELECT m.*,e1.emp_id mes_sender,e2.emp_id mes_reciver,e1.emp_name
		sender_name,e2.emp_name reciver_name,
		e1.emp_email sender_email,
		e2.emp_email reciver_email
		FROM message m
		LEFT OUTER JOIN employee as e1
		ON m.`mes_sender` = e1.`emp_id`
		LEFT OUTER JOIN employee as e2
		ON
		m.`mes_reciver` = e2.`emp_id`
		<where>
			<if test="mesTitle != null and mesTitle != '' ">
				and mes_title like
				concat('%',#{mesTitle,jdbcType=VARCHAR},'%')
			</if>
			<if test="empEmail != null and empEmail != '' ">
				and e2.`emp_email` like
				concat('%',#{empEmail,jdbcType=VARCHAR},'%')
			</if>
			<if test="mesSendDate != null and mesSendDate != '' ">
				and mes_send_date like concat('%', #{mesSendDate}, '%')
			</if>
		</where>
		order by mes_send_date desc
		LIMIT #{start}, #{pageSize}
	</select>

	<!-- 查询总记录数 -->
	<select id="getCount" resultType="java.lang.Integer">
		select count(*)
		from message
	</select>

	<!-- 根据条件查询记录数 -->
	<select id="getCountByCondition" resultType="java.lang.Integer">
		select count(*)
		from message m
		LEFT OUTER JOIN employee as e1
		ON
		m.`mes_sender` = e1.`emp_id`
		LEFT OUTER JOIN employee as e2
		ON
		m.`mes_reciver` = e2.`emp_id`
		<where>
			<if test="mesTitle != null and mesTitle != '' ">
				and mes_title like
				concat('%',#{mesTitle,jdbcType=VARCHAR},'%')
			</if>
			<if test="empEmail != null and empEmail != '' ">
				and e2.`emp_email` like
				concat('%',#{empEmail,jdbcType=VARCHAR},'%')
			</if>
			<if test="mesSendDate != null and mesSendDate != '' ">
				and mes_send_date like concat('%', #{mesSendDate}, '%')
			</if>
			<if test="mesReciver != null and mesReciver != '' ">
				and mes_reciver=#{mesReciver}
			</if>
			<if test="mesInfo != null and mesInfo != '' ">
				and mes_info like
				concat('%',#{mesInfo,jdbcType=VARCHAR},'%')
			</if>
		</where>
		order by mes_send_date desc
	</select>

	<!-- 获得最后一次添加的信息的id -->
	<select id="getLastInsertId" resultType="java.lang.Integer">
		SELECT LAST_INSERT_ID()
	</select>

	<!-- 根据登录名查询在线信息 -->
	<select id="queryByLoginName" parameterType="com.icss.oa.message.pojo.Message"
		resultMap="BaseResultMap">
		SELECT m.*,e1.emp_id mes_sender,e2.emp_id
		mes_reciver,e1.emp_name
		sender_name,e2.emp_name reciver_name,
		e1.emp_email sender_email,
		e2.emp_email reciver_email,
		e1.emp_login_name sender_login_name,
		e2.emp_login_name
		reciver_login_name
		FROM message m
		LEFT OUTER JOIN
		employee as e1 ON
		m.`mes_sender` = e1.`emp_id`
		LEFT OUTER JOIN employee
		as e2 ON
		m.`mes_reciver` = e2.`emp_id`
		<!-- where e1.emp_login_name=#{empLoginName} OR e2.emp_login_name=#{empLoginName} -->
		<where>
			(e1.emp_login_name=#{empLoginName}
			OR
			e2.emp_login_name=#{empLoginName})
			<if test="mesTitle != null and mesTitle != '' ">
				and mes_title like
				concat('%',#{mesTitle,jdbcType=VARCHAR},'%')
			</if>
			<if test="empEmail != null and empEmail != '' ">
				and e2.`emp_email` like
				concat('%',#{empEmail,jdbcType=VARCHAR},'%')
			</if>
			<if test="mesSendDate != null and mesSendDate != '' ">
				and mes_send_date like concat('%', #{mesSendDate}, '%')
			</if>
			<if test="mesReciver != null and mesReciver != '' ">
				and mes_reciver = #{mesReciver}
			</if>
			<if test="mesInfo != null and mesInfo != '' ">
				and mes_info like
				concat('%',#{mesInfo,jdbcType=VARCHAR},'%')
			</if>
		</where>
		order by mes_send_date desc
		LIMIT #{start}, #{pageSize}
	</select>

	<!-- 根据登录名查询相应的记录数 -->
	<select id="getCountByEmpLoginName" resultType="java.lang.Integer">
		select count(*)
		from message m
		LEFT OUTER JOIN employee as e1
		ON
		m.`mes_sender` =
		e1.`emp_id`
		LEFT OUTER JOIN employee as e2
		ON
		m.`mes_reciver` =
		e2.`emp_id`
		<where>
			(e1.emp_login_name=#{empLoginName}
			OR
			e2.emp_login_name=#{empLoginName})
			<if test="mesTitle != null and mesTitle != '' ">
				and mes_title like
				concat('%',#{mesTitle,jdbcType=VARCHAR},'%')
			</if>
			<if test="empEmail != null and empEmail != '' ">
				and e2.`emp_email` like
				concat('%',#{empEmail,jdbcType=VARCHAR},'%')
			</if>
			<if test="mesSendDate != null and mesSendDate != '' ">
				and mes_send_date like concat('%', #{mesSendDate}, '%')
			</if>
			<if test="mesReciver != null and mesReciver != '' ">
				and mes_reciver = #{mesReciver}
			</if>
			<if test="mesInfo != null and mesInfo != '' ">
				and mes_info like
				concat('%',#{mesInfo,jdbcType=VARCHAR},'%')
			</if>
		</where>
	</select>

	<!-- 草稿箱以及发件箱的查询 -->
	<select id="queryDraft" parameterType="java.lang.String"
		resultMap="BaseResultMap">
		SELECT m.*,e1.emp_id mes_sender,e2.emp_id
		mes_reciver,e1.emp_name
		sender_name,e2.emp_name reciver_name,
		e1.emp_email sender_email,
		e2.emp_email reciver_email,
		e1.emp_login_name sender_login_name,
		e2.emp_login_name
		reciver_login_name
		FROM message m
		LEFT OUTER JOIN employee as e1 ON
		m.`mes_sender` = e1.`emp_id`
		LEFT OUTER JOIN employee as e2 ON
		m.`mes_reciver` = e2.`emp_id`
		WHERE
		mes_send_confirm=#{mesSendConfirm}
		and
		e1.emp_login_name=#{empLoginName}
		order by mes_send_date desc
		LIMIT
		#{start}, #{pageSize}
	</select>

	<!-- 查询草稿箱以及发件箱的个数 -->
	<select id="getCountDraft" resultType="java.lang.Integer">
		SELECT count(*)
		FROM
		message m
		LEFT OUTER JOIN employee as e1 ON m.`mes_sender` =
		e1.`emp_id`
		LEFT OUTER JOIN employee as e2 ON m.`mes_reciver` =
		e2.`emp_id`
		WHERE
		mes_send_confirm=#{mesSendConfirm}
		and
		e1.emp_login_name=#{empLoginName}
	</select>

	<!-- 收件箱的查询 -->
	<select id="queryInbox" parameterType="java.lang.String"
		resultMap="BaseResultMap">
		SELECT m.*,e1.emp_id mes_sender,e2.emp_id
		mes_reciver,e1.emp_name
		sender_name,e2.emp_name reciver_name,
		e1.emp_email sender_email,
		e2.emp_email reciver_email,
		e1.emp_login_name sender_login_name,
		e2.emp_login_name
		reciver_login_name
		FROM message m
		LEFT OUTER JOIN employee as e1 ON
		m.`mes_sender` = e1.`emp_id`
		LEFT OUTER JOIN employee as e2 ON
		m.`mes_reciver` = e2.`emp_id`
		WHERE
		e2.emp_login_name=#{empLoginName}
		order by mes_send_date desc
		LIMIT #{start}, #{pageSize}
	</select>

	<!-- 查询收件箱的个数 -->
	<select id="getCountInbox" resultType="java.lang.Integer">
		SELECT count(*)
		FROM
		message m
		LEFT OUTER JOIN employee as e1 ON m.`mes_sender` =
		e1.`emp_id`
		LEFT OUTER JOIN employee as e2 ON m.`mes_reciver` =
		e2.`emp_id`
		WHERE
		e2.emp_login_name=#{empLoginName}
	</select>

	<!-- 未读消息的查询 -->
	<select id="queryUnread" parameterType="java.lang.String"
		resultMap="BaseResultMap">
		SELECT m.*,e1.emp_id mes_sender,e2.emp_id
		mes_reciver,e1.emp_name
		sender_name,e2.emp_name reciver_name,
		e1.emp_email sender_email,
		e2.emp_email reciver_email,
		e1.emp_login_name sender_login_name,
		e2.emp_login_name
		reciver_login_name
		FROM message m
		LEFT OUTER JOIN employee as e1 ON
		m.`mes_sender` = e1.`emp_id`
		LEFT OUTER JOIN employee as e2 ON
		m.`mes_reciver` = e2.`emp_id`
		WHERE
		e2.emp_login_name=#{empLoginName}
		AND mes_send_confirm=#{mesSendConfirm}
		AND
		mes_read_confirm=#{mesReadConfirm}
		order by mes_send_date desc
		LIMIT
		#{start}, #{pageSize}
	</select>

	<!-- 查询未读消息的个数 -->
	<select id="getCountUnread" resultType="java.lang.Integer">
		SELECT count(*)
		FROM
		message m
		LEFT OUTER JOIN employee as e1 ON m.`mes_sender` =
		e1.`emp_id`
		LEFT OUTER JOIN employee as e2 ON m.`mes_reciver` =
		e2.`emp_id`
		WHERE
		e2.emp_login_name=#{empLoginName}
		AND
		mes_send_confirm=#{mesSendConfirm}
		AND
		mes_read_confirm=#{mesReadConfirm}
	</select>

</mapper>

全文索引

package com.icss.oa.message.index;

import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;

import com.icss.oa.message.pojo.Message;

@Repository
public class MessageIndexDao {

	// 在线信息索引目录,使用资源文件的键值对
	@Value("#{prop.mes_index_path}")
	private String mesIndexPath;

	// 中文分词器
	public Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_47);

	/**
	 * 增加索引
	 * 
	 * @throws IOException
	 */
	public void create(Document document) throws IOException {
		// 设置索引的分词器
		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47, analyzer);
		// 索引目录对象
		Directory directory = FSDirectory.open(new File(mesIndexPath));
		// 索引写入对象
		IndexWriter indexWriter = new IndexWriter(directory, config);
		// 增加索引
		indexWriter.addDocument(document);
		// 提交
		indexWriter.commit();
		// 关闭
		indexWriter.close();
	}

	/**
	 * 更新索引
	 * 
	 * @throws IOException
	 */
	public void update(Term term, Document document) throws IOException {
		// 设置索引的分词器
		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47, analyzer);
		// 索引目录对象
		Directory directory = FSDirectory.open(new File(mesIndexPath));
		// 索引写入对象
		IndexWriter indexWriter = new IndexWriter(directory, config);
		// 修改索引
		indexWriter.updateDocument(term, document);
		// 提交
		indexWriter.commit();
		// 关闭
		indexWriter.close();
	}

	/**
	 * 删除索引
	 * 
	 * @throws IOException
	 */
	public void delete(Term term) throws IOException {
		// 设置索引的分词器
		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47, analyzer);
		// 索引目录对象
		Directory directory = FSDirectory.open(new File(mesIndexPath));
		// 索引写入对象
		IndexWriter indexWriter = new IndexWriter(directory, config);
		// 删除索引
		indexWriter.deleteDocuments(term);
		// 提交
		indexWriter.commit();
		// 关闭
		indexWriter.close();
	}
	
	/**
	 * 全文检索
	 * 
	 * @throws IOException
	 * @throws InvalidTokenOffsetsException 
	 */
	public List<Message> search(Query query) throws IOException, InvalidTokenOffsetsException{
		// 设置索引的分词器
		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47, analyzer);
		// 索引目录对象
		Directory directory = FSDirectory.open(new File(mesIndexPath));

		// 搜索对象
		IndexReader indexReader = DirectoryReader.open(directory);
		IndexSearcher indexSearcher = new IndexSearcher(indexReader);

		// 过滤对象(附加的删选条件,效率比较低,因为需要二次遍历数据)
		Filter filter = null;

		// 排序对象(默认按照相关度排序,就是匹配的越多越靠前,类似于百度)
		Sort sort = new Sort();

		// 得到满足条件的前100行记录
		TopDocs topDocs = indexSearcher.search(query, 100, sort);

		// 总记录数
		int recordCount = topDocs.totalHits;

		// 文档集合
		ArrayList<Message> mesList = new ArrayList<>();

		// ============高亮和截取某个字段的文本摘要设置=============
		// 设置环绕的首尾字符串
		SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<font color=red>", "</font>");
		// 语法高亮显示设置
		Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query));
		// 100是是表示摘要的字数
		highlighter.setTextFragmenter(new SimpleFragmenter(100));
		// ===================================================

		// 遍历文档
		for (int i = 0; i < recordCount; i++) {
			// 获得原始文档
			ScoreDoc scoreDoc = topDocs.scoreDocs[i];
			// 获得文档内部编号
			int docSn = scoreDoc.doc;
			// 获得Document文档
			Document document = indexSearcher.doc(docSn);

			// 获得员工编号
			Integer mesId = Integer.parseInt(document.get("mesId"));
			// 获得员工姓名
			String mesTitle = document.get("mesTitle");
			// 获得员工电话
			String mesInfo = document.get("mesInfo");

			// 把员工自我介绍进行截取摘要以及添加高亮
			TokenStream tream = analyzer.tokenStream("mesInfo", new StringReader(mesInfo));
			String mesInfoFragment = highlighter.getBestFragment(tream, mesInfo);

			// 把姓名增加高亮
			tream = analyzer.tokenStream("mesTitle", new StringReader(mesTitle));
			String mesTitleFragment = highlighter.getBestFragment(tream, mesTitle);

			// 如果内容没有包含搜索关键字或原始内容不足100字
			if (mesInfoFragment == null) {
				int minLen = mesInfo.length() >= 100 ? 100 : mesInfo.length();
				mesInfoFragment = mesInfo.substring(0, minLen);
			}

			if (mesTitleFragment == null) {
				int minLen = mesTitle.length() >= 100 ? 100 : mesTitle.length();
				mesTitleFragment = mesTitle.substring(0, minLen);
			}

			// 封装到Employee对象
			Message mes = new Message();

			mes.setMesId(mesId);
			mes.setMesTitle(mesTitleFragment);
			mes.setMesInfo(mesInfoFragment);

			// 放到集合中
			mesList.add(mes);
		}

		return mesList;
	}

}

总结

gitee链接:https://gitee.com/bao-hailu/oa.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值