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 final String entity = "Bunny";
public static void main(String[] args) { 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; package cn.bunny.dao.entity.i18n;
import cn.bunny.dao.entity.BaseEntity; 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.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
/**
* <p>
* 多语言表
* </p>
*
* @author Bunny
* @since 2024-09-28
*/
@Getter @Getter
@Setter @Setter
@Accessors(chain = true) @Accessors(chain = true)
@Schema(name = "I18n对象", title = "多语言表", description = "多语言表") @TableName("sys_i18n")
@ApiModel(value = "I18n对象", description = "多语言表")
public class I18n extends BaseEntity { public class I18n extends BaseEntity {
@Schema(name = "typeId", title = "语言类型id") @ApiModelProperty("多语言key")
private Integer keyName;
@ApiModelProperty("多语言翻译名称")
private String translation;
@ApiModelProperty("多语言类型id")
private Long typeId; 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 cn.bunny.dao.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName; 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.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
/**
* <p>
* 多语言类型表
* </p>
*
* @author Bunny
* @since 2024-09-28
*/
@Getter @Getter
@Setter @Setter
@Accessors(chain = true) @Accessors(chain = true)
@TableName("i18n_type") @TableName("sys_i18n_type")
@Schema(name = "I18nType", title = "多语言类型表", description = "多语言类型表") @ApiModel(value = "I18nType对象", description = "多语言类型表")
public class I18nType extends BaseEntity { public class I18nType extends BaseEntity {
@Schema(name = "languageName", title = "语言名称") @ApiModelProperty("多语言类型(比如zh,en)")
private String languageName; private String typeName;
@Schema(name = "summary", title = "语言名") @ApiModelProperty("名称解释(比如中文,英文)")
private String summary; private String summary;
@Schema(name = "isDefault", title = "是否作为默认语言")
private Byte isDefault;
} }

View File

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

View File

@ -1,6 +1,5 @@
package cn.bunny.services.controller; 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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -10,9 +9,8 @@ import org.springframework.web.bind.annotation.RestController;
* </p> * </p>
* *
* @author Bunny * @author Bunny
* @since 2024-09-26 * @since 2024-09-28
*/ */
@Tag(name = "多语言类型", description = "多语言类型相关接口")
@RestController @RestController
@RequestMapping("/i18nType") @RequestMapping("/i18nType")
public class I18nTypeController { 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.common.TreeSelectVo;
import cn.bunny.dao.vo.router.RouterManageVo; import cn.bunny.dao.vo.router.RouterManageVo;
@ -10,7 +10,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
@Component @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.JwtHelper;
import cn.bunny.common.service.utils.ip.IpUtil; 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.AdminUser;
import cn.bunny.dao.entity.system.Power; import cn.bunny.dao.entity.system.Power;
import cn.bunny.dao.entity.system.Role; import cn.bunny.dao.entity.system.Role;
import cn.bunny.dao.pojo.constant.LocalDateTimeConstant; import cn.bunny.dao.pojo.constant.LocalDateTimeConstant;
import cn.bunny.dao.pojo.constant.RedisUserConstant; import cn.bunny.dao.pojo.constant.RedisUserConstant;
import cn.bunny.dao.pojo.constant.UserConstant;
import cn.bunny.dao.vo.user.LoginVo; import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.services.mapper.PowerMapper; import cn.bunny.services.mapper.PowerMapper;
import cn.bunny.services.mapper.RoleMapper; 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.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
@ -33,12 +36,18 @@ public class UserFactory {
@Autowired @Autowired
private RedisTemplate<String, Object> redisTemplate; private RedisTemplate<String, Object> redisTemplate;
@Autowired
private MinioUtil minioUtil;
public LoginVo buildUserVo(AdminUser user, long readMeDay) { public LoginVo buildUserVo(AdminUser user, long readMeDay) {
// 创建token // 创建token
Long userId = user.getId(); Long userId = user.getId();
String email = user.getEmail(); String email = user.getEmail();
String token = JwtHelper.createToken(userId, email, (int) readMeDay); String token = JwtHelper.createToken(userId, email, (int) readMeDay);
String avatar = user.getAvatar();
// 判断用户是否有头像如果没有头像设置默认头像
avatar = StringUtils.hasText(avatar) ? UserConstant.USER_AVATAR : minioUtil.getObjectNameFullPath(avatar);
// 设置用户IP地址并更新用户信息 // 设置用户IP地址并更新用户信息
AdminUser updateUser = new AdminUser(); AdminUser updateUser = new AdminUser();
@ -56,20 +65,19 @@ public class UserFactory {
List<String> roles = roleMapper.selectListByUserId(userId).stream().map(Role::getRoleCode).toList(); List<String> roles = roleMapper.selectListByUserId(userId).stream().map(Role::getRoleCode).toList();
List<String> permissions = new ArrayList<>(); List<String> permissions = new ArrayList<>();
// 判断是否是 admin 如果是admin 赋予所有权限
boolean isAdmin = roles.stream().anyMatch(role -> role.equals("admin")); boolean isAdmin = roles.stream().anyMatch(role -> role.equals("admin"));
if (isAdmin) { if (isAdmin) {
permissions.add("*"); permissions.add("*");
permissions.add("*::*"); permissions.add("*::*");
permissions.add("*::*::*"); permissions.add("*::*::*");
} else { } else permissions = powerMapper.selectListByUserId(userId).stream().map(Power::getPowerCode).toList();
permissions = powerMapper.selectListByUserId(userId).stream().map(Power::getPowerCode).toList();
}
// 构建返回对象 // 构建返回对象设置用户需要内容
LoginVo loginVo = new LoginVo(); LoginVo loginVo = new LoginVo();
BeanUtils.copyProperties(user, loginVo); BeanUtils.copyProperties(user, loginVo);
loginVo.setNickname(user.getNickName()); loginVo.setNickname(user.getNickName());
loginVo.setAvatar(avatar);
loginVo.setToken(token); loginVo.setToken(token);
loginVo.setRefreshToken(token); loginVo.setRefreshToken(token);
loginVo.setLastLoginIp(IpUtil.getCurrentUserIpAddress().getRemoteAddr()); loginVo.setLastLoginIp(IpUtil.getCurrentUserIpAddress().getRemoteAddr());

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,6 @@
package cn.bunny.services.security.service.iml; package cn.bunny.services.security.service.iml;
import cn.bunny.common.service.context.BaseContext; import cn.bunny.common.service.context.BaseContext;
import cn.bunny.common.service.utils.JwtHelper;
import cn.bunny.dao.entity.system.Power; import cn.bunny.dao.entity.system.Power;
import cn.bunny.services.mapper.PowerMapper; import cn.bunny.services.mapper.PowerMapper;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
@ -36,10 +35,6 @@ public class CustomAuthorizationManagerServiceImpl implements AuthorizationManag
public AuthorizationDecision check(Supplier<Authentication> authentication, RequestAuthorizationContext context) { public AuthorizationDecision check(Supplier<Authentication> authentication, RequestAuthorizationContext context) {
// 用户的token和用户id请求Url // 用户的token和用户id请求Url
HttpServletRequest request = context.getRequest(); HttpServletRequest request = context.getRequest();
String token = request.getHeader("token");
// 用户id
Long userId = JwtHelper.getUserId(token);
// 请求地址 // 请求地址
String requestURI = request.getRequestURI(); String requestURI = request.getRequestURI();
@ -74,6 +69,6 @@ public class CustomAuthorizationManagerServiceImpl implements AuthorizationManag
List<Power> powerList = powerMapper.selectListByPowerCodes(powerCodes); 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; import java.util.List;
@Component @Component
public class CustomUserDetailsService implements cn.bunny.services.security.service.CustomUserDetailsService { public class CustomUserDetailsServiceImpl implements cn.bunny.services.security.service.CustomUserDetailsService {
@Autowired @Autowired
private UserMapper userMapper; private UserMapper userMapper;
@ -60,7 +60,9 @@ public class CustomUserDetailsService implements cn.bunny.services.security.serv
Long readMeDay = loginDto.getReadMeDay(); 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); .eq(AdminUser::getUsername, username);
AdminUser user = userMapper.selectOne(queryWrapper); AdminUser user = userMapper.selectOne(queryWrapper);

View File

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

View File

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

View File

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

View File

@ -12,7 +12,7 @@ import org.springframework.stereotype.Service;
* </p> * </p>
* *
* @author Bunny * @author Bunny
* @since 2024-09-26 * @since 2024-09-28
*/ */
@Service @Service
public class I18nTypeServiceImpl extends ServiceImpl<I18nTypeMapper, I18nType> implements I18nTypeService { 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.RouterMeta;
import cn.bunny.dao.vo.router.UserRouterVo; import cn.bunny.dao.vo.router.UserRouterVo;
import cn.bunny.dao.vo.user.LoginVo; import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.services.factory.RouterServiceFactory;
import cn.bunny.services.mapper.RouterMapper; import cn.bunny.services.mapper.RouterMapper;
import cn.bunny.services.service.RouterService; 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.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -39,7 +39,7 @@ import java.util.List;
@Transactional @Transactional
public class RouterServiceImpl extends ServiceImpl<RouterMapper, Router> implements RouterService { public class RouterServiceImpl extends ServiceImpl<RouterMapper, Router> implements RouterService {
@Autowired @Autowired
private RouterServiceProcess routerServiceProcess; private RouterServiceFactory routerServiceFactory;
@Autowired @Autowired
private RedisTemplate<String, Object> redisTemplate; private RedisTemplate<String, Object> redisTemplate;
@ -98,7 +98,7 @@ public class RouterServiceImpl extends ServiceImpl<RouterMapper, Router> impleme
// 构建树形结构 // 构建树形结构
routerVoList.forEach(routerVo -> { routerVoList.forEach(routerVo -> {
if (routerVo.getParentId() == 0) { if (routerVo.getParentId() == 0) {
routerVo.setChildren(routerServiceProcess.handleGetChildrenWIthRouter(routerVo.getId(), routerVoList)); routerVo.setChildren(routerServiceFactory.handleGetChildrenWIthRouter(routerVo.getId(), routerVoList));
list.add(routerVo); list.add(routerVo);
} }
}); });

View File

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

View File

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