[add] app注册、登录、实名认证、人员展示、通知

This commit is contained in:
lcj
2025-07-24 17:36:30 +08:00
parent e6a98ad0bd
commit 3d2f4b05ff
55 changed files with 1998 additions and 213 deletions

View File

@ -8,6 +8,8 @@ import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
/**
* app菜单
@ -85,6 +87,18 @@ public class AppMenu extends BaseEntity {
*/
private String remark;
/**
* 父菜单名称
*/
@TableField(exist = false)
private String parentName;
/**
* 子菜单
*/
@TableField(exist = false)
private List<AppMenu> children = new ArrayList<>();
@Serial
@TableField(exist = false)
private static final long serialVersionUID = 1L;

View File

@ -3,6 +3,8 @@ package org.dromara.app.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.dromara.app.system.domain.AppMenu;
import java.util.List;
/**
* @author lilemy
* @description 针对表【app_menu(app菜单)】的数据库操作Mapper
@ -10,6 +12,14 @@ import org.dromara.app.system.domain.AppMenu;
*/
public interface AppMenuMapper extends BaseMapper<AppMenu> {
/**
* 根据用户ID查询菜单
*
* @param userId 用户ID
* @return 菜单列表
*/
List<AppMenu> selectMenuTreeByUserId(Long userId);
}

View File

@ -1,7 +1,6 @@
package org.dromara.app.system.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.app.system.domain.AppMenu;
import org.dromara.app.system.domain.dto.menu.AppMenuCreateReq;
@ -9,6 +8,8 @@ import org.dromara.app.system.domain.dto.menu.AppMenuQueryReq;
import org.dromara.app.system.domain.dto.menu.AppMenuUpdateReq;
import org.dromara.app.system.domain.vo.menu.AppMenuVo;
import java.util.List;
/**
* @author lilemy
* @description 针对表【app_menu(app菜单)】的数据库操作Service
@ -16,6 +17,22 @@ import org.dromara.app.system.domain.vo.menu.AppMenuVo;
*/
public interface AppMenuService extends IService<AppMenu> {
/**
* 根据id查询app菜单
*
* @param id app菜单id
* @return app菜单视图
*/
AppMenuVo queryById(Long id);
/**
* 根据用户ID查询菜单树信息
*
* @param userId 用户ID
* @return 菜单列表
*/
List<AppMenu> selectMenuTreeByUserId(Long userId);
/**
* 新增app菜单
*
@ -32,6 +49,14 @@ public interface AppMenuService extends IService<AppMenu> {
*/
Boolean updateByReq(AppMenuUpdateReq req);
/**
* 校验app菜单名称唯一
*
* @param menu app菜单
* @return 是否唯一
*/
Boolean checkMenuNameUnique(AppMenu menu);
/**
* 获取app菜单视图
*
@ -49,11 +74,11 @@ public interface AppMenuService extends IService<AppMenu> {
LambdaQueryWrapper<AppMenu> buildQueryWrapper(AppMenuQueryReq req);
/**
* 获取app菜单分页对象视图
* 获取app菜单列表对象视图
*
* @param menuPage app菜单分页对象
* @return app菜单分页对象视图
* @param menuList app菜单列表对象
* @return app菜单列表对象视图
*/
Page<AppMenuVo> getVoPage(Page<AppMenu> menuPage);
List<AppMenuVo> getVoList(List<AppMenu> menuList);
}

View File

@ -1,7 +1,11 @@
package org.dromara.app.system.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.app.system.domain.AppRole;
import org.dromara.app.system.domain.dto.role.AppRoleQueryReq;
import org.dromara.app.system.domain.vo.role.AppRoleVo;
/**
* @author lilemy
@ -10,4 +14,28 @@ import org.dromara.app.system.domain.AppRole;
*/
public interface AppRoleService extends IService<AppRole> {
/**
* 获取app角色视图
*
* @param menu app角色
* @return app角色视图
*/
AppRoleVo getVo(AppRole menu);
/**
* 构建查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
LambdaQueryWrapper<AppRole> buildQueryWrapper(AppRoleQueryReq req);
/**
* 获取app角色视图列表
*
* @param rolePage app角色列表
* @return app角色视图列表
*/
Page<AppRoleVo> getVoList(Page<AppRole> rolePage);
}

View File

@ -1,8 +1,7 @@
package org.dromara.app.system.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.app.system.domain.AppMenu;
import org.dromara.app.system.domain.dto.menu.AppMenuCreateReq;
@ -11,10 +10,16 @@ import org.dromara.app.system.domain.dto.menu.AppMenuUpdateReq;
import org.dromara.app.system.domain.vo.menu.AppMenuVo;
import org.dromara.app.system.mapper.AppMenuMapper;
import org.dromara.app.system.service.AppMenuService;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
@ -26,6 +31,43 @@ import java.util.List;
public class AppMenuServiceImpl extends ServiceImpl<AppMenuMapper, AppMenu>
implements AppMenuService {
/**
* 根据id查询app菜单
*
* @param id app菜单id
* @return app菜单视图
*/
@Override
public AppMenuVo queryById(Long id) {
AppMenu menu = this.getById(id);
if (menu == null) {
throw new ServiceException("app菜单不存在", HttpStatus.NOT_FOUND);
}
return this.getVo(menu);
}
/**
* 根据用户ID查询菜单树信息
*
* @param userId 用户ID
* @return 菜单列表
*/
@Override
public List<AppMenu> selectMenuTreeByUserId(Long userId) {
List<AppMenu> menus;
if (LoginHelper.isSuperAdmin(userId)) {
menus = this.lambdaQuery()
.in(AppMenu::getMenuType, SystemConstants.TYPE_DIR, SystemConstants.TYPE_MENU)
.eq(AppMenu::getStatus, SystemConstants.NORMAL)
.orderByAsc(AppMenu::getParentId)
.orderByAsc(AppMenu::getOrderNum)
.list();
} else {
menus = baseMapper.selectMenuTreeByUserId(userId);
}
return getChildPerms(menus, 0);
}
/**
* 新增app菜单
*
@ -48,6 +90,23 @@ public class AppMenuServiceImpl extends ServiceImpl<AppMenuMapper, AppMenu>
return null;
}
/**
* 校验app菜单名称唯一
*
* @param menu app菜单
* @return 是否唯一
*/
@Override
public Boolean checkMenuNameUnique(AppMenu menu) {
boolean exists = this.exists(
new LambdaQueryWrapper<AppMenu>()
.eq(AppMenu::getMenuName, menu.getMenuName())
.eq(AppMenu::getParentId, menu.getParentId())
.ne(ObjectUtil.isNotNull(menu.getId()), AppMenu::getId, menu.getId())
);
return !exists;
}
/**
* 获取app菜单视图
*
@ -88,29 +147,53 @@ public class AppMenuServiceImpl extends ServiceImpl<AppMenuMapper, AppMenu>
}
/**
* 获取app菜单分页对象视图
* 获取app菜单列表对象视图
*
* @param menuPage app菜单分页对象
* @return app菜单分页对象视图
* @param menuList app菜单列表对象
* @return app菜单列表对象视图
*/
@Override
public Page<AppMenuVo> getVoPage(Page<AppMenu> menuPage) {
List<AppMenu> menuList = menuPage.getRecords();
Page<AppMenuVo> menuVoPage = new Page<>(
menuPage.getCurrent(),
menuPage.getSize(),
menuPage.getTotal());
if (CollUtil.isEmpty(menuList)) {
return menuVoPage;
}
List<AppMenuVo> menuVoList = menuList.stream().map(entity -> {
public List<AppMenuVo> getVoList(List<AppMenu> menuList) {
return menuList.stream().map(entity -> {
AppMenuVo menuVo = new AppMenuVo();
BeanUtils.copyProperties(entity, menuVo);
return menuVo;
}).toList();
menuVoPage.setRecords(menuVoList);
return menuVoPage;
}
/* 根据父节点的ID获取所有子节点
*
* @param list 分类表
* @param parentId 传入的父节点ID
* @return String
*/
private List<AppMenu> getChildPerms(List<AppMenu> list, int parentId) {
List<AppMenu> returnList = new ArrayList<>();
for (AppMenu t : list) {
// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
if (t.getParentId() == parentId) {
recursionFn(list, t);
returnList.add(t);
}
}
return returnList;
}
/**
* 递归列表
*/
private void recursionFn(List<AppMenu> list, AppMenu t) {
// 得到子节点列表
List<AppMenu> childList = StreamUtils.filter(list, n -> n.getParentId().equals(t.getId()));
t.setChildren(childList);
for (AppMenu tChild : childList) {
// 判断是否有子节点
if (list.stream().anyMatch(n -> n.getParentId().equals(tChild.getId()))) {
recursionFn(list, tChild);
}
}
}
}

View File

@ -1,7 +1,11 @@
package org.dromara.app.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.app.system.domain.AppRole;
import org.dromara.app.system.domain.dto.role.AppRoleQueryReq;
import org.dromara.app.system.domain.vo.role.AppRoleVo;
import org.dromara.app.system.mapper.AppRoleMapper;
import org.dromara.app.system.service.AppRoleService;
import org.springframework.stereotype.Service;
@ -15,6 +19,38 @@ import org.springframework.stereotype.Service;
public class AppRoleServiceImpl extends ServiceImpl<AppRoleMapper, AppRole>
implements AppRoleService {
/**
* 获取app角色视图
*
* @param menu app角色
* @return app角色视图
*/
@Override
public AppRoleVo getVo(AppRole menu) {
return null;
}
/**
* 构建查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
@Override
public LambdaQueryWrapper<AppRole> buildQueryWrapper(AppRoleQueryReq req) {
return null;
}
/**
* 获取app角色视图列表
*
* @param rolePage app角色列表
* @return app角色视图列表
*/
@Override
public Page<AppRoleVo> getVoList(Page<AppRole> rolePage) {
return null;
}
}

View File

@ -31,4 +31,26 @@
icon,create_dept,remark,create_by,update_by,
create_time,update_time
</sql>
<select id="selectMenuTreeByUserId" parameterType="Long" resultType="org.dromara.app.system.domain.AppMenu">
select distinct m.id,
m.parent_id,
m.menu_name,
m.path,
m.component,
m.query_param,
m.visible,
m.status,
m.perms,
m.menu_type,
m.icon,
m.order_num,
m.create_time
from app_menu m
left join app_role_menu rm on m.id = rm.menu_id and m.status = '0'
left join app_role r on rm.role_id = r.id and r.status = '0'
where m.menu_type in ('M', 'C')
and r.id in (select role_id from sys_user_role where user_id = #{userId})
order by m.parent_id, m.order_num
</select>
</mapper>