Compare commits

..

3 Commits

Author SHA1 Message Date
Bunny ac47b31122 feat(修改): 修改鉴权内容 2024-09-28 21:39:21 +08:00
Bunny b9263fc450 feat(新增): 生成多语言 2024-09-28 20:34:13 +08:00
Bunny c82f6f2757 feat(修改): 代码不要的地方 2024-09-28 20:34:01 +08:00
21 changed files with 81 additions and 66 deletions

View File

@ -20,7 +20,7 @@ public class NewCodeGet {
public static final String entity = "Bunny";
public static void main(String[] args) {
Generation("sys_router");
Generation("sys_i18n", "sys_i18n_type");
}
/**

View File

@ -1,23 +1,35 @@
package cn.bunny.dao.entity.i18n;
import cn.bunny.dao.entity.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 多语言表
* </p>
*
* @author Bunny
* @since 2024-09-28
*/
@Getter
@Setter
@Accessors(chain = true)
@Schema(name = "I18n对象", title = "多语言表", description = "多语言表")
@TableName("sys_i18n")
@ApiModel(value = "I18n对象", description = "多语言表")
public class I18n extends BaseEntity {
@Schema(name = "typeId", title = "语言类型id")
@ApiModelProperty("多语言key")
private Integer keyName;
@ApiModelProperty("多语言翻译名称")
private String translation;
@ApiModelProperty("多语言类型id")
private Long typeId;
@Schema(name = "keyName", title = "多语言key")
private String keyName;
@Schema(name = "summary", title = "翻译")
private String summary;
}
}

View File

@ -2,24 +2,31 @@ package cn.bunny.dao.entity.i18n;
import cn.bunny.dao.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 多语言类型表
* </p>
*
* @author Bunny
* @since 2024-09-28
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("i18n_type")
@Schema(name = "I18nType", title = "多语言类型表", description = "多语言类型表")
@TableName("sys_i18n_type")
@ApiModel(value = "I18nType对象", description = "多语言类型表")
public class I18nType extends BaseEntity {
@Schema(name = "languageName", title = "语言名称")
private String languageName;
@ApiModelProperty("多语言类型(比如zh,en)")
private String typeName;
@Schema(name = "summary", title = "语言名")
@ApiModelProperty("名称解释(比如中文,英文)")
private String summary;
@Schema(name = "isDefault", title = "是否作为默认语言")
private Byte isDefault;
}
}

View File

@ -1,6 +1,5 @@
package cn.bunny.services.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -10,9 +9,8 @@ import org.springframework.web.bind.annotation.RestController;
* </p>
*
* @author Bunny
* @since 2024-09-26
* @since 2024-09-28
*/
@Tag(name = "多语言", description = "多语言相关接口")
@RestController
@RequestMapping("/i18n")
public class I18nController {

View File

@ -1,6 +1,5 @@
package cn.bunny.services.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -10,9 +9,8 @@ import org.springframework.web.bind.annotation.RestController;
* </p>
*
* @author Bunny
* @since 2024-09-26
* @since 2024-09-28
*/
@Tag(name = "多语言类型", description = "多语言类型相关接口")
@RestController
@RequestMapping("/i18nType")
public class I18nTypeController {

View File

@ -1,4 +1,4 @@
package cn.bunny.services.service.process;
package cn.bunny.services.factory;
import cn.bunny.dao.vo.common.TreeSelectVo;
import cn.bunny.dao.vo.router.RouterManageVo;
@ -10,7 +10,7 @@ import java.util.ArrayList;
import java.util.List;
@Component
public class RouterServiceProcess {
public class RouterServiceFactory {
/**
* * 递归调用设置子路由

View File

@ -2,11 +2,13 @@ package cn.bunny.services.factory;
import cn.bunny.common.service.utils.JwtHelper;
import cn.bunny.common.service.utils.ip.IpUtil;
import cn.bunny.common.service.utils.minio.MinioUtil;
import cn.bunny.dao.entity.system.AdminUser;
import cn.bunny.dao.entity.system.Power;
import cn.bunny.dao.entity.system.Role;
import cn.bunny.dao.pojo.constant.LocalDateTimeConstant;
import cn.bunny.dao.pojo.constant.RedisUserConstant;
import cn.bunny.dao.pojo.constant.UserConstant;
import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.services.mapper.PowerMapper;
import cn.bunny.services.mapper.RoleMapper;
@ -15,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@ -33,12 +36,18 @@ public class UserFactory {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private MinioUtil minioUtil;
public LoginVo buildUserVo(AdminUser user, long readMeDay) {
// 创建token
Long userId = user.getId();
String email = user.getEmail();
String token = JwtHelper.createToken(userId, email, (int) readMeDay);
String avatar = user.getAvatar();
// 判断用户是否有头像如果没有头像设置默认头像
avatar = StringUtils.hasText(avatar) ? UserConstant.USER_AVATAR : minioUtil.getObjectNameFullPath(avatar);
// 设置用户IP地址并更新用户信息
AdminUser updateUser = new AdminUser();
@ -56,20 +65,19 @@ public class UserFactory {
List<String> roles = roleMapper.selectListByUserId(userId).stream().map(Role::getRoleCode).toList();
List<String> permissions = new ArrayList<>();
// 判断是否是 admin 如果是admin 赋予所有权限
boolean isAdmin = roles.stream().anyMatch(role -> role.equals("admin"));
if (isAdmin) {
permissions.add("*");
permissions.add("*::*");
permissions.add("*::*::*");
} else {
permissions = powerMapper.selectListByUserId(userId).stream().map(Power::getPowerCode).toList();
}
} else permissions = powerMapper.selectListByUserId(userId).stream().map(Power::getPowerCode).toList();
// 构建返回对象
// 构建返回对象设置用户需要内容
LoginVo loginVo = new LoginVo();
BeanUtils.copyProperties(user, loginVo);
loginVo.setNickname(user.getNickName());
loginVo.setAvatar(avatar);
loginVo.setToken(token);
loginVo.setRefreshToken(token);
loginVo.setLastLoginIp(IpUtil.getCurrentUserIpAddress().getRemoteAddr());

View File

@ -10,7 +10,7 @@ import org.apache.ibatis.annotations.Mapper;
* </p>
*
* @author Bunny
* @since 2024-09-26
* @since 2024-09-28
*/
@Mapper
public interface I18nMapper extends BaseMapper<I18n> {

View File

@ -10,7 +10,7 @@ import org.apache.ibatis.annotations.Mapper;
* </p>
*
* @author Bunny
* @since 2024-09-26
* @since 2024-09-28
*/
@Mapper
public interface I18nTypeMapper extends BaseMapper<I18nType> {

View File

@ -36,8 +36,7 @@ public class NoTokenAuthenticationFilter extends OncePerRequestFilter {
}
// 判断 token 是否过期
boolean expired = JwtHelper.isExpired(token);
if (expired) {
if (JwtHelper.isExpired(token)) {
ResponseUtil.out(response, Result.error(ResultCodeEnum.AUTHENTICATION_EXPIRED));
return;
}

View File

@ -9,15 +9,13 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import java.io.IOException;
/**
* 请求未认证接口
*/
@Slf4j
public class SecurityAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) {
String token = response.getHeader("token");
String message = authException.getMessage();
// 创建结果对象

View File

@ -2,7 +2,6 @@ package cn.bunny.services.security.handelr;
import cn.bunny.dao.pojo.result.Result;
import com.alibaba.fastjson2.JSON;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
@ -11,7 +10,7 @@ import java.io.IOException;
public class SecurityAuthenticationFailureHandler implements org.springframework.security.web.authentication.AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException {
// 错误消息
String localizedMessage = exception.getLocalizedMessage();
Result<String> result = Result.error(localizedMessage);

View File

@ -1,7 +1,6 @@
package cn.bunny.services.security.service.iml;
import cn.bunny.common.service.context.BaseContext;
import cn.bunny.common.service.utils.JwtHelper;
import cn.bunny.dao.entity.system.Power;
import cn.bunny.services.mapper.PowerMapper;
import jakarta.servlet.http.HttpServletRequest;
@ -36,10 +35,6 @@ public class CustomAuthorizationManagerServiceImpl implements AuthorizationManag
public AuthorizationDecision check(Supplier<Authentication> authentication, RequestAuthorizationContext context) {
// 用户的token和用户id请求Url
HttpServletRequest request = context.getRequest();
String token = request.getHeader("token");
// 用户id
Long userId = JwtHelper.getUserId(token);
// 请求地址
String requestURI = request.getRequestURI();
@ -74,6 +69,6 @@ public class CustomAuthorizationManagerServiceImpl implements AuthorizationManag
List<Power> powerList = powerMapper.selectListByPowerCodes(powerCodes);
// 判断是否与请求路径匹配
return powerList.stream().anyMatch(power -> power.getRequestUrl().equals(requestURI));
return powerList.stream().anyMatch(power -> requestURI.matches(power.getRequestUrl()));
}
}

View File

@ -22,7 +22,7 @@ import org.springframework.util.DigestUtils;
import java.util.List;
@Component
public class CustomUserDetailsService implements cn.bunny.services.security.service.CustomUserDetailsService {
public class CustomUserDetailsServiceImpl implements cn.bunny.services.security.service.CustomUserDetailsService {
@Autowired
private UserMapper userMapper;
@ -60,7 +60,9 @@ public class CustomUserDetailsService implements cn.bunny.services.security.serv
Long readMeDay = loginDto.getReadMeDay();
// 查询用户相关内容
LambdaQueryWrapper<AdminUser> queryWrapper = new LambdaQueryWrapper<AdminUser>().eq(AdminUser::getEmail, username).or()
LambdaQueryWrapper<AdminUser> queryWrapper = new LambdaQueryWrapper<AdminUser>()
.eq(AdminUser::getEmail, username)
.or()
.eq(AdminUser::getUsername, username);
AdminUser user = userMapper.selectOne(queryWrapper);

View File

@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
* </p>
*
* @author Bunny
* @since 2024-09-26
* @since 2024-09-28
*/
public interface I18nService extends IService<I18n> {

View File

@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
* </p>
*
* @author Bunny
* @since 2024-09-26
* @since 2024-09-28
*/
public interface I18nTypeService extends IService<I18nType> {

View File

@ -12,7 +12,7 @@ import org.springframework.stereotype.Service;
* </p>
*
* @author Bunny
* @since 2024-09-26
* @since 2024-09-28
*/
@Service
public class I18nServiceImpl extends ServiceImpl<I18nMapper, I18n> implements I18nService {

View File

@ -12,7 +12,7 @@ import org.springframework.stereotype.Service;
* </p>
*
* @author Bunny
* @since 2024-09-26
* @since 2024-09-28
*/
@Service
public class I18nTypeServiceImpl extends ServiceImpl<I18nTypeMapper, I18nType> implements I18nTypeService {

View File

@ -11,9 +11,9 @@ import cn.bunny.dao.vo.router.RouterManageVo;
import cn.bunny.dao.vo.router.RouterMeta;
import cn.bunny.dao.vo.router.UserRouterVo;
import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.services.factory.RouterServiceFactory;
import cn.bunny.services.mapper.RouterMapper;
import cn.bunny.services.service.RouterService;
import cn.bunny.services.service.process.RouterServiceProcess;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -39,7 +39,7 @@ import java.util.List;
@Transactional
public class RouterServiceImpl extends ServiceImpl<RouterMapper, Router> implements RouterService {
@Autowired
private RouterServiceProcess routerServiceProcess;
private RouterServiceFactory routerServiceFactory;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@ -98,7 +98,7 @@ public class RouterServiceImpl extends ServiceImpl<RouterMapper, Router> impleme
// 构建树形结构
routerVoList.forEach(routerVo -> {
if (routerVo.getParentId() == 0) {
routerVo.setChildren(routerServiceProcess.handleGetChildrenWIthRouter(routerVo.getId(), routerVoList));
routerVo.setChildren(routerServiceFactory.handleGetChildrenWIthRouter(routerVo.getId(), routerVoList));
list.add(routerVo);
}
});

View File

@ -5,19 +5,19 @@
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.bunny.dao.entity.i18n.I18n">
<id column="id" property="id"/>
<result column="type_id" property="typeId"/>
<result column="key_name" property="keyName"/>
<result column="summary" property="summary"/>
<result column="translation" property="translation"/>
<result column="type_id" property="typeId"/>
<result column="create_user" property="createUser"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="update_user" property="updateUser"/>
<result column="update_time" property="updateTime"/>
<result column="create_time" property="createTime"/>
<result column="is_deleted" property="isDeleted"/>
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, type_id, key_name, summary, create_user, create_time, update_time, update_user, is_deleted
id, key_name, translation, type_id, create_user, update_user, update_time, create_time, is_deleted
</sql>
</mapper>

View File

@ -5,19 +5,18 @@
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.bunny.dao.entity.i18n.I18nType">
<id column="id" property="id"/>
<result column="language_name" property="languageName"/>
<result column="type_name" property="typeName"/>
<result column="summary" property="summary"/>
<result column="is_default" property="isDefault"/>
<result column="create_user" property="createUser"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="update_user" property="updateUser"/>
<result column="update_time" property="updateTime"/>
<result column="create_time" property="createTime"/>
<result column="is_deleted" property="isDeleted"/>
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, language_name, summary, is_default, create_user, create_time, update_time, update_user, is_deleted
id, type_name, summary, create_user, update_user, update_time, create_time, is_deleted
</sql>
</mapper>