docs: 注释优化
This commit is contained in:
@@ -12,7 +12,6 @@ import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
|
||||
*/
|
||||
@SpringBootApplication
|
||||
@ConfigurationPropertiesScan // 开启配置属性绑定
|
||||
// @EnableScheduling // 开启定时任务
|
||||
public class YouLaiBootApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
@@ -23,9 +23,9 @@ import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
|
||||
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
|
||||
|
||||
/**
|
||||
* WebSocket 自动配置类
|
||||
* WebSocket 配置
|
||||
*
|
||||
* @author haoxr
|
||||
* @author Ray.Hao
|
||||
* @since 2.4.0
|
||||
*/
|
||||
// 启用WebSocket消息代理功能和配置STOMP协议,实现实时双向通信和消息传递
|
||||
|
||||
@@ -21,7 +21,7 @@ import java.io.IOException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* IP限流过滤器
|
||||
* IP 限流过滤器
|
||||
*
|
||||
* @author Theo
|
||||
* @since 2024/08/10 14:38
|
||||
|
||||
@@ -124,7 +124,7 @@ public class DictController {
|
||||
public Result<List<DictItemOptionVO>> getDictItems(
|
||||
@Parameter(description = "字典编码") @PathVariable String dictCode
|
||||
) {
|
||||
List<DictItemOptionVO> list = dictService.getDictItems(dictCode);
|
||||
List<DictItemOptionVO> list = dictItemService.getDictItems(dictCode);
|
||||
return Result.success(list);
|
||||
}
|
||||
|
||||
@@ -147,7 +147,7 @@ public class DictController {
|
||||
@PathVariable String dictCode,
|
||||
@Parameter(description = "字典项ID") @PathVariable Long itemId
|
||||
) {
|
||||
DictItemForm formData = dictItemService.getDictItemForm(dictCode,itemId);
|
||||
DictItemForm formData = dictItemService.getDictItemForm(itemId);
|
||||
return Result.success(formData);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import com.youlai.boot.system.model.vo.DictItemPageVO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
/**
|
||||
* 字典数据映射层
|
||||
* 字典项映射层
|
||||
*
|
||||
* @author Ray Hao
|
||||
* @since 2.9.0
|
||||
@@ -17,7 +17,7 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
public interface DictItemMapper extends BaseMapper<DictItem> {
|
||||
|
||||
/**
|
||||
* 字典数据分页列表
|
||||
* 字典项分页列表
|
||||
*/
|
||||
Page<DictItemPageVO> getDictItemPage(Page<DictItemPageVO> page, DictItemPageQuery queryParams);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import com.youlai.boot.system.model.entity.User;
|
||||
import com.youlai.boot.system.model.query.UserPageQuery;
|
||||
import com.youlai.boot.system.model.form.UserForm;
|
||||
import com.youlai.boot.common.annotation.DataPermission;
|
||||
import com.youlai.boot.core.security.model.AuthCredentials;
|
||||
import com.youlai.boot.core.security.model.UserAuthCredentials;
|
||||
import com.youlai.boot.system.model.dto.UserExportDTO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@@ -46,7 +46,7 @@ public interface UserMapper extends BaseMapper<User> {
|
||||
* @param username 用户名
|
||||
* @return 认证信息
|
||||
*/
|
||||
AuthCredentials getAuthCredentialsByUsername(String username);
|
||||
UserAuthCredentials getAuthCredentialsByUsername(String username);
|
||||
|
||||
/**
|
||||
* 根据微信openid获取用户认证信息
|
||||
@@ -54,7 +54,7 @@ public interface UserMapper extends BaseMapper<User> {
|
||||
* @param openid 微信openid
|
||||
* @return 认证信息
|
||||
*/
|
||||
AuthCredentials getAuthCredentialsByOpenId(String openid);
|
||||
UserAuthCredentials getAuthCredentialsByOpenId(String openid);
|
||||
|
||||
/**
|
||||
* 根据手机号获取用户认证信息
|
||||
@@ -62,7 +62,7 @@ public interface UserMapper extends BaseMapper<User> {
|
||||
* @param mobile 手机号
|
||||
* @return 认证信息
|
||||
*/
|
||||
AuthCredentials getAuthCredentialsByMobile(String mobile);
|
||||
UserAuthCredentials getAuthCredentialsByMobile(String mobile);
|
||||
|
||||
/**
|
||||
* 获取导出用户列表
|
||||
|
||||
@@ -6,7 +6,7 @@ import lombok.Data;
|
||||
/**
|
||||
* 用户导入对象
|
||||
*
|
||||
* @author haoxr
|
||||
* @author Ray.Hao
|
||||
* @since 2022/4/10
|
||||
*/
|
||||
@Data
|
||||
|
||||
@@ -7,7 +7,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* 系统配置 实体
|
||||
* 系统配置对象
|
||||
*
|
||||
* @author Theo
|
||||
* @since 2024-07-29 11:17:26
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
package com.youlai.boot.system.model.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.youlai.boot.common.base.BaseEntity;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
/**
|
||||
* 部门实体
|
||||
* 部门实体对象
|
||||
*
|
||||
* @author Ray
|
||||
* @author Ray.Hao
|
||||
* @since 2024/06/23
|
||||
*/
|
||||
@TableName("sys_dept")
|
||||
|
||||
@@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode;
|
||||
/**
|
||||
* 字典实体
|
||||
*
|
||||
* @author haoxr
|
||||
* @author Ray.Hao
|
||||
* @since 2022/12/17
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
|
||||
@@ -10,7 +10,7 @@ import java.time.LocalDateTime;
|
||||
/**
|
||||
* 系统日志 实体类
|
||||
*
|
||||
* @author Ray
|
||||
* @author Ray.Hao
|
||||
* @since 2.10.0
|
||||
*/
|
||||
@Data
|
||||
|
||||
@@ -10,7 +10,7 @@ import java.time.LocalDateTime;
|
||||
/**
|
||||
* 菜单实体
|
||||
*
|
||||
* @author Ray
|
||||
* @author Ray.Hao
|
||||
* @since 2023/3/6
|
||||
*/
|
||||
@TableName("sys_menu")
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.youlai.boot.system.model.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.youlai.boot.common.base.BaseEntity;
|
||||
import lombok.Getter;
|
||||
@@ -8,10 +7,11 @@ import lombok.Setter;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 通知公告实体对象
|
||||
*
|
||||
* @author youlaitech
|
||||
* @author Kylin
|
||||
* @since 2024-08-27 10:31
|
||||
*/
|
||||
@Getter
|
||||
|
||||
@@ -8,7 +8,7 @@ import lombok.Setter;
|
||||
/**
|
||||
* 角色实体
|
||||
*
|
||||
* @author Ray
|
||||
* @author Ray.Hao
|
||||
* @since 2024/6/23
|
||||
*/
|
||||
@TableName("sys_role")
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package com.youlai.boot.system.model.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
|
||||
/**
|
||||
* 角色和菜单关联表
|
||||
*/
|
||||
@@ -25,6 +23,4 @@ public class RoleMenu {
|
||||
*/
|
||||
private Long menuId;
|
||||
|
||||
@TableField(exist = false)
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
@@ -13,7 +13,7 @@ import java.time.LocalDateTime;
|
||||
/**
|
||||
* 用户通知公告实体对象
|
||||
*
|
||||
* @author youlaitech
|
||||
* @author Kylin
|
||||
* @since 2024-08-28 16:56
|
||||
*/
|
||||
@Getter
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.youlai.boot.system.model.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
@@ -10,7 +9,7 @@ import lombok.NoArgsConstructor;
|
||||
/**
|
||||
* 用户和角色关联表
|
||||
*
|
||||
* @author haoxr
|
||||
* @author Rya.Hao
|
||||
* @since 2022/12/17
|
||||
*/
|
||||
@TableName("sys_user_role")
|
||||
@@ -27,7 +26,4 @@ public class UserRole {
|
||||
* 角色ID
|
||||
*/
|
||||
private Long roleId;
|
||||
|
||||
@TableField(exist = false)
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
@@ -6,7 +6,7 @@ import lombok.Data;
|
||||
/**
|
||||
* 个人中心用户信息
|
||||
*
|
||||
* @author Ray
|
||||
* @author Ray.Hao
|
||||
* @since 2024/8/13
|
||||
*/
|
||||
@Schema(description = "个人中心用户信息")
|
||||
|
||||
@@ -5,20 +5,20 @@ import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
/**
|
||||
* 字典数据项
|
||||
* 字典项键值对象
|
||||
*
|
||||
* @author Ray
|
||||
* @author Ray.Hao
|
||||
* @since 0.0.1
|
||||
*/
|
||||
@Schema(description = "字典数据项")
|
||||
@Schema(description = "字典项键值对象")
|
||||
@Getter
|
||||
@Setter
|
||||
public class DictItemOptionVO {
|
||||
|
||||
@Schema(description = "字典数据值")
|
||||
@Schema(description = "字典项值")
|
||||
private String value;
|
||||
|
||||
@Schema(description = "字典数据标签")
|
||||
@Schema(description = "字典项标签")
|
||||
private String label;
|
||||
|
||||
@Schema(description = "标签类型")
|
||||
|
||||
@@ -5,19 +5,18 @@ import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
|
||||
/**
|
||||
* 字典项分页VO
|
||||
* 字典项分页对象
|
||||
*
|
||||
* @author Ray
|
||||
* @author Ray.Hao
|
||||
* @since 0.0.1
|
||||
*/
|
||||
@Schema(description = "字典数据分页对象")
|
||||
@Schema(description = "字典项分页对象")
|
||||
@Getter
|
||||
@Setter
|
||||
public class DictItemPageVO {
|
||||
|
||||
@Schema(description = "字典数据ID")
|
||||
@Schema(description = "字典项ID")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "字典编码")
|
||||
|
||||
@@ -2,10 +2,10 @@ package com.youlai.boot.system.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.youlai.boot.common.model.Option;
|
||||
import com.youlai.boot.system.model.entity.DictItem;
|
||||
import com.youlai.boot.system.model.form.DictItemForm;
|
||||
import com.youlai.boot.system.model.query.DictItemPageQuery;
|
||||
import com.youlai.boot.system.model.vo.DictItemOptionVO;
|
||||
import com.youlai.boot.system.model.vo.DictItemPageVO;
|
||||
|
||||
import java.util.List;
|
||||
@@ -19,50 +19,50 @@ import java.util.List;
|
||||
public interface DictItemService extends IService<DictItem> {
|
||||
|
||||
/**
|
||||
* 字典数据分页列表
|
||||
* 字典项分页列表
|
||||
*
|
||||
* @param queryParams
|
||||
* @return
|
||||
* @param queryParams 查询参数
|
||||
* @return 字典项分页列表
|
||||
*/
|
||||
Page<DictItemPageVO> getDictItemPage(DictItemPageQuery queryParams);
|
||||
|
||||
/**
|
||||
* 获取字典数据表单
|
||||
* 获取字典项列表
|
||||
*
|
||||
* @param dictCode 字典编码
|
||||
* @param itemId 字典数据ID
|
||||
* @return
|
||||
* @return 字典项列表
|
||||
*/
|
||||
DictItemForm getDictItemForm(String dictCode,Long itemId);
|
||||
List<DictItemOptionVO> getDictItems(String dictCode);
|
||||
|
||||
/**
|
||||
* 获取字典项表单
|
||||
*
|
||||
* @param itemId 字典项ID
|
||||
* @return 字典项表单
|
||||
*/
|
||||
DictItemForm getDictItemForm(Long itemId);
|
||||
|
||||
/**
|
||||
* 保存字典项
|
||||
*
|
||||
* @param formData
|
||||
* @return
|
||||
* @param formData 字典项表单
|
||||
* @return 是否成功
|
||||
*/
|
||||
boolean saveDictItem(DictItemForm formData);
|
||||
|
||||
/**
|
||||
* 更新字典数据
|
||||
* 更新字典项
|
||||
*
|
||||
* @param formData 字典数据表单
|
||||
* @return
|
||||
* @param formData 字典项表单
|
||||
* @return 是否成功
|
||||
*/
|
||||
boolean updateDictItem(DictItemForm formData);
|
||||
|
||||
/**
|
||||
* 删除字典数据
|
||||
* 删除字典项
|
||||
*
|
||||
* @param ids 字典数据ID,多个逗号分隔
|
||||
* @param ids 字典项ID,多个逗号分隔
|
||||
*/
|
||||
void deleteDictItemByIds(String ids);
|
||||
|
||||
/**
|
||||
* 获取字典数据列表
|
||||
*
|
||||
* @param dictCode 字典编码
|
||||
* @return
|
||||
*/
|
||||
List<Option<String>> getDictDataList(String dictCode);
|
||||
}
|
||||
|
||||
@@ -66,13 +66,6 @@ public interface DictService extends IService<Dict> {
|
||||
*/
|
||||
void deleteDictByIds(List<String> ids);
|
||||
|
||||
/**
|
||||
* 获取字典项列表
|
||||
*
|
||||
* @param dictCode 字典编码
|
||||
* @return 字典项列表
|
||||
*/
|
||||
List<DictItemOptionVO> getDictItems(String dictCode);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -35,12 +35,10 @@ import java.util.stream.Collectors;
|
||||
@RequiredArgsConstructor
|
||||
public class ConfigServiceImpl extends ServiceImpl<ConfigMapper, Config> implements ConfigService {
|
||||
|
||||
|
||||
private final ConfigConverter configConverter;
|
||||
|
||||
private final RedisTemplate<String, Object> redisTemplate;
|
||||
|
||||
|
||||
/**
|
||||
* 系统启动完成后,加载系统配置到缓存
|
||||
*/
|
||||
|
||||
@@ -3,12 +3,12 @@ package com.youlai.boot.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 com.youlai.boot.common.model.Option;
|
||||
import com.youlai.boot.system.converter.DictDataConverter;
|
||||
import com.youlai.boot.system.mapper.DictItemMapper;
|
||||
import com.youlai.boot.system.model.entity.DictItem;
|
||||
import com.youlai.boot.system.model.form.DictItemForm;
|
||||
import com.youlai.boot.system.model.query.DictItemPageQuery;
|
||||
import com.youlai.boot.system.model.vo.DictItemOptionVO;
|
||||
import com.youlai.boot.system.model.vo.DictItemPageVO;
|
||||
import com.youlai.boot.system.service.DictItemService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@@ -18,9 +18,9 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 字典数据实现类
|
||||
* 字典项实现类
|
||||
*
|
||||
* @author haoxr
|
||||
* @author Ray.Hao
|
||||
* @since 2022/10/12
|
||||
*/
|
||||
@Service
|
||||
@@ -30,10 +30,10 @@ public class DictItemServiceImpl extends ServiceImpl<DictItemMapper, DictItem> i
|
||||
private final DictDataConverter dictDataConverter;
|
||||
|
||||
/**
|
||||
* 获取字典数据分页列表
|
||||
* 获取字典项分页列表
|
||||
*
|
||||
* @param queryParams
|
||||
* @return
|
||||
* @param queryParams 查询参数
|
||||
* @return 字典项分页列表
|
||||
*/
|
||||
@Override
|
||||
public Page<DictItemPageVO> getDictItemPage(DictItemPageQuery queryParams) {
|
||||
@@ -44,24 +44,48 @@ public class DictItemServiceImpl extends ServiceImpl<DictItemMapper, DictItem> i
|
||||
return this.baseMapper.getDictItemPage(page, queryParams);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取字典项列表
|
||||
*
|
||||
* @param dictCode 字典编码
|
||||
*/
|
||||
@Override
|
||||
public List<DictItemOptionVO> getDictItems(String dictCode) {
|
||||
return this.list(
|
||||
new LambdaQueryWrapper<DictItem>()
|
||||
.eq(DictItem::getDictCode, dictCode)
|
||||
.eq(DictItem::getStatus, 1)
|
||||
.orderByAsc(DictItem::getSort)
|
||||
).stream()
|
||||
.map(item -> {
|
||||
DictItemOptionVO dictItemOptionVO = new DictItemOptionVO();
|
||||
dictItemOptionVO.setLabel(item.getLabel());
|
||||
dictItemOptionVO.setValue(item.getValue());
|
||||
dictItemOptionVO.setTagType(item.getTagType());
|
||||
return dictItemOptionVO;
|
||||
}).toList();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取字典项表单
|
||||
*
|
||||
* @param dictCode 字典编码
|
||||
* @param itemId 字典数据ID
|
||||
* @return
|
||||
* @param itemId 字典项ID
|
||||
* @return 字典项表单
|
||||
*/
|
||||
@Override
|
||||
public DictItemForm getDictItemForm(String dictCode,Long itemId) {
|
||||
public DictItemForm getDictItemForm( Long itemId) {
|
||||
DictItem entity = this.getById(itemId);
|
||||
return dictDataConverter.toForm(entity);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存字典数据
|
||||
* 保存字典项
|
||||
*
|
||||
* @param formData
|
||||
* @return
|
||||
* @param formData 字典项表单
|
||||
* @return 是否成功
|
||||
*/
|
||||
@Override
|
||||
public boolean saveDictItem(DictItemForm formData) {
|
||||
@@ -70,10 +94,10 @@ public class DictItemServiceImpl extends ServiceImpl<DictItemMapper, DictItem> i
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新字典数据
|
||||
* 更新字典项
|
||||
*
|
||||
* @param formData 字典数据表单
|
||||
* @return
|
||||
* @param formData 字典项表单
|
||||
* @return 是否成功
|
||||
*/
|
||||
@Override
|
||||
public boolean updateDictItem(DictItemForm formData) {
|
||||
@@ -82,9 +106,9 @@ public class DictItemServiceImpl extends ServiceImpl<DictItemMapper, DictItem> i
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除字典数据
|
||||
* 删除字典项
|
||||
*
|
||||
* @param ids 字典数据ID集合
|
||||
* @param ids 字典项ID集合
|
||||
*/
|
||||
@Override
|
||||
public void deleteDictItemByIds(String ids) {
|
||||
@@ -92,20 +116,6 @@ public class DictItemServiceImpl extends ServiceImpl<DictItemMapper, DictItem> i
|
||||
this.removeByIds(idList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取字典数据列表
|
||||
*
|
||||
* @param dictCode 字典编码
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<Option<String>> getDictDataList(String dictCode) {
|
||||
return this.list(new LambdaQueryWrapper<DictItem>()
|
||||
.eq(DictItem::getDictCode, dictCode)
|
||||
.eq(DictItem::getStatus, 1)
|
||||
).stream().map(item -> new Option<>(item.getValue(), item.getLabel(),item.getTagType()))
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -58,8 +58,8 @@ public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements Di
|
||||
@Override
|
||||
public List<Option<String>> getDictList() {
|
||||
return this.list(new LambdaQueryWrapper<Dict>().eq(Dict::getStatus, 1))
|
||||
.stream().map(item ->
|
||||
new Option<>(item.getDictCode(), item.getName()))
|
||||
.stream()
|
||||
.map(item -> new Option<>(item.getDictCode(), item.getName()))
|
||||
.toList();
|
||||
}
|
||||
|
||||
@@ -150,28 +150,6 @@ public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements Di
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取字典项列表
|
||||
*
|
||||
* @param dictCode 字典编码
|
||||
*/
|
||||
@Override
|
||||
public List<DictItemOptionVO> getDictItems(String dictCode) {
|
||||
return dictItemService.list(
|
||||
new LambdaQueryWrapper<DictItem>()
|
||||
.eq(DictItem::getDictCode, dictCode)
|
||||
.eq(DictItem::getStatus, 1)
|
||||
.orderByAsc(DictItem::getSort)
|
||||
).stream()
|
||||
.map(item -> {
|
||||
DictItemOptionVO dictItemOptionVO = new DictItemOptionVO();
|
||||
dictItemOptionVO.setLabel(item.getLabel());
|
||||
dictItemOptionVO.setValue(item.getValue());
|
||||
dictItemOptionVO.setTagType(item.getTagType());
|
||||
return dictItemOptionVO;
|
||||
}).toList();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -17,11 +17,10 @@ import org.springframework.stereotype.Service;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
/**
|
||||
* 角色菜单业务实现
|
||||
* 角色菜单服务实现类
|
||||
*
|
||||
* @author Ray
|
||||
* @author Ray.Hao
|
||||
* @since 2.5.0
|
||||
*/
|
||||
@Service
|
||||
|
||||
Reference in New Issue
Block a user