package com.learn.common;
import com.learn.model.SysUser;
import javax.servlet.http.HttpServletRequest;
public class RequestHolder {
private static final ThreadLocal userHolder = new ThreadLocal();
private static final ThreadLocal requestHolder = new ThreadLocal();
public static void add(SysUser sysUser) {
userHolder.set(sysUser);
}
public static void add(HttpServletRequest request) {
requestHolder.set(request);
}
public static SysUser getCurrentUser() {
return userHolder.get();
}
public static HttpServletRequest getCurrentRequest() {
return requestHolder.get();
}
public static void remove() {
userHolder.remove();
requestHolder.remove();
}
}
package com.learn.common;
import com.learn.util.JsonMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@Slf4j
public class HttpInterceptor extends HandlerInterceptorAdapter {
private static final String START_TIME = "requestStartTime";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURI().toString();
Map parameterMap = request.getParameterMap();
log.info("request start. url:{}, params:{}", url, JsonMapper.obj2String(parameterMap));
long start = System.currentTimeMillis();
request.setAttribute(START_TIME, start);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// String url = request.getRequestURI().toString();
// long start = (Long) request.getAttribute(START_TIME);
// long end = System.currentTimeMillis();
// log.info("request finished. url:{}, cost:{}", url, end - start);
removeThreadLocalInfo();
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String url = request.getRequestURI().toString();
long start = (Long) request.getAttribute(START_TIME);
long end = System.currentTimeMillis();
log.info("request completed. url:{}, cost:{}", url, end - start);
removeThreadLocalInfo();
}
public void removeThreadLocalInfo() {
RequestHolder.remove();
}
}
package com.learn.filter;
import com.learn.common.RequestHolder;
import com.learn.model.SysUser;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Slf4j
public class LoginFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
SysUser sysUser = (SysUser)req.getSession().getAttribute("user");
if (sysUser == null) {
String path = "/signin.jsp";
resp.sendRedirect(path);
return;
}
RequestHolder.add(sysUser);
RequestHolder.add(req);
filterChain.doFilter(servletRequest, servletResponse);
return;
}
public void destroy() {
}
}
loginFilter
com.learn.filter.LoginFilter
loginFilter
/sys/*
/admin/*
package com.learn.controller;
import com.learn.common.JsonData;
import com.learn.dto.DeptLevelDto;
import com.learn.param.DeptParam;
import com.learn.service.SysDeptService;
import com.learn.service.SysTreeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import java.util.List;
@Controller
@RequestMapping("/sys/dept")
@Slf4j
public class SysDeptController {
@Resource
private SysDeptService sysDeptService;
@RequestMapping("/save.json")
@ResponseBody
public JsonData saveDept(DeptParam param) {
sysDeptService.save(param);
return JsonData.success();
}
@RequestMapping("/update.json")
@ResponseBody
public JsonData updateDept(DeptParam param) {
sysDeptService.update(param);
return JsonData.success();
}
}
package com.learn.service;
import com.google.common.base.Preconditions;
import com.learn.common.RequestHolder;
import com.learn.dao.SysDeptMapper;
import com.learn.dao.SysUserMapper;
import com.learn.exception.ParamException;
import com.learn.model.SysDept;
import com.learn.param.DeptParam;
import com.learn.util.BeanValidator;
import com.learn.util.IpUtil;
import com.learn.util.LevelUtil;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@Service
public class SysDeptService {
@Resource
private SysDeptMapper sysDeptMapper;
@Resource
private SysUserMapper sysUserMapper;
@Resource
private SysLogService sysLogService;
public void save(DeptParam param) {
BeanValidator.check(param);
if(checkExist(param.getParentId(), param.getName(), param.getId())) {
throw new ParamException("同一层级下存在相同名称的部门");
}
SysDept dept = SysDept.builder().name(param.getName()).parentId(param.getParentId())
.seq(param.getSeq()).remark(param.getRemark()).build();
dept.setLevel(LevelUtil.calculateLevel(getLevel(param.getParentId()), param.getParentId()));
dept.setOperator(RequestHolder.getCurrentUser().getUsername());
dept.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest()));
dept.setOperateTime(new Date());
sysDeptMapper.insertSelective(dept);
sysLogService.saveDeptLog(null, dept);
}
public void update(DeptParam param) {
BeanValidator.check(param);
if(checkExist(param.getParentId(), param.getName(), param.getId())) {
throw new ParamException("同一层级下存在相同名称的部门");
}
SysDept before = sysDeptMapper.selectByPrimaryKey(param.getId());
Preconditions.checkNotNull(before, "待更新的部门不存在");
if(checkExist(param.getParentId(), param.getName(), param.getId())) {
throw new ParamException("同一层级下存在相同名称的部门");
}
SysDept after = SysDept.builder().id(param.getId()).name(param.getName()).parentId(param.getParentId())
.seq(param.getSeq()).remark(param.getRemark()).build();
after.setLevel(LevelUtil.calculateLevel(getLevel(param.getParentId()), param.getParentId()));
after.setOperator(RequestHolder.getCurrentUser().getUsername());
after.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest()));
after.setOperateTime(new Date());
updateWithChild(before, after);
sysLogService.saveDeptLog(before, after);
}
}
package com.learn.service;
import com.google.common.base.Preconditions;
import com.learn.beans.PageQuery;
import com.learn.beans.PageResult;
import com.learn.common.RequestHolder;
import com.learn.dao.SysUserMapper;
import com.learn.exception.ParamException;
import com.learn.model.SysUser;
import com.learn.param.UserParam;
import com.learn.util.BeanValidator;
import com.learn.util.IpUtil;
import com.learn.util.MD5Util;
import com.learn.util.PasswordUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@Service
public class SysUserService {
@Resource
private SysUserMapper sysUserMapper;
@Resource
private SysLogService sysLogService;
public void save(UserParam param) {
BeanValidator.check(param);
if(checkTelephoneExist(param.getTelephone(), param.getId())) {
throw new ParamException("电话已被占用");
}
if(checkEmailExist(param.getMail(), param.getId())) {
throw new ParamException("邮箱已被占用");
}
String password = PasswordUtil.randomPassword();
//TODO:
password = "12345678";
String encryptedPassword = MD5Util.encrypt(password);
SysUser user = SysUser.builder().username(param.getUsername()).telephone(param.getTelephone()).mail(param.getMail())
.password(encryptedPassword).deptId(param.getDeptId()).status(param.getStatus()).remark(param.getRemark()).build();
user.setOperator(RequestHolder.getCurrentUser().getUsername());
user.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest()));
user.setOperateTime(new Date());
// TODO: sendEmail
sysUserMapper.insertSelective(user);
sysLogService.saveUserLog(null, user);
}
public void update(UserParam param) {
BeanValidator.check(param);
if(checkTelephoneExist(param.getTelephone(), param.getId())) {
throw new ParamException("电话已被占用");
}
if(checkEmailExist(param.getMail(), param.getId())) {
throw new ParamException("邮箱已被占用");
}
SysUser before = sysUserMapper.selectByPrimaryKey(param.getId());
Preconditions.checkNotNull(before, "待更新的用户不存在");
SysUser after = SysUser.builder().id(param.getId()).username(param.getUsername()).telephone(param.getTelephone()).mail(param.getMail())
.deptId(param.getDeptId()).status(param.getStatus()).remark(param.getRemark()).build();
after.setOperator(RequestHolder.getCurrentUser().getUsername());
after.setOperateIp(IpUtil.getRemoteIp(RequestHolder.getCurrentRequest()));
after.setOperateTime(new Date());
sysUserMapper.updateByPrimaryKeySelective(after);
sysLogService.saveUserLog(before, after);
}
}