Commit 8a2860f6 by ypenglv
2 parents b04eadb0 65fe01cd
package org.nafmii.admin.user.controller;
import com.github.pagehelper.PageHelper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.nafmii.admin.user.param.EditMenuParam;
import org.nafmii.admin.user.param.QueryMenusParam;
import org.nafmii.admin.user.service.ICenterMenuService;
import org.nafmii.admin.user.vo.CenterMenuVO;
import org.nafmii.common.param.BeanTransferUtils;
import org.nafmii.common.param.PageResult;
import org.nafmii.common.response.ApiResponse;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* <p>
* 中心端菜单表 前端控制器
* </p>
*
* @author suncq
* @since 2021-04-28
*/
@RestController
@RequestMapping("/nafmii/admin/menu")
@Api(tags = "3.0.0", description = "中心端菜单接口")
public class CenterMenuController {
@Resource
private ICenterMenuService centerMenuService;
@ApiOperation( value = "中心端新增修改菜单",notes = "中心端新增修改菜单")
@PostMapping("/edit")
@ResponseBody
public ApiResponse editMenus (@RequestBody @Validated EditMenuParam param){
ApiResponse result = centerMenuService.editMenu(param);
return result;
}
@ApiOperation( value = "中心端菜单列表查询",notes = "中心端菜单列表查询")
@PostMapping("/queryMenuList")
@ResponseBody
public ApiResponse<List<CenterMenuVO>> queryMenuList (@RequestBody @Validated QueryMenusParam param){
PageHelper.startPage(param.getPageNum(),param.getPageSize());
PageResult<CenterMenuVO> result =
BeanTransferUtils.toPagedResult(centerMenuService.queryMenuList(param), CenterMenuVO.class);
return new ApiResponse(result);
}
@ApiOperation( value = "中心端菜单删除",notes = "中心端菜单删除")
@PostMapping("/delete")
@ResponseBody
public ApiResponse deleteMenus(@RequestParam Long[] ids){
ApiResponse result = centerMenuService.deleteMenus(ids);
return result;
}
@ApiOperation( value = "中心端用户对应菜单查询",notes = "中心端用户对应菜单查询")
@PostMapping("/queryUserMenus")
@ResponseBody
public ApiResponse queryUserMenus (){
ApiResponse result = centerMenuService.queryUserMenus();
return result;
}
}
package org.nafmii.admin.user.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.nafmii.admin.user.dto.QueryMenusDto;
import org.nafmii.admin.user.entity.CenterMenuPO;
import org.nafmii.admin.user.vo.CenterMenuVO;
import java.util.List;
/**
* <p>
* 中心端菜单表 Mapper 接口
* </p>
*
* @author suncq
* @since 2021-04-28
*/
public interface CenterMenuMapper extends BaseMapper<CenterMenuPO> {
/**
* @author:suncq
* @Function:中心端菜单新增修改
* @date 2021/4/27
* @ClassName:
* @version:
* @remark:
*/
int updateMenuById(CenterMenuPO centerMenuPO);
/**
* @author:suncq
* @Function:中心端菜单列表查询
* @date 2021/4/27
* @ClassName:
* @version:
* @remark:
*/
List<CenterMenuVO> queryMenuList(QueryMenusDto dto);
/**
* @author:suncq
* @Function:中心端菜单删除
* @date 2021/4/27
* @ClassName:
* @version:
* @remark:
*/
int deleteMenus(Long[] ids);
/**
* @author:suncq
* @Function:中心端用户对应菜单查询
* @date 2021/4/27
* @ClassName:
* @version:
* @remark:
*/
List<CenterMenuVO> queryUserMenus(Long userid);
}
package org.nafmii.admin.user.dto;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* <p>
* 中心端菜单表
* </p>
*
* @author suncq
* @since 2021-04-28
*/
@Data
@ApiModel("中心端菜单参数对象")
public class CenterMenuDTO extends Model {
@ApiModelProperty(value = "主键")
private Long id;
@ApiModelProperty(value = "菜单名称")
private String menuName;
@ApiModelProperty(value = "菜单级别")
private Integer menuLevle;
@ApiModelProperty(value = "父级主键")
private Long parentId;
@ApiModelProperty(value = "排序字段")
private Integer orderSeq;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;
@ApiModelProperty(value = "启用禁用 0 启用 1 禁用")
private String isEnable;
@ApiModelProperty(value = "创建人")
private Long createUserId;
@ApiModelProperty(value = "修改人")
private Long updateUserId;
}
package org.nafmii.admin.user.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.nafmii.common.param.PageQuery;
import java.time.LocalDate;
/**
* @author lvyp
* @date 2021/4/28
*/
@Data
@ApiModel(value = "菜单列表查询数据交互类型")
public class QueryMenusDto extends PageQuery {
@ApiModelProperty(value = "创建开始时间")
private LocalDate startCreateTime;
@ApiModelProperty(value = "创建结束时间")
private LocalDate endCreateTime;
}
package org.nafmii.admin.user.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 中心端菜单表
* </p>
*
* @author suncq
* @since 2021-04-28
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("CENTER_MENU")
@ApiModel(value="CenterMenuPO对象", description="中心端菜单表")
public class CenterMenuPO extends Model {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键")
@TableId("ID")
private Long id;
@ApiModelProperty(value = "菜单名称")
@TableField("MENU_NAME")
private String menuName;
@ApiModelProperty(value = "菜单级别")
@TableField("MENU_LEVLE")
private Integer menuLevle;
@ApiModelProperty(value = "父级主键")
@TableField("PARENT_ID")
private Long parentId;
@ApiModelProperty(value = "排序字段")
@TableField("ORDER_SEQ")
private Integer orderSeq;
@ApiModelProperty(value = "创建时间")
@TableField("CREATE_TIME")
private LocalDateTime createTime;
@ApiModelProperty(value = "更新时间")
@TableField("UPDATE_TIME")
private LocalDateTime updateTime;
@ApiModelProperty(value = "启用禁用 0 启用 1 禁用")
@TableField("IS_ENABLE")
private String isEnable;
@ApiModelProperty(value = "创建人")
@TableField("CREATE_USER_ID")
private Long createUserId;
@ApiModelProperty(value = "修改人")
@TableField("UPDATE_USER_ID")
private Long updateUserId;
}
package org.nafmii.admin.user.param;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
/**
* <p>
* 中心端菜单表
* </p>
*
* @author suncq
* @since 2021-04-28
*/
@Data
@ApiModel(value="菜单列表新增修改入参对象")
public class EditMenuParam extends Model {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键")
private Long id;
@ApiModelProperty(value = "菜单名称")
@NotNull(message = "菜单名称不能为空")
private String menuName;
@ApiModelProperty(value = "菜单级别")
@NotNull(message = "菜单级别不能为空")
private Integer menuLevle;
@ApiModelProperty(value = "父级主键")
@NotNull(message = "父级主键不能为空")
private Long parentId;
@ApiModelProperty(value = "排序字段")
@NotNull(message = "排序字段不能为空")
private Integer orderSeq;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;
@ApiModelProperty(value = "启用禁用 0 启用 1 禁用")
@NotNull(message = "启用禁用不能为空")
private String isEnable;
@ApiModelProperty(value = "创建人")
private Long createUserId;
@ApiModelProperty(value = "修改人")
private Long updateUserId;
}
package org.nafmii.admin.user.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.nafmii.common.param.PageQuery;
import java.time.LocalDate;
/**
* @author suncq
* @date 2021/4/28
*/
@Data
@ApiModel(value="菜单列表查询入参对象")
public class QueryMenusParam extends PageQuery {
@ApiModelProperty(value = "创建开始时间 yyyy-MM-dd")
private LocalDate startCreateTime;
@ApiModelProperty(value = "创建结束时间 yyyy-MM-dd")
private LocalDate endCreateTime;
}
package org.nafmii.admin.user.service;
import org.nafmii.admin.user.param.EditMenuParam;
import org.nafmii.admin.user.param.QueryMenusParam;
import org.nafmii.admin.user.vo.CenterMenuVO;
import org.nafmii.common.response.ApiResponse;
import java.util.List;
/**
* <p>
* 中心端菜单表 服务类
* </p>
*
* @author suncq
* @since 2021-04-28
*/
public interface ICenterMenuService{
/**
* @author:suncq
* @Function:中心端菜单新增修改
* @date 2021/4/27
* @ClassName:
* @version:
* @remark:
*/
ApiResponse editMenu(EditMenuParam param);
/**
* @author:suncq
* @Function:中心端菜单查询
* @date 2021/4/27
* @ClassName:
* @version:
* @remark:
*/
List<CenterMenuVO> queryMenuList(QueryMenusParam param);
/**
* @author:suncq
* @Function:中心端菜单删除
* @date 2021/4/27
* @ClassName:
* @version:
* @remark:
*/
ApiResponse deleteMenus(Long[] ids);
/**
* @author:suncq
* @Function:中心端用户对应菜单查询
* @date 2021/4/27
* @ClassName:
* @version:
* @remark:
*/
ApiResponse queryUserMenus();
}
package org.nafmii.admin.user.service.impl;
import org.nafmii.admin.user.dao.CenterMenuMapper;
import org.nafmii.admin.user.dto.QueryMenusDto;
import org.nafmii.admin.user.entity.CenterMenuPO;
import org.nafmii.admin.user.param.EditMenuParam;
import org.nafmii.admin.user.param.QueryMenusParam;
import org.nafmii.admin.user.service.ICenterMenuService;
import org.nafmii.admin.user.vo.CenterMenuVO;
import org.nafmii.common.constant.MessageEnum;
import org.nafmii.common.param.BeanTransferUtils;
import org.nafmii.common.response.ApiResponse;
import org.nafmii.common.utils.RequestUtils;
import org.nafmii.common.utils.SnowFlakeUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
/**
* <p>
* 中心端菜单表 服务实现类
* </p>
*
* @author suncq
* @since 2021-04-28
*/
@Service
public class CenterMenuServiceImpl implements ICenterMenuService {
@Resource
private CenterMenuMapper centerMenuMapper;
/**
* 中心端菜单新增修改
* @param param
* @return
*/
@Override
public ApiResponse editMenu(EditMenuParam param) {
Long menuId = param.getId();
if(null == menuId){//新增
CenterMenuPO cmp = new CenterMenuPO();
cmp.setId(SnowFlakeUtil.nextId());
cmp.setMenuName(param.getMenuName());
cmp.setMenuLevle(param.getMenuLevle());
cmp.setOrderSeq(param.getOrderSeq());
cmp.setParentId(param.getParentId());
cmp.setIsEnable(param.getIsEnable());
cmp.setCreateUserId(RequestUtils.getUserId());
cmp.setUpdateUserId(RequestUtils.getUserId());
cmp.setCreateTime(LocalDateTime.now());
cmp.setUpdateTime(LocalDateTime.now());
int i = centerMenuMapper.insert(cmp);
if (i < 0){
return new ApiResponse(ApiResponse.FAIL,ApiResponse.FAIL_TEXT);
}else{
return new ApiResponse(ApiResponse.SUCCESS,ApiResponse.SUCCESS_TEXT);
}
}else{//修改
CenterMenuPO cmp = new CenterMenuPO();
cmp.setId(param.getId());
cmp.setMenuName(param.getMenuName());
cmp.setMenuLevle(param.getMenuLevle());
cmp.setOrderSeq(param.getOrderSeq());
cmp.setParentId(param.getParentId());
cmp.setIsEnable(param.getIsEnable());
cmp.setUpdateUserId(param.getCreateUserId());
cmp.setUpdateTime(LocalDateTime.now());
int i = centerMenuMapper.updateMenuById(cmp);
if (i < 0){
return new ApiResponse(ApiResponse.FAIL,ApiResponse.FAIL_TEXT);
}else{
return new ApiResponse(ApiResponse.SUCCESS,ApiResponse.SUCCESS_TEXT);
}
}
}
/**
* 中心端菜单查询
* @param
* @return
*/
@Override
public List<CenterMenuVO> queryMenuList(QueryMenusParam param) {
QueryMenusDto dto = BeanTransferUtils.transfer(param, QueryMenusDto.class);
return centerMenuMapper.queryMenuList(dto);
}
/**
* 中心端菜单删除
* @param
* @return
*/
@Override
public ApiResponse deleteMenus(Long[] ids) {
int result = centerMenuMapper.deleteMenus(ids);
if (result < 0){
return new ApiResponse(ApiResponse.FAIL,ApiResponse.FAIL_TEXT);
}else{
return new ApiResponse(ApiResponse.SUCCESS,ApiResponse.SUCCESS_TEXT);
}
}
/**
* 中心端用户对应菜单查询
* @param
* @return
*/
@Override
public ApiResponse queryUserMenus() {
Long userid = RequestUtils.getUserId();
List<CenterMenuVO> result = centerMenuMapper.queryUserMenus(userid);
return new ApiResponse(ApiResponse.SUCCESS,ApiResponse.SUCCESS_TEXT,result);
}
}
package org.nafmii.admin.user.vo;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* <p>
* 中心端菜单表
* </p>
*
* @author suncq
* @since 2021-04-28
*/
@Data
@ApiModel("菜单返回报文")
public class CenterMenuVO extends Model {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键")
private Long id;
@ApiModelProperty(value = "菜单名称")
private String menuName;
@ApiModelProperty(value = "菜单级别")
private Integer menuLevle;
@ApiModelProperty(value = "父级主键")
private Long parentId;
@ApiModelProperty(value = "排序字段")
private Integer orderSeq;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;
@ApiModelProperty(value = "启用禁用 0 启用 1 禁用")
private String isEnable;
@ApiModelProperty(value = "创建人")
private Long createUserId;
@ApiModelProperty(value = "修改人")
private Long updateUserId;
}
<?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="org.nafmii.admin.user.dao.CenterMenuMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="org.nafmii.admin.user.entity.CenterMenuPO">
<id column="ID" property="id" />
<result column="MENU_NAME" property="menuName" />
<result column="MENU_LEVLE" property="menuLevle" />
<result column="PARENT_ID" property="parentId" />
<result column="ORDER_SEQ" property="orderSeq" />
<result column="CREATE_TIME" property="createTime" />
<result column="UPDATE_TIME" property="updateTime" />
<result column="IS_ENABLE" property="isEnable" />
<result column="CREATE_USER_ID" property="createUserId" />
<result column="UPDATE_USER_ID" property="updateUserId" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
ID, MENU_NAME, MENU_LEVLE, PARENT_ID, ORDER_SEQ, CREATE_TIME, UPDATE_TIME, IS_ENABLE, CREATE_USER_ID, UPDATE_USER_ID
</sql>
<!-- 新增修改中心端角色 -->
<update id="updateMenuById" parameterType="map" >
update CENTER_MENU
<set >
<if test="menuName != null" >
MENU_NAME = #{menuName,jdbcType=VARCHAR},
</if>
<if test="menuLevle != null" >
MENU_LEVLE = #{menuLevle,jdbcType=INTEGER},
</if>
<if test="parentId != null" >
PARENT_ID = #{parentId,jdbcType=BIGINT},
</if>
<if test="orderSeq != null" >
ORDER_SEQ = #{orderSeq,jdbcType=INTEGER},
</if>
<if test="createTime != null" >
CREATE_TIME = #{createTime,jdbcType=BIGINT},
</if>
<if test="updateTime != null" >
UPDATE_TIME = #{updateTime,jdbcType=BIGINT},
</if>
<if test="isEnable != null" >
IS_ENABLE = #{isEnable,jdbcType=VARCHAR},
</if>
<if test="createUserId != null" >
CREATE_USER_ID = #{createUserId,jdbcType=BIGINT},
</if>
<if test="updateUserId != null" >
UPDATE_USER_ID = #{updateUserId,jdbcType=BIGINT},
</if>
</set>
where ID = #{id,jdbcType=BIGINT}
</update>
<!-- 查询中心端菜单 -->
<select id="queryMenuList" parameterType="org.nafmii.admin.user.dto.CenterMenuDTO"
resultType="org.nafmii.admin.user.vo.CenterMenuVO">
select
ID as id, MENU_NAME as menuName, MENU_LEVLE as menuLevle, PARENT_ID as parentId, ORDER_SEQ as orderSeq,
CREATE_TIME as createTime, UPDATE_TIME as updateTime, IS_ENABLE as isEnable, CREATE_USER_ID as createUserId,
UPDATE_USER_ID as updateUserId
from CENTER_MENU
<where>
<if test="startCreateTime != null and endCreateTime != null">
DATE_FORMAT(CREATE_TIME,'%Y-%m-%d') BETWEEN #{startCreateTime} and #{endCreateTime}
</if>
</where>
</select>
<!-- 删除中心端菜单 -->
<update id="deleteMenus">
update
CENTER_MENU
set IS_ENABLE = "1"
where
ID IN
<foreach collection="array" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
<!-- 中心端用户对应菜单查询 -->
<select id="queryUserMenus" parameterType="map" resultType="org.nafmii.admin.user.vo.CenterMenuVO">
SELECT
cm.ID as id, cm.MENU_NAME as menuName, cm.MENU_LEVLE as menuLevle, cm.PARENT_ID as parentId, cm.ORDER_SEQ as orderSeq,
cm.CREATE_TIME as createTime,cm.UPDATE_TIME as updateTime, cm.IS_ENABLE as isEnable, cm.CREATE_USER_ID as createUserId,
cm.UPDATE_USER_ID as updateUserId
FROM
CENTER_MENU cm
INNER JOIN CENTER_ROLE_MENU crm ON cm.id = crm.menu_id
INNER JOIN CENTER_USER_ROLE cur ON cur.role_id = crm.role_id
INNER JOIN CENTER_USER cu ON cur.user_id = cu.id
WHERE
cu.id = #{userid,jdbcType=BIGINT}
</select>
</mapper>
......@@ -100,7 +100,7 @@ public class UserServiceImpl implements UserService {
//查询用户信息通过手机号
UserVO userVO = appUserMapper.selectByPhone(registerDto.getPhone());
if (null != userVO){
throw new BusinessException("该用户已注册");
return new ApiResponse(ApiResponse.FAIL,"该用户已注册");
}
//用户实体类
AppUserPO appUser = new AppUserPO();
......@@ -112,7 +112,7 @@ public class UserServiceImpl implements UserService {
appUser.setPhone(registerDto.getPhone());
//判断注册密码和再次输入密码
if (!registerDto.getLoginPwd().equals(registerDto.getConfirmPwd())){
throw new BusinessException("两次密码输入不相同,请再次输入");
return new ApiResponse(ApiResponse.FAIL,"两次密码输入不相同,请再次输入");
}
appUser.setLoginPwd(registerDto.getLoginPwd());
appUser.setCreateTime(LocalDateTime.now());
......@@ -125,16 +125,16 @@ public class UserServiceImpl implements UserService {
String code = stringRedisTemplate.opsForValue().get(USER_CODE_KEY+registerDto.getPhone());
log.info("冲缓存中获取的验证码===============》{}",code);
if (null == code){
throw new BusinessException("验证码已过期");
return new ApiResponse(ApiResponse.FAIL,"验证码已过期");
}
if (!code.equals(registerDto.getCode())){
throw new BusinessException("验证码错误请重新输入");
return new ApiResponse(ApiResponse.FAIL,"验证码错误请重新输入");
}
int i = appUserMapper.insert(appUser);
if (i<0){
return new ApiResponse().fail("新增失败");
return new ApiResponse(ApiResponse.FAIL,"新增失败");
}
return new ApiResponse();
return new ApiResponse(ApiResponse.SUCCESS,"新增成功");
}
/**
......@@ -152,21 +152,21 @@ public class UserServiceImpl implements UserService {
//密码登陆
userVo = appUserMapper.selectByPassword(loginDto);
if (null == userVo){
throw new BusinessException("请先注册");
return new ApiResponse(ApiResponse.FAIL,"请先注册");
}
}else{
//验证码登陆
String code = stringRedisTemplate.opsForValue().get(USER_CODE_KEY+loginDto.getPhone());
log.info("冲redis中获取的验证码===============》{}",code);
if (null == code){
throw new BusinessException("验证码已过期");
return new ApiResponse(ApiResponse.FAIL,"验证码已过期");
}
if (!code.equals(loginDto.getCode())){
throw new BusinessException("验证码错误请重新输入");
return new ApiResponse(ApiResponse.FAIL,"验证码错误请重新输入");
}
userVo = appUserMapper.selectByPhone(loginDto.getPhone());
if (null != userVo){
throw new BusinessException("请先注册");
return new ApiResponse(ApiResponse.FAIL,"请先注册");
}
}
Map<String,Object> map = new HashMap<>();
......
......@@ -162,6 +162,11 @@
<version>3.9</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.1.0</version>
......
package org.nafmii.common.excle;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import java.lang.reflect.*;
/**
* 反射工具类.
* 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.
*
* @author calvin
* @version 2013-01-15
*/
@SuppressWarnings("rawtypes")
public class Reflections {
private static final String SETTER_PREFIX = "set";
private static final String GETTER_PREFIX = "get";
private static final String CGLIB_CLASS_SEPARATOR = "$$";
private static Logger logger = LoggerFactory.getLogger(Reflections.class);
/**
* 调用Getter方法.
* 支持多级,如:对象名.对象名.方法
*/
public static Object invokeGetter(Object obj, String propertyName) {
Object object = obj;
for (String name : StringUtils.split(propertyName, ".")) {
String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name);
object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{});
}
return object;
}
/**
* 调用Setter方法, 仅匹配方法名。
* 支持多级,如:对象名.对象名.方法
*/
public static void invokeSetter(Object obj, String propertyName, Object value) {
Object object = obj;
String[] names = StringUtils.split(propertyName, ".");
for (int i = 0; i < names.length; i++) {
if (i < names.length - 1) {
String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]);
object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{});
} else {
String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]);
invokeMethodByName(object, setterMethodName, new Object[]{value});
}
}
}
/**
* 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
*/
public static Object getFieldValue(final Object obj, final String fieldName) {
Field field = getAccessibleField(obj, fieldName);
if (field == null) {
throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + obj + "]");
}
Object result = null;
try {
result = field.get(obj);
} catch (IllegalAccessException e) {
logger.error("不可能抛出的异常{}", e.getMessage());
}
return result;
}
/**
* 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数.
*/
public static void setFieldValue(final Object obj, final String fieldName, final Object value) {
Field field = getAccessibleField(obj, fieldName);
if (field == null) {
throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + obj + "]");
}
try {
field.set(obj, value);
} catch (IllegalAccessException e) {
logger.error("不可能抛出的异常:{}", e.getMessage());
}
}
/**
* 直接调用对象方法, 无视private/protected修饰符.
* 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用.
* 同时匹配方法名+参数类型,
*/
public static Object invokeMethod(final Object obj, final String methodName, final Class<?>[] parameterTypes,
final Object[] args) {
Method method = getAccessibleMethod(obj, methodName, parameterTypes);
if (method == null) {
throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + obj + "]");
}
try {
return method.invoke(obj, args);
} catch (Exception e) {
throw convertReflectionExceptionToUnchecked(e);
}
}
/**
* 直接调用对象方法, 无视private/protected修饰符,
* 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用.
* 只匹配函数名,如果有多个同名函数调用第一个。
*/
public static Object invokeMethodByName(final Object obj, final String methodName, final Object[] args) {
Method method = getAccessibleMethodByName(obj, methodName);
if (method == null) {
throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + obj + "]");
}
try {
return method.invoke(obj, args);
} catch (Exception e) {
throw convertReflectionExceptionToUnchecked(e);
}
}
/**
* 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问.
* <p>
* 如向上转型到Object仍无法找到, 返回null.
*/
public static Field getAccessibleField(final Object obj, final String fieldName) {
Validate.notNull(obj, "object can't be null");
Validate.notBlank(fieldName, "fieldName can't be blank");
for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) {
try {
Field field = superClass.getDeclaredField(fieldName);
makeAccessible(field);
return field;
} catch (NoSuchFieldException e) {//NOSONAR
// Field不在当前类定义,继续向上转型
continue;// new add
}
}
return null;
}
/**
* 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
* 如向上转型到Object仍无法找到, 返回null.
* 匹配函数名+参数类型。
* <p>
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
*/
public static Method getAccessibleMethod(final Object obj, final String methodName,
final Class<?>... parameterTypes) {
Validate.notNull(obj, "object can't be null");
Validate.notBlank(methodName, "methodName can't be blank");
for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) {
try {
Method method = searchType.getDeclaredMethod(methodName, parameterTypes);
makeAccessible(method);
return method;
} catch (NoSuchMethodException e) {
// Method不在当前类定义,继续向上转型
continue;// new add
}
}
return null;
}
/**
* 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
* 如向上转型到Object仍无法找到, 返回null.
* 只匹配函数名。
* <p>
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
*/
public static Method getAccessibleMethodByName(final Object obj, final String methodName) {
Validate.notNull(obj, "object can't be null");
Validate.notBlank(methodName, "methodName can't be blank");
for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) {
Method[] methods = searchType.getDeclaredMethods();
for (Method method : methods) {
if (method.getName().equals(methodName)) {
makeAccessible(method);
return method;
}
}
}
return null;
}
/**
* 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
*/
public static void makeAccessible(Method method) {
if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers()))
&& !method.isAccessible()) {
method.setAccessible(true);
}
}
/**
* 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
*/
public static void makeAccessible(Field field) {
if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) || Modifier
.isFinal(field.getModifiers())) && !field.isAccessible()) {
field.setAccessible(true);
}
}
/**
* 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处
* 如无法找到, 返回Object.class.
* eg.
* public UserDao extends HibernateDao<User>
*
* @param clazz The class to introspect
* @return the first generic declaration, or Object.class if cannot be determined
*/
@SuppressWarnings("unchecked")
public static <T> Class<T> getClassGenricType(final Class clazz) {
return getClassGenricType(clazz, 0);
}
/**
* 通过反射, 获得Class定义中声明的父类的泛型参数的类型.
* 如无法找到, 返回Object.class.
* <p>
* 如public UserDao extends HibernateDao<User,Long>
*
* @param clazz clazz The class to introspect
* @param index the Index of the generic ddeclaration,start from 0.
* @return the index generic declaration, or Object.class if cannot be determined
*/
public static Class getClassGenricType(final Class clazz, final int index) {
Type genType = clazz.getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
logger.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
logger.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
+ params.length);
return Object.class;
}
if (!(params[index] instanceof Class)) {
logger.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
return Object.class;
}
return (Class) params[index];
}
public static Class<?> getUserClass(Object instance) {
Assert.notNull(instance, "Instance must not be null");
Class clazz = instance.getClass();
if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) {
Class<?> superClass = clazz.getSuperclass();
if (superClass != null && !Object.class.equals(superClass)) {
return superClass;
}
}
return clazz;
}
/**
* 将反射时的checked exception转换为unchecked exception.
*/
public static RuntimeException convertReflectionExceptionToUnchecked(Exception e) {
if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException
|| e instanceof NoSuchMethodException) {
return new IllegalArgumentException(e);
} else if (e instanceof InvocationTargetException) {
return new RuntimeException(((InvocationTargetException) e).getTargetException());
} else if (e instanceof RuntimeException) {
return (RuntimeException) e;
}
return new RuntimeException("Unexpected Checked Exception.", e);
}
}
package org.nafmii.common.excle.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Excel注解定义
* Created by tianc on 17/8/25.
*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelField {
/**
* 导出字段名(默认调用当前字段的“get”方法,如指定导出字段为对象,请填写“对象名.对象属性”,例:“area.name”、“office.name”)
*/
String value() default "";
/**
* 导出字段标题(需要添加批注请用“**”分隔,标题**批注,仅对导出模板有效)
*/
String title();
/**
* 字段类型(0:导出导入;1:仅导出;2:仅导入)
*/
int type() default 0;
/**
* 导出字段对齐方式(0:自动;1:靠左;2:居中;3:靠右)
*/
int align() default 0;
/**
* 导出字段字段排序(升序)
*/
int sort() default 0;
/**
* 如果是字典类型,请设置字典的type值
*/
String dictType() default "";
/**
* 反射类型
*/
Class<?> fieldType() default Class.class;
/**
* 字段归属组(根据分组导出导入)
*/
int[] groups() default {};
}
package org.nafmii.common.excle;
/**
* @author:zhoujh
* @Function:TODO
* @date 2021/4/29 15:35
* @ClassName:
* @version:
* @remark:
*/
public class test {
}
package org.nafmii.common.utils;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.nafmii.common.excle.Reflections;
import org.nafmii.common.excle.annotation.ExcelField;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
/**
* 导入Excel文件(支持“XLS”和“XLS”格式)
* Created by tianc on 17/8/25.
*/
public class ImportExcelUtils {
private static Logger log = LoggerFactory.getLogger(ImportExcelUtils.class);
/**
* 工作薄对象
*/
private Workbook wb;
/**
* 工作表对象
*/
private Sheet sheet;
/**
* 标题行号
*/
private int headerNum;
/**
* 构造函数
*
* @param fileName 导入文件,读取第一个工作表
* @param headerNum 标题行号,数据行号=标题行号+1
* @throws InvalidFormatException
* @throws IOException
*/
public ImportExcelUtils(String fileName, int headerNum)
throws InvalidFormatException, IOException {
this(new File(fileName), headerNum);
}
/**
* 构造函数
*
* @param file 导入文件对象,读取第一个工作表
* @param headerNum 标题行号,数据行号=标题行号+1
* @throws InvalidFormatException
* @throws IOException
*/
public ImportExcelUtils(File file, int headerNum)
throws InvalidFormatException, IOException {
this(file, headerNum, 0);
}
/**
* 构造函数
*
* @param fileName 导入文件
* @param headerNum 标题行号,数据行号=标题行号+1
* @param sheetIndex 工作表编号
* @throws InvalidFormatException
* @throws IOException
*/
public ImportExcelUtils(String fileName, int headerNum, int sheetIndex)
throws InvalidFormatException, IOException {
this(new File(fileName), headerNum, sheetIndex);
}
/**
* 构造函数
*
* @param file 导入文件对象
* @param headerNum 标题行号,数据行号=标题行号+1
* @param sheetIndex 工作表编号
* @throws InvalidFormatException
* @throws IOException
*/
public ImportExcelUtils(File file, int headerNum, int sheetIndex)
throws InvalidFormatException, IOException {
this(file.getName(), new FileInputStream(file), headerNum, sheetIndex);
}
/**
* 构造函数
*
* @param multipartFile 导入文件对象
* @param headerNum 标题行号,数据行号=标题行号+1
* @param sheetIndex 工作表编号
* @throws InvalidFormatException
* @throws IOException
*/
public ImportExcelUtils(MultipartFile multipartFile, int headerNum, int sheetIndex)
throws InvalidFormatException, IOException {
this(multipartFile.getOriginalFilename(), multipartFile.getInputStream(), headerNum, sheetIndex);
}
/**
* 构造函数
*
* @param fileName 导入文件对象
* @param headerNum 标题行号,数据行号=标题行号+1
* @param sheetIndex 工作表编号
* @throws InvalidFormatException
* @throws IOException
*/
public ImportExcelUtils(String fileName, InputStream is, int headerNum, int sheetIndex)
throws InvalidFormatException, IOException {
try{
if (fileName == null || fileName == "") {
throw new RuntimeException("导入文档为空!");
} else if (fileName.toLowerCase().endsWith("xls")) {
this.wb = new HSSFWorkbook(is);
} else if (fileName.toLowerCase().endsWith("xlsx")) {
this.wb = new XSSFWorkbook(is);
} else {
throw new RuntimeException("文档格式不正确!");
}
if (this.wb.getNumberOfSheets() < sheetIndex) {
throw new RuntimeException("文档中没有工作表!");
}
this.sheet = this.wb.getSheetAt(sheetIndex);
this.headerNum = headerNum;
log.debug("Initialize success.");
}finally {
is.close();
}
}
/**
* 获取行对象
*
* @param rownum
* @return
*/
public Row getRow(int rownum) {
return this.sheet.getRow(rownum);
}
/**
* 获取数据行号
*
* @return
*/
public int getDataRowNum() {
return headerNum + 1;
}
/**
* 获取最后一个数据行号
*
* @return
*/
public int getLastDataRowNum() {
return this.sheet.getLastRowNum() + headerNum;
}
/**
* 获取最后一个列号
*
* @return
*/
public int getLastCellNum() {
return this.getRow(headerNum).getLastCellNum();
}
/**
* 获取单元格值
*
* @param row 获取的行
* @param column 获取单元格列号
* @return 单元格值
*/
public Object getCellValue(Row row, int column) {
Object val = "";
try {
Cell cell = row.getCell(column);
if (cell != null) {
if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
val = cell.getNumericCellValue();
} else if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
val = cell.getStringCellValue();
} else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
val = cell.getCellFormula();
} else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
val = cell.getBooleanCellValue();
} else if (cell.getCellType() == Cell.CELL_TYPE_ERROR) {
val = cell.getErrorCellValue();
}
}
} catch (Exception e) {
return val;
}
return val;
}
/**
* 获取导入数据列表
*
* @param cls 导入对象类型
* @param groups 导入分组
*/
public <E> List<E> getDataList(Class<E> cls, int... groups) throws InstantiationException, IllegalAccessException {
List<Object[]> annotationList = Lists.newArrayList();
// Get annotation field
Field[] fs = cls.getDeclaredFields();
for (Field f : fs) {
ExcelField ef = f.getAnnotation(ExcelField.class);
if (ef != null && (ef.type() == 0 || ef.type() == 2)) {
if (groups != null && groups.length > 0) {
boolean inGroup = false;
for (int g : groups) {
if (inGroup) {
break;
}
for (int efg : ef.groups()) {
if (g == efg) {
inGroup = true;
annotationList.add(new Object[]{ef, f});
break;
}
}
}
} else {
annotationList.add(new Object[]{ef, f});
}
}
}
// Get annotation method
Method[] ms = cls.getDeclaredMethods();
for (Method m : ms) {
ExcelField ef = m.getAnnotation(ExcelField.class);
if (ef != null && (ef.type() == 0 || ef.type() == 2)) {
if (groups != null && groups.length > 0) {
boolean inGroup = false;
for (int g : groups) {
if (inGroup) {
break;
}
for (int efg : ef.groups()) {
if (g == efg) {
inGroup = true;
annotationList.add(new Object[]{ef, m});
break;
}
}
}
} else {
annotationList.add(new Object[]{ef, m});
}
}
}
// Field sorting
Collections.sort(annotationList, new Comparator<Object[]>() {
public int compare(Object[] o1, Object[] o2) {
return new Integer(((ExcelField) o1[0]).sort()).compareTo(
new Integer(((ExcelField) o2[0]).sort()));
}
});
//log.debug("Import column count:"+annotationList.size());
// Get excel data
List<E> dataList = Lists.newArrayList();
for (int i = this.getDataRowNum(); i < this.getLastDataRowNum(); i++) {
E e = cls.newInstance();
int column = 0;
Row row = this.getRow(i);
StringBuilder sb = new StringBuilder();
for (Object[] os : annotationList) {
Object val = this.getCellValue(row, column++);
if (val != null) {
ExcelField ef = (ExcelField) os[0];
// If is dict type, get dict value
// if (StringUtils.isNotBlank(ef.dictType())) {
// val = DictUtils.getDictValue(val.toString(), ef.dictType(), "");
// }
// Get param type and type cast
Class<?> valType = Class.class;
if (os[1] instanceof Field) {
valType = ((Field) os[1]).getType();
} else if (os[1] instanceof Method) {
Method method = ((Method) os[1]);
if ("get".equals(method.getName().substring(0, 3))) {
valType = method.getReturnType();
} else if ("set".equals(method.getName().substring(0, 3))) {
valType = ((Method) os[1]).getParameterTypes()[0];
}
}
//log.debug("Import value type: ["+i+","+column+"] " + valType);
try {
if (valType == String.class) {
String s = String.valueOf(val.toString());
if (s.endsWith(".0")) {
val = StringUtils.substringBefore(s, ".0");
} else {
val = String.valueOf(val.toString());
}
} else if (valType == Integer.class) {
val = Double.valueOf(val.toString()).intValue();
} else if (valType == Long.class) {
val = Double.valueOf(val.toString()).longValue();
} else if (valType == Double.class) {
val = Double.valueOf(val.toString());
} else if (valType == Float.class) {
val = Float.valueOf(val.toString());
} else if (valType == Date.class) {
val = DateUtil.getJavaDate((Double) val);
} else {
if (ef.fieldType() != Class.class) {
val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val.toString());
} else {
val = Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(),
"fieldtype." + valType.getSimpleName() + "Type")).getMethod("getValue", String.class).invoke(null, val.toString());
}
}
} catch (Exception ex) {
log.info("Get cell value [" + i + "," + column + "] error: " + ex.toString());
val = null;
}
// set entity value
if (os[1] instanceof Field) {
Reflections.invokeSetter(e, ((Field) os[1]).getName(), val);
} else if (os[1] instanceof Method) {
String mthodName = ((Method) os[1]).getName();
if ("get".equals(mthodName.substring(0, 3))) {
mthodName = "set" + StringUtils.substringAfter(mthodName, "get");
}
Reflections.invokeMethod(e, mthodName, new Class[]{valType}, new Object[]{val});
}
}
sb.append(val + ", ");
}
dataList.add(e);
log.debug("Read success: [" + i + "] " + sb.toString());
}
return dataList;
}
/**
* 导入测试
*/
public static void main(String[] args) throws Throwable {
// File file = new File("D:\\excle");
// if (!file.exists()){
// file.getParentFile().mkdir();
// }
ImportExcelUtils ei = new ImportExcelUtils("D:\\excle/test1.xlsx", 1);
for (int i = ei.getDataRowNum(); i < ei.getLastDataRowNum(); i++) {
Row row = ei.getRow(i);
for (int j = 0; j < ei.getLastCellNum(); j++) {
Object val = ei.getCellValue(row, j);
System.out.print(val+", ");
}
System.out.print("\n");
}
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!