package com.zdcf.action; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.io.FilenameUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; 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 org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.zdcf.base.BaseAction; import com.zdcf.base.Constants; import com.zdcf.dto.MessageDTO; import com.zdcf.dto.ThemeDTO; import com.zdcf.dto.ZhihuDTO; import com.zdcf.model.FileExchange; import com.zdcf.model.Message; import com.zdcf.model.Theme; import com.zdcf.model.User; import com.zdcf.search.IChnlZhihuSearchService; import com.zdcf.search.entity.ChnlZhihuSearch; //import com.zdcf.search.IChnlZhihuSearchService; //import com.zdcf.search.entity.ChnlZhihuSearch; import com.zdcf.search.param.ZhihuSearchParam; import com.zdcf.service.FileService; import com.zdcf.service.MessageService; import com.zdcf.service.RobotService; import com.zdcf.service.UserService; import com.zdcf.tool.PageVo; import com.zdcf.tool.Tools; import com.zdcf.tool.UserSessionUtil; import com.zdcf.tool.WebUtil; import net.sf.json.JSONObject; @Controller @RequestMapping("/message") public class MessageAction extends BaseAction{ private static Logger logger = Logger.getLogger(MessageAction.class); private static final int pageSize = 15; @Resource private MessageService messageService; @Resource private UserService userService; @Resource private RobotService robotService; @Resource private FileService fileService; // @Autowired // private IChnlThemeSearchService themeSearchService; @Autowired private IChnlZhihuSearchService zhihuSearchService; @RequestMapping("/getAllTheme") public String getAllAirticle(HttpServletRequest request,HttpServletResponse response,ModelMap model){ PageVo<Map<String, Object>> pageVo = WebUtil.findPageVo(request); pageVo.setPageSize(pageSize); String currentPage = "1"; if(null!=request.getParameter("currentPage")){ currentPage =request.getParameter("currentPage"); } pageVo.setCurrentPage(Integer.parseInt(currentPage)); pageVo = (PageVo<Map<String, Object>>) messageService.getThemeListPage(pageVo); model.addAttribute("pageView", pageVo); // if(!isMobile()){ return "/message/themeListNew"; // }else{ // return "mobile/index"; // } } //手机端论坛主题分页 @RequestMapping("/findNextTheme") public @ResponseBody List<HashMap<String, Object>> findNextTheme(int index) throws Exception { List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); list = messageService.findNextTheme(index,5); return list; } //手机端知乎日报主题分页 @RequestMapping("/findNextZhihuAirticle") public @ResponseBody List<HashMap<String, Object>> findNextZhihuAirticle(int index) throws Exception { List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); list = messageService.findNextZhihuAirticle(index,5); return list; } @RequestMapping("/toAddTheme") public String toAddTheme(ModelMap model,HttpServletRequest request){ User u = UserSessionUtil.currentUser(); if(null==u){ return "index/login"; } return "/message/addThemeNew"; } public String StringFilter(String str) throws PatternSyntaxException { // 只允许字母和数字 // String regEx = "[^a-zA-Z0-9]"; // 清除掉所有特殊字符 String regEx="[`~!@#$%^&*()+=|{}':;',\\[\\]<>/?~!@#¥%……&*()——+|{}‘;:”“’。,、?]"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); return m.replaceAll("").trim(); } @RequestMapping(value ="/addTheme", method = RequestMethod.POST) public String addAirticle(HttpServletRequest request,HttpServletResponse response,@RequestParam("theme")String theme,@RequestParam("content") String content,ModelMap model,@RequestParam("code") String code) throws UnsupportedEncodingException{ String realcode = request.getSession().getAttribute(Constants.SESSION_IMAGE_CODE).toString(); if(null==code||"".equals(code)||!code.equals(realcode)){ return "redirect:/message/getAllTheme"; }else{ //验证成功后将session的验证码更新,防止再次使用此验证码发送主题 String valcode = ""; Random rd = new Random(); for(int i=0; i<4; i++) valcode+=rd.nextInt(10); // 把产生的验证码存入到Session中 HttpSession session = request.getSession(); session.setAttribute(Constants.SESSION_IMAGE_CODE, valcode); } String ip = Tools.getNoHTMLString(StringFilter(getIpAddr(request))); User u = UserSessionUtil.currentUser(); Theme th = new Theme(); th.setTheme(StringFilter(theme)); th.setUserId(u.getId()); th.setContent(content); logger.info("ip:"+ip+" 发表了一个主题"); messageService.addTheme(th); return "redirect:/message/getAllTheme"; } @RequestMapping("/getThemeDetail") public String getAirticleDetail(@RequestParam("id")int id,ModelMap model,HttpServletRequest request) throws UnsupportedEncodingException{ String ip = StringFilter(getIpAddr(request)); ThemeDTO theme = messageService.getThemeById(id); logger.info("ip:"+ip+" 查看了主题:"+theme.getTheme()); model.addAttribute("theme", theme); List<MessageDTO> messages = messageService.getMessagesByThemeId(id); model.addAttribute("messages", messages); // if(!isMobile()){ return "message/themeDetailNew"; // }else{ // return "mobile/themeDetail"; // } } public String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Real-IP"); if (null != ip && !"".equals(ip.trim()) && !"unknown".equalsIgnoreCase(ip)) { return ip; } ip = request.getHeader("X-Forwarded-For"); if (null != ip && !"".equals(ip.trim()) && !"unknown".equalsIgnoreCase(ip)) { // 多次反向代理后会有多个IP值,第一个为真实IP。 int index = ip.indexOf(','); if (index != -1) { return ip.substring(0, index); } else { return ip; } } return request.getRemoteAddr(); } @RequestMapping("/addMessage") public String addMessage(HttpServletRequest request,HttpServletResponse response,@RequestParam("message")String message,@RequestParam("themeId")int themeId,@RequestParam("messageCode")String messageCode) throws UnsupportedEncodingException{ String realcode = request.getSession().getAttribute(Constants.SESSION_IMAGE_CODE).toString(); if(null==messageCode||"".equals(messageCode)||!messageCode.equals(realcode)){ return "redirect:/message/getThemeDetail?id="+themeId; }else{ //验证成功后将session的验证码更新,防止再次使用此验证码发送主题 String valcode = ""; Random rd = new Random(); for(int i=0; i<4; i++) valcode+=rd.nextInt(10); // 把产生的验证码存入到Session中 HttpSession session = request.getSession(); session.setAttribute(Constants.SESSION_IMAGE_CODE, valcode); } String ip = Tools.getNoHTMLString(getIpAddr(request)); User u = UserSessionUtil.currentUser(); Message me = new Message(); int userIdToRobot; me.setUserId(u.getId()); userIdToRobot = u.getId(); me.setMessage(message); me.setThemeId(themeId); logger.info("ip:"+ip+" 回复了一个帖子"); messageService.addMessage(me); if(themeId==62788){ JSONObject jsonObject = null; String result = robotService.getAnswerFromRobot(Tools.getNoHTMLString(message),userIdToRobot); jsonObject = JSONObject.fromObject(result); String answer = "@"+u.getUsername()+" "; if(null!=jsonObject.get("text")){ answer += jsonObject.get("text").toString(); } if(null!=jsonObject.get("url")){ answer+=" <a target='_blank' href='"+jsonObject.get("url").toString()+"'>网页链接</a> "; } Message robotMe = new Message(); robotMe.setMessage(answer); robotMe.setThemeId(themeId); robotMe.setUserId(11); logger.info("robot回复了一个帖子:"+answer); messageService.addMessage(robotMe); } return "redirect:/message/getThemeDetail?id="+themeId; } /** * 该方法是用来生成图形验证的. */ @RequestMapping(value = "/tuXingYanZhengMa") public void getImg(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 告知浏览当作图片处理 response.setContentType("image/jpeg"); // 告诉浏览器不缓存 response.setHeader("pragma", "no-cache"); response.setHeader("cache-control", "no-cache"); response.setHeader("expires", "0"); // 产生由4位数字构成的验证码 int length = 4; String valcode = ""; Random rd = new Random(); for(int i=0; i<length; i++) valcode+=rd.nextInt(10); // 把产生的验证码存入到Session中 HttpSession session = request.getSession(); session.setAttribute(Constants.SESSION_IMAGE_CODE, valcode); // 产生图片 int width = 100; int height = 30; BufferedImage img = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); // 获取一个Graphics Graphics g = img.getGraphics(); // 填充背景色 g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); // 填充干扰线50 for(int i=0; i<50; i++){ g.setColor(new Color(rd.nextInt(100)+155,rd.nextInt(100)+155,rd.nextInt(100)+155)); g.drawLine(rd.nextInt(width), rd.nextInt(height),rd.nextInt(width), rd.nextInt(height)); } // 绘制边框 g.setColor(Color.GRAY); g.drawRect(0, 0, width-1, height-1); // 绘制验证码 Font[] fonts = {new Font("隶书",Font.BOLD,28),new Font("楷体",Font.BOLD,28),new Font("宋体",Font.BOLD,28),new Font("幼圆",Font.BOLD,18)}; for(int i=0; i<length; i++){ g.setColor(new Color(rd.nextInt(150),rd.nextInt(150),rd.nextInt(150))); g.setFont(fonts[rd.nextInt(fonts.length)]); g.drawString(valcode.charAt(i)+"", width/valcode.length()*i+2, 28); } // 输出图像 g.dispose(); ImageIO.write(img, "jpeg", response.getOutputStream()); } public static int getPagesize() { return pageSize; } @RequestMapping("/getArticleFromZhihu") public String getArticleFromZhihu(ZhihuSearchParam searchParam,HttpServletRequest request,ModelMap model) throws IOException{ // PageVo<Map<String, Object>> pageVo = WebUtil.findPageVo(request); // pageVo.setPageSize(pageSize); // String currentPage = "1"; // if(null!=request.getParameter("currentPage")){ // currentPage =request.getParameter("currentPage"); // } // pageVo.setCurrentPage(Integer.parseInt(currentPage)); // pageVo = (PageVo<Map<String, Object>>) messageService.getZhihuArticleListPage(pageVo); // model.addAttribute("pageView", pageVo); String currentPage = "1"; if(null!=request.getParameter("currentPage")){ currentPage =request.getParameter("currentPage"); } searchParam.setI(Integer.valueOf(currentPage)); List<ChnlZhihuSearch> list = zhihuSearchService.search(searchParam); for (ChnlZhihuSearch chnlZhihuSearch : list) { FileExchange fileExchange =fileService.getFileExchange(chnlZhihuSearch.getImages()); if(null==fileExchange){ FileExchange newfileExchange = new FileExchange(); HttpClient client = new HttpClient(); GetMethod get = new GetMethod(chnlZhihuSearch.getImages()); String fileExt = FilenameUtils.getExtension(chnlZhihuSearch.getImages()); String newUrl = UUID.randomUUID().toString().replaceAll("-", "")+"."+fileExt; newfileExchange.setOldUrl(chnlZhihuSearch.getImages()); newfileExchange.setNewUrl(newUrl); File storeFile = new File(request.getSession().getServletContext().getRealPath("/")+"uploadfile/"+newUrl); FileOutputStream output = null; try{ client.executeMethod(get); output = new FileOutputStream(storeFile); output.write(get.getResponseBody()); output.close(); }catch (HttpException e) { e.printStackTrace(); } //存储redis和数据库 fileService.addFileExchange(newfileExchange); chnlZhihuSearch.setImages(newfileExchange.getNewUrl()); }else{ chnlZhihuSearch.setImages( fileExchange.getNewUrl()); } } model.addAttribute("list", list); model.addAttribute("searchParam", searchParam); return "/message/zhihuAiticleList"; } @RequestMapping("/getZhihuArticleDetail") public String getZhihuArticleDetail(@RequestParam("id")int id,ModelMap model,HttpServletRequest request) throws UnsupportedEncodingException{ String ip = StringFilter(getIpAddr(request)); ZhihuDTO zhihu = messageService.getZhihuDetailById(id); logger.info("ip:"+ip+" 查看了知乎日报的文章:《"+zhihu.getTitle()+"》"); model.addAttribute("zhihu", zhihu); // if(!isMobile()){ return "/message/zhihuArticleDetailforPC"; // }else{ // return "/message/zhihuArticleDetail"; // // } } @ResponseBody @RequestMapping("/queryKeyWord") public Map<String, Object> mutiThreads(ZhihuSearchParam searchParam){ searchParam.setS(5); Map<String, Object> map = new HashMap<String, Object>(); List<ChnlZhihuSearch> list = zhihuSearchService.search(searchParam); map.put("list", list); return map; } }