Просмотр исходного кода

Merge branch 'master' of https://git.coding.net/aft/AFT.git

wanghui лет назад: 8
Родитель
Сommit
e51df3e3e7
33 измененных файлов с 1206 добавлено и 50 удалено
  1. 13 1
      src/main/java/com/goafanti/admin/controller/AdminApiController.java
  2. 19 4
      src/main/java/com/goafanti/admin/controller/AdminCopyrightApiController.java
  3. 14 0
      src/main/java/com/goafanti/admin/controller/AdminPatentApiController.java
  4. 59 0
      src/main/java/com/goafanti/admin/controller/AdminSystemController.java
  5. 18 3
      src/main/java/com/goafanti/admin/controller/AdminTechProjectApiController.java
  6. 6 0
      src/main/java/com/goafanti/common/controller/WebpageController.java
  7. 18 0
      src/main/java/com/goafanti/common/dao/MemberGradeMapper.java
  8. 2 0
      src/main/java/com/goafanti/common/dao/UserMapper.java
  9. 2 2
      src/main/java/com/goafanti/common/enums/CopyrightStatus.java
  10. 4 0
      src/main/java/com/goafanti/common/enums/UserType.java
  11. 40 0
      src/main/java/com/goafanti/common/mapper/MemberGradeMapper.xml
  12. 6 0
      src/main/java/com/goafanti/common/mapper/UserMapper.xml
  13. 12 1
      src/main/java/com/goafanti/common/utils/LoggerUtils.java
  14. 1 0
      src/main/java/com/goafanti/core/cache/serializer/FastJsonRedisSerializer.java
  15. 211 0
      src/main/java/com/goafanti/easemob/EasemobUtils.java
  16. 81 0
      src/main/java/com/goafanti/easemob/bo/EasemobInfo.java
  17. 52 0
      src/main/java/com/goafanti/easemob/enums/EasemonSysUsers.java
  18. 151 0
      src/main/java/com/goafanti/easemob/queue/EasemobRedisQueue.java
  19. 19 0
      src/main/java/com/goafanti/easemob/queue/EasemobRedisQueueListener.java
  20. 5 0
      src/main/java/com/goafanti/easemob/queue/RedisQueueListener.java
  21. 43 0
      src/main/java/com/goafanti/memberGrade/bo/BusinessType.java
  22. 59 0
      src/main/java/com/goafanti/memberGrade/bo/MemberGrade.java
  23. 68 0
      src/main/java/com/goafanti/memberGrade/bo/MemberGradeBO.java
  24. 77 0
      src/main/java/com/goafanti/memberGrade/controller/MemberGradeController.java
  25. 45 0
      src/main/java/com/goafanti/memberGrade/service/MemberGradeService.java
  26. 32 3
      src/main/java/com/goafanti/user/controller/UserApiController.java
  27. 9 6
      src/main/java/com/goafanti/user/service/UserService.java
  28. 7 0
      src/main/java/com/goafanti/user/service/impl/UserServiceImpl.java
  29. 5 1
      src/main/resources/props/config_dev.properties
  30. 29 25
      src/main/resources/props/config_local.properties
  31. 5 1
      src/main/resources/props/config_test.properties
  32. 14 3
      src/main/resources/spring/spring-shiro.xml
  33. 80 0
      src/main/webapp/WEB-INF/views/portal/membership.html

+ 13 - 1
src/main/java/com/goafanti/admin/controller/AdminApiController.java

@@ -17,6 +17,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -123,6 +124,8 @@ import com.goafanti.copyright.bo.CopyrightInfoDetail;
 import com.goafanti.copyright.service.CopyrightInfoService;
 import com.goafanti.core.mybatis.page.Pagination;
 import com.goafanti.core.shiro.token.TokenManager;
+import com.goafanti.easemob.EasemobUtils;
+import com.goafanti.easemob.enums.EasemonSysUsers;
 import com.goafanti.patent.service.PatentInfoService;
 import com.goafanti.user.bo.InputOrganizationIdentity;
 import com.goafanti.user.bo.InputUser;
@@ -189,6 +192,9 @@ public class AdminApiController extends CertifyApiController {
 	@Resource
 	private OrgCognizanceProportionService	orgCognizanceProportionService;
 
+	@Autowired
+	EasemobUtils							easemobUtils;
+
 	/**
 	 * 获取营销员及营销经理下拉
 	 */
@@ -2801,7 +2807,13 @@ public class AdminApiController extends CertifyApiController {
 		BeanUtils.copyProperties(cog, ocl);
 
 		orgCognizanceService.updateCognizance(oc, ocl, recordTime, TokenManager.getAdminId());
-
+		if (cog.getState() != null && !cog.getState().equals(o.getState())
+				&& cog.getState() <= OrgCognizanceStatus.CALLBACK.getCode()
+				&& cog.getState() >= OrgCognizanceStatus.PREPARE.getCode()) {
+			easemobUtils.sendMessage(EasemonSysUsers.ADMIN_DDDT.getUsername(),
+					userService.selectNumberByPrimaryKey(o.getUid()), "您的科技项目申报订单:#%s,状态变更为%s", o.getSerialNumber(),
+					OrgCognizanceStatus.getStatus(cog.getState()).getDesc());
+		}
 		return res;
 	}
 

+ 19 - 4
src/main/java/com/goafanti/admin/controller/AdminCopyrightApiController.java

@@ -12,6 +12,7 @@ import javax.validation.Valid;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.FieldError;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -35,6 +36,8 @@ import com.goafanti.copyright.bo.CopyrightInfoDetail;
 import com.goafanti.copyright.bo.InputCopyright;
 import com.goafanti.copyright.service.CopyrightInfoService;
 import com.goafanti.core.shiro.token.TokenManager;
+import com.goafanti.easemob.EasemobUtils;
+import com.goafanti.easemob.enums.EasemonSysUsers;
 import com.goafanti.user.service.UserService;
 
 @RestController
@@ -47,6 +50,9 @@ public class AdminCopyrightApiController extends CertifyApiController {
 	@Resource
 	private AdminService			adminService;
 
+	@Autowired
+	EasemobUtils					easemobUtils;
+
 	@RequestMapping(value = "/circulation", method = RequestMethod.POST)
 	public Result circulation(@RequestParam(name = "ids[]", required = false) String[] ids, @Valid InputCopyright ic,
 			BindingResult bindingResult, String recordTimeFormattedDate) {
@@ -56,7 +62,7 @@ public class AdminCopyrightApiController extends CertifyApiController {
 					CopyrightFields.getFieldDesc(bindingResult.getFieldError().getField())));
 			return res;
 		}
-		
+
 		if (ids == null || ids.length < 1) {
 			res.getError().add(buildError(ErrorConstants.PARAM_ERROR, "", ""));
 			return res;
@@ -162,6 +168,14 @@ public class AdminCopyrightApiController extends CertifyApiController {
 		cl.setOperator(TokenManager.getAdminId());
 		copyrightInfoService.updateByPrimaryKeySelective(ci, cl);
 		res.setData(1);
+		if (inputInfo.getStatus() != null && !inputInfo.getStatus().equals(oci.getStatus())
+				&& inputInfo.getStatus() <= CopyrightStatus.CALLBACK.getCode()
+				&& inputInfo.getStatus() >= CopyrightStatus.SUBMIT.getCode()) {
+			easemobUtils.sendMessage(EasemonSysUsers.ADMIN_DDDT.getUsername(),
+					userService.selectNumberByPrimaryKey(oci.getUid()), "您的软著申请订单:#%s%s,状态变更为%s", oci.getSerialNumber(),
+					oci.getCopyrightName() == null ? "" : oci.getCopyrightName(),
+					CopyrightStatus.getStatus(inputInfo.getStatus()).getDesc());
+		}
 		return res;
 	}
 
@@ -221,8 +235,9 @@ public class AdminCopyrightApiController extends CertifyApiController {
 	}
 
 	@RequestMapping(value = "/list", method = RequestMethod.GET)
-	public Result list(String contractId, Integer province, String unitName, String uid, String copyrightName, String status, String pageNo,
-			String pageSize, @RequestParam(name = "createTime[]", required = false) String[] createTime,
+	public Result list(String contractId, Integer province, String unitName, String uid, String copyrightName,
+			String status, String pageNo, String pageSize,
+			@RequestParam(name = "createTime[]", required = false) String[] createTime,
 			@RequestParam(name = "acceptTime[]", required = false) String[] acceptTime,
 			@RequestParam(name = "authTime[]", required = false) String[] authTime) {
 		Result res = new Result();
@@ -329,7 +344,7 @@ public class AdminCopyrightApiController extends CertifyApiController {
 		List<Admin> list = adminService.selectCopyrightPrincipal();
 		Map<String, String> map = new TreeMap<String, String>();
 		for (Admin o : list) {
-			map.put(o.getId(), o.getName()+ " " + (null == o.getPosition() ? "" : o.getPosition()));
+			map.put(o.getId(), o.getName() + " " + (null == o.getPosition() ? "" : o.getPosition()));
 		}
 		res.setData(map);
 		return res;

+ 14 - 0
src/main/java/com/goafanti/admin/controller/AdminPatentApiController.java

@@ -23,6 +23,7 @@ import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -67,6 +68,8 @@ import com.goafanti.common.utils.StringUtils;
 import com.goafanti.core.mybatis.page.Pagination;
 import com.goafanti.core.shiro.token.TokenManager;
 import com.goafanti.dataGlossory.service.DistrictGlossoryService;
+import com.goafanti.easemob.EasemobUtils;
+import com.goafanti.easemob.enums.EasemonSysUsers;
 import com.goafanti.patent.bo.InputPatentCost;
 import com.goafanti.patent.bo.InputPatentInfo;
 import com.goafanti.patent.bo.InputPatentRegistration;
@@ -111,6 +114,9 @@ public class AdminPatentApiController extends CertifyApiController {
 	@Value(value = "${aesSecretKey}")
 	private String							secretKey	= null;
 
+	@Autowired
+	EasemobUtils							easemobUtils;
+
 	/**
 	 * 专利批量流转
 	 * 
@@ -301,6 +307,14 @@ public class AdminPatentApiController extends CertifyApiController {
 		BeanUtils.copyProperties(patentInfo, pi);
 		BeanUtils.copyProperties(patentInfo, pl);
 		patentInfoService.updatePatentInfo(pi, pl, recordTime);
+		if (patentInfo.getState() != null && !patentInfo.getState().equals(p.getPatentState())
+				&& patentInfo.getState() <= PatentInfoStatus.CALLBACK.getCode()
+				&& patentInfo.getState() >= PatentInfoStatus.COMPOSE.getCode()) {
+			easemobUtils.sendMessage(EasemonSysUsers.ADMIN_DDDT.getUsername(),
+					userService.selectNumberByPrimaryKey(p.getUid()), "您的专利申请订单:#%s%s,状态变更为%s", p.getSerialNumber(),
+					p.getPatentName() == null ? "" : p.getPatentName(),
+					PatentInfoStatus.getStatus(patentInfo.getState()).getDesc());
+		}
 		return res;
 	}
 

+ 59 - 0
src/main/java/com/goafanti/admin/controller/AdminSystemController.java

@@ -0,0 +1,59 @@
+package com.goafanti.admin.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import com.alibaba.fastjson.JSONObject;
+import com.goafanti.common.bo.Result;
+import com.goafanti.common.constant.AFTConstants;
+import com.goafanti.common.controller.BaseApiController;
+import com.goafanti.core.shiro.token.TokenManager;
+import com.goafanti.easemob.EasemobUtils;
+import com.goafanti.easemob.bo.EasemobInfo;
+import com.goafanti.easemob.enums.EasemonSysUsers;
+
+@Controller
+@RequestMapping(value = "/api/admin")
+public class AdminSystemController extends BaseApiController {
+
+	@Autowired
+	EasemobUtils easemobUtils;
+
+	/**
+	 * 初始化系统消息用户
+	 */
+	@RequestMapping(value = "/sys/initEasemob", method = RequestMethod.GET)
+	public Result initEasemob() {
+		if (isSuperAdmin()) {
+			for (EasemonSysUsers esu : EasemonSysUsers.values()) {
+				JSONObject jo = new JSONObject();
+				jo.put("username", esu.getUsername());
+				jo.put("nickname", esu.getNickname());
+				jo.put("password", System.currentTimeMillis());
+				easemobUtils.sendLater(new EasemobInfo().uri("/users").data(jo.toJSONString()).method(HttpMethod.POST));
+			}
+			return res().data(true);
+		}
+		return res().data(false);
+	}
+
+	/**
+	 * 测试发送消息
+	 */
+	@RequestMapping(value = "/sys/sendMsg", method = RequestMethod.GET)
+	public Result sendMsg(String from, String to, String msg) {
+		if (isSuperAdmin()) {
+			easemobUtils.sendMessage(from, to, new ModelMap("nickname", EasemonSysUsers.getNickname(from)), msg, true);
+			return res().data(true);
+		}
+		return res().data(false);
+	}
+
+	private boolean isSuperAdmin() {
+		return TokenManager.hasRole(AFTConstants.SUPERADMIN);
+	}
+}

+ 18 - 3
src/main/java/com/goafanti/admin/controller/AdminTechProjectApiController.java

@@ -14,6 +14,7 @@ import javax.validation.Valid;
 
 import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.validation.BindingResult;
@@ -38,6 +39,8 @@ import com.goafanti.common.utils.AesUtils;
 import com.goafanti.common.utils.StringUtils;
 import com.goafanti.core.mybatis.page.Pagination;
 import com.goafanti.core.shiro.token.TokenManager;
+import com.goafanti.easemob.EasemobUtils;
+import com.goafanti.easemob.enums.EasemonSysUsers;
 import com.goafanti.techproject.bo.InputTechProject;
 import com.goafanti.techproject.bo.InputTechWebsite;
 import com.goafanti.techproject.bo.TechProjectManageListBo;
@@ -65,6 +68,9 @@ public class AdminTechProjectApiController extends CertifyApiController {
 	@Resource
 	private AdminService			adminService;
 
+	@Autowired
+	EasemobUtils					easemobUtils;
+
 	/**
 	 * 科技网址申报公司下拉
 	 * 
@@ -125,7 +131,8 @@ public class AdminTechProjectApiController extends CertifyApiController {
 	 */
 	@SuppressWarnings("unchecked")
 	@RequestMapping(value = "/listTechProject", method = RequestMethod.POST)
-	public Result listTechProject(String contractId, Integer province, String unitName, String uid, String pageNo, String pageSize) {
+	public Result listTechProject(String contractId, Integer province, String unitName, String uid, String pageNo,
+			String pageSize) {
 		Result res = new Result();
 		Integer pNo = 1;
 		Integer pSize = 10;
@@ -135,8 +142,8 @@ public class AdminTechProjectApiController extends CertifyApiController {
 		if (StringUtils.isNumeric(pageNo)) {
 			pNo = Integer.parseInt(pageNo);
 		}
-		Pagination<TechProjectManageListBo> t = techProjectService.listManageTechProject(contractId, province, unitName, uid, pNo,
-				pSize);
+		Pagination<TechProjectManageListBo> t = techProjectService.listManageTechProject(contractId, province, unitName,
+				uid, pNo, pSize);
 		if (null != t) {
 			List<TechProjectManageListBo> l = (List<TechProjectManageListBo>) t.getList();
 			for (TechProjectManageListBo w : l) {
@@ -274,6 +281,14 @@ public class AdminTechProjectApiController extends CertifyApiController {
 		BeanUtils.copyProperties(techProject, tp);
 		BeanUtils.copyProperties(techProject, tpl);
 		res.setData(techProjectService.updateTechProject(tp, tpl, recordTime));
+		if (techProject.getState() != null && !techProject.getState().equals(t.getState())
+				&& techProject.getState() <= TechProjectStatus.CALLBACK.getCode()
+				&& techProject.getState() >= TechProjectStatus.SUBMIT.getCode()) {
+			easemobUtils.sendMessage(EasemonSysUsers.ADMIN_DDDT.getUsername(),
+					userService.selectNumberByPrimaryKey(t.getUid()), "您的科技项目申报订单:#%s%s,状态变更为%s", t.getSerialNumber(),
+					t.getProjectName() == null ? "" : t.getProjectName(),
+					TechProjectStatus.getStatus(techProject.getState()).getDesc());
+		}
 		return res;
 	}
 

+ 6 - 0
src/main/java/com/goafanti/common/controller/WebpageController.java

@@ -219,6 +219,12 @@ public class WebpageController extends BaseController {
 		return modelview;
 	}
 
+	@RequestMapping(value = "/portal/membership", method = RequestMethod.GET)
+	public ModelAndView membership(HttpServletRequest request, ModelAndView modelview) {
+		modelview.setViewName("/portal/membership");
+		return modelview;
+	}
+
 	@RequestMapping(value = "/portal/search/demand", method = RequestMethod.GET)
 	public ModelAndView portalSearchDemand(HttpServletRequest request, ModelAndView modelview) {
 		modelview.setViewName("/portal/search/demand");

+ 18 - 0
src/main/java/com/goafanti/common/dao/MemberGradeMapper.java

@@ -0,0 +1,18 @@
+package com.goafanti.common.dao;
+
+import java.util.List;
+
+import com.goafanti.memberGrade.bo.MemberGrade;
+
+public interface MemberGradeMapper {
+	List<MemberGrade> selectMemberGrade();
+	
+	int delGrade(int id); 
+	
+	int selectRank(MemberGrade me);
+	int addGradeName(MemberGrade me);
+	
+	int addBusinessAndCost(MemberGrade me);
+	
+	
+}

+ 2 - 0
src/main/java/com/goafanti/common/dao/UserMapper.java

@@ -37,4 +37,6 @@ public interface UserMapper {
 	UserPartnerDetailBo findUserPartnerDetail(@Param("uid") String uid, @Param("tokenId") String tokenId);
 
 	OrgPartnerDetailBo findOrgPartnerDetail(@Param("uid") String uid, @Param("tokenId") String tokenId);
+
+	Long selectNumberByPrimaryKey(String userId);
 }

+ 2 - 2
src/main/java/com/goafanti/common/enums/CopyrightStatus.java

@@ -7,9 +7,9 @@ import org.apache.commons.lang3.StringUtils;
 
 public enum CopyrightStatus {
 	CREATE(0, "创建"),
-	SIGN(1,"签单"),
+	SIGN(1, "签单"),
 	DELIVERD(2, "派单"),
-	CIRCULATION(3,"流转"),
+	CIRCULATION(3, "流转"),
 	SUBMIT(4, "材料提交"),
 	ACCEPT(5, "受理"),
 	AMEND(6, "补正"),

+ 4 - 0
src/main/java/com/goafanti/common/enums/UserType.java

@@ -21,6 +21,10 @@ public enum UserType {
 		}
 	}
 
+	public static boolean isPersonal(Integer code) {
+		return PERSONAL == getStatus(code);
+	}
+
 	public static UserType getStatus(Integer code) {
 		if (containsType(code)) {
 			return status.get(code);

+ 40 - 0
src/main/java/com/goafanti/common/mapper/MemberGradeMapper.xml

@@ -0,0 +1,40 @@
+<?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.goafanti.common.dao.MemberGradeMapper">
+ 
+  	<!-- 查询所有 -->
+	<select id="selectMemberGrade" resultType="com.goafanti.memberGrade.bo.MemberGrade">
+		SELECT * FROM member_grade;
+	</select>
+	 
+	<!-- 删除会员等级 -->
+	<delete id="delGrade" parameterType="int">
+		DELETE FROM member_grade WHERE id=#{id}
+	</delete>
+  
+  	
+  	<!-- 新增会员等级是否存在 -->
+  	<select id="selectRank" parameterType="com.goafanti.memberGrade.bo.MemberGrade" resultType="int">
+  		SELECT COUNT(*) FROM member_grade WHERE memberRank=#{memberRank}
+  	</select>
+  	
+  
+  	<!-- 新增会员等级 -->
+	<insert id="addGradeName" parameterType="com.goafanti.memberGrade.bo.MemberGrade" useGeneratedKeys="true" keyProperty="id">
+		INSERT INTO member_grade(gradeName,memberRank) VALUES (#{gradeName},#{memberRank})
+	</insert> 
+  
+  
+  	<!-- 为等级添加业务和费用 -->
+    <update id="addBusinessAndCost" parameterType="com.goafanti.memberGrade.bo.MemberGrade">
+    	UPDATE member_grade SET business=#{business},cost=#{cost} WHERE id=#{id}
+    </update>
+  
+  
+  
+  
+  
+  
+  
+
+</mapper>

+ 6 - 0
src/main/java/com/goafanti/common/mapper/UserMapper.xml

@@ -926,4 +926,10 @@
   		and uc.work_unit like CONCAT('%',#{workUnit,jdbcType=VARCHAR},'%')
   	</if>
   </select>
+  
+  <select id="selectNumberByPrimaryKey" parameterType="String" resultType="java.lang.Long">
+  	select number
+  	from user
+  	where id = #{id,jdbcType=VARCHAR}
+  </select>
 </mapper>

+ 12 - 1
src/main/java/com/goafanti/common/utils/LoggerUtils.java

@@ -53,7 +53,7 @@ public class LoggerUtils {
 			logger.debug(fmtString);
 		}
 	}
-	
+
 	/**
 	 * 
 	 * @param logger
@@ -66,6 +66,17 @@ public class LoggerUtils {
 	}
 
 	/**
+	 * 
+	 * @param logger
+	 * @param message
+	 */
+	public static void debug(Logger logger, Object message) {
+		if (isDebug) {
+			logger.debug(message.toString());
+		}
+	}
+
+	/**
 	 * Error 输出
 	 * 
 	 * @param clazz

+ 1 - 0
src/main/java/com/goafanti/core/cache/serializer/FastJsonRedisSerializer.java

@@ -23,6 +23,7 @@ public class FastJsonRedisSerializer implements RedisSerializer<Object> {
 		pc.addAccept("com.goafanti.news.bo.NewsPortalList");
 		pc.addAccept("com.goafanti.common.model.Activity");
 		pc.addAccept("com.goafanti.portal.bo.InternationalListBo");
+		pc.addAccept("com.goafanti.easemob.bo.EasemobInfo");
 	}
 
 	@Override

+ 211 - 0
src/main/java/com/goafanti/easemob/EasemobUtils.java

@@ -0,0 +1,211 @@
+package com.goafanti.easemob;
+
+import java.io.IOException;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.concurrent.FutureCallback;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
+import org.apache.http.impl.nio.client.HttpAsyncClients;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpMethod;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.goafanti.common.utils.LoggerUtils;
+import com.goafanti.easemob.bo.EasemobInfo;
+import com.goafanti.easemob.queue.EasemobRedisQueue;
+
+public class EasemobUtils implements InitializingBean, DisposableBean {
+	private static final String				UTF_8		= "UTF-8";
+	private static final Logger				logger		= LoggerFactory.getLogger(EasemobUtils.class);
+	private static final Optional<Integer>	UN_AUTH		= Optional.of(401);
+	private static final Optional<Integer>	REACH_LIMIT	= Optional.of(429);
+
+	@Value(value = "${easemob.client.url}")
+	private String							clientUrl;
+	@Value(value = "${easemob.client.id}")
+	private String							clientId;
+	@Value(value = "${easemob.client.secret}")
+	private String							clientSecret;
+
+	private String							token;
+
+	@Autowired
+	private EasemobRedisQueue				jedisQueue;
+
+	private void auth() {
+		JSONObject jo = new JSONObject();
+		jo.put("grant_type", "client_credentials");
+		jo.put("client_id", clientId);
+		jo.put("client_secret", clientSecret);
+		JSONObject res = send(
+				new EasemobInfo().uri("/token").data(jo.toJSONString()).method(HttpMethod.POST).withAuth(false));
+		if (res != null) {
+			token = res.getString("access_token");
+		}
+	}
+
+	private HttpUriRequest buildRequest(EasemobInfo info) {
+		HttpUriRequest req = null;
+		switch (info.getMethod()) {
+		case POST:
+			req = new HttpPost(clientUrl + info.getUri());
+			((HttpPost) req).setEntity(new StringEntity(info.getData(), UTF_8));
+			break;
+		default:
+			req = new HttpGet(clientUrl + info.getUri());
+			break;
+		}
+		if (info.isWithAuth()) {
+			req.addHeader("Authorization", "Bearer " + token);
+		}
+		((HttpRequestBase) req).setConfig(RequestConfig.custom().setConnectTimeout(10000)
+				.setConnectionRequestTimeout(10000).setSocketTimeout(10000).build());
+		req.addHeader("Content-Type", "application/json");
+		return req;
+	}
+
+	public JSONObject send(EasemobInfo info) {
+		HttpUriRequest req = buildRequest(info);
+		CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
+		httpclient.start();
+		LoggerUtils.debug(logger, "SEND: [%s] - [%s]", info.getMethod(), info.getUri());
+		Future<HttpResponse> future = httpclient.execute(req, null);
+		try {
+			HttpResponse response = future.get();
+			Optional<Integer> rescode = getResCode(response);
+			if (info.isWithAuth() && isUnauth(rescode)) {
+				auth();
+			} else if (isReachLimit(rescode)) {
+				LoggerUtils.debug(logger, "Reach Easemob API limitation!");
+			} else {
+				HttpEntity entity = response.getEntity();
+				if (entity != null) {
+					try {
+						String resStr = EntityUtils.toString(entity, UTF_8);
+						return (JSONObject) JSON.parse(resStr);
+					} catch (Exception e) {
+						LoggerUtils.debug(logger, e.getMessage(), e);
+					}
+				}
+			}
+			LoggerUtils.debug(logger, response);
+		} catch (InterruptedException | ExecutionException e) {
+			LoggerUtils.debug(logger, e.getMessage(), e);
+		} finally {
+			try {
+				httpclient.close();
+			} catch (IOException e) {
+			}
+		}
+		return info.getTryCount() > 1 ? null : send(info.tryCount(info.getTryCount() + 1));
+	}
+
+	public void sendLater(EasemobInfo info) {
+		jedisQueue.pushFromTail(info);
+	}
+
+	public void sendAsync(EasemobInfo info) {
+		HttpUriRequest req = buildRequest(info);
+		CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
+		httpclient.start();
+		LoggerUtils.debug(logger, "SEND: [%s] - [%s]", info.getMethod(), info.getUri());
+		httpclient.execute(req, new FutureCallback<HttpResponse>() {
+			@Override
+			public void failed(Exception ex) {
+				sendLater(info.tryCount(info.getTryCount() + 1));
+				close();
+			}
+
+			@Override
+			public void completed(HttpResponse result) {
+				Optional<Integer> rescode = getResCode(result);
+				if (info.isWithAuth() && isUnauth(rescode)) {
+					auth();
+				} else if (isReachLimit(rescode)) {
+					LoggerUtils.debug(logger, "Reach Easemob API limitation!");
+					sendLater(info.tryCount(info.getTryCount() + 1));
+				}
+				LoggerUtils.debug(logger, result);
+				close();
+			}
+
+			@Override
+			public void cancelled() {
+				close();
+				LoggerUtils.debug(logger, "CANCELLED: [%s] - [%s]", req.getMethod(), req.getURI());
+			}
+
+			private void close() {
+				try {
+					httpclient.close();
+				} catch (IOException e) {
+				}
+			}
+		});
+	}
+
+	public void sendMessage(String from, String to, String msg, Object... value) {
+		sendAsync(new EasemobInfo().uri("/messages").data(buildMessage(from, to, null, String.format(msg, value)))
+				.method(HttpMethod.POST));
+	}
+
+	public void sendMessage(String from, String to, Object ext, String msg, Object... value) {
+		sendAsync(new EasemobInfo().uri("/messages").data(buildMessage(from, to, ext, String.format(msg, value)))
+				.method(HttpMethod.POST));
+	}
+
+	private String buildMessage(String from, String to, Object ext, String msg) {
+		JSONObject message = new JSONObject();
+		message.put("type", "txt");
+		message.put("msg", msg);
+		JSONObject jo = new JSONObject();
+		jo.put("target_type", "users");
+		jo.put("target", new String[] { to });
+		jo.put("msg", message);
+		jo.put("from", from);
+		if (ext != null) {
+			jo.put("ext", ext);
+		}
+		return jo.toJSONString();
+	}
+
+	private Optional<Integer> getResCode(HttpResponse response) {
+		return Optional.ofNullable(response).map(res -> res.getStatusLine()).map(sl -> sl.getStatusCode());
+	}
+
+	private boolean isUnauth(Optional<Integer> responseStatus) {
+		return UN_AUTH.equals(responseStatus);
+	}
+
+	private boolean isReachLimit(Optional<Integer> responseStatus) {
+		return REACH_LIMIT.equals(responseStatus);
+	}
+
+	@Override
+	public void destroy() throws Exception {
+		LoggerUtils.debug(logger, "消息系统关闭");
+	}
+
+	@Override
+	public void afterPropertiesSet() throws Exception {
+		auth();
+	}
+
+}

+ 81 - 0
src/main/java/com/goafanti/easemob/bo/EasemobInfo.java

@@ -0,0 +1,81 @@
+package com.goafanti.easemob.bo;
+
+import org.springframework.http.HttpMethod;
+
+public class EasemobInfo {
+	private String		uri;
+
+	private String		data;
+
+	private HttpMethod	method;
+
+	private int			tryCount	= 0;
+
+	private boolean		withAuth	= true;
+
+	public String getUri() {
+		return uri;
+	}
+
+	public void setUri(String uri) {
+		this.uri = uri;
+	}
+
+	public String getData() {
+		return data;
+	}
+
+	public void setData(String data) {
+		this.data = data;
+	}
+
+	public int getTryCount() {
+		return tryCount;
+	}
+
+	public void setTryCount(int tryCount) {
+		this.tryCount = tryCount;
+	}
+
+	public HttpMethod getMethod() {
+		return method;
+	}
+
+	public void setMethod(HttpMethod method) {
+		this.method = method;
+	}
+
+	public boolean isWithAuth() {
+		return withAuth;
+	}
+
+	public void setWithAuth(boolean withAuth) {
+		this.withAuth = withAuth;
+	}
+
+	public EasemobInfo uri(String uri) {
+		this.uri = uri;
+		return this;
+	}
+
+	public EasemobInfo method(HttpMethod method) {
+		this.method = method;
+		return this;
+	}
+
+	public EasemobInfo tryCount(int tryCount) {
+		this.tryCount = tryCount;
+		return this;
+	}
+
+	public EasemobInfo data(String data) {
+		this.data = data;
+		return this;
+	}
+
+	public EasemobInfo withAuth(boolean withAuth) {
+		this.withAuth = withAuth;
+		return this;
+	}
+
+}

+ 52 - 0
src/main/java/com/goafanti/easemob/enums/EasemonSysUsers.java

@@ -0,0 +1,52 @@
+package com.goafanti.easemob.enums;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum EasemonSysUsers {
+	ADMIN_DDDT("ADMIN_DDDT", "订单动态"),
+	ADMIN_XQDT("ADMIN_XQDT", "需求动态"),
+	ADMIN_CGDT("ADMIN_CGDT", "成果动态"),
+	ADMIN_XTXX("ADMIN_XTXX", "系统消息");
+
+	private EasemonSysUsers(String username, String nickname) {
+		this.username = username;
+		this.nickname = nickname;
+	}
+
+	private String	username;
+
+	private String	nickname;
+
+	public String getUsername() {
+		return username;
+	}
+
+	public String getNickname() {
+		return nickname;
+	}
+
+	private static Map<String, EasemonSysUsers> users = new HashMap<String, EasemonSysUsers>();
+
+	static {
+		for (EasemonSysUsers value : EasemonSysUsers.values()) {
+			users.put(value.getUsername(), value);
+		}
+	}
+
+	public static EasemonSysUsers getField(String code) {
+		if (containsType(code)) {
+			return users.get(code);
+		}
+		return ADMIN_XTXX;
+	}
+
+	public static String getNickname(String code) {
+		return getField(code).getNickname();
+	}
+
+	public static boolean containsType(String code) {
+		return users.containsKey(code);
+	}
+
+}

+ 151 - 0
src/main/java/com/goafanti/easemob/queue/EasemobRedisQueue.java

@@ -0,0 +1,151 @@
+package com.goafanti.easemob.queue;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.data.redis.connection.RedisConnection;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.BoundListOperations;
+import org.springframework.data.redis.core.RedisConnectionUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+
+import com.goafanti.easemob.bo.EasemobInfo;
+
+public class EasemobRedisQueue implements InitializingBean, DisposableBean {
+	private RedisTemplate<String, Object>		redisTemplate;
+	private String								key;
+	private RedisConnectionFactory				factory;
+	private RedisConnection						connection;
+	private BoundListOperations<String, Object>	listOperations;
+
+	private Lock								lock	= new ReentrantLock();
+
+	private RedisQueueListener<EasemobInfo>	listener;
+	private Thread								listenerThread;
+
+	private boolean								isClosed;
+
+	public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
+		this.redisTemplate = redisTemplate;
+	}
+
+	public void setListener(RedisQueueListener<EasemobInfo> listener) {
+		this.listener = listener;
+	}
+
+	public void setKey(String key) {
+		this.key = key;
+	}
+
+	@Override
+	public void afterPropertiesSet() throws Exception {
+		factory = redisTemplate.getConnectionFactory();
+		connection = RedisConnectionUtils.getConnection(factory);
+
+		listOperations = redisTemplate.boundListOps(key);
+		if (listener != null) {
+			listenerThread = new ListenerThread();
+			listenerThread.setDaemon(true);
+			listenerThread.start();
+		}
+	}
+
+	/**
+	 * blocking remove and get last item from queue:BRPOP
+	 * 
+	 * @return
+	 */
+	public Object takeFromTail(int timeout) throws InterruptedException {
+		lock.lockInterruptibly();
+		try {
+			return listOperations.rightPop(timeout, TimeUnit.SECONDS);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public Object takeFromTail() throws InterruptedException {
+		return takeFromTail(0);
+	}
+
+	/**
+	 * 从队列的头,插入
+	 */
+	public void pushFromHead(Object value) {
+		listOperations.leftPush(value);
+	}
+
+	public void pushFromTail(Object value) {
+		listOperations.rightPush(value);
+	}
+
+	/**
+	 * noblocking
+	 * 
+	 * @return null if no item in queue
+	 */
+	public Object removeFromHead() {
+		return listOperations.leftPop();
+	}
+
+	public Object removeFromTail() {
+		return listOperations.rightPop();
+	}
+
+	/**
+	 * blocking remove and get first item from queue:BLPOP
+	 * 
+	 * @return
+	 */
+	public Object takeFromHead(int timeout) throws InterruptedException {
+		lock.lockInterruptibly();
+		try {
+			return listOperations.leftPop(timeout, TimeUnit.SECONDS);
+		} finally {
+			lock.unlock();
+		}
+	}
+
+	public Object takeFromHead() throws InterruptedException {
+		return takeFromHead(0);
+	}
+
+	@Override
+	public void destroy() throws Exception {
+		if (isClosed) {
+			return;
+		}
+		shutdown();
+		RedisConnectionUtils.releaseConnection(connection, factory);
+	}
+
+	private void shutdown() {
+		try {
+			listenerThread.interrupt();
+		} catch (Exception e) {
+		}
+	}
+
+	private class ListenerThread extends Thread {
+		@Override
+		public void run() {
+			try {
+				while (true) {
+					Object value = takeFromHead();
+					// 逐个执行
+					if (value != null) {
+						try {
+							listener.onMessage((EasemobInfo) value);
+						} catch (Exception e) {
+						}
+					}
+				}
+			} catch (InterruptedException e) {
+			}
+		}
+	}
+
+}

+ 19 - 0
src/main/java/com/goafanti/easemob/queue/EasemobRedisQueueListener.java

@@ -0,0 +1,19 @@
+package com.goafanti.easemob.queue;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.goafanti.easemob.EasemobUtils;
+import com.goafanti.easemob.bo.EasemobInfo;
+
+public class EasemobRedisQueueListener implements RedisQueueListener<EasemobInfo> {
+	@Autowired
+	EasemobUtils easemobUtils;
+
+	@Override
+	public void onMessage(EasemobInfo value) {
+		if (value.getTryCount() < 3) {
+			easemobUtils.sendAsync(value);
+		}
+	}
+
+}

+ 5 - 0
src/main/java/com/goafanti/easemob/queue/RedisQueueListener.java

@@ -0,0 +1,5 @@
+package com.goafanti.easemob.queue;
+
+public interface RedisQueueListener<T> {
+	public void onMessage(T value);
+}

+ 43 - 0
src/main/java/com/goafanti/memberGrade/bo/BusinessType.java

@@ -0,0 +1,43 @@
+package com.goafanti.memberGrade.bo;
+
+/**
+ * 增值服务枚举
+ * 
+ * @author Administrator
+ *
+ */
+public enum BusinessType {
+	TUI_SONG("1001", "科技成果,专家信息定点推送"), 
+	CHA_KAN_LIAN_XI("1002", "查看专家的联系方式"),
+	YE_WU_SHEN_QIN("1003",	"任何业务申请,付费业享受会员专属折扣"), 
+	JIN_JI_FU_WU("1004", "一对一的技术经纪人服务,进行技术成果媒合服务"),
+	KE_JI_ZHI_XUN("1005","一对一的科技咨询师服务"), 
+	ZHUAN_YU_GU_WEN("1006", "一对一的专业技术顾问,搜集技术情报,提供研发高参"),
+	XIAN_CHANG_PEI_XUN("1007","免费参加现场业务培训会"), 
+	KE_JI_WU_CHI("1008", "免前期费用做科技类扶持资金项目申报");
+
+	private String	key;
+	private String	desc;
+
+	private BusinessType(String key, String desc) {
+		this.key = key;
+		this.desc = desc;
+	}
+
+	public String getKey() {
+		return key;
+	}
+
+	public void setKey(String key) {
+		this.key = key;
+	}
+
+	public String getDesc() {
+		return desc;
+	}
+
+	public void setDesc(String desc) {
+		this.desc = desc;
+	}
+
+}

+ 59 - 0
src/main/java/com/goafanti/memberGrade/bo/MemberGrade.java

@@ -0,0 +1,59 @@
+package com.goafanti.memberGrade.bo;
+
+/**
+ * 会员等级
+ * @author Administrator
+ *
+ */
+public class MemberGrade {
+	private int id;
+	private String gradeName;
+	private String business;
+	private String cost;
+	private int memberRank;
+	
+	public MemberGrade() {
+	}
+	
+	public MemberGrade(int id, String gradeName, String business, String cost, int memberRank) {
+		this.id = id;
+		this.gradeName = gradeName;
+		this.business = business;
+		this.cost = cost;
+		this.memberRank = memberRank;
+	}
+	
+	public int getId() {
+		return id;
+	}
+	public void setId(int id) {
+		this.id = id;
+	}
+	public String getGradeName() {
+		return gradeName;
+	}
+	public void setGradeName(String gradeName) {
+		this.gradeName = gradeName;
+	}
+	public String getBusiness() {
+		return business;
+	}
+	public void setBusiness(String business) {
+		this.business = business;
+	}
+	public String getCost() {
+		return cost;
+	}
+	public void setCost(String cost) {
+		this.cost = cost;
+	}
+	public int getMemberRank() {
+		return memberRank;
+	}
+	public void setMemberRank(int memberRank) {
+		this.memberRank = memberRank;
+	}
+	
+	
+	
+}

+ 68 - 0
src/main/java/com/goafanti/memberGrade/bo/MemberGradeBO.java

@@ -0,0 +1,68 @@
+package com.goafanti.memberGrade.bo;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class MemberGradeBO {
+
+	/**
+	 * 会员等级json格式 
+	 * 
+	 * @author Administrator
+	 *
+	 */
+	private int id;
+	private String gradeName;
+	private JSONObject business;
+	private JSONObject cost;
+	private int memberRank;
+	
+	
+	public MemberGradeBO() {
+	}
+	
+	public MemberGradeBO(int id, String gradeName, JSONObject business, JSONObject cost, int memberRank) {
+		super();
+		this.id = id;
+		this.gradeName = gradeName;
+		this.business = business;
+		this.cost = cost;
+		this.memberRank = memberRank;
+	}
+	
+	public int getId() {
+		return id;
+	}
+	public void setId(int id) {
+		this.id = id;
+	}
+	public String getGradeName() {
+		return gradeName;
+	}
+	public void setGradeName(String gradeName) {
+		this.gradeName = gradeName;
+	}
+	public JSONObject getBusiness() {
+		return business;
+	}
+	public void setBusiness(JSONObject business) {
+		this.business = business;
+	}
+	public JSONObject getCost() {
+		return cost;
+	}
+	public void setCost(JSONObject cost) {
+		this.cost = cost;
+	}
+	public int getMemberRank() {
+		return memberRank;
+	}
+	public void setMemberRank(int memberRank) {
+		this.memberRank = memberRank;
+	}
+	
+	
+	
+	
+	
+
+}

+ 77 - 0
src/main/java/com/goafanti/memberGrade/controller/MemberGradeController.java

@@ -0,0 +1,77 @@
+package com.goafanti.memberGrade.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSON;
+import com.goafanti.common.bo.Result;
+import com.goafanti.common.controller.BaseApiController;
+import com.goafanti.memberGrade.bo.MemberGrade;
+import com.goafanti.memberGrade.bo.MemberGradeBO;
+import com.goafanti.memberGrade.service.MemberGradeService;
+
+@RestController
+@RequestMapping(value = "/api/admin/member")
+public class MemberGradeController extends BaseApiController {
+	@Autowired
+	private MemberGradeService memberGradeService;
+
+	/**
+	 * 查询全部信息
+	 * 
+	 * @return
+	 */
+	@RequestMapping(value = "/selectMemberGrade", method = RequestMethod.GET)
+	public Result selectMemberGrade() {
+		List<MemberGrade> list = memberGradeService.selectMemberGrade();
+		List<MemberGradeBO> result = new ArrayList<>();
+		for (MemberGrade mg : list) {
+			result.add(new MemberGradeBO(mg.getId(), mg.getGradeName(), JSON.parseObject(mg.getBusiness()),
+					JSON.parseObject(mg.getCost()), mg.getMemberRank()));
+		}
+		return res().data(result);
+	}
+
+	/**
+	 * 删除会员等级
+	 * 
+	 * @param id
+	 * @return
+	 */
+	@RequestMapping(value = "/delGrade", method = RequestMethod.GET)
+	public Result delGrade(int id) {
+		return res().data(memberGradeService.delGrade(id));
+	}
+	
+	/**
+	 * 新增会员等级名称
+	 * @param name
+	 * @return
+	 */
+	@RequestMapping(value = "/addGradeName",method = RequestMethod.GET)
+	public Result addGradeName(MemberGrade me){
+		if(memberGradeService.selectRank(me)>=1){
+			return res().data(0);
+		}
+			memberGradeService.addGradeName(me);
+			return res().data(me.getId());
+	}
+	
+	/**
+	 * 增加业务及费用  与更改
+	 * @param me
+	 * @return
+	 */
+	@RequestMapping(value="/addBusinessAndCost",method=RequestMethod.GET)
+	public Result addBusinessAndCost(MemberGrade me){
+		return res().data(memberGradeService.addBusinessAndCost(me));
+	}
+	
+	
+
+}

+ 45 - 0
src/main/java/com/goafanti/memberGrade/service/MemberGradeService.java

@@ -0,0 +1,45 @@
+package com.goafanti.memberGrade.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.goafanti.common.dao.MemberGradeMapper;
+import com.goafanti.memberGrade.bo.MemberGrade;
+
+@Service
+public class MemberGradeService {
+	@Autowired
+	private MemberGradeMapper memberGradeMapper;
+	
+	
+	public List<MemberGrade> selectMemberGrade() {
+		return memberGradeMapper.selectMemberGrade();
+	}
+	
+	public int delGrade(int id) {
+		return memberGradeMapper.delGrade(id);
+	} 
+	
+	
+	
+	public int selectRank(MemberGrade me){
+		return memberGradeMapper.selectRank(me);
+	}
+	
+	
+	public int addGradeName(MemberGrade me) {
+		return memberGradeMapper.addGradeName(me);
+	}
+	
+	
+	public int addBusinessAndCost(MemberGrade me){
+		return memberGradeMapper.addBusinessAndCost(me);
+	}
+	
+	
+	
+	
+	
+}

+ 32 - 3
src/main/java/com/goafanti/user/controller/UserApiController.java

@@ -10,7 +10,10 @@ import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.crypto.hash.SimpleHash;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -18,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import com.alibaba.fastjson.JSONObject;
 import com.goafanti.cognizance.bo.InputOrgHumanResource;
 import com.goafanti.cognizance.service.OrgRatepayService;
 import com.goafanti.common.bo.Result;
@@ -53,6 +57,8 @@ import com.goafanti.common.utils.PasswordUtil;
 import com.goafanti.common.utils.TimeUtils;
 import com.goafanti.common.utils.VerifyCodeUtils;
 import com.goafanti.core.shiro.token.TokenManager;
+import com.goafanti.easemob.EasemobUtils;
+import com.goafanti.easemob.bo.EasemobInfo;
 import com.goafanti.techproject.service.TechWebsiteService;
 import com.goafanti.user.bo.InputOrgPro;
 import com.goafanti.user.bo.InputOrganizationTech;
@@ -109,6 +115,9 @@ public class UserApiController extends BaseApiController {
 	@Resource
 	private OrgRatepayService				orgRatepayService;
 
+	@Autowired
+	private EasemobUtils					easemobUtils;
+
 	private static final Integer			STEP_ONE			= 1;
 
 	// private static final Integer STEP_TWO = 2;
@@ -425,9 +434,8 @@ public class UserApiController extends BaseApiController {
 					OrgProFields.getFieldDesc(bindingResult.getFieldError().getField())));
 			return res;
 		}
-		
-		
-		if (StringUtils.isBlank(pro.getCompanyName())){
+
+		if (StringUtils.isBlank(pro.getCompanyName())) {
 			res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR, "找不到单位名称", "单位名称"));
 			return res;
 		}
@@ -877,4 +885,25 @@ public class UserApiController extends BaseApiController {
 		return res;
 	}
 
+	/**
+	 * 获取环信登录账号,如果未注册则先注册
+	 */
+	@RequestMapping(value = "/easemob", method = RequestMethod.GET)
+	public Result getEasemob() {
+		User u = TokenManager.getUserToken();
+		if (u != null) {
+			JSONObject res = easemobUtils.send(new EasemobInfo().uri("/users/" + u.getNumber()).method(HttpMethod.GET));
+			JSONObject resultObj = new JSONObject();
+			resultObj.put("password", new SimpleHash("md5", u.getId(), null, 1).toHex());
+			resultObj.put("username", String.valueOf(u.getNumber()));
+			resultObj.put("nickname", StringUtils.isBlank(u.getNickname()) ? "技淘用户" + u.getNumber() : u.getNickname());
+			if (res == null || StringUtils.equals("service_resource_not_found", (CharSequence) res.get("error"))) {
+				easemobUtils.sendLater(
+						new EasemobInfo().uri("/users/").data(resultObj.toJSONString()).method(HttpMethod.POST));
+			}
+			return res().data(resultObj);
+		} else {
+			return res().error(buildError("user only", "必须是登录会员才能访问。"));
+		}
+	}
 }

+ 9 - 6
src/main/java/com/goafanti/user/service/UserService.java

@@ -20,6 +20,8 @@ public interface UserService {
 
 	User selectByPrimaryKey(String userId);
 
+	String selectNumberByPrimaryKey(String userId);
+
 	int updateByPrimaryKeySelective(User u);
 
 	int updateByPrimaryKey(User u);
@@ -40,8 +42,9 @@ public interface UserService {
 	Pagination<OrgListBo> listOrg(String uid, String mobile, String email, String[] createTime, Integer number,
 			String unitName, Integer auditStatus, Integer pNo, Integer pSize) throws ParseException;
 
-	Pagination<OrgListBo> selectUserByAid(Integer number, String mobile, Integer auditStatus, String auditName, String email,
-			String adminId, String startCreateTime, String endCreateTime, Integer type, Integer pNo, Integer pSize);
+	Pagination<OrgListBo> selectUserByAid(Integer number, String mobile, Integer auditStatus, String auditName,
+			String email, String adminId, String startCreateTime, String endCreateTime, Integer type, Integer pNo,
+			Integer pSize);
 
 	List<OrgUnitNames> selectDemandUnitNames();
 
@@ -59,10 +62,10 @@ public interface UserService {
 
 	Object findOrgPartnerDetail(String uid);
 
-	Pagination<StarListBo> listStar(Integer number, String engagedField, String username, String professionalTitle, String workUnit,
-			Integer pNo, Integer pSize);
-
-	Pagination<StarAndExpertListBo> listStarAndExpert(Integer number, String engagedField, String username, String professionalTitle,
+	Pagination<StarListBo> listStar(Integer number, String engagedField, String username, String professionalTitle,
 			String workUnit, Integer pNo, Integer pSize);
 
+	Pagination<StarAndExpertListBo> listStarAndExpert(Integer number, String engagedField, String username,
+			String professionalTitle, String workUnit, Integer pNo, Integer pSize);
+
 }

+ 7 - 0
src/main/java/com/goafanti/user/service/impl/UserServiceImpl.java

@@ -9,6 +9,7 @@ import java.util.UUID;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
 import com.goafanti.common.constant.AFTConstants;
@@ -504,4 +505,10 @@ public class UserServiceImpl extends BaseMybatisDao<UserMapper> implements UserS
 				params, pNo, pSize);
 	}
 
+	@Override
+	@Cacheable(value = "UserNumberCache", key = "'UserNumberCache:UID:'+#userId")
+	public String selectNumberByPrimaryKey(String userId) {
+		return String.valueOf(userMapper.selectNumberByPrimaryKey(userId));
+	}
+
 }

+ 5 - 1
src/main/resources/props/config_dev.properties

@@ -71,4 +71,8 @@ portal.host=//afts.hnzhiming.com/portal/1.0.11
 
 patentTemplate=SMS_72005286
 
-avatar.upload.host=//afts.hnzhiming.com/upload
+avatar.upload.host=//afts.hnzhiming.com/upload
+
+easemob.client.url=https://a1.easemob.com/1117170814115609/jitao
+easemob.client.id=YXA6RUDGkIDSEeemq9_4PWzcNA
+easemob.client.secret=YXA61NHE0renI5N8gEgizoI5ivM9SYE

+ 29 - 25
src/main/resources/props/config_local.properties

@@ -1,41 +1,41 @@
 #Driver
 jdbc.driverClassName=com.mysql.jdbc.Driver
-#\u6570\u636e\u5e93\u94fe\u63a5\uff0c
-jdbc.url=jdbc:mysql://127.0.0.1:3306/aft?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
-#\u5e10\u53f7
+#\u6570\u636E\u5E93\u94FE\u63A5\uFF0C
+jdbc.url=jdbc:mysql://127.0.0.1:3306/aft_dev?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
+#\u5E10\u53F7
 jdbc.username=root
-#\u5bc6\u7801
+#\u5BC6\u7801
 jdbc.password=123456
-#\u68c0\u6d4b\u6570\u636e\u5e93\u94fe\u63a5\u662f\u5426\u6709\u6548\uff0c\u5fc5\u987b\u914d\u7f6e
+#\u68C0\u6D4B\u6570\u636E\u5E93\u94FE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u5FC5\u987B\u914D\u7F6E
 jdbc.validationQuery=SELECT 'x'
-#\u521d\u59cb\u8fde\u63a5\u6570
+#\u521D\u59CB\u8FDE\u63A5\u6570
 jdbc.initialSize=3
-#\u6700\u5927\u8fde\u63a5\u6c60\u6570\u91cf
+#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
 jdbc.maxActive=20
-#\u53bb\u6389\uff0c\u914d\u7f6e\u6587\u4ef6\u5bf9\u5e94\u53bb\u6389
+#\u53BB\u6389\uFF0C\u914D\u7F6E\u6587\u4EF6\u5BF9\u5E94\u53BB\u6389
 #jdbc.maxIdle=20
-#\u914d\u7f6e0,\u5f53\u7ebf\u7a0b\u6c60\u6570\u91cf\u4e0d\u8db3\uff0c\u81ea\u52a8\u8865\u5145\u3002
+#\u914D\u7F6E0,\u5F53\u7EBF\u7A0B\u6C60\u6570\u91CF\u4E0D\u8DB3\uFF0C\u81EA\u52A8\u8865\u5145\u3002
 jdbc.minIdle=0
-#\u83b7\u53d6\u94fe\u63a5\u8d85\u65f6\u65f6\u95f4\u4e3a1\u5206\u949f\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\u3002
+#\u83B7\u53D6\u94FE\u63A5\u8D85\u65F6\u65F6\u95F4\u4E3A1\u5206\u949F\uFF0C\u5355\u4F4D\u4E3A\u6BEB\u79D2\u3002
 jdbc.maxWait=120000
-#\u83b7\u53d6\u94fe\u63a5\u7684\u65f6\u5019\uff0c\u4e0d\u6821\u9a8c\u662f\u5426\u53ef\u7528\uff0c\u5f00\u542f\u4f1a\u6709\u635f\u6027\u80fd\u3002
+#\u83B7\u53D6\u94FE\u63A5\u7684\u65F6\u5019\uFF0C\u4E0D\u6821\u9A8C\u662F\u5426\u53EF\u7528\uFF0C\u5F00\u542F\u4F1A\u6709\u635F\u6027\u80FD\u3002
 jdbc.testOnBorrow=false
-#\u5f52\u8fd8\u94fe\u63a5\u5230\u8fde\u63a5\u6c60\u7684\u65f6\u5019\u6821\u9a8c\u94fe\u63a5\u662f\u5426\u53ef\u7528\u3002
+#\u5F52\u8FD8\u94FE\u63A5\u5230\u8FDE\u63A5\u6C60\u7684\u65F6\u5019\u6821\u9A8C\u94FE\u63A5\u662F\u5426\u53EF\u7528\u3002
 jdbc.testOnReturn=false
-#\u6b64\u9879\u914d\u7f6e\u4e3atrue\u5373\u53ef\uff0c\u4e0d\u5f71\u54cd\u6027\u80fd\uff0c\u5e76\u4e14\u4fdd\u8bc1\u5b89\u5168\u6027\u3002\u610f\u4e49\u4e3a\uff1a\u7533\u8bf7\u8fde\u63a5\u7684\u65f6\u5019\u68c0\u6d4b\uff0c\u5982\u679c\u7a7a\u95f2\u65f6\u95f4\u5927\u4e8etimeBetweenEvictionRunsMillis\uff0c\u6267\u884cvalidationQuery\u68c0\u6d4b\u8fde\u63a5\u662f\u5426\u6709\u6548\u3002
+#\u6B64\u9879\u914D\u7F6E\u4E3Atrue\u5373\u53EF\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u610F\u4E49\u4E3A\uFF1A\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
 jdbc.testWhileIdle=true
-#1.Destroy\u7ebf\u7a0b\u4f1a\u68c0\u6d4b\u8fde\u63a5\u7684\u95f4\u9694\u65f6\u95f4
-#2.testWhileIdle\u7684\u5224\u65ad\u4f9d\u636e
+#1.Destroy\u7EBF\u7A0B\u4F1A\u68C0\u6D4B\u8FDE\u63A5\u7684\u95F4\u9694\u65F6\u95F4
+#2.testWhileIdle\u7684\u5224\u65AD\u4F9D\u636E
 jdbc.timeBetweenEvictionRunsMillis=60000
-#\u4e00\u4e2a\u94fe\u63a5\u751f\u5b58\u7684\u65f6\u95f4\uff08\u4e4b\u524d\u7684\u503c\uff1a25200000\uff0c\u8fd9\u4e2a\u65f6\u95f4\u6709\u70b9BT\uff0c\u8fd9\u4e2a\u7ed3\u679c\u4e0d\u77e5\u9053\u662f\u600e\u4e48\u6765\u7684\uff0c\u6362\u7b97\u540e\u7684\u7ed3\u679c\u662f\uff1a25200000/1000/60/60 = 7\u4e2a\u5c0f\u65f6\uff09
+#\u4E00\u4E2A\u94FE\u63A5\u751F\u5B58\u7684\u65F6\u95F4\uFF08\u4E4B\u524D\u7684\u503C\uFF1A25200000\uFF0C\u8FD9\u4E2A\u65F6\u95F4\u6709\u70B9BT\uFF0C\u8FD9\u4E2A\u7ED3\u679C\u4E0D\u77E5\u9053\u662F\u600E\u4E48\u6765\u7684\uFF0C\u6362\u7B97\u540E\u7684\u7ED3\u679C\u662F\uFF1A25200000/1000/60/60 = 7\u4E2A\u5C0F\u65F6\uFF09
 jdbc.minEvictableIdleTimeMillis=300000
-#\u94fe\u63a5\u4f7f\u7528\u8d85\u8fc7\u65f6\u95f4\u9650\u5236\u662f\u5426\u56de\u6536
+#\u94FE\u63A5\u4F7F\u7528\u8D85\u8FC7\u65F6\u95F4\u9650\u5236\u662F\u5426\u56DE\u6536
 jdbc.removeAbandoned=true
-#\u8d85\u8fc7\u65f6\u95f4\u9650\u5236\u65f6\u95f4\uff08\u5355\u4f4d\u79d2\uff09\uff0c\u76ee\u524d\u4e3a5\u5206\u949f\uff0c\u5982\u679c\u6709\u4e1a\u52a1\u5904\u7406\u65f6\u95f4\u8d85\u8fc75\u5206\u949f\uff0c\u53ef\u4ee5\u9002\u5f53\u8c03\u6574\u3002
+#\u8D85\u8FC7\u65F6\u95F4\u9650\u5236\u65F6\u95F4\uFF08\u5355\u4F4D\u79D2\uFF09\uFF0C\u76EE\u524D\u4E3A5\u5206\u949F\uFF0C\u5982\u679C\u6709\u4E1A\u52A1\u5904\u7406\u65F6\u95F4\u8D85\u8FC75\u5206\u949F\uFF0C\u53EF\u4EE5\u9002\u5F53\u8C03\u6574\u3002
 jdbc.removeAbandonedTimeout=300
-#\u94fe\u63a5\u56de\u6536\u7684\u65f6\u5019\u63a7\u5236\u53f0\u6253\u5370\u4fe1\u606f\uff0c\u6d4b\u8bd5\u73af\u5883\u53ef\u4ee5\u52a0\u4e0atrue\uff0c\u7ebf\u4e0a\u73af\u5883false\u3002\u4f1a\u5f71\u54cd\u6027\u80fd\u3002
+#\u94FE\u63A5\u56DE\u6536\u7684\u65F6\u5019\u63A7\u5236\u53F0\u6253\u5370\u4FE1\u606F\uFF0C\u6D4B\u8BD5\u73AF\u5883\u53EF\u4EE5\u52A0\u4E0Atrue\uFF0C\u7EBF\u4E0A\u73AF\u5883false\u3002\u4F1A\u5F71\u54CD\u6027\u80FD\u3002
 jdbc.logAbandoned=true
-#\u7edf\u8ba1\u76d1\u63a7
+#\u7EDF\u8BA1\u76D1\u63A7
 jdbc.filters=stat
 
 logging.level.com.goafanti=DEBUG
@@ -43,7 +43,7 @@ logging.level.com.goafanti=DEBUG
 jedis.host=127.0.0.1
 jedis.port=6379
 jedis.timeout=5000
-jedis.password=aft123456
+jedis.password=123456
 
 pwd.hash_algorithm_name=md5
 pwd.hash_iterations=2
@@ -53,7 +53,7 @@ session.validate.timespan=18000000
 
 app.name=AFT
 
-static.host=//sb.jishutao.com/1.0.41
+static.host=//afts.hnzhiming.com/1.0.41
 
 upload.path=/Users/xiaolong/Sites/upload
 upload.private.path=/Users/xiaolong/Sites/doc
@@ -61,7 +61,7 @@ upload.private.path=/Users/xiaolong/Sites/doc
 accessKey=LTAIqTgQLLwz252Z
 accessSecret=ICGuiUnqzaar7urw4zecVcJrJ1MHg9
 
-avatar.host=//sf.jishutao.com
+avatar.host=//afts.hnzhiming.com
 
 aesSecretKey=aft1234567890123
 
@@ -69,8 +69,12 @@ template.cacheable=false
 
 mobileCodeTemplate=SMS_37845022
 
-portal.host=//sf.jishutao.com/portal/1.0.11
+portal.host=//afts.hnzhiming.com/portal/1.0.11
 
 patentTemplate=SMS_72005286
 
-avatar.upload.host=//sf.jishutao.com/upload
+avatar.upload.host=//afts.hnzhiming.com/upload
+
+easemob.client.url=https://a1.easemob.com/1117170814115609/jitao
+easemob.client.id=YXA6RUDGkIDSEeemq9_4PWzcNA
+easemob.client.secret=YXA61NHE0renI5N8gEgizoI5ivM9SYE

+ 5 - 1
src/main/resources/props/config_test.properties

@@ -73,4 +73,8 @@ portal.host=//aftts.hnzhiming.com/portal/1.0.8
 
 patentTemplate=SMS_72005286
 
-avatar.upload.host=//aftts.hnzhiming.com/upload
+avatar.upload.host=//aftts.hnzhiming.com/upload
+
+easemob.client.url=https://a1.easemob.com/1117170814115609/jitao
+easemob.client.id=YXA6RUDGkIDSEeemq9_4PWzcNA
+easemob.client.secret=YXA61NHE0renI5N8gEgizoI5ivM9SYE

+ 14 - 3
src/main/resources/spring/spring-shiro.xml

@@ -29,9 +29,20 @@
 	<bean id="redisTemplate" class="com.goafanti.core.cache.template.FastJsonRedisTemplate">
 		<constructor-arg index="0" ref="redisConnectionFactory" />
 	</bean>
-
-	<bean id="sessionRedisTemplate"
-		class="com.goafanti.core.shiro.cache.template.SessionRedisTemplate">
+	
+    <bean id="jedisQueueListener" class="com.goafanti.easemob.queue.EasemobRedisQueueListener"/>  
+    
+    
+    <bean id="jedisQueue" class="com.goafanti.easemob.queue.EasemobRedisQueue" destroy-method="destroy">  
+        <property name="redisTemplate" ref="redisTemplate"></property>  
+        <property name="key" value="easemob:queue"></property>  
+        <property name="listener" ref="jedisQueueListener"></property>  
+    </bean> 
+    
+    <bean id="easemobUtils" class="com.goafanti.easemob.EasemobUtils"/>
+      
+
+	<bean id="sessionRedisTemplate" class="com.goafanti.core.shiro.cache.template.SessionRedisTemplate">
 		<constructor-arg index="0" ref="redisConnectionFactory" />
 	</bean>
 

+ 80 - 0
src/main/webapp/WEB-INF/views/portal/membership.html

@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+
+<head th:replace="common::header(~{::title},~{::link})">
+	<title>用户会员申请</title>
+	<link th:href="${portalHost + '/vendors.css'}" rel="stylesheet">
+	<link th:href="${portalHost + '/membership.css'}" rel="stylesheet">
+</head>
+
+<body>
+	<header>
+		<div th:replace="common::{topNav}">
+			<div class="container">
+				<div class="lt">欢迎进入科技认知计算交易平台!</div>
+				<div class="rt">
+					<a href="/user/login.html" class="login">登录</a> <a href="/user/signIn.html">注册</a> <a href="#">导航</a> <a href="#">关于我们</a>
+					<a href="#">联系我们</a>
+				</div>
+			</div>
+		</div>
+	</header>
+	<div class="wrap">
+		<div class="member-title">申请会员获得更多增值服务</div>
+		<div class="member-text">根据企业所需选择合适的付费方案,更高效地为您提供服务</div>
+		<div class="member-card">
+			<ul id="member-list" class="clearfix">
+				<li>
+					<div class="level level1">黄金会员</div>
+					<div class="top">
+						<i class="topImg"></i>
+						<span>提供的专属服务</span>
+					</div>
+					<div class="server">
+						<p>科技成果,专家信息定点推送</p>
+						<p>查看专家的联系方式</p>
+						<p>任何业务申请,付费业享受会员专属折扣。</p>
+						<p>一对一的技术经纪人服务,进行技术成果媒合服务</p>
+						<p>一对一的科技咨询师服务</p>
+					</div>
+					<div class="money">
+						<p><a href="">800/3月</a></p>
+						<p><a href="">1400/6月</a></p>
+						<p><a href="">2000/12月</a></p>
+					</div>
+				</li>
+				<li>
+					<div class="level level2">钻石会员</div>
+					<div class="top">
+						<i class="topImg"></i>
+						<span>提供的专属服务</span>
+					</div>
+					<div class="server">
+						<p>科技成果,专家信息定点推送</p>
+						<p>查看专家的联系方式</p>
+						<p>任何业务申请,付费业享受会员专属折扣。</p>
+						<p>一对一的技术经纪人服务,进行技术成果媒合服务</p>
+						<p>一对一的科技咨询师服务</p>
+						<p>一对一的专业技术顾问,搜集技术情报,提供研发高参</p>
+						<p>免费参加现场业务培训会</p>
+						<p>免前期费用做科技类扶持资金项目申报</p>
+					</div>
+					<div class="money">
+						<p><a href="">2000/3月</a></p>
+						<p><a href="">3500/6月</a></p>
+						<p><a href="">5000/12月</a></p>
+					</div>
+				</li>
+			</ul>
+		</div>
+	</div>
+	<footer>
+		<div th:replace="common::copyright"></div>
+	</footer>
+	<div th:replace="common::footer(~{::script})">
+		<script type="text/javascript" th:src="${portalHost + '/vendors.js'}"></script>
+		<script type="text/javascript" th:src="${portalHost + '/membership.js'}"></script>
+	</div>
+</body>
+
+</html>