zouxuan 5 年 前
コミット
741e95e5ed
31 ファイル変更1785 行追加60 行削除
  1. 6 0
      edu-auth/edu-auth-api/pom.xml
  2. 12 0
      edu-auth/edu-auth-server/pom.xml
  3. 28 0
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/config/ImageVerifyCodeConfig.java
  4. 1 1
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/config/ResourceServerConfig.java
  5. 18 0
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/SmsCodeService.java
  6. 16 0
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/SysMessageConfigService.java
  7. 153 0
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/SysMessageService.java
  8. 53 0
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/impl/SmsCodeServiceImpl.java
  9. 29 0
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/impl/SysMessageConfigServiceImpl.java
  10. 444 0
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/impl/SysMessageServiceImpl.java
  11. 114 0
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/web/controller/SmsCodeController.java
  12. 13 0
      edu-auth/edu-auth-server/src/main/resources/application.yml
  13. 119 0
      edu-auth/edu-auth-server/src/main/resources/config/mybatis/SysMessageConfigMapper.xml
  14. 187 0
      edu-auth/edu-auth-server/src/main/resources/config/mybatis/SysMessageMapper.xml
  15. 1 2
      edu-common/pom.xml
  16. 18 0
      edu-common/src/main/java/com/keao/edu/common/dao/SysMessageConfigDao.java
  17. 47 0
      edu-common/src/main/java/com/keao/edu/common/dao/SysMessageDao.java
  18. 34 0
      edu-common/src/main/java/com/keao/edu/common/entity/Mapper.java
  19. 194 0
      edu-common/src/main/java/com/keao/edu/common/entity/SysMessage.java
  20. 102 0
      edu-common/src/main/java/com/keao/edu/common/entity/SysMessageConfig.java
  21. 34 0
      edu-common/src/main/java/com/keao/edu/common/enums/MessageSendMode.java
  22. 31 0
      edu-common/src/main/java/com/keao/edu/common/enums/MessageTypeEnum.java
  23. 34 0
      edu-common/src/main/java/com/keao/edu/common/enums/SendStatusEnum.java
  24. 5 7
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/TeacherController.java
  25. 5 4
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/entity/Teacher.java
  26. 39 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/enums/TeacherSettlementTypeEnum.java
  27. 16 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/page/TeacherQueryInfo.java
  28. 0 1
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/OrganizationService.java
  29. 5 6
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/OrganizationServiceImpl.java
  30. 12 1
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/TeacherServiceImpl.java
  31. 15 38
      edu-user/edu-user-server/src/main/resources/config/mybatis/TeacherMapper.xml

+ 6 - 0
edu-auth/edu-auth-api/pom.xml

@@ -23,6 +23,12 @@
 		<dependency>
 			<groupId>com.keao.edu</groupId>
 			<artifactId>edu-common</artifactId>
+			<exclusions>
+				<exclusion>
+					<groupId>com.keao.edu</groupId>
+					<artifactId>edu-auth-api</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 	</dependencies>
 </project>

+ 12 - 0
edu-auth/edu-auth-server/pom.xml

@@ -80,5 +80,17 @@
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-openfeign-core</artifactId>
+            <version>2.1.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.keao.edu</groupId>
+            <artifactId>edu-thirdparty</artifactId>
+            <version>1.0</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

+ 28 - 0
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/config/ImageVerifyCodeConfig.java

@@ -0,0 +1,28 @@
+package com.keao.edu.auth.config;
+
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Properties;
+
+@Configuration
+public class ImageVerifyCodeConfig {
+    @Bean(name="captchaProducer")
+    public DefaultKaptcha getKaptchaBean(){
+        DefaultKaptcha defaultKaptcha=new DefaultKaptcha();
+        Properties properties=new Properties();
+        properties.setProperty("kaptcha.border", "yes");
+        properties.setProperty("kaptcha.border.color", "105,179,90");
+        properties.setProperty("kaptcha.textproducer.font.color", "blue");
+        properties.setProperty("kaptcha.image.width", "125");
+        properties.setProperty("kaptcha.image.height", "45");
+        properties.setProperty("kaptcha.session.key", "code");
+        properties.setProperty("kaptcha.textproducer.char.length", "4");
+        properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
+        Config config=new Config(properties);
+        defaultKaptcha.setConfig(config);
+        return defaultKaptcha;
+    }
+}

+ 1 - 1
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/config/ResourceServerConfig.java

@@ -26,7 +26,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 	@Override
 	public void configure(HttpSecurity http) throws Exception {
 		http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
-				.authorizeRequests().antMatchers("/task/**","/v2/api-docs").hasIpAddress("0.0.0.0/0").anyRequest().authenticated().and().httpBasic();
+				.authorizeRequests().antMatchers("/task/**","/v2/api-docs","/code/*").hasIpAddress("0.0.0.0/0").anyRequest().authenticated().and().httpBasic();
 	}
 
 	@Override

+ 18 - 0
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/SmsCodeService.java

@@ -0,0 +1,18 @@
+package com.keao.edu.auth.service;
+
+public interface SmsCodeService {
+
+	/**
+	 * 校验验证码
+	 * @param mobile
+	 * @param authCode
+	 * @return
+	 */
+	boolean verifyValidCode(String mobile, String authCode);
+
+	/**
+	 * 发送登录验证码
+	 * @return
+	 */
+	boolean sendValidCode(String mobile) throws Exception;
+}

+ 16 - 0
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/SysMessageConfigService.java

@@ -0,0 +1,16 @@
+package com.keao.edu.auth.service;
+
+
+import com.keao.edu.common.entity.SysMessageConfig;
+import com.keao.edu.common.enums.MessageTypeEnum;
+import com.keao.edu.common.service.BaseService;
+
+public interface SysMessageConfigService extends BaseService<Integer, SysMessageConfig> {
+
+	/**
+	 * 根据消息类型查询对象
+	 * @param type
+	 * @return
+	 */
+	SysMessageConfig queryByType(MessageTypeEnum type);
+}

+ 153 - 0
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/SysMessageService.java

@@ -0,0 +1,153 @@
+package com.keao.edu.auth.service;
+
+
+import com.keao.edu.common.entity.SysMessage;
+import com.keao.edu.common.enums.MessageSendMode;
+import com.keao.edu.common.enums.MessageTypeEnum;
+import com.keao.edu.common.service.BaseService;
+import com.keao.edu.thirdparty.message.MessageSenderPluginContext.MessageSender;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface SysMessageService extends BaseService<Long, SysMessage> {
+
+	/**
+	 * 修改消息对象
+	 * @param message
+	 * @return
+	 */
+	public int updateMessage(SysMessage message);
+
+	/**
+	 * 推送站内消息
+	 * @param userIds
+	 * @param messageType
+	 * @return
+	 */
+	boolean batchSeoMessage(Set<Integer> userIds, MessageTypeEnum messageType, String memo, Object... args);
+
+	/**
+	 * 推送im文本消息,包换调整链接
+	 * @param senderId
+	 * @param messageType
+	 * @return
+	 */
+	void batchSendImMessage(MessageTypeEnum messageType, String senderId, String extra, String[] targetIds, String url, Object... args);
+
+	/**
+	 * 推送im自定义节拍器消息
+	 * @param senderId
+	 * @param roomId
+	 * @param content
+	 */
+//	void batchSendImPlayMidiMessage(String senderId,String roomId, String content);
+
+	/**
+	 * 批量发送消息
+	 * @param messageSender 消息发送者
+	 * @param subject 消息主题
+	 * @param content 消息内容
+	 * @param receivers 消息接受者
+	 * @param triggerTime 触发时间
+	 * @param group 组
+	 * @return
+	 */
+	public boolean batchSendMessage(MessageSender messageSender, String subject, String content, Map<Integer, String> receivers, Date triggerTime,
+                                    Integer readStatus, String memo, String group, String jpushType);
+
+	/**
+	 * 发送消息
+	 * @param messageSender 消息发送者
+	 * @param messageType 消息类型
+	 * @param receivers 消息接收者(Key:用户编号  value:消息接收对象)
+	 * @param triggerTime 触发时间
+	 * @param readStatus 阅读状态(0-未读  1-已读)
+	 * @param url 超链接地址
+	 * @param args 参数
+	 * @return
+	 */
+	public void batchSendMessage(MessageSender messageSender, MessageTypeEnum messageType, Map<Integer, String> receivers, Date triggerTime,
+                                 Integer readStatus, String url, String jpushType, Object... args);
+
+	/**
+	 * 发送消息
+	 * @param messageSender 消息发送者
+	 * @param userId 用户编号
+	 * @param title 消息标题
+	 * @param content 消息内容
+	 * @param receiver 消息接受者
+	 * @param triggerTime 触发时间
+	 * @param readStatus 阅读状态(0-未读  1-已读)
+	 * @param url 超链接地址
+	 * @param group 组
+	 * @return
+	 */
+	public void sendMessage(MessageSender messageSender, Integer userId, String title, String content, String receiver, Date triggerTime, Integer readStatus,
+                            String url, String group, String jpushType);
+
+	/**
+	 * 发送验证码
+	 * @param messageSender 消息发送者
+	 * @param userId 用户编号
+	 * @param messageType 消息类型
+	 * @param receiver 消息接受者
+	 * @return
+	 */
+	public boolean sendSecurityCode(MessageSender messageSender, Integer userId, MessageTypeEnum messageType, String receiver);
+
+	/**
+	 * 获取已经发送的验证码
+	 * @param type
+	 * @param mobileNOOrEmailAddr
+	 * @return
+	 */
+	public String getSendedVerificationCode(MessageTypeEnum type, String mobileNOOrEmailAddr);
+
+	/**
+	 * 删除已有的key
+	 * @param type
+	 * @param mobileNOOrEmailAddr
+	 */
+	public void delSendedVerificationCode(MessageTypeEnum type, String mobileNOOrEmailAddr);
+
+	/**
+	 * 查询消息未读条数
+	 * @param type
+	 * @param userId
+	 * @return
+	 */
+	public Map<String, Integer> queryCountOfUnread(MessageSendMode type, Integer userId);
+
+	/**
+	 *
+	 * @param userId 用户id
+	 * @param status 状态/1 已读,0未读
+	 * @return
+	 */
+	public int updateStatus(Integer userId, int status);
+
+	/**
+	 * 修改单条消息状态
+	 */
+	public int updateOneStatus(Long id, int status);
+
+	public List<SysMessage> queryUserInRecentMinList(String mobile, int recentMin, MessageSendMode type);
+
+	/**
+	 * 发送私聊消息
+	 * @param studentId
+	 * @param content
+	 */
+    void sendPrivateMessage(String studentId, String content);
+
+	/**
+	 * 发送私聊消息
+	 * @param sender
+	 * @param receiver
+	 * @param content
+	 */
+	void sendNoAuthPrivateMessage(String sender, String receiver, String content);
+}

+ 53 - 0
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/impl/SmsCodeServiceImpl.java

@@ -0,0 +1,53 @@
+package com.keao.edu.auth.service.impl;
+
+
+import com.keao.edu.auth.api.client.SysUserFeignService;
+import com.keao.edu.auth.api.entity.SysUser;
+import com.keao.edu.auth.service.SmsCodeService;
+import com.keao.edu.auth.service.SysMessageService;
+import com.keao.edu.common.entity.SysMessage;
+import com.keao.edu.common.enums.MessageSendMode;
+import com.keao.edu.common.enums.MessageTypeEnum;
+import com.keao.edu.common.exception.BizException;
+import com.keao.edu.thirdparty.message.MessageSenderPluginContext;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class SmsCodeServiceImpl implements SmsCodeService {
+
+	@Autowired
+	private SysMessageService sysMessageService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@Override
+	public boolean verifyValidCode(String mobile, String authCode) {
+		String verifyCode = sysMessageService.getSendedVerificationCode(MessageTypeEnum.SMS_VERIFY_CODE_LOGIN, mobile);
+		if (StringUtils.isNoneEmpty(verifyCode) && StringUtils.equalsIgnoreCase(verifyCode, authCode)) {
+			return true;
+		}
+		return false;
+	}
+
+	@Override
+	public boolean sendValidCode(String mobile) {
+		SysUser sysUser = sysUserFeignService.queryUserByMobile(mobile);
+		Integer userId = null;
+		if (sysUser != null) {
+			userId = sysUser.getId();
+		}
+		int times = 3;
+		// 十分钟内只能发3条
+		List<SysMessage> list = sysMessageService.queryUserInRecentMinList(mobile, 10, MessageSendMode.SMS);
+		if (list != null && list.size() >= times) {
+			throw new BizException("对不起,您发送太频繁请稍后重试!");
+		}
+		sysMessageService.sendSecurityCode(MessageSenderPluginContext.MessageSender.YIMEI, userId, MessageTypeEnum.SMS_VERIFY_CODE_LOGIN, mobile);
+		return true;
+	}
+
+}

+ 29 - 0
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/impl/SysMessageConfigServiceImpl.java

@@ -0,0 +1,29 @@
+package com.keao.edu.auth.service.impl;
+
+
+import com.keao.edu.auth.service.SysMessageConfigService;
+import com.keao.edu.common.dal.BaseDAO;
+import com.keao.edu.common.dao.SysMessageConfigDao;
+import com.keao.edu.common.entity.SysMessageConfig;
+import com.keao.edu.common.enums.MessageTypeEnum;
+import com.keao.edu.common.service.impl.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SysMessageConfigServiceImpl extends BaseServiceImpl<Integer, SysMessageConfig>  implements SysMessageConfigService {
+	
+	@Autowired
+	private SysMessageConfigDao sysMessageConfigDao;
+
+	@Override
+	public BaseDAO<Integer, SysMessageConfig> getDAO() {
+		return sysMessageConfigDao;
+	}
+
+	@Override
+	public SysMessageConfig queryByType(MessageTypeEnum type) {
+		return sysMessageConfigDao.queryByType(type.getCode());
+	}
+	
+}

+ 444 - 0
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/impl/SysMessageServiceImpl.java

@@ -0,0 +1,444 @@
+package com.keao.edu.auth.service.impl;
+
+
+import com.keao.edu.auth.api.client.SysUserFeignService;
+import com.keao.edu.auth.api.entity.SysUser;
+import com.keao.edu.auth.service.SysMessageConfigService;
+import com.keao.edu.auth.service.SysMessageService;
+import com.keao.edu.common.dal.BaseDAO;
+import com.keao.edu.common.dao.SysMessageDao;
+import com.keao.edu.common.entity.Mapper;
+import com.keao.edu.common.entity.SysMessage;
+import com.keao.edu.common.entity.SysMessageConfig;
+import com.keao.edu.common.enums.MessageSendMode;
+import com.keao.edu.common.enums.MessageTypeEnum;
+import com.keao.edu.common.enums.SendStatusEnum;
+import com.keao.edu.common.exception.BizException;
+import com.keao.edu.common.redis.service.RedisCache;
+import com.keao.edu.common.service.impl.BaseServiceImpl;
+import com.keao.edu.im.api.client.ImFeignService;
+import com.keao.edu.im.api.entity.ImPrivateMessage;
+import com.keao.edu.im.api.entity.ImTxtMessage;
+import com.keao.edu.thirdparty.message.MessageSenderPluginContext;
+import com.keao.edu.thirdparty.message.MessageSenderPluginContext.MessageSender;
+import com.keao.edu.util.string.MessageFormatter;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> implements SysMessageService {
+
+	private final static Logger LOGGER = LoggerFactory.getLogger(SysMessageServiceImpl.class);
+
+	@Autowired
+	private SysMessageDao sysMessageDao;
+
+	@Autowired
+	private SysMessageConfigService sysMessageConfigService;
+
+	@Autowired
+	private MessageSenderPluginContext messageSenderPluginContext;
+
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@Autowired
+	private ImFeignService imFeignService;
+
+	@Autowired
+	private RedisCache<String, Object> redisCache;
+
+	// 验证码有效期
+	public static final int CODE_EXPIRE = 60 * 5;
+
+	// 发送验证码的间隔时间
+	public static final int CODE_INTERVAL_TIME = 60;
+
+	private final int DEFAULT_CODE = 888888;
+
+	@Value("${message.debugMode}")
+	private boolean debugMode;
+
+	@Override
+	public BaseDAO<Long, SysMessage> getDAO() {
+		return sysMessageDao;
+	}
+
+	/**
+	 * 添加消息
+	 * @param subject 消息主题
+	 * @param content 消息内容
+	 * @param receivers 接收人,多个人用逗号分开
+	 * @param triggerTime 触发时间
+	 * @param mode 消息的发送模式
+	 * @param status 消息的当前状态
+	 * @param errorMsg 错误消息
+	 * @param readStatus 阅读状态
+	 * @param memo 备注
+	 * @param group 消息组
+	 * @return
+	 */
+	private int addMessage(Map<Integer, String> receivers, String subject, String content, Date triggerTime, MessageSendMode mode, SendStatusEnum status,
+						   String errorMsg, Integer readStatus, String memo, String group) {
+		SysMessage message = null;
+		Date date = new Date();
+
+		List<SysMessage> messages = new ArrayList<>();
+
+		Integer userId = null;
+		String receiver;
+		for (Map.Entry<Integer, String> entry : receivers.entrySet()) {
+			userId = entry.getKey();
+			receiver = entry.getValue();
+
+			message = new SysMessage();
+			if (userId == null) {
+				SysUser user = sysUserFeignService.queryUserByMobile(receiver);
+				if (user != null) {
+					userId = user.getId();
+				}
+			}
+			message.setUserId(userId);
+			message.setContent(content);
+			message.setCreateOn(date);
+			message.setModifyOn(date);
+			message.setReceiver(receiver);
+			if (triggerTime == null) {
+				triggerTime = date;
+			}
+			message.setSendTime(triggerTime);
+			message.setTitle(subject);
+			message.setStatus(status);
+			message.setType(mode);
+			message.setErrorMsg(errorMsg);
+			message.setReadStatus(readStatus);
+			message.setMemo(memo);
+			message.setGroup(group);
+
+			messages.add(message);
+		}
+
+		return sysMessageDao.batchInsert(messages);
+	}
+
+	@Override
+	public int updateMessage(SysMessage message) {
+		return sysMessageDao.update(message);
+	}
+
+	@Override
+	public boolean batchSeoMessage(Set<Integer> userIds, MessageTypeEnum messageType, String memo, Object... args) {
+		if (userIds == null || userIds.size() == 0) {
+			throw new BizException("接收地址不能为空");
+		}
+		SysMessageConfig messageConfig = sysMessageConfigService.queryByType(messageType);
+		if (messageConfig == null) {
+			throw new BizException("消息类型错误");
+		}else if(messageConfig.getSendFlag() == null || messageConfig.getSendFlag() == 0){
+			return true;
+		}
+		Date date = new Date();
+		SendStatusEnum status = SendStatusEnum.SUCCESSED;
+		String content = MessageFormatter.arrayFormat(messageConfig.getContent(), args);
+		SysMessage message = null;
+
+		List<SysMessage> messages = new ArrayList<>();
+		for (Integer userId : userIds) {
+			message = new SysMessage();
+			message.setUserId(userId);
+			message.setContent(content);
+			message.setCreateOn(date);
+			message.setModifyOn(date);
+			message.setReceiver(userId.toString());
+			message.setSendTime(date);
+			message.setStatus(status);
+			message.setType(MessageSendMode.SEO);
+			message.setTitle(messageConfig.getDescription());
+			message.setReadStatus(0);
+			message.setMemo(memo);
+			message.setGroup(messageConfig.getGroup());
+			messages.add(message);
+		}
+		sysMessageDao.batchInsert(messages);
+		return true;
+	}
+
+	@Override
+	public void batchSendImMessage(MessageTypeEnum type, String senderId,String extra, String[] targetIds, String url, Object... args) {
+		SysMessageConfig messageConfig = sysMessageConfigService.queryByType(type);
+		if (messageConfig == null) {
+			throw new BizException("消息类型错误");
+		}else if(messageConfig.getSendFlag() == null || messageConfig.getSendFlag() == 0){
+			return;
+		}
+		String content = MessageFormatter.arrayFormat(messageConfig.getContent(), args);
+		if(StringUtils.isNotEmpty(url)){
+			content += url;
+		}
+		ImPrivateMessage privateMessage = new ImPrivateMessage();
+		privateMessage.setObjectName("RC:TxtMsg");
+		privateMessage.setTargetId(targetIds);
+		privateMessage.setSenderId(senderId);
+		privateMessage.setContent(new ImTxtMessage(content,extra));
+		imFeignService.privateSend(privateMessage);
+	}
+
+	/*@Override
+	public void batchSendImPlayMidiMessage(String senderId,String roomId, String content) {
+		ImGroupMessage groupMessage = new ImGroupMessage();
+		privateMessage.setObjectName("DY:PlayMidiMessage");
+		groupMessage.setTargetId(roomId.split(","));
+		groupMessage.setSenderId(senderId);
+		groupMessage.setContent(new ImPlayMidiMessage(content,null));
+		groupMessage.setType("DY:PlayMidiMessage");
+		imFeignService.privateSendCustom(groupMessage);
+	}*/
+
+	@Override
+	public void sendPrivateMessage(String studentId, String content) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if(sysUser == null){
+			throw new BizException("用户信息获取失败");
+		}
+		ImPrivateMessage privateMessage = new ImPrivateMessage();
+		privateMessage.setObjectName("RC:TxtMsg");
+		privateMessage.setTargetId(studentId.split(","));
+		privateMessage.setSenderId(sysUser.getId().toString());
+		privateMessage.setContent(new ImTxtMessage(content,null));
+		imFeignService.privateSend(privateMessage);
+	}
+
+	@Override
+	public void sendNoAuthPrivateMessage(String sender, String receiver, String content) {
+		ImPrivateMessage privateMessage = new ImPrivateMessage();
+		privateMessage.setObjectName("RC:TxtMsg");
+		privateMessage.setTargetId(receiver.split(","));
+		privateMessage.setSenderId(sender);
+		privateMessage.setContent(new ImTxtMessage(content,null));
+		imFeignService.privateSend(privateMessage);
+	}
+
+	@Override
+	@Async
+	public boolean batchSendMessage(MessageSender messageSender, String subject, String content, Map<Integer, String> receivers, Date triggerTime,
+									Integer readStatus, String memo, String group, String jpushType) {
+
+		if (receivers == null || receivers.size() == 0) {
+			throw new BizException("消息接收人不能为空");
+		}
+		if (StringUtils.isBlank(content)) {
+			throw new BizException("消息内容不能为空");
+		}
+		String[] tos = receivers.values().toArray(new String[receivers.size()]);
+		if (tos != null && tos.length > 0) {
+			Date date = new Date();
+			SendStatusEnum status = SendStatusEnum.WAIT;
+
+			String errorMsg = null;
+			try {
+				// 立即发送
+				if (triggerTime == null || date.after(triggerTime)) {
+					status = SendStatusEnum.SENDING;
+					if (debugMode == true || messageSenderPluginContext.batchSend(messageSender, subject, content, tos, memo,jpushType)) {
+						status = SendStatusEnum.SUCCESSED;
+					} else {
+						status = SendStatusEnum.FAILED;
+					}
+				}
+			} catch (Exception e) {
+				status = SendStatusEnum.FAILED;
+				errorMsg = e.getMessage();
+				LOGGER.warn("消息发送失败", e);
+			}
+			MessageSendMode mode = MessageSendMode.SMS;
+			if (messageSender.getSendMode().equals("PUSH")) {
+				mode = MessageSendMode.PUSH;
+			} else if (messageSender.getSendMode().equals("EMAIL")) {
+				mode = MessageSendMode.EMAIL;
+			}
+			return addMessage(receivers, subject, content, triggerTime, mode, status, errorMsg, readStatus, memo, null) > 0;
+		}
+
+		return false;
+	}
+
+	@Override
+	@Async
+	public void batchSendMessage(MessageSender messageSender, MessageTypeEnum type, Map<Integer, String> receivers, Date triggerTime, Integer readStatus,
+								 String url, String jpushType, Object... args) {
+
+		if (receivers == null || receivers.size() == 0) {
+			throw new BizException("接收地址不能为空");
+		}
+		String[] tos = receivers.values().toArray(new String[receivers.size()]);
+		SysMessageConfig messageConfig = sysMessageConfigService.queryByType(type);
+		if (messageConfig == null) {
+			throw new BizException("消息类型错误");
+		}else if(messageConfig.getSendFlag() == null || messageConfig.getSendFlag() == 0){
+			return;
+		}
+		Date date = new Date();
+		SendStatusEnum status = SendStatusEnum.WAIT;
+		String errorMsg = null;
+		// 立即发送
+		if (triggerTime == null || date.after(triggerTime)) {
+			status = SendStatusEnum.SENDING;
+			try {
+				if (debugMode == true
+						|| messageSenderPluginContext.batchSend(messageSender, messageConfig.getDescription(),
+								MessageFormatter.arrayFormat(messageConfig.getContent(), args), tos, url,jpushType)) {
+					status = SendStatusEnum.SUCCESSED;
+				} else {
+					status = SendStatusEnum.FAILED;
+				}
+			} catch (Exception e) {
+				status = SendStatusEnum.FAILED;
+				errorMsg = e.getMessage();
+				LOGGER.warn("消息发送失败", e);
+			}
+		}
+		MessageSendMode mode = MessageSendMode.SMS;
+		if (messageSender.getSendMode().equals("PUSH")) {
+			mode = MessageSendMode.PUSH;
+		} else if (messageSender.getSendMode().equals("EMAIL")) {
+			mode = MessageSendMode.EMAIL;
+		}
+		addMessage(receivers, messageConfig.getDescription(), MessageFormatter.arrayFormat(messageConfig.getContent(), args), triggerTime, mode, status, errorMsg, readStatus,
+				url, messageConfig.getGroup());
+	}
+
+	@Override
+	@Async
+	public void sendMessage(MessageSender messageSender, Integer userId, String title, String content, String receiver, Date triggerTime, Integer readStatus,
+			String url, String group,String jpushType) {
+		if (StringUtils.isBlank(receiver)) {
+			throw new BizException("接收地址不能为空");
+		}
+		Date date = new Date();
+		SendStatusEnum status = SendStatusEnum.WAIT;
+		String errorMsg = null;
+		// 立即发送
+		if (triggerTime == null || date.after(triggerTime)) {
+			status = SendStatusEnum.SENDING;
+			try {
+				if (debugMode == true || messageSenderPluginContext.send(messageSender, receiver, title, content, url,jpushType)) {
+					status = SendStatusEnum.SUCCESSED;
+				} else {
+					status = SendStatusEnum.FAILED;
+				}
+			} catch (Exception e) {
+				status = SendStatusEnum.FAILED;
+				errorMsg = e.getMessage();
+				LOGGER.warn("消息发送失败", e);
+			}
+		}
+		MessageSendMode mode = MessageSendMode.SMS;
+		if (messageSender.getSendMode().equals("PUSH")) {
+			mode = MessageSendMode.PUSH;
+		} else if (messageSender.getSendMode().equals("EMAIL")) {
+			mode = MessageSendMode.EMAIL;
+		}
+		Map<Integer, String> receivers = new HashMap<Integer, String>();
+		receivers.put(userId, receiver);
+		addMessage(receivers, title, content, triggerTime, mode, status, errorMsg, readStatus, url, null);
+	}
+
+	@Override
+	public boolean sendSecurityCode(MessageSender messageSender, Integer userId, MessageTypeEnum messageType, String receiver) {
+		String key1 = getVerificationCode1CacheKey(messageType, receiver);
+		if (redisCache.get(key1) != null) {
+			throw new BizException("请勿频繁操作,获取验证码间隔时间为60秒");
+		}
+
+		String key = getVerificationCodeCacheKey(messageType, receiver);
+		int code = DEFAULT_CODE;
+		if (debugMode == false) {
+			code = getRandomCode(messageType, receiver);
+		}
+		Map<Integer, String> receivers = new HashMap<>(1);
+		receivers.put(userId, receiver);
+		batchSendMessage(messageSender, messageType, receivers, null, 1, "","", code);
+		redisCache.put(key, code + "", CODE_EXPIRE);
+		redisCache.put(key1, code + "", CODE_INTERVAL_TIME);
+		return true;
+	}
+
+	@Override
+	public String getSendedVerificationCode(MessageTypeEnum type, String mobileNOOrEmailAddr) {
+		if (debugMode == true) {
+			return DEFAULT_CODE + "";
+		}
+		String key = getVerificationCodeCacheKey(type, mobileNOOrEmailAddr);
+		Object object = redisCache.get(key);
+		return object == null ? null : object.toString();
+	}
+
+	@Override
+	public void delSendedVerificationCode(MessageTypeEnum type, String mobileNOOrEmailAddr) {
+		String key = getVerificationCodeCacheKey(type, mobileNOOrEmailAddr);
+		if (StringUtils.isNotBlank(key)) {
+			redisCache.delete(key);
+		}
+	}
+
+	@Override
+	public Map<String, Integer> queryCountOfUnread(MessageSendMode type, Integer userId) {
+		List<Mapper> mappers = sysMessageDao.queryCountOfUnread(type, userId);
+
+		Map<String, Integer> map = new HashMap<String, Integer>();
+
+		for (Mapper mapper : mappers) {
+			map.put(mapper.getKey().toString(), Integer.parseInt(mapper.getValue().toString()));
+		}
+
+		return map;
+	}
+
+	public void setDebugMode(boolean debugMode) {
+		this.debugMode = debugMode;
+	}
+
+	private int getRandomCode(MessageTypeEnum type, String mobileNo) {
+		int min = 100000;
+		int max = 999999;
+		Random random = new Random();
+
+		return random.nextInt(max) % (max - min + 1) + min;
+	}
+
+	private static String getVerificationCodeCacheKey(MessageTypeEnum type, String mobileNOOrEmailAddr) {
+		return "verificationCode" + type.name() + mobileNOOrEmailAddr;
+	}
+
+	private static String getVerificationCode1CacheKey(MessageTypeEnum type, String mobileNOOrEmailAddr) {
+		return "verificationCode" + mobileNOOrEmailAddr;
+	}
+
+	/**
+	 *
+	 * @param userId 用户id数组
+	 * @param status 状态/1 已读,0未读
+	 * @return 修改的条数
+	 */
+	@Override
+	public int updateStatus(Integer userId, int status) {
+		return sysMessageDao.updateStatus(userId, status);
+	}
+
+	@Override
+	public int updateOneStatus(Long id, int status) {
+		return sysMessageDao.updateOneStatus(id, status);
+	}
+
+	@Override
+	public List<SysMessage> queryUserInRecentMinList(String mobile, int recentMin, MessageSendMode type) {
+		return sysMessageDao.queryUserInRecentMinList(mobile, recentMin, type);
+	}
+}

+ 114 - 0
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/web/controller/SmsCodeController.java

@@ -0,0 +1,114 @@
+package com.keao.edu.auth.web.controller;
+
+
+import com.google.code.kaptcha.Constants;
+import com.google.code.kaptcha.Producer;
+import com.google.code.kaptcha.servlet.KaptchaServlet;
+import com.keao.edu.auth.api.util.SecurityConstants;
+import com.keao.edu.auth.service.SmsCodeService;
+import com.keao.edu.common.controller.BaseController;
+import com.keao.edu.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+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.RestController;
+
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.util.concurrent.TimeUnit;
+
+@RestController
+@RequestMapping("code")
+@Api(tags = "验证码服务")
+public class SmsCodeController extends BaseController {
+
+    @Autowired
+    private SmsCodeService smsCodeService;
+    @Autowired
+    private Producer captchaProducer;
+    @Autowired
+    private RedisTemplate<String,String> redisTemplate;
+
+    @ApiOperation(value = "发送登录短信验证码")
+    @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String")
+    @PostMapping(value = "/sendSms")
+    public Object sendLoginVerifyCode(String mobile) throws Exception {
+        smsCodeService.sendValidCode(mobile);
+        return succeed();
+    }
+
+    @ApiOperation(value = "校验短信验证码")
+    @ApiImplicitParams({ @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "code", value = "短信验证码", required = true, dataType = "String") })
+    @PostMapping(value = "/verifySmsCode")
+    public Object verifySmsCode(String phone,String code) {
+        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){
+            return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
+        }
+        if(smsCodeService.verifyValidCode(phone,code)){
+            return succeed();
+        }
+        return failed("验证码校验失败");
+    }
+
+    @PostMapping(value = "/verifyLoginImage")
+    @ApiOperation("校验登录图形验证码")
+    @ApiImplicitParams({ @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "code", value = "验证码", required = true, dataType = "String") })
+    public Object verifyImageCode(String phone,String code){
+        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){
+            return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
+        }
+        String redisKey = Constants.KAPTCHA_SESSION_KEY + phone;
+        if(redisTemplate.hasKey(redisKey)){
+            if(StringUtils.equalsIgnoreCase(redisTemplate.opsForValue().get(redisKey),code)){
+                return succeed();
+            }
+        }
+        return failed(SecurityConstants.VERIFY_FAILURE);
+    }
+
+    @GetMapping(value = "/getLoginImage")
+    @ApiOperation("获取登录图片验证码")
+    @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String")
+    public void getKaptchaImage(HttpServletResponse response, String phone) throws Exception {
+        if(StringUtils.isEmpty(phone)){
+            throw new BizException("请输入手机号");
+        }
+        response.setDateHeader("Expires", 0);
+
+        // Set standard HTTP/1.1 no-cache headers.
+        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
+        // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
+        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
+        // Set standard HTTP/1.0 no-cache header.
+        response.setHeader("Pragma", "no-cache");
+        // return a jpeg
+        response.setContentType("image/jpeg");
+        // create the text for the image
+        String capText = captchaProducer.createText();
+
+        redisTemplate.opsForValue().set(Constants.KAPTCHA_SESSION_KEY + phone,capText,3, TimeUnit.MINUTES);
+        // create the image with the text
+        BufferedImage bi = captchaProducer.createImage(capText);
+        KaptchaServlet kaptchaServlet = new KaptchaServlet();
+        kaptchaServlet.init();
+        ServletOutputStream out = response.getOutputStream();
+        // write the data out
+        try {
+            ImageIO.write(bi, "jpg", out);
+            out.flush();
+        } finally {
+            out.close();
+        }
+    }
+}

+ 13 - 0
edu-auth/edu-auth-server/src/main/resources/application.yml

@@ -88,3 +88,16 @@ ribbon:
 
 message:
   debugMode: true
+
+push:
+  jiguang:
+    reqURL: https://api.jpush.cn/v3/push
+    appKey:
+      student: 0e7422e1d6e73637e678716a
+      teacher: 7e0282ca92c12c8c45a93bb3
+      system: a003c997b1add94aa8d6caf9
+    masterSecret:
+      student: c2361016604eab56ab2db2ac
+      teacher: d47430e2f4755ef5dc050ac5
+      system: c281fe6a21acf2e8a9f9d628
+    apns_production: false

+ 119 - 0
edu-auth/edu-auth-server/src/main/resources/config/mybatis/SysMessageConfigMapper.xml

@@ -0,0 +1,119 @@
+<?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.keao.edu.common.dao.SysMessageConfigDao">
+
+	<resultMap type="com.keao.edu.common.entity.SysMessageConfig"
+		id="SysMessageConfig">
+		<result column="id_" property="id" />
+		<result column="message_type_" property="messageType" typeHandler="com.keao.edu.common.dal.CustomEnumTypeHandler" />
+		<result column="content_" property="content" />
+		<result column="description_" property="description" />
+		<result column="modify_on_" property="modifyOn" />
+		<result column="url_" property="url" />
+		<result column="group_" property="group" />
+		<result column="send_flag_" property="sendFlag" />
+	</resultMap>
+
+	<sql id="queryCondition">
+		<where>
+			<if test="messageType != null">
+				and message_type_ =
+				#{messageType,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="content != null">
+				and content_ = #{content,jdbcType=VARCHAR},
+			</if>
+			<if test="description != null">
+				and description_ = #{description,jdbcType=VARCHAR}
+			</if>
+			<if test="group != null">
+				and group_ = #{group,jdbcType=VARCHAR}
+			</if>
+			<if test="sendFlag != null">
+				and send_flag_ = #{sendFlag}
+			</if>
+		</where>
+	</sql>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysMessageConfig">
+		SELECT * FROM
+		sys_message_config WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysMessageConfig">
+		SELECT * FROM sys_message_config
+		ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.keao.edu.common.entity.SysMessageConfig"
+		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
+			AS ID FROM DUAL </selectKey> -->
+		INSERT INTO sys_message_config
+		(id_,message_type_,content_,description_,modify_on_,url_,group_)
+		VALUES(#{id},#{messageType},#{content},#{description},#{modifyOn},#{url},#{group})
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.keao.edu.common.entity.SysMessageConfig">
+		UPDATE sys_message_config
+		<set>
+			<if test="modifyOn != null">
+				modify_on_ = #{modifyOn},
+			</if>
+			<if test="messageType != null">
+				message_type_ = #{messageType},
+			</if>
+			<if test="id != null">
+				id_ = #{id},
+			</if>
+			<if test="url != null">
+				url_ = #{url},
+			</if>
+			<if test="group != null">
+				group_ = #{group},
+			</if>
+			<if test="content != null">
+				content_ = #{content},
+			</if>
+			<if test="description != null">
+				description_ = #{description},
+			</if>
+			<if test="sendFlag != null">
+				send_flag_ = #{sendFlag}
+			</if>
+		</set>
+		WHERE id_ = #{id}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete">
+		DELETE FROM sys_message_config WHERE id_ =
+		#{id}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysMessageConfig"
+		parameterType="map">
+		select * from sys_message_config
+		<include refid="queryCondition" />
+		order by update_time_ desc
+		<include refid="global.limit" />
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		select count(*) from sys_message_config
+		<include refid="queryCondition" />
+	</select>
+	<select id="queryByType" resultMap="SysMessageConfig">
+		SELECT * FROM sys_message_config WHERE message_type_ = #{messageType}
+	</select>
+    <select id="findContent" resultType="java.lang.String">
+		SELECT content_ FROM sys_message_config WHERE message_type_ = #{messageType}
+	</select>
+</mapper>

+ 187 - 0
edu-auth/edu-auth-server/src/main/resources/config/mybatis/SysMessageMapper.xml

@@ -0,0 +1,187 @@
+<?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.keao.edu.common.dao.SysMessageDao">
+
+    <resultMap type="com.keao.edu.common.entity.SysMessage" id="message">
+        <result column="id_" property="id"/>
+        <result column="title_" property="title"/>
+        <result column="content_" property="content"/>
+        <result column="type_" property="type" typeHandler="com.keao.edu.common.dal.CustomEnumTypeHandler"/>
+        <result column="status_" property="status" typeHandler="com.keao.edu.common.dal.CustomEnumTypeHandler"/>
+        <result column="receiver_" property="receiver"/>
+        <result column="send_time_" property="sendTime"/>
+        <result column="error_msg_" property="errorMsg"/>
+        <result column="create_on_" property="createOn"/>
+        <result column="modify_on_" property="modifyOn"/>
+        <result column="user_id_" property="userId"/>
+        <result column="memo_" property="memo"/>
+        <result column="read_status_" property="readStatus"/>
+        <result column="group_" property="group"/>
+    </resultMap>
+    
+    <resultMap type="com.keao.edu.common.entity.Mapper" id="Mapper">
+    	<result column="key_" property="key"/>
+        <result column="value_" property="value"/>
+    </resultMap>
+
+	<sql id="queryCondition">
+		<where>
+			<if test="userId != null">
+				and user_id_ = #{userId}
+			</if>
+			<if test="receiver != null">
+				and receiver_ like '%' #{receiver} '%'
+			</if>
+			<if test="status != null">
+				and status_ = #{status,jdbcType=TINYINT}
+			</if>
+			<if test="readStatus != null">
+				and read_status_ = #{readStatus,jdbcType=TINYINT}
+			</if>
+			<if test="title != null">
+				and title_ like '%' #{title} '%'
+			</if>
+			<if test="type != null">
+				and type_ = #{type}
+			</if>
+			<if test="group != null">
+				and group_ = #{group}
+			</if>
+			<if test="readStatus != null">
+				and read_status_ = #{readStatus}
+			</if>
+		</where>
+	</sql>
+
+    <select id="get" resultMap="message" parameterType="java.lang.Long">
+		select *
+		from sys_message
+		where id_ = #{id,jdbcType=BIGINT}
+	</select>
+
+	<delete id="delete" parameterType="java.lang.Long">
+		delete from
+		sys_message
+		where
+		id_ = #{id,jdbcType=BIGINT}
+	</delete>
+
+	<insert id="insert" parameterType="com.keao.edu.common.entity.SysMessage">
+		insert into sys_message (user_id_,title_, content_,type_, receiver_,
+		send_time_, error_msg_,memo_, create_on_,modify_on_,group_)
+		values (#{userId}, #{title},#{content},#{type,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler}, #{receiver},now(),#{errorMsg},#{memo},now(),now(),#{group})
+	</insert>
+
+	<insert id="batchInsert" parameterType="com.keao.edu.common.entity.SysMessage">
+		insert into sys_message (id_, user_id_,
+		title_, content_,
+		type_, status_, receiver_,
+		send_time_, error_msg_,read_status_,memo_, create_on_,
+		modify_on_,group_)
+		values
+		<foreach collection="list" item="item" index="index"
+			separator=",">
+			(
+			#{item.id,jdbcType=BIGINT},#{item.userId,jdbcType=BIGINT}, #{item.title,jdbcType=VARCHAR},
+			#{item.content,jdbcType=VARCHAR},
+			#{item.type,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
+			#{item.status,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler}, #{item.receiver,jdbcType=VARCHAR},
+			#{item.sendTime},#{item.errorMsg,jdbcType=VARCHAR},#{item.readStatus},#{item.memo},
+			#{item.createOn},
+			#{item.modifyOn},#{item.group}
+			)
+		</foreach>
+	</insert>
+
+	<update id="update" parameterType="com.keao.edu.common.entity.SysMessage">
+		update sys_message
+		<set>
+			<if test="userId != null">
+				user_id_ = #{userId,jdbcType=BIGINT},
+			</if>
+			<if test="title != null">
+				title_ = #{title,jdbcType=VARCHAR},
+			</if>
+			<if test="content != null">
+				content_ = #{content,jdbcType=VARCHAR},
+			</if>
+			<if test="type != null">
+				type_ = #{type,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="status != null">
+				status_ = #{status,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="receiver != null">
+				receiver_ = #{receiver,jdbcType=VARCHAR},
+			</if>
+			<if test="sendTime != null">
+				send_time_ = #{sendTime},
+			</if>
+			<if test="errorMsg != null">
+				error_msg_ = #{errorMsg,jdbcType=VARCHAR},
+			</if>
+			<if test="readStatus != null">
+				read_status_ = #{readStatus,jdbcType=TINYINT},
+			</if>
+			<if test="memo != null">
+				memo_ = #{memo,jdbcType=VARCHAR},
+			</if>
+			<if test="createOn != null">
+				create_on_ = #{createOn},
+			</if>
+			<if test="modifyOn != null">
+				modify_on_ = #{modifyOn},
+			</if>
+			<if test="group != null">
+				group_ = #{group},
+			</if>
+		</set>
+		where id_ = #{id,jdbcType=BIGINT}
+	</update>
+	<update id="updateStatus">
+		update sys_message set read_status_=#{status}
+		where user_id_ =#{userId}
+	</update>
+
+    <update id="updateOneStatus">
+       update sys_message set read_status_=#{status}
+		where id_ =#{id}
+    </update>
+
+    <select id="queryCount" parameterType="map" resultType="int">
+		select count(*) from sys_message
+		<include refid="queryCondition" />
+		order by create_on_ desc
+	</select>
+
+	<select id="queryPage" parameterType="map" resultMap="message">
+		select * from sys_message
+		<include refid="queryCondition" />
+		order by create_on_ desc
+		<include refid="global.limit" />
+	</select>
+
+	<select id="queryByStatusAndTime" resultMap="message">
+		select *
+		from sys_message where status_ = #{status} and <![CDATA[DATE_ADD(CURDATE(),
+		INTERVAL #{recentMin} MINUTE) >= date(send_time_)]]>
+	</select>
+
+	<select id="queryCountOfUnread" resultMap="Mapper" parameterType="map">
+		SELECT group_ key_,COUNT(*) value_ FROM sys_message WHERE user_id_ = #{userId} AND read_status_ = 0 and status_ = 2
+		<if test="type != null">
+		and type_ = #{type,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler}
+		</if>
+		group by group_
+	</select>
+
+	<select id="queryUserInRecentMinList" resultMap="message" parameterType="map">
+		select *
+		from sys_message where receiver_ = #{mobile} and type_ = #{type,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler} and <![CDATA[DATE_ADD(send_time_,
+		INTERVAL #{recentMin} MINUTE) >= now()]]>
+	</select>
+</mapper>

+ 1 - 2
edu-common/pom.xml

@@ -75,6 +75,5 @@
             <version>1.5.20</version>
             <scope>compile</scope>
         </dependency>
-
-    </dependencies>
+	</dependencies>
 </project>

+ 18 - 0
edu-common/src/main/java/com/keao/edu/common/dao/SysMessageConfigDao.java

@@ -0,0 +1,18 @@
+package com.keao.edu.common.dao;
+
+
+import com.keao.edu.common.dal.BaseDAO;
+import com.keao.edu.common.entity.SysMessageConfig;
+import org.apache.ibatis.annotations.Param;
+
+public interface SysMessageConfigDao extends BaseDAO<Integer, SysMessageConfig> {
+
+	/**
+	 * 根据消息类型查询对象
+	 * @param messageType
+	 * @return
+	 */
+	SysMessageConfig queryByType(@Param("messageType") String messageType);
+
+    String findContent(String messageType);
+}

+ 47 - 0
edu-common/src/main/java/com/keao/edu/common/dao/SysMessageDao.java

@@ -0,0 +1,47 @@
+package com.keao.edu.common.dao;
+
+import com.keao.edu.common.dal.BaseDAO;
+import com.keao.edu.common.entity.Mapper;
+import com.keao.edu.common.entity.SysMessage;
+import com.keao.edu.common.enums.MessageSendMode;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface SysMessageDao extends BaseDAO<Long, SysMessage> {
+
+	public List<SysMessage> queryUserInRecentMinList(@Param("mobile") String mobile, @Param("recentMin") int recentMin, @Param("type") MessageSendMode type);
+
+	/**
+	 * 根据状态查询最近N分钟的记录
+	 * @param status 状态值
+	 * @param recentMin 最近分钟数
+	 * @return
+	 */
+	public List<SysMessage> queryByStatusAndTime(@Param("status") int status, @Param("recentMin") int recentMin);
+
+	/**
+	 * 批量插入
+	 * @param messages
+	 * @return
+	 */
+	public int batchInsert(List<SysMessage> messages);
+
+	/**
+	 * 查询消息未读条数
+	 * @param type
+	 * @param userId
+	 * @return
+	 */
+	public List<Mapper> queryCountOfUnread(@Param("type") MessageSendMode type, @Param("userId") Integer userId);
+
+	/**
+	 * 修改用户所有消息阅读状态
+	 */
+	public int updateStatus(@Param("userId") Integer userId, @Param("status") int status);
+
+	/**
+	 * 修改单个消息状态
+	 */
+	public int updateOneStatus(@Param("id") Long id, @Param("status") int status);
+}

+ 34 - 0
edu-common/src/main/java/com/keao/edu/common/entity/Mapper.java

@@ -0,0 +1,34 @@
+package com.keao.edu.common.entity;
+
+public class Mapper {
+
+	private Object key;
+	
+	private Object value;
+
+	private Integer courseScheduleId;
+
+	public Integer getCourseScheduleId() {
+		return courseScheduleId;
+	}
+
+	public void setCourseScheduleId(Integer courseScheduleId) {
+		this.courseScheduleId = courseScheduleId;
+	}
+
+	public Object getKey() {
+		return key;
+	}
+
+	public void setKey(Object key) {
+		this.key = key;
+	}
+
+	public Object getValue() {
+		return value;
+	}
+
+	public void setValue(Object value) {
+		this.value = value;
+	}
+}

+ 194 - 0
edu-common/src/main/java/com/keao/edu/common/entity/SysMessage.java

@@ -0,0 +1,194 @@
+package com.keao.edu.common.entity;
+
+import com.keao.edu.common.enums.MessageSendMode;
+import com.keao.edu.common.enums.SendStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_message):
+ */
+public class SysMessage {
+
+	/** 主键 */
+	private Long id;
+	
+	/** 标题 */
+	@ApiModelProperty(value = "标题",required = false)
+	private String title;
+	
+	/** 消息内容 */
+	@ApiModelProperty(value = "消息内容",required = false)
+	private String content;
+	
+	/** 消息类型;1,表示短信;2,表示邮件; 3,app推送消息 */
+	@ApiModelProperty(value = "消息类型",required = false)
+	private MessageSendMode type;
+	
+	/** 状态,-1,发送失败;0,待发送;1,发送中;2,发送完成 */
+	@ApiModelProperty(value = "状态",required = false)
+	private SendStatusEnum status;
+	
+	/** 接收人(多个人用逗号分隔) */
+	@ApiModelProperty(value = "接收人(多个人用逗号分隔)",required = false)
+	private String receiver;
+	
+	/** 发送时间 */
+	@ApiModelProperty(value = "发送时间",required = false)
+	private java.util.Date sendTime;
+	
+	/** 错误信息 */
+	@ApiModelProperty(value = "错误信息",required = false)
+	private String errorMsg;
+	
+	/** 创建时间 */
+	private java.util.Date createOn;
+	
+	/** 修改时间 */
+	private java.util.Date modifyOn;
+	
+	/** 用户编号 */
+	@ApiModelProperty(value = "用户编号",required = false)
+	private Integer userId;
+	
+	/** 备注 */
+	@ApiModelProperty(value = "备注",required = false)
+	private String memo;
+	
+	/** 是否已读 */
+	@ApiModelProperty(value = "是否已读",required = false)
+	private Integer readStatus;
+	
+	@ApiModelProperty(value = "消息组",required = false)
+	private String group;
+
+	public SysMessage() {
+	}
+
+	public SysMessage(String title, String content, MessageSendMode type, String receiver, Integer userId, String memo) {
+		this.title = title;
+		this.content = content;
+		this.type = type;
+		this.receiver = receiver;
+		this.userId = userId;
+		this.memo = memo;
+	}
+
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setTitle(String title){
+		this.title = title;
+	}
+	
+	public String getTitle(){
+		return this.title;
+	}
+			
+	public void setContent(String content){
+		this.content = content;
+	}
+	
+	public String getContent(){
+		return this.content;
+	}
+			
+	public void setReceiver(String receiver){
+		this.receiver = receiver;
+	}
+	
+	public String getReceiver(){
+		return this.receiver;
+	}
+			
+	public void setSendTime(java.util.Date sendTime){
+		this.sendTime = sendTime;
+	}
+	
+	public java.util.Date getSendTime(){
+		return this.sendTime;
+	}
+			
+	public void setErrorMsg(String errorMsg){
+		this.errorMsg = errorMsg;
+	}
+	
+	public String getErrorMsg(){
+		return this.errorMsg;
+	}
+			
+	public void setCreateOn(java.util.Date createOn){
+		this.createOn = createOn;
+	}
+	
+	public java.util.Date getCreateOn(){
+		return this.createOn;
+	}
+			
+	public void setModifyOn(java.util.Date modifyOn){
+		this.modifyOn = modifyOn;
+	}
+	
+	public java.util.Date getModifyOn(){
+		return this.modifyOn;
+	}
+			
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setMemo(String memo){
+		this.memo = memo;
+	}
+	
+	public String getMemo(){
+		return this.memo;
+	}
+
+	public MessageSendMode getType() {
+		return type;
+	}
+
+	public void setType(MessageSendMode type) {
+		this.type = type;
+	}
+
+	public SendStatusEnum getStatus() {
+		return status;
+	}
+
+	public void setStatus(SendStatusEnum status) {
+		this.status = status;
+	}
+
+	public Integer getReadStatus() {
+		return readStatus;
+	}
+
+	public void setReadStatus(Integer readStatus) {
+		this.readStatus = readStatus;
+	}
+
+	public String getGroup() {
+		return group;
+	}
+
+	public void setGroup(String group) {
+		this.group = group;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 102 - 0
edu-common/src/main/java/com/keao/edu/common/entity/SysMessageConfig.java

@@ -0,0 +1,102 @@
+package com.keao.edu.common.entity;
+
+import com.keao.edu.common.enums.MessageTypeEnum;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_message_config):
+ */
+public class SysMessageConfig {
+
+	/**  */
+	private Integer id;
+
+	/** 消息类型 */
+	private MessageTypeEnum messageType;
+
+	/** 消息内容 */
+	private String content;
+
+	/** 描述 */
+	private String description;
+
+	/** 最后修改时间 */
+	private java.util.Date modifyOn;
+
+	/** 跳转url */
+	private String url;
+	
+	private String group;
+
+	private Integer sendFlag;
+
+	public Integer getSendFlag() {
+		return sendFlag;
+	}
+
+	public void setSendFlag(Integer sendFlag) {
+		this.sendFlag = sendFlag;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getId() {
+		return this.id;
+	}
+
+	public MessageTypeEnum getMessageType() {
+		return messageType;
+	}
+
+	public void setMessageType(MessageTypeEnum messageType) {
+		this.messageType = messageType;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+
+	public String getContent() {
+		return this.content;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public String getDescription() {
+		return this.description;
+	}
+
+	public void setModifyOn(java.util.Date modifyOn) {
+		this.modifyOn = modifyOn;
+	}
+
+	public java.util.Date getModifyOn() {
+		return this.modifyOn;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
+	public String getUrl() {
+		return this.url;
+	}
+
+	public String getGroup() {
+		return group;
+	}
+
+	public void setGroup(String group) {
+		this.group = group;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 34 - 0
edu-common/src/main/java/com/keao/edu/common/enums/MessageSendMode.java

@@ -0,0 +1,34 @@
+package com.keao.edu.common.enums;
+
+/**
+ 状态,1,表示短信;2,表示邮件; 3,app推送消息
+ */
+public enum MessageSendMode implements BaseEnum<Integer, MessageSendMode> {
+	SMS(1, "短信"), EMAIL(2, "邮件"), PUSH(3, "app推送消息"), SEO(4, "站内推送消息");
+
+	private Integer code;
+
+	private String msg;
+
+	MessageSendMode(Integer code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public void setCode(Integer code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	@Override
+	public Integer getCode() {
+		return this.code;
+	}
+}

+ 31 - 0
edu-common/src/main/java/com/keao/edu/common/enums/MessageTypeEnum.java

@@ -0,0 +1,31 @@
+package com.keao.edu.common.enums;
+
+public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
+    SMS_VERIFY_CODE_LOGIN("SMS_VERIFY_CODE_LOGIN", "验证码登录");
+
+    MessageTypeEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    private String code;
+
+    private String msg;
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return code;
+    }
+}

+ 34 - 0
edu-common/src/main/java/com/keao/edu/common/enums/SendStatusEnum.java

@@ -0,0 +1,34 @@
+package com.keao.edu.common.enums;
+
+/**
+ 状态,-1,发送失败;0,待发送;1,发送中;2,发送完成
+ */
+public enum SendStatusEnum implements BaseEnum<Integer, SendStatusEnum> {
+	FAILED(-1, "发送失败"), WAIT(0, "待发送"), SENDING(1, "发送中"), SUCCESSED(2, "发送完成");
+
+	private Integer code;
+
+	private String msg;
+
+	SendStatusEnum(Integer code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public void setCode(Integer code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	@Override
+	public Integer getCode() {
+		return this.code;
+	}
+}

+ 5 - 7
edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/TeacherController.java

@@ -6,15 +6,13 @@ import com.keao.edu.common.entity.HttpResponseResult;
 import com.keao.edu.common.page.PageInfo;
 import com.keao.edu.common.page.QueryInfo;
 import com.keao.edu.user.entity.Teacher;
+import com.keao.edu.user.page.TeacherQueryInfo;
 import com.keao.edu.user.service.TeacherService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-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.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * 系统配置控制层
@@ -30,14 +28,14 @@ public class TeacherController extends BaseController {
 	@ApiOperation(value = "教师列表")
 	@GetMapping(value = "list")
     @PreAuthorize("@pcs.hasPermissions('teacher/list')")
-	public HttpResponseResult<PageInfo<Teacher>> list(QueryInfo queryInfo) {
+	public HttpResponseResult<PageInfo<Teacher>> list(TeacherQueryInfo queryInfo) {
 		return succeed(teacherService.queryPage(queryInfo));
 	}
 
 	@ApiOperation(value = "修改教师")
 	@PostMapping(value = "update")
     @PreAuthorize("@pcs.hasPermissions('teacher/update')")
-	public HttpResponseResult update(Teacher teacher) {
+	public HttpResponseResult update(@RequestBody Teacher teacher) {
 		teacherService.updateTeacher(teacher);
 		return succeed();
 	}
@@ -45,7 +43,7 @@ public class TeacherController extends BaseController {
 	@ApiOperation(value = "新增教师")
 	@PostMapping(value = "add")
     @PreAuthorize("@pcs.hasPermissions('teacher/add')")
-	public HttpResponseResult add(Teacher teacher) {
+	public HttpResponseResult add(@RequestBody Teacher teacher) {
 		return succeed(teacherService.add(teacher));
 	}
 

+ 5 - 4
edu-user/edu-user-server/src/main/java/com/keao/edu/user/entity/Teacher.java

@@ -1,6 +1,7 @@
 package com.keao.edu.user.entity;
 
 import com.keao.edu.auth.api.entity.SysUser;
+import com.keao.edu.user.enums.TeacherSettlementTypeEnum;
 import com.keao.edu.user.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -19,8 +20,8 @@ public class Teacher {
 	@ApiModelProperty(value = "专业",required = false)
 	private String subjectIdList;
 	
-	@ApiModelProperty(value = "薪酬结算方式(按天、按考生数)",required = false)
-	private String salarySettlementType;
+	@ApiModelProperty(value = "薪酬结算方式(单次结算,人数结算)",required = false)
+	private TeacherSettlementTypeEnum salarySettlementType;
 	
 	@ApiModelProperty(value = "薪酬",required = false)
 	private java.math.BigDecimal salary;
@@ -87,11 +88,11 @@ public class Teacher {
 		return this.subjectIdList;
 	}
 			
-	public void setSalarySettlementType(String salarySettlementType){
+	public void setSalarySettlementType(TeacherSettlementTypeEnum salarySettlementType){
 		this.salarySettlementType = salarySettlementType;
 	}
 	
-	public String getSalarySettlementType(){
+	public TeacherSettlementTypeEnum getSalarySettlementType(){
 		return this.salarySettlementType;
 	}
 			

+ 39 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/enums/TeacherSettlementTypeEnum.java

@@ -0,0 +1,39 @@
+package com.keao.edu.user.enums;
+
+import com.keao.edu.common.enums.BaseEnum;
+
+/**
+ * @Author Joburgess
+ * @Date 2020.06.18
+ */
+public enum TeacherSettlementTypeEnum implements BaseEnum<String, TeacherSettlementTypeEnum> {
+
+    SINGLE("SINGLE", "单次结算"),
+    PEOPLE_NUM("PEOPLE_NUM", "人数");
+
+    private String code;
+
+    private String msg;
+
+    TeacherSettlementTypeEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 16 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/page/TeacherQueryInfo.java

@@ -0,0 +1,16 @@
+package com.keao.edu.user.page;
+
+import com.keao.edu.common.page.QueryInfo;
+
+public class TeacherQueryInfo extends QueryInfo {
+
+    private String settlementType;
+
+    public String getSettlementType() {
+        return settlementType;
+    }
+
+    public void setSettlementType(String settlementType) {
+        this.settlementType = settlementType;
+    }
+}

+ 0 - 1
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/OrganizationService.java

@@ -3,7 +3,6 @@ package com.keao.edu.user.service;
 
 import com.keao.edu.common.service.BaseService;
 import com.keao.edu.user.entity.Organization;
-import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 

+ 5 - 6
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/OrganizationServiceImpl.java

@@ -60,11 +60,7 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 		SysUser user = sysUserDao.queryByPhone(sysUser.getPhone());
 		organ.setParentOrganId(queryUserInfo.getId());
 		organ.setLevel(currentOrganization.getLevel() + 1);
-		if(StringUtils.isEmpty(currentOrganization.getParentOrganIdTag())){
-			organ.setParentOrganIdTag(queryUserInfo.getId().toString());
-		}else {
-			organ.setParentOrganIdTag(currentOrganization.getParentOrganIdTag() + "," + queryUserInfo.getId());
-		}
+		organ.setParentOrganIdTag(currentOrganization.getParentOrganIdTag() + "," + queryUserInfo.getId());
 		if(user != null && user.getId() != null){
 			Organization organization = organDao.get(user.getId());
 			if(organization == null){
@@ -111,6 +107,7 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 	@Transactional(rollbackFor = Exception.class)
 	public void updateOrganization(Organization organization) {
 		SysUser sysUser = organization.getSysUser();
+		sysUser.setId(organization.getId());
 		if(null == organDao.get(sysUser.getId())){
 			throw new BizException("合作商信息不存在");
 		}
@@ -127,7 +124,9 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 		//删除当前用户角色
 		sysUserDao.delEmployeeRole(sysUser.getId());
 		//新增用户角色
-		sysUserDao.batchAddEmployeeRole(sysUser.getId(),sysUser.getRoles());
+		if(sysUser.getRoles() != null && sysUser.getRoles().size() > 0){
+			sysUserDao.batchAddEmployeeRole(sysUser.getId(),sysUser.getRoles());
+		}
 		sysUserDao.update(sysUser);
 		imFeignService.update(new ImUserModel(sysUser.getId().toString(),sysUser.getRealName(),sysUser.getAvatar()));
 	}

+ 12 - 1
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/TeacherServiceImpl.java

@@ -1,6 +1,7 @@
 package com.keao.edu.user.service.impl;
 
 
+import com.keao.edu.auth.api.client.SysUserFeignService;
 import com.keao.edu.auth.api.entity.SysUser;
 import com.keao.edu.common.dal.BaseDAO;
 import com.keao.edu.common.exception.BizException;
@@ -29,6 +30,8 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
 	private SysUserDao sysUserDao;
 	@Autowired
 	private ImFeignService imFeignService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
 
 	@Override
 	public BaseDAO<Integer, Teacher> getDAO() {
@@ -38,22 +41,29 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public int add(Teacher teacher) {
+		SysUser queryUserInfo = sysUserFeignService.queryUserInfo();
 		SysUser sysUser = teacher.getSysUser();
 		SysUser user = sysUserDao.queryByPhone(sysUser.getPhone());
 		Date date = new Date();
+		String tenantId = queryUserInfo.getTenantId();
+		teacher.setTenantId(tenantId);
+		sysUser.setTenantId(tenantId);
 		if(user != null && user.getId() != null){
 			if(user.getUserType().contains("TEACHER")){
 				throw new BizException("此手机号已被占用");
 			}
 			Integer id = user.getId();
+			sysUser.setId(id);
 			Teacher teacher1 = teacherDao.get(id);
 			if(teacher1 == null || teacher1.getUserId() == null){
 				teacher.setUserId(id);
-				teacher.setDelFlag(YesOrNoEnum.NO);
 				teacherDao.insert(teacher);
 				sysUser.setUserType(user.getUserType() + ",TEACHER");
 				sysUser.setUpdateTime(date);
 				sysUserDao.update(sysUser);
+			}else if (teacher1.getDelFlag() == YesOrNoEnum.YES){
+				teacher.setDelFlag(YesOrNoEnum.NO);
+				teacherDao.update(teacher);
 			}else {
 				throw new BizException("用户已存在");
 			}
@@ -77,6 +87,7 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
 	@Transactional(rollbackFor = Exception.class)
 	public void updateTeacher(Teacher teacher) {
 		SysUser sysUser = teacher.getSysUser();
+		sysUser.setId(teacher.getUserId());
 		if(null == teacherDao.get(sysUser.getId())){
 			throw new BizException("教师信息不存在");
 		}

+ 15 - 38
edu-user/edu-user-server/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -10,50 +10,24 @@
 		<result column="user_id_" property="userId" />
 		<result column="title_" property="title" />
 		<result column="subject_id_list_" property="subjectIdList" />
-		<result column="salary_settlement_type_" property="salarySettlementType" />
+		<result column="salary_settlement_type_" property="salarySettlementType" typeHandler="com.keao.edu.common.dal.CustomEnumTypeHandler"/>
 		<result column="salary_" property="salary" />
-		<result column="del_flag_" property="delFlag" />
+		<result column="del_flag_" property="delFlag" typeHandler="com.keao.edu.common.dal.CustomEnumTypeHandler"/>
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 		<result column="tenant_id_" property="tenantId" />
-		<association property="sysUser" javaType="com.keao.edu.auth.api.entity.SysUser">
-			<result column="id_" property="id"/>
-			<result column="username_" property="username"/>
-			<result column="real_name_" property="realName"/>
-			<result column="password_" property="password"/>
-			<result column="salt_" property="salt"/>
-			<result column="phone_" property="phone"/>
-			<result column="avatar_" property="avatar"/>
-			<result column="create_time_" property="createTime"/>
-			<result column="update_time_" property="updateTime"/>
-			<result column="lock_flag_" property="lockFlag"/>
-			<result column="del_flag_" property="delFlag"/>
-			<result column="wx_openid_" property="wxOpenid"/>
-			<result column="qq_openid_" property="qqOpenid"/>
-			<result column="user_type_" property="userType"/>
-			<result column="gender_" property="gender"/>
-			<result column="nation_" property="nation"/>
-			<result column="birthdate_" property="birthdate"/>
-			<result column="email_" property="email"/>
-			<result column="im_token_" property="imToken"/>
-			<result column="id_card_no_" property="idCardNo"/>
-			<result column="wechat_id_" property="wechatId"/>
-			<result column="is_super_admin_" property="isSuperAdmin"/>
-		</association>
+		<association property="sysUser" resultMap="com.keao.edu.user.dao.SysUserDao.SysUser"/>
 	</resultMap>
 
 	<select id="get" resultMap="Teacher">
         SELECT t.*,su.* FROM teacher t
-        LEFT JOIN sys_user su ON t.id_ = su.id_
-        WHERE t.id_ = #{id} AND t.del_flag_ = 0
+        LEFT JOIN sys_user su ON t.user_id_ = su.id_
+        WHERE t.user_id_ = #{id}
     </select>
 
 	<update id="update" parameterType="com.keao.edu.user.entity.Teacher">
 		UPDATE teacher
 		<set>
-			<if test="userId != null">
-				user_id_ = #{userId},
-			</if>
 			<if test="title != null">
 				title_ = #{title},
 			</if>
@@ -61,7 +35,10 @@
 				subject_id_list_ = #{subjectIdList},
 			</if>
 			<if test="salarySettlementType != null">
-				salary_settlement_type_ = #{salarySettlementType},
+				salary_settlement_type_ = #{salarySettlementType,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="delFlag != null">
+				del_flag_ = #{delFlag,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
 			</if>
 			<if test="salary != null">
 				salary_ = #{salary},
@@ -71,7 +48,7 @@
 			</if>
 			update_time_ = NOW()
 		</set>
-		WHERE id_ = #{id}
+		WHERE user_id_ = #{userId}
 	</update>
 
 
@@ -83,7 +60,7 @@
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.keao.edu.user.entity.Teacher" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO teacher (user_id_,title_,subject_id_list_,salary_settlement_type_,salary_,create_time_,update_time_,tenant_id_)
-		VALUES(#{userId},#{title},#{subjectIdList},#{salarySettlementType},#{salary},NOW(),NOW(),#{tenantId})
+		VALUES(#{userId},#{title},#{subjectIdList},#{salarySettlementType,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},#{salary},NOW(),NOW(),#{tenantId})
 	</insert>
 
 	<update id="delete">
@@ -91,11 +68,11 @@
 	</update>
 	<sql id="teacherQueryPage">
 		<where>
-			t.del_flag_ = 0 AND t.tenant_id_ = #{tenantId}
+			t.del_flag_ = 0 AND FIND_IN_SET(#{tenantId},t.tenant_id_)
 			<if test="search != null and search != ''">
-				AND (t.user_id_ = 1
-				OR su.real_name_ LIKE CONCAT('%','','%')
-				OR su.phone_ LIKE CONCAT('%','','%'))
+				AND (t.user_id_ = #{search}
+				OR su.real_name_ LIKE CONCAT('%',#{search},'%')
+				OR su.phone_ LIKE CONCAT('%',#{search},'%'))
 			</if>
 		</where>
 	</sql>