content: package com.enterprise.controller.manage;
  
  import java.awt.*;
  import java.awt.image.BufferedImage;
  import java.awt.image.CropImageFilter;
  import java.awt.image.FilteredImageSource;
  import java.awt.image.ImageFilter;
  import java.io.File;
  import java.io.IOException;
  import java.io.InputStream;
  import java.text.SimpleDateFormat;
  import java.util.*;
  import java.util.List;
  
  import javax.imageio.ImageIO;
  import javax.servlet.http.Cookie;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import javax.servlet.http.HttpSession;
  
  import com.enterprise.entity.Systemlog;
  import com.enterprise.service.MenuService;
  import org.apache.commons.lang.StringUtils;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.stereotype.Controller;
  import org.springframework.ui.ModelMap;
  import org.springframework.web.bind.annotation.*;
  import org.springframework.web.multipart.MultipartFile;
  import org.springframework.web.servlet.mvc.support.RedirectAttributes;
  
  import com.enterprise.entity.Menu;
  import com.enterprise.entity.MenuItem;
  import com.enterprise.entity.User;
  import com.enterprise.service.Services;
  import com.enterprise.service.impl.UserServiceImpl;
  import com.enterprise.service.SystemlogService;
  import com.enterprise.util.AddressUtil;
  import com.enterprise.util.MD5;
  import com.enterprise.util.RequestHolder;
  import com.enterprise.controller.BaseController;
  /**
   * 用户登录、登出、信息操作
   * @author Cesiumai
   *
   */
  @Controller
  @RequestMapping("/manage/user/")
  public class UserAction extends BaseController<User> {
  
  	private static final long serialVersionUID = 1L;
  
  	private static final String page_input = "/manage/system/login";// 登录页面
  	private static final String page_home = "/manage/system/home";// 后台主页
  	private static final String page_toList = "/manage/system/user/userList";// 后台用户列表页
  	private static final String page_toAdd = "/manage/system/user/editUser";// 添加用户页面
  	private static final String page_toEdit = "/manage/system/user/editUser";// 编辑用户页面
  	private static final String page_info = "/manage/system/user/info";//个人用户信息
  	private static final String page_changePwd_result = "/manage/system/user/changePwd";//修改密码成功
  
  	public UserAction() {
  		super.page_toEdit = page_toEdit;
  		super.page_toList = page_toList;
  		super.page_toAdd = page_toAdd;
  	}
  
  
  	@Autowired
  	private UserServiceImpl userServiceImpl;
  	@Autowired
  	private MenuService menuService;
  	@Autowired
  	private SystemlogService systemlogService;
  
  	@Override
  	public Services<User> getService() {
  		return userServiceImpl;
  	}
  
  	public UserServiceImpl getUserServiceImpl() {
  		return userServiceImpl;
  	}
  
  	public void setUserServiceImpl(UserServiceImpl userServiceImpl) {
  		this.userServiceImpl = userServiceImpl;
  	}
  
  	@Override
  	public void insertAfter(User e) {
  		e.clear();
  	}
  
  	/**
  	 * 转到登录页面
  	 * 
  	 * @param e
  	 * @param session
  	 * @return
  	 */
  	@RequestMapping(value = "login", method = RequestMethod.GET)
  	public String login(@ModelAttribute("e") User e, HttpSession session,HttpServletRequest request) {
  		if (session.getAttribute("manage_session_user_info") != null) {
  			return "redirect:/manage/user/home";
  		}
  		/**
  		 * 判断没有cookie
  		 */
  		Cookie[] cookies = request.getCookies();
  		Cookie sCookie=null;
  		String username = null;
  		String password = null;
  		if(cookies!=null && cookies.length>0){
  			for(int i = 0; i<cookies.length;i++){
  				sCookie = cookies[i];
  				if(sCookie!=null){
  					if(StringUtils.equals(sCookie.getName(), "manage_cookie_username")){
  						username = sCookie.getValue();
  					}
  					if(StringUtils.equals(sCookie.getName(), "manage_cookie_password")){
  						password = sCookie.getValue();
  					}
  				}
  			}
  		}
  		if(username!=null && password!=null&&session.getAttribute("manage_session_user_info")==null){
  			e.setUsername(username);
  			e.setPassword(password);
  			e = userServiceImpl.login(e);
  			session.setAttribute("manage_session_user_info", e);
  			Collection<MenuItem> userMenus = loadMenus();
  			session.setAttribute("userMenus", userMenus);
  			return "redirect:/manage/user/home";
  		}
  		return page_input;
  	}
  
  	/**
  	 * 登录方法
  	 * 
  	 * @param session
  	 * @param e
  	 * @param model
  	 * @return
  	 * @throws Exception
  	 */
  	@RequestMapping(value = "login", method = RequestMethod.POST)
  	public String login(HttpSession session,HttpServletResponse response, @ModelAttribute("e") User e, ModelMap model) throws Exception {
  		String remember = RequestHolder.getRequest().getParameter("remember");
  		String errorMsg;
  		if (session.getAttribute("manage_session_user_info") != null) {
  			return "redirect:/manage/user/home";
  		}
  		if (StringUtils.isBlank(e.getUsername()) || StringUtils.isBlank(e.getPassword())) {
  			model.addAttribute("errorMsg", "用户名和密码不能为空");
  			return page_input;
  		}
  		if(StringUtils.isBlank(e.getManage_vcode())){
  			model.addAttribute("errorMsg", "验证码不能为空");
  			return page_input;
  		}
  		String manage_vcode = RequestHolder.getSession().getAttribute("validateCode").toString();
  		if(StringUtils.isNotBlank(manage_vcode)&&!(manage_vcode.toLowerCase()).equals(e.getManage_vcode().toLowerCase())){
  			model.addAttribute("errorMsg", "验证码错误");
  			return page_input;
  		}
  		e.setPassword(MD5.md5(e.getPassword()));
  		User u = userServiceImpl.login(e);
  		if (u == null) {
  			errorMsg = "登录失败，用户名和密码不符";
  			model.addAttribute("errorMsg", errorMsg);
  			return page_input;
  		}
  		if(StringUtils.isNotBlank(remember)){
  			Cookie usernameCookie = new Cookie("manage_cookie_username", e.getUsername());
  			Cookie passwordCookie = new Cookie("manage_cookie_password", e.getPassword());
  			usernameCookie.setMaxAge(60*60*24*7);	//七天
  			passwordCookie.setMaxAge(60*60*24*7);	//七天
  			response.addCookie(usernameCookie);
  			response.addCookie(passwordCookie);
  		}
  		session.setAttribute("manage_session_user_info", u);
  		Collection<MenuItem> userMenus = loadMenus();
  		session.setAttribute("userMenus", userMenus);
  		try {
  			insertLog(u, "login");
  		} catch (Exception ex) {
  			ex.printStackTrace();
  		}
  		return "redirect:/manage/user/home";
  	}
  
  	/**
  	 * 主页面
  	 * @return
       */
  	@RequestMapping("home")
  	public String home() {
  		return page_home;
  	}
  
  	/**
  	 * 加载后台菜单
  	 * 
  	 * @return
  	 */
  	public Collection<MenuItem> loadMenus() {
  		Map<String, String> param = new HashMap<String, String>();
  
  		List<Menu> menus = menuService.selectList(param);
  		LinkedHashMap<String, MenuItem> root = new LinkedHashMap<String, MenuItem>();
  		for (Menu menu : menus) {
  			MenuItem item = new MenuItem(menu.getName(), null);
  			item.setId(String.valueOf(menu.getId()));
  			item.setPid(menu.getPid());
  			item.setIcon(menu.getIcon());
  			item.setUrl(StringUtils.trim(menu.getUrl()));
  			if (item.isRootMenu()) {
  				root.put(item.getId(), item);
  			}
  		}
  		for (Menu menu : menus) {
  			MenuItem item = new MenuItem(menu.getName(), null);
  			item.setId(String.valueOf(menu.getId()));
  			item.setPid(menu.getPid());
  			item.setIcon(menu.getIcon());
  			item.setUrl(StringUtils.trimToEmpty(menu.getUrl()));
  			if (!item.isRootMenu() && !item.isButton()) {
  				MenuItem parentItem = root.get(item.getPid());
  				if (parentItem != null) {
  					parentItem.addChildren(item);
  				}
  			}
  		}
  		return root.values();
  	}
  
  	/**
  	 * 登出
  	 * 
  	 * @param e
  	 * @return
  	 * @throws Exception
  	 */
  	@RequestMapping("logout")
  	public String logout(@ModelAttribute("e") User e,HttpServletRequest request,HttpServletResponse response) throws Exception {
  		HttpSession session = RequestHolder.getSession();
  		if (session != null) {
  			User u = (User) RequestHolder.getSession().getAttribute("manage_session_user_info");
  			if (u != null && StringUtils.isNotBlank(u.getUsername())) {
  				insertLog(u, "loginOut");
  			}
  			session.setAttribute("manage_session_user_info", null);
  		}
  		Cookie[] cookies = request.getCookies();
  		if (cookies != null || cookies.length > 0) {
  			for(Cookie cookie:cookies){
  				if(StringUtils.equals(cookie.getName(), "manage_cookie_username")){
  		            cookie.setMaxAge(0);
  		            response.addCookie(cookie);
  				}
  				if(StringUtils.equals(cookie.getName(), "manage_cookie_password")){
  					cookie.setMaxAge(0);
  		            response.addCookie(cookie);
  				}
  			}
  	    }
  		e.clear();
  		return page_input;
  	}
  
  
  
  	/**
  	 * 编辑
  	 */
  	@RequestMapping("toEdit")
  	@Override
  	public String toEdit(@ModelAttribute("e") User e, ModelMap model) throws Exception {
  		e = userServiceImpl.selectOne(e);
  		model.addAttribute("e", e);
  		return page_toEdit;
  	}
  
  	/**
  	 * 添加
  	 */
  	@RequestMapping("toAdd")
  	@Override
  	public String toAdd(@ModelAttribute("e") User user, ModelMap model) throws Exception {
  		return page_toAdd;
  	}
  
  	/**
  	 * 增加或修改
  	 * 
  	 * @param e
  	 * @param model
  	 * @param flushAttrs
  	 * @return
  	 * @throws Exception
  	 */
  	@RequestMapping(value = "insertOrUpdate", method = RequestMethod.POST)
  	public String insertOrUpdate(@ModelAttribute("e") User e, ModelMap model, RedirectAttributes flushAttrs)
  			throws Exception {
  		User user = (User) RequestHolder.getSession().getAttribute("manage_session_user_info");
  		if (e.getId() == 0) {// 添加
  			if (StringUtils.isBlank(e.getPassword()) || StringUtils.isBlank(e.getNewpassword2())) {
  				flushAttrs.addFlashAttribute("errorMsg", "输入的密码不符合要求！");
  				return "redirect:toEdit?id=" + e.getId();
  			}
  
  			if (!e.getPassword().equals(e.getNewpassword2())) {
  				flushAttrs.addFlashAttribute("errorMsg", "两次输入的密码不一致！");
  				return "redirect:toEdit?id=" + e.getId();
  			}
  			e.setCreateAccount(user.getUsername());
  			e.setPassword(MD5.md5(e.getPassword()));
  			getService().insert(e);
  		} else {// 修改
  			if (StringUtils.isBlank(e.getPassword()) && StringUtils.isBlank(e.getNewpassword2())) {
  				// 不修改密码
  				e.setPassword(null);
  			} else {
  				// 修改密码
  				if(StringUtils.isBlank(e.getOldPassword())){
  					flushAttrs.addFlashAttribute("errorMsg", "修改密码原始密码不能为空");
  					return "redirect:toEdit?id=" + e.getId();
  				}
  				if (!MD5.md5(e.getOldPassword()).equals(user.getPassword())) {
  					flushAttrs.addFlashAttribute("errorMsg", "原密码不正确");
  					return "redirect:toEdit?id=" + e.getId();
  				}
  				if (!e.getNewpassword().equals(e.getNewpassword2())) {
  					flushAttrs.addFlashAttribute("errorMsg", "两次输入的密码不一致！");
  					return "redirect:toEdit?id=" + e.getId();
  				}
  				e.setPassword(MD5.md5(e.getNewpassword()));
  			}
  
  			e.setUpdateAccount(user.getUsername());
  			getService().update(e);
  			if(StringUtils.isNotBlank(e.getPassword())) {
  				return page_changePwd_result ;
  			}
  		}
  		flushAttrs.addFlashAttribute("message", "操作成功!");
  		return "redirect:back";
  	}
  
  
  
  
  	/**
  	 * 管理员个人信息
  	 * 
  	 * @param e
  	 * @param request
  	 * @param model
  	 * @return
  	 */
  	@RequestMapping("info")
  	public String info(@ModelAttribute("e") User e, HttpServletRequest request, ModelMap model) {
  		if (StringUtils.isBlank(request.getParameter("id"))) {
  			throw new NullPointerException("非法请求！");
  		}
  		int id = Integer.parseInt(request.getParameter("id"));
  		e.setId(id);
  		e = getService().selectOne(e);
  		model.addAttribute("e", e);
  		return page_info;
  	}
  
  	/**
  	 * 添加日志
  	 * 
  	 * @param u
  	 * @param log
  	 */
  	private void insertLog(User u, String log) {
  		Systemlog systemlog = new Systemlog();
  		systemlog.setTitle(log);
  		systemlog.setContent(log);
  		systemlog.setAccount(u.getUsername());
  		systemlog.setType(1);
  		systemlog.setLoginIp(AddressUtil.getIp(RequestHolder.getRequest()));
  
  		String address = null;
  		if (!systemlog.getLoginIp().equals("127.0.0.1") && !systemlog.getLoginIp().equals("localhost")) {
  			// 获取指定IP的区域位置
  			try {
  				address = AddressUtil.getAddress("ip=" + systemlog.getLoginIp(), "utf-8");
  			} catch (Exception e) {
  				e.printStackTrace();
  			}
  			systemlog.setLoginArea(address);
  
  			// 异地登陆的判断方法为：先比较本次登陆和上次登陆的区域位置，如果不一致，说明是异地登陆；如果获取不到区域，则比较IP地址，如果IP地址和上次的不一致，则是异地登陆
  			Systemlog firstSystemlog = systemlogService.selectFirstOne(u.getUsername());
  			if (firstSystemlog != null) {
  				if (StringUtils.isNotBlank(address) && StringUtils.isNotBlank(firstSystemlog.getLoginArea())) {
  					if (!address.equals(firstSystemlog.getLoginArea())) {
  						systemlog.setDiffAreaLogin(Systemlog.systemlog_diffAreaLogin_y);
  					}
  				} else if (StringUtils.isNotBlank(systemlog.getLoginIp())
  						&& StringUtils.isNotBlank(firstSystemlog.getLoginIp())) {
  					if (!systemlog.getLoginIp().equals(firstSystemlog.getLoginIp())) {
  						systemlog.setDiffAreaLogin(Systemlog.systemlog_diffAreaLogin_y);
  					}
  				}
  			}
  		}
  		systemlogService.insert(systemlog);
  	}
  
  	/**
  	 * 删除
  	 * @param request
  	 * @param user
  	 * @param flushAttrs
  	 * @return
       * @throws Exception
       */
  	@RequestMapping("delete")
  	public String update(HttpServletRequest request, @ModelAttribute("e") User user, RedirectAttributes flushAttrs) throws Exception {
  		userServiceImpl.delete(user);
  		addMessage(flushAttrs,"操作成功！");
  		return "redirect:selectList";
  	}
  
  	/**
  	 * 上传头像
  	 *
  	 * @param request
  	 * @param x
  	 * @param y
  	 * @param h
  	 * @param w
  	 * @param imageFile
       * @return
       * @throws Exception
       */
  	@RequestMapping(value = "/uploadHeadImage")
  	public String uploadHeadImage(
  			HttpServletRequest request,
  			@RequestParam(value = "x") String x,
  			@RequestParam(value = "y") String y,
  			@RequestParam(value = "h") String h,
  			@RequestParam(value = "w") String w,
  			@RequestParam(value = "imgFile") MultipartFile imageFile
  	) throws Exception{
  		User user = (User) RequestHolder.getSession().getAttribute("manage_session_user_info");
  		String realPath = request.getSession().getServletContext().getRealPath("/");
  		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  		String ymd = sdf.format(new Date());
  		String resourcePath = "attached/headPortrait/"+ymd+"/";//路径
  		if(imageFile!=null){
  			if(allowUpload(imageFile.getContentType())){
  				String fileName = rename(imageFile.getOriginalFilename());
  				int end = fileName.lastIndexOf(".");
  				String saveName = fileName.substring(0,end);
  				File dir = new File(realPath + resourcePath);
  				if(!dir.exists()){
  					dir.mkdirs();
  				}
  				InputStream is = imageFile.getInputStream();
  				String srcImagePath = realPath + resourcePath + saveName;
  				String savePath = resourcePath + saveName;
  				int imageX = Integer.parseInt(x);
  				int imageY = Integer.parseInt(y);
  				int imageH = Integer.parseInt(h);
  				int imageW = Integer.parseInt(w);
  				//这里开始截取操作
  				imgCut(is,srcImagePath,savePath,imageX,imageY,imageW,imageH);
  			}
  		}
  		return "redirect:toEdit?id="+user.getId();
  	}
  	/**
  	 * 截取图片
  	 * @param is
  	 * @param srcImageFile
  	 * @param x
  	 * @param y
  	 * @param desWidth
  	 * @param desHeight
  	 */
  	private void imgCut(InputStream is,String srcImageFile,String savePath, int x, int y, int desWidth,
  							  int desHeight) {
  		try {
  			HttpSession session = RequestHolder.getSession();
  			double ratio = 0.0;
  			Double r = 100.0;
  			Image img;
  			ImageFilter cropFilter;
  			BufferedImage bi = ImageIO.read(is);    //接收图片流
  			int srcWidth = bi.getWidth();
  			int srcHeight = bi.getHeight();
  			double d = (double) srcWidth/600;
  			x = (int)(x*d);
  			y = (int)(y*d);
  			desWidth = (int)(desWidth*d);
  			desHeight = (int)(desHeight*d);
  			if (srcWidth >= desWidth && srcHeight >= desHeight) {
  				ratio = (double)(r / desWidth);
  				Image image = bi.getScaledInstance(srcWidth, srcHeight,Image.SCALE_DEFAULT);
  				cropFilter = new CropImageFilter(x, y, desWidth, desHeight);
  				img = Toolkit.getDefaultToolkit().createImage(
  						new FilteredImageSource(image.getSource(), cropFilter));
  				BufferedImage tag = new BufferedImage(desWidth, desHeight,
  						BufferedImage.TYPE_INT_RGB);
  				int newWidth =(int)(tag.getWidth()*ratio);
  				int newHeight =(int)(tag.getHeight()*ratio);
  				BufferedImage bfImage= new BufferedImage(newWidth,newHeight,BufferedImage.TYPE_INT_RGB);
  				bfImage.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight,Image.SCALE_SMOOTH),0,0,null);
  				Graphics g = tag.getGraphics();
  				g.drawImage(img, 0, 0, null);
  				g.dispose();
  				//输出文件
  				ImageIO.write(bfImage, "JPEG", new File(srcImageFile+".jpg"));
  				User user = (User) RequestHolder.getSession().getAttribute("manage_session_user_info");
  				User u = new User();
  				u.setId(user.getId());
  				u.setPortrait(savePath+".jpg");
  				userServiceImpl.update(u);
  				u = userServiceImpl.selectById(u.getId());
  				session.setAttribute("manage_session_user_info", u);
  			}
  		} catch (Exception e) {
  			e.printStackTrace();
  		}
  	}
  	//允许的格式
  	public static final List<String> ALLOW_TYPES = Arrays.asList(
  			"image/jpg","image/jpeg","image/png","image/gif"
  	);
  	//文件重命名
  	public static String rename(String fileName){
  		int i = fileName.lastIndexOf(".");
  		String str = fileName.substring(i);
  		return new Date().getTime()+""+ new Random().nextInt(99999999) +str;
  	}
  	//校验文件类型是否是被允许的
  	public static boolean allowUpload(String postfix){
  		return ALLOW_TYPES.contains(postfix);
  	}
  
  
  	@RequestMapping("unique")
  	@ResponseBody
  	public String unique(@ModelAttribute("e") User e,HttpServletResponse response) throws IOException{
  		response.setCharacterEncoding("utf-8");//设置响应编码为utf-8
  		if(StringUtils.isNotBlank(e.getUsername())){
  			User user = new User();
  			user.setUsername(e.getUsername());
  			user = userServiceImpl.selectOne(user);
  
  			if(user==null){
  				return "{\"ok\":\"帐号可以使用!\"}";
  			}else{
  				return "{\"error\":\"帐号已经存在!\"}";
  			}
  		}else if(StringUtils.isNotBlank(e.getNickname())){
  			User user = new User();
  			user.setNickname(e.getNickname());
  			user = userServiceImpl.selectOne(user);
  			if(user==null){
  				return "{\"ok\":\"管理员名称可以使用!\"}";
  			}else{
  				if(e.getId()!=0 && e.getId()==user.getId()){
  					return "{}";
  				}else {
  					return "{\"error\":\"管理员名称已经存在!\"}";
  				}
  			}
  		}
  		return null;
  
  	}
  
  }
  