ycl-common/pom.xml
@@ -27,6 +27,11 @@ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> ycl-common/src/main/java/com/ycl/annotation/LogSave.java
New file @@ -0,0 +1,13 @@ package com.ycl.annotation; import java.lang.annotation.*; @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface LogSave { String operationType() default ""; String contain() default ""; } ycl-common/src/main/java/com/ycl/aspect/LogAspect.java
New file @@ -0,0 +1,65 @@ package com.ycl.aspect; import com.ycl.annotation.LogSave; import com.ycl.bo.AdminUserDetails; import com.ycl.entity.user.UmsAdminLoginLog; import com.ycl.mapper.user.UmsAdminLoginLogMapper; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.Date; @Component @Aspect public class LogAspect { @Resource UmsAdminLoginLogMapper umsAdminLoginLogMapper; @Pointcut("@annotation(com.ycl.annotation.LogSave)") public void pointCut() { } @Before("pointCut()") public void handle(JoinPoint joinPoint) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); LogSave annotation = method.getAnnotation(LogSave.class); AdminUserDetails adminUserDetails = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); UmsAdminLoginLog loginLog = new UmsAdminLoginLog(); loginLog.setAdminId(adminUserDetails.getUserId()); loginLog.setCreateTime(new Date()); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); loginLog.setIp(request.getRemoteAddr()); String header = request.getHeader("user-agent"); if (header.contains("Windows NT")) { loginLog.setUserAgent("Web端"); } else if(header.contains("Android")) { loginLog.setUserAgent("Android端"); } else if(header.contains("iPhone")) { loginLog.setUserAgent("ios端"); } else if(header.contains("iPad")) { loginLog.setUserAgent("iPad端"); }else { loginLog.setUserAgent("Web端"); } loginLog.setOperationType(annotation.operationType()); loginLog.setContain(annotation.contain()); umsAdminLoginLogMapper.insert(loginLog); } } ycl-common/src/main/java/com/ycl/entity/user/AdminMenuRelation.java
New file @@ -0,0 +1,49 @@ package com.ycl.entity.user; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; /** * <p> * 后台用户菜单关系表 * </p> * * @author zhanghua * @since 2022-10-12 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("ums_admin_menu_relation") public class AdminMenuRelation implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 角色ID */ @TableField("admin_id") private Long adminId; /** * 菜单ID */ @TableField("menu_id") private Long menuId; /** * 是否启用(1启用) */ @TableField("is_start") private Integer isStart; } ycl-common/src/main/java/com/ycl/entity/user/UmsAdminLoginLog.java
@@ -41,5 +41,9 @@ @ApiModelProperty(value = "浏览器登录类型") private String userAgent; @ApiModelProperty(value = "操作类型") private String operationType; @ApiModelProperty(value = "操作内容") private String contain; } ycl-common/src/main/java/com/ycl/entity/user/vo/UmsMenuVo.java
@@ -23,10 +23,10 @@ @Data @EqualsAndHashCode(callSuper = false) @TableName("ums_menu") @ApiModel(value="UmsMenuVo对象", description="自定义菜单输出") @ApiModel(value = "UmsMenuVo对象", description = "自定义菜单输出") public class UmsMenuVo implements Serializable { private static final long serialVersionUID=1L; private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; @@ -55,5 +55,11 @@ @ApiModelProperty(value = "前端隐藏") private Integer hidden; @ApiModelProperty(value = "关系id") private Long relationId; @ApiModelProperty(value = "是否开启") private Integer isStart; List<UmsMenuVo> menuVoArrayList; } ycl-common/src/main/java/com/ycl/mapper/user/AdminMenuRelationMapper.java
New file @@ -0,0 +1,16 @@ package com.ycl.mapper.user; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.entity.user.AdminMenuRelation; /** * <p> * 后台角色菜单关系表 Mapper 接口 * </p> * * @author zhanghua * @since 2022-10-12 */ public interface AdminMenuRelationMapper extends BaseMapper<AdminMenuRelation> { } ycl-common/src/main/java/com/ycl/mapper/user/UmsMenuMapper.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.entity.user.UmsMenu; import com.ycl.entity.user.vo.UmsMenuVo; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -25,4 +26,6 @@ */ List<UmsMenu> getMenuListByRoleId(@Param("roleId") Long roleId); List<UmsMenuVo> adminMenuRelation(@Param("id") Long id); } ycl-common/src/main/java/com/ycl/service/user/IAdminMenuRelationService.java
New file @@ -0,0 +1,16 @@ package com.ycl.service.user; import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.entity.user.AdminMenuRelation; /** * <p> * 后台角色菜单关系表 服务类 * </p> * * @author zhanghua * @since 2022-10-12 */ public interface IAdminMenuRelationService extends IService<AdminMenuRelation> { } ycl-common/src/main/java/com/ycl/service/user/UmsMenuService.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.dto.UmsMenuNode; import com.ycl.entity.user.UmsMenu; import com.ycl.entity.user.vo.UmsMenuVo; import java.util.List; @@ -37,4 +38,7 @@ * 修改菜单显示状态 */ boolean updateHidden(Long id, Integer hidden); List<UmsMenuVo> ListTreeMyself(Long id); } ycl-common/src/main/java/com/ycl/service/user/impl/AdminMenuRelationServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.ycl.service.user.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.entity.user.AdminMenuRelation; import com.ycl.mapper.user.AdminMenuRelationMapper; import com.ycl.service.user.IAdminMenuRelationService; import org.springframework.stereotype.Service; /** * <p> * 后台角色菜单关系表 服务实现类 * </p> * * @author zhanghua * @since 2022-10-12 */ @Service public class AdminMenuRelationServiceImpl extends ServiceImpl<AdminMenuRelationMapper, AdminMenuRelation> implements IAdminMenuRelationService { } ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java
@@ -76,6 +76,10 @@ private RedisService redisService; @Resource private UmsDepartManageMapper umsDepartManageMapper; @Resource UmsRoleMenuRelationMapper umsRoleMenuRelationMapper; @Resource AdminMenuRelationMapper adminMenuRelationMapper; @Override public UmsAdmin getAdminByUsername(String username) { @@ -117,13 +121,38 @@ List<Long> ids = umsAdminParam.getRoleIds(); if (!ids.isEmpty()) { List<UmsAdminRoleRelation> roleIds = new ArrayList<>(); for(Long id:ids){ for (Long id : ids) { UmsAdminRoleRelation urr = new UmsAdminRoleRelation(); urr.setAdminId(umsAdmin.getId()); urr.setRoleId(id); roleIds.add(urr); } } umsAdminRoleRelationService.saveBatch(roleIds); } //绑定菜单于用户 if (!ids.isEmpty()) { Integer size = 0; Long maxId = null; for (Long id : ids) { if (size < umsRoleMenuRelationMapper .selectList(new LambdaQueryWrapper<UmsRoleMenuRelation>() .eq(UmsRoleMenuRelation::getRoleId, id)).size()) { size = umsRoleMenuRelationMapper .selectList(new LambdaQueryWrapper<UmsRoleMenuRelation>() .eq(UmsRoleMenuRelation::getRoleId, id)).size(); maxId = id; } } umsRoleMenuRelationMapper .selectList(new LambdaQueryWrapper<UmsRoleMenuRelation>() .eq(UmsRoleMenuRelation::getRoleId, maxId)) .stream() .forEach(item->{ AdminMenuRelation adminMenuRelation = new AdminMenuRelation(); adminMenuRelation.setAdminId(umsAdmin.getId()); adminMenuRelation.setMenuId(item.getMenuId()); adminMenuRelationMapper.insert(adminMenuRelation); }); } //对用户名系统默认添加 umsAdmin.setNickName(RandomUtils.getUserId(umsAdmin.getId())); @@ -340,8 +369,8 @@ e.setDepartName(umsDepart.getDepartName()); } //获取角色列表 List<UmsRole> roles = umsRoleMapper.getRoleList(e.getId()); e.setRoles(roles); List<UmsRole> roles = umsRoleMapper.getRoleList(e.getId()); e.setRoles(roles); }); } return page1; @@ -358,11 +387,11 @@ public boolean updateStatusBatch(List<Long> ids, Integer status) { List<UmsAdmin> users = new ArrayList<>(); for (Long id : ids) { UmsAdmin umsAdmin = UmsAdmin.builder(). UmsAdmin umsAdmin = UmsAdmin.builder(). id(id).status(status).build(); users.add(umsAdmin); } updateBatchById(users,users.size()); updateBatchById(users, users.size()); getCacheService().delBatchAdmin(ids); return true; } @@ -371,8 +400,8 @@ public List<UmsAdmin> getDepartUser(Long departId) { QueryWrapper<UmsDepartManage> wrapper = new QueryWrapper<>(); wrapper.lambda().eq(UmsDepartManage::getDepartId, departId); List<UmsDepartManage> list = umsDepartManageMapper.selectList(wrapper); List<Long> userIds = list.stream().map(UmsDepartManage::getUserId).collect(Collectors.toList()); List<UmsDepartManage> list = umsDepartManageMapper.selectList(wrapper); List<Long> userIds = list.stream().map(UmsDepartManage::getUserId).collect(Collectors.toList()); QueryWrapper<UmsAdmin> wrapperUser = new QueryWrapper<>(); wrapperUser.in("id", userIds); List<UmsAdmin> adminList = baseMapper.selectList(wrapperUser); ycl-common/src/main/java/com/ycl/service/user/impl/UmsMenuServiceImpl.java
@@ -5,20 +5,29 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.dto.UmsMenuNode; import com.ycl.entity.user.UmsMenu; import com.ycl.entity.user.vo.UmsMenuVo; import com.ycl.mapper.user.AdminMenuRelationMapper; import com.ycl.mapper.user.UmsMenuMapper; import com.ycl.service.user.UmsMenuService; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * 后台菜单管理Service实现类 */ @Service public class UmsMenuServiceImpl extends ServiceImpl<UmsMenuMapper, UmsMenu>implements UmsMenuService { public class UmsMenuServiceImpl extends ServiceImpl<UmsMenuMapper, UmsMenu> implements UmsMenuService { @Resource AdminMenuRelationMapper adminMenuRelationMapper; @Resource UmsMenuMapper umsMenuMapper; @Override public boolean create(UmsMenu umsMenu) { @@ -26,6 +35,7 @@ updateLevel(umsMenu); return save(umsMenu); } /** * 修改菜单层级 @@ -54,11 +64,11 @@ @Override public Page<UmsMenu> list(Long parentId, Integer pageSize, Integer pageNum) { Page<UmsMenu> page = new Page<>(pageNum,pageSize); Page<UmsMenu> page = new Page<>(pageNum, pageSize); QueryWrapper<UmsMenu> wrapper = new QueryWrapper<>(); wrapper.lambda().eq(UmsMenu::getParentId,parentId) wrapper.lambda().eq(UmsMenu::getParentId, parentId) .orderByDesc(UmsMenu::getSort); return page(page,wrapper); return page(page, wrapper); } @Override @@ -78,6 +88,23 @@ return updateById(umsMenu); } @Override public List<UmsMenuVo> ListTreeMyself(Long id) { List<UmsMenuVo> fatherUmsMenuVoList = umsMenuMapper.adminMenuRelation(id); List<UmsMenuVo> umsMenuVoList = fatherUmsMenuVoList.stream() .filter(item -> item.getParentId() == 0L) .peek(item -> item.setMenuVoArrayList(getChildren(item, fatherUmsMenuVoList))) .collect(Collectors.toList()); return umsMenuVoList; } public List<UmsMenuVo> getChildren(UmsMenuVo root, List<UmsMenuVo> allMenus) { return allMenus.stream() .filter(menu -> Objects.equals(menu.getParentId(), root.getId())) .peek(menu -> menu.setMenuVoArrayList(getChildren(menu, allMenus))) .collect(Collectors.toList()); } /** * 将UmsMenu转化为UmsMenuNode并设置children属性 */ ycl-common/src/main/resources/mapper/user/AdminMenuRelationMapper.xml
New file @@ -0,0 +1,18 @@ <?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.ycl.mapper.user.AdminMenuRelationMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ycl.entity.user.AdminMenuRelation"> <id column="id" property="id" /> <result column="admin_id" property="adminId" /> <result column="menu_id" property="menuId" /> <result column="is_start" property="isStart" /> </resultMap> <!-- 通用查询结果列 --> <sql id="Base_Column_List"> id, admin_id, menu_id, is_start </sql> </mapper> ycl-common/src/main/resources/mapper/user/UmsMenuMapper.xml
@@ -58,4 +58,16 @@ m.id </select> <select id="adminMenuRelation" resultType="com.ycl.entity.user.vo.UmsMenuVo"> SELECT amr.id AS relationId, amr.is_start AS isStart, m.* FROM `ums_admin_menu_relation` AS amr JOIN ums_menu AS m ON amr.menu_id = m.id WHERE amr.admin_id = #{id} </select> </mapper> ycl-platform/src/main/java/com/ycl/controller/portal/UmsWebsitePortalController.java
@@ -2,18 +2,23 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ycl.annotation.LogSave; import com.ycl.api.CommonResult; import com.ycl.bo.AdminUserDetails; import com.ycl.entity.portal.ThirdApplications; import com.ycl.entity.portal.WebsiteLogo; import com.ycl.entity.user.AdminMenuRelation; import com.ycl.entity.user.UmsMenu; import com.ycl.entity.user.vo.UmsMenuVo; import com.ycl.service.portal.UmsThirdApplicationsService; import com.ycl.service.portal.UmsWebsiteLogoService; import com.ycl.service.user.IAdminMenuRelationService; import com.ycl.service.user.UmsMenuService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -31,6 +36,8 @@ UmsMenuService umsMenuService; @Autowired UmsThirdApplicationsService umsThirdApplicationsService; @Autowired IAdminMenuRelationService iAdminMenuRelationService; @ApiOperation("logo管理-添加logo") @PostMapping("/logo/add") @@ -101,6 +108,23 @@ return CommonResult.success(menus); } @ApiOperation("菜单权限-个人菜单查询") @GetMapping("/menu/search_myself") @LogSave(contain = "登录拿到个人菜单",operationType = "个人操作") public CommonResult searchMenusMyself() { AdminUserDetails user = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); return CommonResult.success(umsMenuService.ListTreeMyself(user.getUserId())); } @ApiOperation("菜单权限-个人菜单状态修改") @PutMapping("/menu/modification_myself") public CommonResult modifyMenusMyself(@RequestParam Long relationId, Integer status) { AdminMenuRelation adminMenuRelation = new AdminMenuRelation(); adminMenuRelation.setId(relationId); adminMenuRelation.setIsStart(status); return CommonResult.success(iAdminMenuRelationService.updateById(adminMenuRelation)); } @ApiOperation("自定义菜单-添加菜单") @PostMapping("/menu/add") public CommonResult addMenu(@RequestBody UmsMenu umsMenu) {