fix: 优化登录用户逻辑

This commit is contained in:
tangwei 2026-04-28 19:13:19 +08:00
parent 2ecb68fbb6
commit 8ed2545759
6 changed files with 158 additions and 9 deletions

View File

@ -1,6 +1,7 @@
package com.yfd.platform.env.controller; package com.yfd.platform.env.controller;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.annotation.Log; import com.yfd.platform.annotation.Log;
import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceRequest;
@ -55,8 +56,8 @@ public class SdFishDictoryBController {
@Operation(summary = "根据名称查询所有鱼类字典") @Operation(summary = "根据名称查询所有鱼类字典")
public ResponseResult listByName(@RequestParam(required = false) String name) { public ResponseResult listByName(@RequestParam(required = false) String name) {
return ResponseResult.successData(sdFishDictoryBService.list( return ResponseResult.successData(sdFishDictoryBService.list(
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<SdFishDictoryB>() new LambdaQueryWrapper<SdFishDictoryB>()
.eq(StrUtil.isNotBlank(name), SdFishDictoryB::getName, name) .eq(StrUtil.isNotBlank(name), SdFishDictoryB::getName, name).select(SdFishDictoryB::getId, SdFishDictoryB::getName, SdFishDictoryB::getAlias)
)); ));
} }
@ -89,4 +90,12 @@ public class SdFishDictoryBController {
boolean result = sdFishDictoryBService.deleteById(id); boolean result = sdFishDictoryBService.deleteById(id);
return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败");
} }
@GetMapping("/similar")
@Operation(summary = "查询相似鱼类列表")
public ResponseResult findSimilarFish(
@RequestParam String name,
@RequestParam(required = false, defaultValue = "10") Integer limit) {
return ResponseResult.successData(sdFishDictoryBService.findSimilarFish(name, limit));
}
} }

View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.yfd.platform.env.domain.SdFishDictoryB; import com.yfd.platform.env.domain.SdFishDictoryB;
import java.util.List;
public interface ISdFishDictoryBService extends IService<SdFishDictoryB> { public interface ISdFishDictoryBService extends IService<SdFishDictoryB> {
Page<SdFishDictoryB> selectPage(String name, String code, Integer type, Integer rare, Page<SdFishDictoryB> page); Page<SdFishDictoryB> selectPage(String name, String code, Integer type, Integer rare, Page<SdFishDictoryB> page);
@ -15,4 +17,6 @@ public interface ISdFishDictoryBService extends IService<SdFishDictoryB> {
boolean deleteById(String id); boolean deleteById(String id);
SdFishDictoryB getById(String id); SdFishDictoryB getById(String id);
List<SdFishDictoryB> findSimilarFish(String name, Integer limit);
} }

View File

@ -9,6 +9,9 @@ import com.yfd.platform.env.service.ISdFishDictoryBService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
@Service @Service
public class SdFishDictoryBServiceImpl extends ServiceImpl<SdFishDictoryBMapper, SdFishDictoryB> implements ISdFishDictoryBService { public class SdFishDictoryBServiceImpl extends ServiceImpl<SdFishDictoryBMapper, SdFishDictoryB> implements ISdFishDictoryBService {
@ -62,4 +65,116 @@ public class SdFishDictoryBServiceImpl extends ServiceImpl<SdFishDictoryBMapper,
.eq(SdFishDictoryB::getIsDeleted, 0); .eq(SdFishDictoryB::getIsDeleted, 0);
return getOne(wrapper); return getOne(wrapper);
} }
@Override
public List<SdFishDictoryB> findSimilarFish(String name, Integer limit) {
if (!StringUtils.hasText(name)) {
return Collections.emptyList();
}
String searchName = name.trim();
LambdaQueryWrapper<SdFishDictoryB> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SdFishDictoryB::getIsDeleted, 0);
List<SdFishDictoryB> allFish = list(wrapper);
SdFishDictoryB referenceFish = allFish.stream()
.filter(f -> f.getName() != null && f.getName().equals(searchName))
.findFirst()
.orElse(null);
if (referenceFish == null) {
referenceFish = allFish.stream()
.filter(f -> f.getName() != null && f.getName().contains(searchName))
.findFirst()
.orElse(null);
}
if (referenceFish == null && allFish.stream().anyMatch(f ->
f.getName() != null && (f.getName().contains(searchName) || searchName.contains(f.getName())))) {
final String searchNameFinal = searchName;
referenceFish = allFish.stream()
.filter(f -> f.getName() != null &&
(f.getName().contains(searchNameFinal) || searchNameFinal.contains(f.getName())))
.findFirst()
.orElse(null);
}
if (referenceFish == null) {
return allFish.stream()
.filter(f -> f.getName() != null && f.getName().contains(searchName))
.limit(limit != null ? limit : 10)
.collect(Collectors.toList());
}
final SdFishDictoryB finalRefFish = referenceFish;
Map<SdFishDictoryB, Integer> similarityMap = new HashMap<>();
for (SdFishDictoryB fish : allFish) {
if (fish.getId().equals(finalRefFish.getId())) {
continue;
}
int score = calculateSimilarity(finalRefFish, fish);
if (score > 0) {
similarityMap.put(fish, score);
}
}
return similarityMap.entrySet().stream()
.sorted(Map.Entry.<SdFishDictoryB, Integer>comparingByValue().reversed())
.limit(limit != null ? limit : 10)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
}
private int calculateSimilarity(SdFishDictoryB ref, SdFishDictoryB target) {
int score = 0;
if (ref.getOrders() != null && ref.getOrders().equals(target.getOrders())) {
score += 3;
}
if (ref.getFamily() != null && ref.getFamily().equals(target.getFamily())) {
score += 5;
}
if (ref.getGenus() != null && ref.getGenus().equals(target.getGenus())) {
score += 8;
}
if (ref.getSpecies() != null && ref.getSpecies().equals(target.getSpecies())) {
score += 10;
}
if (ref.getType() != null && ref.getType().equals(target.getType())) {
score += 2;
}
if (ref.getHabitat() != null && ref.getHabitat().equals(target.getHabitat())) {
score += 3;
}
if (ref.getRare() != null && ref.getRare().equals(target.getRare())) {
score += 2;
}
if (ref.getPtype() != null && ref.getPtype().equals(target.getPtype())) {
score += 2;
}
if (ref.getResourceType() != null && ref.getResourceType().equals(target.getResourceType())) {
score += 2;
}
if (ref.getHabitMigrat() != null && ref.getHabitMigrat().equals(target.getHabitMigrat())) {
score += 3;
}
if (ref.getFeedingHabit() != null && ref.getFeedingHabit().equals(target.getFeedingHabit())) {
score += 2;
}
if (ref.getSpawnCharact() != null && ref.getSpawnCharact().equals(target.getSpawnCharact())) {
score += 2;
}
return score;
}
} }

View File

@ -5,6 +5,7 @@ import cn.hutool.jwt.JWTUtil;
import com.yfd.platform.config.ResponseResult; import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.config.WebConfig; import com.yfd.platform.config.WebConfig;
import com.yfd.platform.system.domain.*; import com.yfd.platform.system.domain.*;
import com.yfd.platform.system.mapper.SysMenuMapper;
import com.yfd.platform.system.service.ISmsVerifyCodeService; import com.yfd.platform.system.service.ISmsVerifyCodeService;
import com.yfd.platform.system.service.ISysLogService; import com.yfd.platform.system.service.ISysLogService;
import com.yfd.platform.system.service.IUserService; import com.yfd.platform.system.service.IUserService;
@ -47,6 +48,9 @@ public class SmsVerifyCodeController {
@Resource @Resource
private ISysLogService sysLogService; private ISysLogService sysLogService;
@Resource
private SysMenuMapper sysMenuMapper;
@Value("${rsa.private_key}") @Value("${rsa.private_key}")
private String privateKey; private String privateKey;
@ -150,6 +154,8 @@ public class SmsVerifyCodeController {
user.setOrgid("e90063ced25e3d469860e88d920c082f"); user.setOrgid("e90063ced25e3d469860e88d920c082f");
user.setUsertype(1); user.setUsertype(1);
user.setUsername(smsVerifyCodeRequest.getUsername()); user.setUsername(smsVerifyCodeRequest.getUsername());
user.setGroupCode(smsVerifyCodeRequest.getGroupCode());
user.setCompanyCode(smsVerifyCodeRequest.getCompanyCode());
boolean success = userService.save(user); boolean success = userService.save(user);
// 给注册用户加上默认权限 // 给注册用户加上默认权限
this.addDefaultRole(smsVerifyCodeRequest); this.addDefaultRole(smsVerifyCodeRequest);
@ -162,12 +168,9 @@ public class SmsVerifyCodeController {
private boolean addDefaultRole(SmsVerifyCodeRequest smsVerifyCodeRequest) { private boolean addDefaultRole(SmsVerifyCodeRequest smsVerifyCodeRequest) {
String stationCode = smsVerifyCodeRequest.getStationCode(); String stationCode = smsVerifyCodeRequest.getStationCode();
String companyCode = smsVerifyCodeRequest.getCompanyCode();
String groupCode = smsVerifyCodeRequest.getGroupCode();
String hbrvcdCode = smsVerifyCodeRequest.getHbrvcdCode(); String hbrvcdCode = smsVerifyCodeRequest.getHbrvcdCode();
List<String> roleIds=new ArrayList<>();
roleIds.add("c13481a486c9ee559cf305284df4d207");
roleIds.add("c13481a486c9ee559cf305284df4d207");
return true; return true;
} }
@ -277,7 +280,10 @@ public class SmsVerifyCodeController {
LoginUser loginUser = new LoginUser(); LoginUser loginUser = new LoginUser();
loginUser.setUser(user); loginUser.setUser(user);
loginUser.setUsername(user.getUsername()); loginUser.setUsername(user.getUsername());
//Todo 根据用户查询权限信息 添加到LoginUser中
List<String> permissions =
sysMenuMapper.selectPermsByUserId(user.getId());
loginUser.setPermissions( permissions);
HttpServletRequest request = RequestHolder.getHttpServletRequest(); HttpServletRequest request = RequestHolder.getHttpServletRequest();
SysLog sysLog = new SysLog(); SysLog sysLog = new SysLog();
sysLog.setUsercode(user.getUsername()); sysLog.setUsercode(user.getUsername());

View File

@ -24,9 +24,15 @@ public class LoginUser implements UserDetails {
private List<String> permissions=new ArrayList<>(); private List<String> permissions=new ArrayList<>();
/**
* 自定义构造函数如果需要特殊逻辑
*/
public LoginUser(SysUser user, List<String> permissions) { public LoginUser(SysUser user, List<String> permissions) {
this.user = user; this.user = user;
this.permissions = permissions; // 4. 增加非空判断确保 permissions 永远不为 null
if (permissions != null) {
this.permissions = permissions;
}
} }
@JSONField(serialize = false) @JSONField(serialize = false)

View File

@ -146,6 +146,15 @@ public class SysUser implements Serializable {
*/ */
private Date regTime; private Date regTime;
/**
* 集团编号
*/
private String groupCode;
/**
* 公司编号
*/
private String companyCode;
@TableField(exist = false) @TableField(exist = false)
List<SysRole> roles; List<SysRole> roles;
} }