This commit is contained in:
aoshiguchen
2023-08-04 13:55:44 +08:00
3 changed files with 206 additions and 191 deletions
@@ -42,6 +42,7 @@ public class ServiceException extends RuntimeException {
private String msg; private String msg;
public ServiceException(int code, String msg) { public ServiceException(int code, String msg) {
super(msg);
this.code = code; this.code = code;
this.msg = msg; this.msg = msg;
} }
@@ -50,6 +50,7 @@ public enum ExceptionConstant {
ORIGIN_PASSWORD_CHECK_FAIL(12002, "原密码验证失败"), ORIGIN_PASSWORD_CHECK_FAIL(12002, "原密码验证失败"),
LOGIN_PASSWORD_LENGTH_CHECK_FAIL(12003, "登录密码不能小于6位数"), LOGIN_PASSWORD_LENGTH_CHECK_FAIL(12003, "登录密码不能小于6位数"),
LOGIN_PASSWORD_NO_CHANGE_MODIFY_FAIL(12004, "密码没有变化,修改失败"), LOGIN_PASSWORD_NO_CHANGE_MODIFY_FAIL(12004, "密码没有变化,修改失败"),
LICENSE_CANNOT_BE_DELETED(12005, "license下存在[{}]个端口映射!"),
// 端口池管理(13000) // 端口池管理(13000)
PORT_CANNOT_REPEAT(13000,"端口不能重复"), PORT_CANNOT_REPEAT(13000,"端口不能重复"),
PORT_NOT_EXIST(13001, "该端口在端口池中不存在"), PORT_NOT_EXIST(13001, "该端口在端口池中不存在"),
@@ -6,9 +6,12 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import ma.glasnost.orika.MapperFacade;
import org.apache.ibatis.solon.annotation.Db;
import org.dromara.neutrinoproxy.server.base.db.DBInitialize; import org.dromara.neutrinoproxy.server.base.db.DBInitialize;
import org.dromara.neutrinoproxy.server.base.page.PageInfo; import org.dromara.neutrinoproxy.server.base.page.PageInfo;
import org.dromara.neutrinoproxy.server.base.page.PageQuery; import org.dromara.neutrinoproxy.server.base.page.PageQuery;
import org.dromara.neutrinoproxy.server.base.rest.ServiceException;
import org.dromara.neutrinoproxy.server.base.rest.SystemContextHolder; import org.dromara.neutrinoproxy.server.base.rest.SystemContextHolder;
import org.dromara.neutrinoproxy.server.constant.EnableStatusEnum; import org.dromara.neutrinoproxy.server.constant.EnableStatusEnum;
import org.dromara.neutrinoproxy.server.constant.ExceptionConstant; import org.dromara.neutrinoproxy.server.constant.ExceptionConstant;
@@ -19,17 +22,15 @@ import org.dromara.neutrinoproxy.server.controller.req.proxy.LicenseUpdateEnable
import org.dromara.neutrinoproxy.server.controller.req.proxy.LicenseUpdateReq; import org.dromara.neutrinoproxy.server.controller.req.proxy.LicenseUpdateReq;
import org.dromara.neutrinoproxy.server.controller.res.proxy.*; import org.dromara.neutrinoproxy.server.controller.res.proxy.*;
import org.dromara.neutrinoproxy.server.dal.LicenseMapper; import org.dromara.neutrinoproxy.server.dal.LicenseMapper;
import org.dromara.neutrinoproxy.server.dal.PortMappingMapper;
import org.dromara.neutrinoproxy.server.dal.UserMapper; import org.dromara.neutrinoproxy.server.dal.UserMapper;
import org.dromara.neutrinoproxy.server.dal.entity.LicenseDO; import org.dromara.neutrinoproxy.server.dal.entity.LicenseDO;
import org.dromara.neutrinoproxy.server.dal.entity.PortMappingDO;
import org.dromara.neutrinoproxy.server.dal.entity.UserDO; import org.dromara.neutrinoproxy.server.dal.entity.UserDO;
import org.dromara.neutrinoproxy.server.util.ParamCheckUtil; import org.dromara.neutrinoproxy.server.util.ParamCheckUtil;
import ma.glasnost.orika.MapperFacade;
import org.apache.ibatis.solon.annotation.Db;
import org.dromara.neutrinoproxy.server.controller.res.proxy.*;
import org.noear.solon.annotation.Component; import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Init; import org.noear.solon.annotation.Init;
import org.noear.solon.annotation.Inject; import org.noear.solon.annotation.Inject;
import org.noear.solon.core.Lifecycle;
import org.noear.solon.core.bean.LifecycleBean; import org.noear.solon.core.bean.LifecycleBean;
import java.util.*; import java.util.*;
@@ -38,219 +39,231 @@ import java.util.stream.Collectors;
/** /**
* license服务 * license服务
*
* @author: aoshiguchen * @author: aoshiguchen
* @date: 2022/8/6 * @date: 2022/8/6
*/ */
@Component @Component
public class LicenseService implements LifecycleBean { public class LicenseService implements LifecycleBean {
@Inject @Inject
private MapperFacade mapperFacade; private MapperFacade mapperFacade;
@Db @Db
private LicenseMapper licenseMapper; private LicenseMapper licenseMapper;
@Db @Db
private UserMapper userMapper; private PortMappingMapper portMappingMapper;
@Inject @Db
private VisitorChannelService visitorChannelService; private UserMapper userMapper;
@Inject @Inject
private DBInitialize dbInitialize; private VisitorChannelService visitorChannelService;
@Inject
private DBInitialize dbInitialize;
public PageInfo<LicenseListRes> page(PageQuery pageQuery, LicenseListReq req) { public PageInfo<LicenseListRes> page(PageQuery pageQuery, LicenseListReq req) {
Page<LicenseListRes> result = PageHelper.startPage(pageQuery.getCurrent(), pageQuery.getSize()); Page<LicenseListRes> result = PageHelper.startPage(pageQuery.getCurrent(), pageQuery.getSize());
List<LicenseDO> list = licenseMapper.selectList(new LambdaQueryWrapper<LicenseDO>() List<LicenseDO> list = licenseMapper.selectList(new LambdaQueryWrapper<LicenseDO>()
.eq(req.getUserId() != null, LicenseDO::getUserId, req.getUserId()) .eq(req.getUserId() != null, LicenseDO::getUserId, req.getUserId())
.eq(req.getIsOnline() != null, LicenseDO::getIsOnline, req.getIsOnline()) .eq(req.getIsOnline() != null, LicenseDO::getIsOnline, req.getIsOnline())
.eq(req.getEnable() != null, LicenseDO::getEnable, req.getEnable()) .eq(req.getEnable() != null, LicenseDO::getEnable, req.getEnable())
.orderByAsc(Arrays.asList(LicenseDO::getUserId, LicenseDO::getId)) .orderByAsc(Arrays.asList(LicenseDO::getUserId, LicenseDO::getId))
); );
List<LicenseListRes> respList = mapperFacade.mapAsList(list, LicenseListRes.class); List<LicenseListRes> respList = mapperFacade.mapAsList(list, LicenseListRes.class);
if (CollectionUtils.isEmpty(list)) { if (CollectionUtils.isEmpty(list)) {
return PageInfo.of(respList, result.getTotal(), pageQuery.getCurrent(), pageQuery.getSize()); return PageInfo.of(respList, result.getTotal(), pageQuery.getCurrent(), pageQuery.getSize());
} }
if (!CollectionUtil.isEmpty(respList)) { if (!CollectionUtil.isEmpty(respList)) {
Set<Integer> userIds = respList.stream().map(LicenseListRes::getUserId).collect(Collectors.toSet()); Set<Integer> userIds = respList.stream().map(LicenseListRes::getUserId).collect(Collectors.toSet());
List<UserDO> userList = userMapper.findByIds(userIds); List<UserDO> userList = userMapper.findByIds(userIds);
Map<Integer, UserDO> userMap = userList.stream().collect(Collectors.toMap(UserDO::getId, Function.identity())); Map<Integer, UserDO> userMap = userList.stream().collect(Collectors.toMap(UserDO::getId, Function.identity()));
for (LicenseListRes item : respList) { for (LicenseListRes item : respList) {
UserDO userDO = userMap.get(item.getUserId()); UserDO userDO = userMap.get(item.getUserId());
if (null != userDO) { if (null != userDO) {
item.setUserName(userDO.getName()); item.setUserName(userDO.getName());
} }
item.setKey(desensitization(item.getUserId(), item.getKey())); item.setKey(desensitization(item.getUserId(), item.getKey()));
} }
} }
return PageInfo.of(respList, result.getTotal(), pageQuery.getCurrent(), pageQuery.getSize()); return PageInfo.of(respList, result.getTotal(), pageQuery.getCurrent(), pageQuery.getSize());
} }
public List<LicenseListRes> list(LicenseListReq req) { public List<LicenseListRes> list(LicenseListReq req) {
List<LicenseDO> list = licenseMapper.selectList(new LambdaQueryWrapper<LicenseDO>() List<LicenseDO> list = licenseMapper.selectList(new LambdaQueryWrapper<LicenseDO>()
.eq(null != req.getEnable(), LicenseDO::getEnable, req.getEnable()) .eq(null != req.getEnable(), LicenseDO::getEnable, req.getEnable())
); );
List<LicenseListRes> licenseList = assembleConvertLicenses(list); List<LicenseListRes> licenseList = assembleConvertLicenses(list);
return licenseList; return licenseList;
} }
private List<LicenseListRes> assembleConvertLicenses(List<LicenseDO> list) { private List<LicenseListRes> assembleConvertLicenses(List<LicenseDO> list) {
List<LicenseListRes> licenseList = mapperFacade.mapAsList(list, LicenseListRes.class); List<LicenseListRes> licenseList = mapperFacade.mapAsList(list, LicenseListRes.class);
if (!CollectionUtil.isEmpty(licenseList)) { if (!CollectionUtil.isEmpty(licenseList)) {
Set<Integer> userIds = licenseList.stream().map(LicenseListRes::getUserId).collect(Collectors.toSet()); Set<Integer> userIds = licenseList.stream().map(LicenseListRes::getUserId).collect(Collectors.toSet());
List<UserDO> userList = userMapper.findByIds(userIds); List<UserDO> userList = userMapper.findByIds(userIds);
Map<Integer, UserDO> userMap = userList.stream().collect(Collectors.toMap(UserDO::getId, Function.identity())); Map<Integer, UserDO> userMap = userList.stream().collect(Collectors.toMap(UserDO::getId, Function.identity()));
for (LicenseListRes item : licenseList) { for (LicenseListRes item : licenseList) {
UserDO userDO = userMap.get(item.getUserId()); UserDO userDO = userMap.get(item.getUserId());
if (null != userDO) { if (null != userDO) {
item.setUserName(userDO.getName()); item.setUserName(userDO.getName());
} }
item.setKey(desensitization(item.getUserId(), item.getKey())); item.setKey(desensitization(item.getUserId(), item.getKey()));
} }
} }
return licenseList; return licenseList;
} }
/** /**
* 创建license * 创建license
* @param req *
* @return * @param req
*/ * @return
public LicenseCreateRes create(LicenseCreateReq req) { */
LicenseDO licenseDO = licenseMapper.checkRepeat(req.getUserId(), req.getName()); public LicenseCreateRes create(LicenseCreateReq req) {
ParamCheckUtil.checkExpression(null == licenseDO, ExceptionConstant.LICENSE_NAME_CANNOT_REPEAT); LicenseDO licenseDO = licenseMapper.checkRepeat(req.getUserId(), req.getName());
ParamCheckUtil.checkExpression(null == licenseDO, ExceptionConstant.LICENSE_NAME_CANNOT_REPEAT);
String key = UUID.randomUUID().toString().replaceAll("-", ""); String key = UUID.randomUUID().toString().replaceAll("-", "");
Date now = new Date(); Date now = new Date();
licenseMapper.insert(new LicenseDO() licenseMapper.insert(new LicenseDO()
.setName(req.getName()) .setName(req.getName())
.setKey(key) .setKey(key)
.setUserId(req.getUserId()) .setUserId(req.getUserId())
.setIsOnline(OnlineStatusEnum.OFFLINE.getStatus()) .setIsOnline(OnlineStatusEnum.OFFLINE.getStatus())
.setEnable(EnableStatusEnum.ENABLE.getStatus()) .setEnable(EnableStatusEnum.ENABLE.getStatus())
.setCreateTime(now) .setCreateTime(now)
.setUpdateTime(now) .setUpdateTime(now)
); );
return new LicenseCreateRes(); return new LicenseCreateRes();
} }
public LicenseUpdateRes update(LicenseUpdateReq req) { public LicenseUpdateRes update(LicenseUpdateReq req) {
LicenseDO oldLicenseDO = licenseMapper.findById(req.getId()); LicenseDO oldLicenseDO = licenseMapper.findById(req.getId());
ParamCheckUtil.checkNotNull(oldLicenseDO, ExceptionConstant.LICENSE_NOT_EXIST); ParamCheckUtil.checkNotNull(oldLicenseDO, ExceptionConstant.LICENSE_NOT_EXIST);
LicenseDO licenseCheck = licenseMapper.checkRepeat(oldLicenseDO.getUserId(), req.getName(), Sets.newHashSet(oldLicenseDO.getId())); LicenseDO licenseCheck = licenseMapper.checkRepeat(oldLicenseDO.getUserId(), req.getName(), Sets.newHashSet(oldLicenseDO.getId()));
ParamCheckUtil.checkMustNull(licenseCheck, ExceptionConstant.LICENSE_NAME_CANNOT_REPEAT); ParamCheckUtil.checkMustNull(licenseCheck, ExceptionConstant.LICENSE_NAME_CANNOT_REPEAT);
licenseMapper.update(req.getId(), req.getName(), new Date()); licenseMapper.update(req.getId(), req.getName(), new Date());
return new LicenseUpdateRes(); return new LicenseUpdateRes();
} }
public LicenseDetailRes detail(Integer id) { public LicenseDetailRes detail(Integer id) {
LicenseDO licenseDO = licenseMapper.findById(id); LicenseDO licenseDO = licenseMapper.findById(id);
if (null == licenseDO) { if (null == licenseDO) {
return null; return null;
} }
UserDO userDO = userMapper.findById(licenseDO.getUserId()); UserDO userDO = userMapper.findById(licenseDO.getUserId());
String userName = ""; String userName = "";
if (null != userDO) { if (null != userDO) {
userName = userDO.getName(); userName = userDO.getName();
} }
return new LicenseDetailRes() return new LicenseDetailRes()
.setId(licenseDO.getId()) .setId(licenseDO.getId())
.setName(licenseDO.getName()) .setName(licenseDO.getName())
.setKey(desensitization(licenseDO.getUserId(), licenseDO.getKey())) .setKey(desensitization(licenseDO.getUserId(), licenseDO.getKey()))
.setUserId(licenseDO.getUserId()) .setUserId(licenseDO.getUserId())
.setUserName(userName) .setUserName(userName)
.setIsOnline(licenseDO.getIsOnline()) .setIsOnline(licenseDO.getIsOnline())
.setEnable(licenseDO.getEnable()) .setEnable(licenseDO.getEnable())
.setCreateTime(licenseDO.getCreateTime()) .setCreateTime(licenseDO.getCreateTime())
.setUpdateTime(licenseDO.getUpdateTime()) .setUpdateTime(licenseDO.getUpdateTime())
; ;
} }
/** /**
* 更新license启用状态 * 更新license启用状态
* @param req *
* @return * @param req
*/ * @return
public LicenseUpdateEnableStatusRes updateEnableStatus(LicenseUpdateEnableStatusReq req) { */
licenseMapper.updateEnableStatus(req.getId(), req.getEnable(), new Date()); public LicenseUpdateEnableStatusRes updateEnableStatus(LicenseUpdateEnableStatusReq req) {
// 更新VisitorChannel licenseMapper.updateEnableStatus(req.getId(), req.getEnable(), new Date());
visitorChannelService.updateVisitorChannelByLicenseId(req.getId(), req.getEnable()); // 更新VisitorChannel
return new LicenseUpdateEnableStatusRes(); visitorChannelService.updateVisitorChannelByLicenseId(req.getId(), req.getEnable());
} return new LicenseUpdateEnableStatusRes();
}
/** /**
* 删除license * 删除license
* @param id *
*/ * @param id
public void delete(Integer id) { */
licenseMapper.deleteById(id); public void delete(Integer id) {
// 更新VisitorChannel List<PortMappingDO> portMappingDOList = portMappingMapper.findListByLicenseId(id);
visitorChannelService.updateVisitorChannelByLicenseId(id, EnableStatusEnum.DISABLE.getStatus()); if (CollectionUtil.isNotEmpty(portMappingDOList)) {
} throw ServiceException.create(ExceptionConstant.LICENSE_CANNOT_BE_DELETED, portMappingDOList.size());
}
licenseMapper.deleteById(id);
// 更新VisitorChannel
visitorChannelService.updateVisitorChannelByLicenseId(id, EnableStatusEnum.DISABLE.getStatus());
}
/** /**
* 重置license * 重置license
* @param id *
*/ * @param id
public void reset(Integer id) { */
String key = UUID.randomUUID().toString().replaceAll("-", ""); public void reset(Integer id) {
Date now = new Date(); String key = UUID.randomUUID().toString().replaceAll("-", "");
Date now = new Date();
licenseMapper.reset(id, key, now); licenseMapper.reset(id, key, now);
} }
public LicenseDO findByKey(String license) { public LicenseDO findByKey(String license) {
return licenseMapper.findByKey(license); return licenseMapper.findByKey(license);
} }
/** /**
* 脱敏处理 * 脱敏处理
* 非当前登录人的license,一律脱敏 * 非当前登录人的license,一律脱敏
* @param userId *
* @param licenseKey * @param userId
* @return * @param licenseKey
*/ * @return
private String desensitization(Integer userId, String licenseKey) { */
Integer currentUserId = SystemContextHolder.getUser().getId(); private String desensitization(Integer userId, String licenseKey) {
if (currentUserId.equals(userId)) { Integer currentUserId = SystemContextHolder.getUser().getId();
return licenseKey; if (currentUserId.equals(userId)) {
} return licenseKey;
return licenseKey.substring(0, 10) + "****" + licenseKey.substring(licenseKey.length() - 10); }
} return licenseKey.substring(0, 10) + "****" + licenseKey.substring(licenseKey.length() - 10);
}
/** /**
* 服务端项目停止、启动时,更新在线状态为离线 * 服务端项目停止、启动时,更新在线状态为离线
*/ */
@Init @Init
public void init() { public void init() {
licenseMapper.updateOnlineStatus(OnlineStatusEnum.OFFLINE.getStatus(), new Date()); licenseMapper.updateOnlineStatus(OnlineStatusEnum.OFFLINE.getStatus(), new Date());
} }
@Override @Override
public void start() throws Throwable { public void start() throws Throwable {
} }
/** /**
* 服务端项目停止、启动时,更新在线状态为离线 * 服务端项目停止、启动时,更新在线状态为离线
*/ */
@Override @Override
public void stop() throws Throwable { public void stop() throws Throwable {
licenseMapper.updateOnlineStatus(OnlineStatusEnum.OFFLINE.getStatus(), new Date()); licenseMapper.updateOnlineStatus(OnlineStatusEnum.OFFLINE.getStatus(), new Date());
} }
/** /**
* 查询当前角色下的license,若为管理员 则返回全部license * 查询当前角色下的license,若为管理员 则返回全部license
*/ */
public List<LicenseListRes> queryCurUserLicense(LicenseListReq req) { public List<LicenseListRes> queryCurUserLicense(LicenseListReq req) {
if(SystemContextHolder.isAdmin()){ if (SystemContextHolder.isAdmin()) {
return this.list(req); return this.list(req);
} }
List<LicenseDO> list = licenseMapper.selectList(new LambdaQueryWrapper<LicenseDO>() List<LicenseDO> list = licenseMapper.selectList(new LambdaQueryWrapper<LicenseDO>()
.eq(LicenseDO::getEnable, EnableStatusEnum.ENABLE.getStatus()) .eq(LicenseDO::getEnable, EnableStatusEnum.ENABLE.getStatus())
.eq(LicenseDO::getUserId,SystemContextHolder.getUserId()) .eq(LicenseDO::getUserId, SystemContextHolder.getUserId())
); );
List<LicenseListRes> licenseList = assembleConvertLicenses(list); List<LicenseListRes> licenseList = assembleConvertLicenses(list);
return licenseList; return licenseList;
} }
} }