作者 钟来

模块整理

正在显示 234 个修改的文件 包含 4467 行增加672 行删除
... ... @@ -12,29 +12,9 @@
<artifactId>lh-central-control</artifactId>
<dependencies>
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- Spring框架基本的核心工具 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- 系统模块-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-common</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-common-redis</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-domain</artifactId>
<artifactId>lh-jar-device-service</artifactId>
</dependency>
</dependencies>
... ...
... ... @@ -5,7 +5,7 @@ import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.core.domain.MessageCode;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.html.HttpUtils;
import com.ruoyi.system.domain.iot.IotDevice;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.redis.service.RedisCache;
import okhttp3.Response;
import org.springframework.beans.factory.annotation.Autowired;
... ...
package com.ruoyi.system.domain.entity;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
... ... @@ -15,6 +16,7 @@ import javax.validation.constraints.Size;
*/
public class SysDictData extends BaseEntity
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 字典编码 */
... ...
package com.ruoyi.system.domain.entity; import javax.validation.constraints.NotBlank;import javax.validation.constraints.Size; import com.ruoyi.common.annotation.Excel;import org.apache.commons.lang3.builder.ToStringBuilder;import org.apache.commons.lang3.builder.ToStringStyle;import com.ruoyi.common.tool.BaseEntity; /** * 字典类型表 sys_dict_type * * @author ruoyi */public class SysDictType extends BaseEntity{ private static final long serialVersionUID = 1L; /** 字典主键 */ @Excel(name = "字典主键", cellType = Excel.ColumnType.NUMERIC) private Long dictId; /** 字典名称 */ @Excel(name = "字典名称") private String dictName; /** 字典类型 */ @Excel(name = "字典类型") private String dictType; /** 状态(0正常 1停用) */ @Excel(name = "状态", readConverterExp = "0=正常,1=停用") private String status; public Long getDictId() { return dictId; } public void setDictId(Long dictId) { this.dictId = dictId; } @NotBlank(message = "字典名称不能为空") @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") public String getDictName() { return dictName; } public void setDictName(String dictName) { this.dictName = dictName; } @NotBlank(message = "字典类型不能为空") @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") public String getDictType() { return dictType; } public void setDictType(String dictType) { this.dictType = dictType; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("dictId", getDictId()) .append("dictName", getDictName()) .append("dictType", getDictType()) .append("status", getStatus()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("remark", getRemark()) .toString(); }}
\ No newline at end of file
package com.ruoyi.system.domain.entity; import javax.validation.constraints.NotBlank;import javax.validation.constraints.Size; import com.ruoyi.common.annotation.Excel;import com.ruoyi.common.annotation.PublicSQLConfig;import org.apache.commons.lang3.builder.ToStringBuilder;import org.apache.commons.lang3.builder.ToStringStyle;import com.ruoyi.common.tool.BaseEntity; /** * 字典类型表 sys_dict_type * * @author ruoyi */public class SysDictType extends BaseEntity{ @PublicSQLConfig(isSelect=false) private static final long serialVersionUID = 1L; /** 字典主键 */ @Excel(name = "字典主键", cellType = Excel.ColumnType.NUMERIC) private Long dictId; /** 字典名称 */ @Excel(name = "字典名称") private String dictName; /** 字典类型 */ @Excel(name = "字典类型") private String dictType; /** 状态(0正常 1停用) */ @Excel(name = "状态", readConverterExp = "0=正常,1=停用") private String status; public Long getDictId() { return dictId; } public void setDictId(Long dictId) { this.dictId = dictId; } @NotBlank(message = "字典名称不能为空") @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") public String getDictName() { return dictName; } public void setDictName(String dictName) { this.dictName = dictName; } @NotBlank(message = "字典类型不能为空") @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") public String getDictType() { return dictType; } public void setDictType(String dictType) { this.dictType = dictType; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("dictId", getDictId()) .append("dictName", getDictName()) .append("dictType", getDictType()) .append("status", getStatus()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("remark", getRemark()) .toString(); }}
\ No newline at end of file
... ...
package com.ruoyi.system.domain.entity;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
... ... @@ -15,6 +16,7 @@ import javax.validation.constraints.Size;
*/
public class SysRole extends BaseEntity
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 角色ID */
... ...
... ... @@ -6,6 +6,7 @@ import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.annotation.Excel.Type;
import com.ruoyi.common.annotation.Excels;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.utils.xss.Xss;
import com.ruoyi.common.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
... ... @@ -24,6 +25,7 @@ import java.util.List;
*/
public class SysUser extends BaseEntity
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 用户ID */
... ...
... ... @@ -202,14 +202,10 @@ public class PublicSQL {
{
Object object = para.get("object");
String whereFieldNames = (String) para.get("whereFieldNames");
if( null != para.get("tablename"))
{
}
String tableName = (String) para.get("tablename");
if(null == tableName)
String tableName = changTableNameFromObject(object);
if(para.containsKey("tablename"))
{
tableName = changTableNameFromObject(object);
tableName = (String) para.get("tablename");
}
String sql = "update ";
sql += tableName;
... ...
... ... @@ -4,6 +4,7 @@ import java.util.Date;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
... ... @@ -21,6 +22,7 @@ import com.ruoyi.quartz.util.CronUtils;
*/
public class SysJob extends BaseEntity
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 任务ID */
... ...
... ... @@ -3,6 +3,7 @@ package com.ruoyi.quartz.domain;
import java.util.Date;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
... ... @@ -14,6 +15,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
*/
public class SysJobLog extends BaseEntity
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** ID */
... ...
... ... @@ -27,12 +27,10 @@
<module>lh-quartz</module>
<module>ruoyi-auth</module>
<module>ruoyi-common</module>
<module>ruoyi-common-core</module>
<module>ruoyi-common-redis</module>
<module>ruoyi-common-security</module>
<module>ruoyi-framework</module>
<module>ruoyi-generator</module>
<module>ruoyi-system</module>
</modules>
<packaging>pom</packaging>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-common</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ruoyi-common-core</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
\ No newline at end of file
package com.zhonglai.luhui;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
\ No newline at end of file
package com.zhonglai.luhui.security.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true, securedEnabled = true)
@EnableWebSecurity
@ConditionalOnClass(WebSecurityConfigurerAdapter.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
public class CustomSpringBootWebSecurityConfiguration {
}
... ...
package com.zhonglai.luhui.security.config;
import com.ruoyi.common.tool.SysLogininforType;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
/**
* spring security配置
*
* @author ruoyi
*/
public abstract class DefaultSecurityConfig extends WebSecurityConfigurerAdapter
{
/**
* 解决 无法直接注入 AuthenticationManager
*
* @return
* @throws Exception
*/
@Override
public AuthenticationManager authenticationManagerBean() throws Exception
{
return super.authenticationManagerBean();
}
@Override
public void configure(WebSecurity web) throws Exception {
super.configure(web);
}
/**
* anyRequest | 匹配所有请求路径
* access | SpringEl表达式结果为true时可以访问
* anonymous | 匿名可以访问
* denyAll | 用户不能访问
* fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录)
* hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问
* hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问
* hasAuthority | 如果有参数,参数表示权限,则其权限可以访问
* hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问
* hasRole | 如果有参数,参数表示角色,则其角色可以访问
* permitAll | 用户可以任意访问
* rememberMe | 允许通过remember-me登录的用户访问
* authenticated | 用户登录后可访问
*/
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception
{
configHttpSecurity(httpSecurity);
}
/**
* 身份认证接口
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
{
auth.userDetailsService(getUserDetailsService()).passwordEncoder(bCryptPasswordEncoder());
}
/**
* 自定义用户认证逻辑
*/
public abstract UserDetailsService getUserDetailsService();
public abstract void configHttpSecurity(HttpSecurity httpSecurity) throws Exception;
public abstract PasswordEncoder bCryptPasswordEncoder();
public abstract SysLogininforType sysLogininforType();
}
... ...
package com.zhonglai.luhui.security.domain;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.tool.BaseEntity;
import java.util.ArrayList;
... ... @@ -13,6 +14,7 @@ import java.util.List;
*/
public class TreeEntity extends BaseEntity
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 父菜单名称 */
... ...
package com.zhonglai.luhui.security.domain;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.system.domain.entity.SysDept;
import com.ruoyi.system.domain.entity.SysMenu;
... ... @@ -15,6 +16,7 @@ import java.util.stream.Collectors;
*/
public class TreeSelect implements Serializable
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 节点ID */
... ...
package com.zhonglai.luhui.security.dto;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.utils.DESUtil;
import com.ruoyi.common.tool.SysLogininforType;
import com.zhonglai.luhui.security.utils.SecurityUtils;
... ... @@ -8,6 +9,7 @@ import org.springframework.security.core.GrantedAuthority;
import java.util.Collection;
public class ApiLoginUser extends BaseLoginUser {
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = -2519976444812946707L;
private Yu2leUserInfo yu2leUserInfo;
private Yu2leUserLogin yu2leUserLogin;
... ...
package com.zhonglai.luhui.security.dto;
import com.ruoyi.common.tool.SysLogininforType;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public abstract class BaseLoginUser implements UserDetails {
/**
... ... @@ -47,7 +53,7 @@ public abstract class BaseLoginUser implements UserDetails {
/**
* 浏览器类型
*/
private SysLogininforType sysLogininforType;
protected SysLogininforType sysLogininforType;
public Long getUserId() {
return userId;
... ... @@ -119,7 +125,8 @@ public abstract class BaseLoginUser implements UserDetails {
return sysLogininforType;
}
public void setSysLogininforType(SysLogininforType sysLogininforType) {
public BaseLoginUser setSysLogininforType(SysLogininforType sysLogininforType) {
this.sysLogininforType = sysLogininforType;
return this;
}
}
... ...
... ... @@ -5,8 +5,11 @@ import com.ruoyi.system.domain.entity.SysUser;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.tool.SysLogininforType;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
/**
... ... @@ -91,6 +94,11 @@ public class SysLoginUser extends BaseLoginUser
this.permissions = permissions;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@JSONField(serialize = false)
public String getPassword()
{
... ... @@ -165,9 +173,5 @@ public class SysLoginUser extends BaseLoginUser
this.user = user;
}
public Collection<? extends GrantedAuthority> getAuthorities()
{
return null;
}
}
... ...
package com.zhonglai.luhui.security.dto;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.utils.DESUtil;
import com.ruoyi.common.utils.DateUtils;
... ... @@ -10,6 +11,7 @@ import java.io.Serializable;
* 登录令牌
*/
public class Yu2leLoginToken implements Serializable {
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = -8696564127500370479L;
private Integer userId; //当前用户id
private String userLoginName; //当前用户登录名
... ...
package com.zhonglai.luhui.security.handle;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.ServletUtils;
... ... @@ -22,6 +23,7 @@ import java.io.Serializable;
@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = -8970718410437077606L;
@Override
... ...
... ... @@ -7,8 +7,8 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.security.dto.BaseLoginUser;
import com.zhonglai.luhui.security.manager.AsyncManager;
import com.zhonglai.luhui.security.manager.factory.AsyncFactory;
import com.zhonglai.luhui.sys.manager.AsyncManager;
import com.zhonglai.luhui.sys.manager.factory.AsyncFactory;
import com.zhonglai.luhui.security.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
... ... @@ -48,4 +48,5 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler
}
ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.SUCCESS, "退出成功")));
}
}
... ...
package com.zhonglai.luhui.security.service;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.tool.SysLogininforType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.entity.SysUser;
import com.zhonglai.luhui.security.dto.SysLoginUser;
import com.zhonglai.luhui.sys.service.ISysUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
/**
* 用户验证处理
*
* @author ruoyi
*/
@Service
public class AdminDetailsServiceImpl implements UserDetailsService
{
private static final Logger log = LoggerFactory.getLogger(AdminDetailsServiceImpl.class);
@Autowired
private ISysUserService userService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
{
SysUser user = userService.selectUserByUserName(username);
if (StringUtils.isNull(user))
{
log.info("登录用户:{} 不存在.", username);
throw new ServiceException("登录用户:" + username + " 不存在");
}
else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
{
log.info("登录用户:{} 已被删除.", username);
throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
}
else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
{
log.info("登录用户:{} 已被停用.", username);
throw new ServiceException("对不起,您的账号:" + username + " 已停用");
}
return createLoginUser(user);
}
public UserDetails createLoginUser(SysUser user)
{
return new SysLoginUser(user.getUserId(), user.getDeptId(), user,null).setSysLogininforType(SysLogininforType.lhAdmin);
}
}
... ...
package com.zhonglai.luhui.security.service;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.tool.SysLogininforType;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.dao.service.PublicService;
import com.zhonglai.luhui.security.dto.ApiLoginUser;
import com.zhonglai.luhui.security.dto.Yu2leUserInfo;
import com.zhonglai.luhui.security.dto.Yu2leUserLogin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
/**
* 用户验证处理
*
* @author ruoyi
*/
@Service
public class ApiDetailsServiceImpl implements UserDetailsService
{
private static final Logger log = LoggerFactory.getLogger(ApiDetailsServiceImpl.class);
@Autowired
private PublicService publicService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Yu2leUserLogin yu2leUserLogin = publicService.getObjectForTableName(Yu2leUserLogin.class,"loginName",username,"`liu_yu_le`.`user_login`");
Yu2leUserInfo yu2leUserInfo = publicService.getObjectForTableName(Yu2leUserInfo.class,"loginName",username,"`liu_yu_le`.`user_info`");;
if (StringUtils.isNull(yu2leUserLogin) || StringUtils.isNull(yu2leUserInfo))
{
log.info("登录用户:{} 不存在.", username);
throw new ServiceException("登录用户:" + username + " 不存在");
}
else if (1==yu2leUserInfo.getIsInvalid())
{
log.info("登录用户:{} 已被停用.", username);
throw new ServiceException("对不起,您的账号:" + username + " 已停用");
}
return new ApiLoginUser(yu2leUserInfo, yu2leUserLogin).setSysLogininforType(SysLogininforType.lhApi);
}
}
... ...
package com.zhonglai.luhui.security.service;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.InternalAuthenticationServiceException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsPasswordService;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.util.Assert;
import java.util.Map;
public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {
/**
* The plaintext password used to perform PasswordEncoder#matches(CharSequence,
* String)} on when the user is not found to avoid SEC-2056.
*/
private static final String USER_NOT_FOUND_PASSWORD = "userNotFoundPassword";
private PasswordEncoder passwordEncoder;
/**
* The password used to perform {@link PasswordEncoder#matches(CharSequence, String)}
* on when the user is not found to avoid SEC-2056. This is necessary, because some
* {@link PasswordEncoder} implementations will short circuit if the password is not
* in a valid format.
*/
private volatile String userNotFoundEncodedPassword;
private CustomUserDetailsService userDetailsService;
private UserDetailsPasswordService userDetailsPasswordService;
public CustomAuthenticationProvider() {
setPasswordEncoder(PasswordEncoderFactories.createDelegatingPasswordEncoder());
}
@Override
@SuppressWarnings("deprecation")
protected void additionalAuthenticationChecks(UserDetails userDetails,
UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
if (authentication.getCredentials() == null) {
this.logger.debug("Failed to authenticate since no credentials provided");
throw new BadCredentialsException(this.messages
.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
}
String presentedPassword = authentication.getCredentials().toString();
if (!this.passwordEncoder.matches(presentedPassword, userDetails.getPassword())) {
this.logger.debug("Failed to authenticate since password does not match stored value");
throw new BadCredentialsException(this.messages
.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"));
}
}
@Override
protected void doAfterPropertiesSet() {
Assert.notNull(this.userDetailsService, "A UserDetailsService must be set");
}
@Override
protected final UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication)
throws AuthenticationException {
this.prepareTimingAttackProtection();
Map<String,String> map = (Map<String, String>) authentication.getDetails(); // 自定义添加
try {
String userType = map.get("userType"); // 自定义添加
UserDetails loadedUser = this.getUserDetailsService().loadUserByUsername(username, userType); // 自定义添加userType参数
if (loadedUser == null) {
throw new InternalAuthenticationServiceException("UserDetailsService returned null, which is an interface contract violation");
} else {
return loadedUser;
}
} catch (UsernameNotFoundException var4) {
this.mitigateAgainstTimingAttack(authentication);
throw var4;
} catch (InternalAuthenticationServiceException var5) {
throw var5;
} catch (Exception var6) {
throw new InternalAuthenticationServiceException(var6.getMessage(), var6);
}
}
@Override
protected Authentication createSuccessAuthentication(Object principal, Authentication authentication,
UserDetails user) {
boolean upgradeEncoding = this.userDetailsPasswordService != null
&& this.passwordEncoder.upgradeEncoding(user.getPassword());
if (upgradeEncoding) {
String presentedPassword = authentication.getCredentials().toString();
String newPassword = this.passwordEncoder.encode(presentedPassword);
user = this.userDetailsPasswordService.updatePassword(user, newPassword);
}
return super.createSuccessAuthentication(principal, authentication, user);
}
private void prepareTimingAttackProtection() {
if (this.userNotFoundEncodedPassword == null) {
this.userNotFoundEncodedPassword = this.passwordEncoder.encode(USER_NOT_FOUND_PASSWORD);
}
}
private void mitigateAgainstTimingAttack(UsernamePasswordAuthenticationToken authentication) {
if (authentication.getCredentials() != null) {
String presentedPassword = authentication.getCredentials().toString();
this.passwordEncoder.matches(presentedPassword, this.userNotFoundEncodedPassword);
}
}
/**
* Sets the PasswordEncoder instance to be used to encode and validate passwords. If
* not set, the password will be compared using
* {@link PasswordEncoderFactories#createDelegatingPasswordEncoder()}
* @param passwordEncoder must be an instance of one of the {@code PasswordEncoder}
* types.
*/
public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
Assert.notNull(passwordEncoder, "passwordEncoder cannot be null");
this.passwordEncoder = passwordEncoder;
this.userNotFoundEncodedPassword = null;
}
protected PasswordEncoder getPasswordEncoder() {
return this.passwordEncoder;
}
public void setUserDetailsService(CustomUserDetailsService userDetailsService) {
this.userDetailsService = userDetailsService;
}
protected CustomUserDetailsService getUserDetailsService() {
return this.userDetailsService;
}
public void setUserDetailsPasswordService(UserDetailsPasswordService userDetailsPasswordService) {
this.userDetailsPasswordService = userDetailsPasswordService;
}
}
package com.zhonglai.luhui.security.service;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
public interface CustomUserDetailsService extends UserDetailsService {
UserDetails loadUserByUsername(String username, String usertype) throws UsernameNotFoundException;
}
package com.zhonglai.luhui.security.config;
package com.zhonglai.luhui.security.service;
import com.ruoyi.common.tool.SysLogininforType;
import com.zhonglai.luhui.security.filter.JwtAuthenticationTokenFilter;
import com.zhonglai.luhui.security.handle.AuthenticationEntryPointImpl;
import com.zhonglai.luhui.security.handle.LogoutSuccessHandlerImpl;
import com.zhonglai.luhui.security.service.CustomAuthenticationProvider;
import com.zhonglai.luhui.security.service.CustomUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutFilter;
import org.springframework.stereotype.Service;
import org.springframework.web.filter.CorsFilter;
/**
* spring security配置
*
* @author ruoyi
*/
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
/**
* 自定义用户认证逻辑
*/
@Autowired
private CustomUserDetailsService userDetailsService;
import javax.servlet.*;
import java.io.IOException;
@Service
public class SecurityConfigService {
/**
* 认证失败处理类
*/
... ... @@ -43,59 +30,41 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
private AuthenticationEntryPointImpl unauthorizedHandler;
/**
* 退出处理类
*/
@Autowired
private LogoutSuccessHandlerImpl logoutSuccessHandler;
/**
* token认证过滤器
*/
@Autowired
private JwtAuthenticationTokenFilter authenticationTokenFilter;
/**
* 跨域过滤器
*/
@Autowired
private CorsFilter corsFilter;
/**
* 退出处理类
*/
@Autowired
private LogoutSuccessHandlerImpl logoutSuccessHandler;
/**
* 不拦截url
*/
@Value("${sys.antMatchers}")
private String antMatchers;
/**
* 解决 无法直接注入 AuthenticationManager
*
* @return
* @throws Exception
*/
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception
{
return super.authenticationManagerBean();
public void configHttpSecurity(HttpSecurity httpSecurity) throws Exception{
httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
defaultConfigHttpSecurity(httpSecurity);
// 添加JWT filter
httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
// 添加CORS filter
httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class);
httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class);
}
/**
* anyRequest | 匹配所有请求路径
* access | SpringEl表达式结果为true时可以访问
* anonymous | 匿名可以访问
* denyAll | 用户不能访问
* fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录)
* hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问
* hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问
* hasAuthority | 如果有参数,参数表示权限,则其权限可以访问
* hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问
* hasRole | 如果有参数,参数表示角色,则其角色可以访问
* permitAll | 用户可以任意访问
* rememberMe | 允许通过remember-me登录的用户访问
* authenticated | 用户登录后可访问
*/
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception
public void defaultConfigHttpSecurity(HttpSecurity httpSecurity) throws Exception
{
httpSecurity
// CSRF禁用,因为不使用session
... ... @@ -126,12 +95,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
.anyRequest().authenticated()
.and()
.headers().frameOptions().disable();
httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
// 添加JWT filter
httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
// 添加CORS filter
httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class);
httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class);
}
... ... @@ -144,26 +107,4 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
return new BCryptPasswordEncoder();
}
// /**
// * 身份认证接口
// */
// @Override
// protected void configure(AuthenticationManagerBuilder auth) throws Exception
// {
// auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
// }
@Bean(name="customAuthenticationProvider")
public AuthenticationProvider customAuthenticationProvider() {
CustomAuthenticationProvider customAuthenticationProvider= new CustomAuthenticationProvider();
customAuthenticationProvider.setUserDetailsService(userDetailsService);
customAuthenticationProvider.setHideUserNotFoundExceptions(false);
customAuthenticationProvider.setPasswordEncoder(bCryptPasswordEncoder());
return customAuthenticationProvider;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(customAuthenticationProvider());
}
}
... ...
package com.zhonglai.luhui.security.service;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.tool.SysLogininforType;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.AddressUtils;
... ... @@ -19,6 +20,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
... ... @@ -62,7 +64,7 @@ public class TokenService
*
* @return 用户信息
*/
public BaseLoginUser getLoginUser(HttpServletRequest request)
public BaseLoginUser getLoginUser(HttpServletRequest request )
{
// 获取请求携带的令牌
String token = getToken(request);
... ... @@ -74,7 +76,9 @@ public class TokenService
// 解析对应的权限以及用户信息
String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
String userKey = getTokenKey(uuid);
BaseLoginUser user = redisCache.getCacheObject(userKey);
Collection<String> keys = redisCache.keys(userKey);
BaseLoginUser user = redisCache.getCacheObject(keys.stream().findFirst().get());
return user;
}
catch (Exception e)
... ... @@ -99,7 +103,7 @@ public class TokenService
/**
* 删除用户身份信息
*/
public void delLoginUser(String token)
public void delLoginUser(String token )
{
if (StringUtils.isNotEmpty(token))
{
... ... @@ -126,7 +130,7 @@ public class TokenService
return createToken(claims);
}
public void upUser(BaseLoginUser loginUser)
public void upUser(BaseLoginUser loginUser, SysLogininforType sysLogininforType)
{
String userKey = getTokenKey(loginUser.getToken());
redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
... ...
package com.zhonglai.luhui.security.service;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class UserDetailsServiceImpl implements CustomUserDetailsService {
@Override
public UserDetails loadUserByUsername(String username, String usertype) throws UsernameNotFoundException {
return null;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return null;
}
}
package com.ruoyi.common.core.domain;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.utils.StringUtils;
... ... @@ -12,6 +13,7 @@ import java.util.HashMap;
*/
public class AjaxResult extends HashMap<String, Object>
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 状态码 */
... ...
package com.ruoyi.common.exception;
import com.ruoyi.common.annotation.PublicSQLConfig;
/**
* 工具类异常
*
... ... @@ -7,6 +9,7 @@ package com.ruoyi.common.exception;
*/
public class UtilException extends RuntimeException
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 8247610319171014183L;
public UtilException(Throwable e)
... ...
package com.ruoyi.common.exception.job;
import com.ruoyi.common.annotation.PublicSQLConfig;
/**
* 计划策略异常
*
... ... @@ -7,6 +9,7 @@ package com.ruoyi.common.exception.job;
*/
public class TaskException extends Exception
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
private Code code;
... ...
package com.ruoyi.common.utils.uuid;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.exception.UtilException;
import java.security.MessageDigest;
... ... @@ -15,6 +16,7 @@ import java.util.concurrent.ThreadLocalRandom;
*/
public final class UUID implements java.io.Serializable, Comparable<UUID>
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = -1185015143654744140L;
/**
... ...
... ... @@ -24,12 +24,9 @@
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
</dependency>
<!-- 系统模块-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-system</artifactId>
<artifactId>ruoyi-common</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
package com.ruoyi.framework.web.domain.server;
import com.ruoyi.common.utils.Arith;
/**
... ...
... ... @@ -332,7 +332,10 @@ public class GenTableServiceImpl implements IGenTableService
genTable.setFunctionAuthor("钟来");
genTable.setGenType("1");
genTable.setGenPath("/");
genTable.setDataSource("DataSourceType."+dataSource);
if(StringUtils.isNotEmpty(dataSource))
{
genTable.setDataSource("DataSourceType."+dataSource);
}
List<GenTableColumn> columns = new ArrayList<>();
for(Map<String,Object> table:list)
{
... ... @@ -364,7 +367,7 @@ public class GenTableServiceImpl implements IGenTableService
switch (tableVules.getDataType())
{
case "int":
if(genTableColumn.getColumnName().equals("create_time"))
if(genTableColumn.getColumnName().indexOf("_time")>=0 )
{
genTableColumn.setQueryType("BETWEEN");
}else{
... ...
... ... @@ -2,21 +2,22 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>lh-common</artifactId>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-system</artifactId>
<artifactId>lh-jar-device-service</artifactId>
<description>
system系统模块
</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 通用工具-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
... ... @@ -75,6 +76,7 @@
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-rocketmq</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
package com.ruoyi.system.domain;
package com.zhonglai.luhui.device.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
... ...
package com.ruoyi.system.domain.iot;
package com.zhonglai.luhui.device.domain;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
... ... @@ -12,6 +13,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
*/
public class IotAlert extends BaseEntity
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 告警ID */
... ...
package com.ruoyi.system.domain.iot;
package com.zhonglai.luhui.device.domain;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
... ... @@ -12,6 +13,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
*/
public class IotAlertLog extends BaseEntity
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 告警ID */
... ...
package com.ruoyi.system.domain.iot;
package com.zhonglai.luhui.device.domain;
import com.ruoyi.common.annotation.PublicSQLConfig;
import io.swagger.annotations.ApiModel;
... ...
package com.ruoyi.system.domain.iot;
package com.zhonglai.luhui.device.domain;
import com.ruoyi.common.annotation.PublicSQLConfig;
import io.swagger.annotations.ApiModel;
... ...
package com.ruoyi.system.domain.iot;
package com.zhonglai.luhui.device.domain;
import com.ruoyi.common.annotation.PublicSQLConfig;
import org.apache.commons.lang3.builder.ToStringBuilder;
... ...
package com.ruoyi.system.domain.iot;
package com.zhonglai.luhui.device.domain;
import com.ruoyi.common.tool.BaseEntity;
import com.ruoyi.common.annotation.PublicSQLConfig;
... ...
package com.ruoyi.system.domain.iot;
package com.zhonglai.luhui.device.domain;
import com.ruoyi.common.annotation.PublicSQLConfig;
import org.apache.commons.lang3.builder.ToStringBuilder;
... ...
package com.ruoyi.system.domain.iot;
package com.zhonglai.luhui.device.domain;
import com.ruoyi.system.domain.user.UserTerminalGroupRelation;
import com.ruoyi.common.annotation.PublicSQLConfig;
... ...
package com.ruoyi.system.domain.iot;
package com.zhonglai.luhui.device.domain;
import com.ruoyi.common.annotation.PublicSQLConfig;
import org.apache.commons.lang3.builder.ToStringBuilder;
... ...
package com.ruoyi.system.domain.iot;
package com.zhonglai.luhui.device.domain;
import com.ruoyi.common.tool.BaseEntity;
import com.ruoyi.common.annotation.PublicSQLConfig;
... ...
package com.ruoyi.system.mapper;
package com.zhonglai.luhui.device.mapper;
import com.ruoyi.system.domain.iot.IotAlertLog;
import com.zhonglai.luhui.device.domain.IotAlertLog;
import org.springframework.stereotype.Repository;
import java.util.List;
... ...
package com.ruoyi.system.mapper;
package com.zhonglai.luhui.device.mapper;
import com.ruoyi.system.domain.iot.IotAlert;
import com.zhonglai.luhui.device.domain.IotAlert;
import org.springframework.stereotype.Repository;
import java.util.List;
... ...
package com.ruoyi.system.mapper;
package com.zhonglai.luhui.device.mapper;
import com.zhonglai.luhui.device.domain.IotDevice;
import java.util.List;
import com.ruoyi.system.domain.iot.IotDevice;
/**
* nullMapper接口
... ...
package com.ruoyi.system.mapper;
package com.zhonglai.luhui.device.mapper;
import com.zhonglai.luhui.device.domain.IotPermission;
import java.util.List;
import com.ruoyi.system.domain.iot.IotPermission;
/**
* nullMapper接口
... ...
package com.ruoyi.system.mapper;
package com.zhonglai.luhui.device.mapper;
import com.zhonglai.luhui.device.domain.IotProduct;
import java.util.List;
import com.ruoyi.system.domain.iot.IotProduct;
/**
* nullMapper接口
... ...
package com.ruoyi.system.mapper;
package com.zhonglai.luhui.device.mapper;
import com.zhonglai.luhui.device.domain.IotProductTranslate;
import java.util.List;
import com.ruoyi.system.domain.iot.IotProductTranslate;
/**
* 产品指标翻译Mapper接口
... ...
package com.ruoyi.system.mapper;
package com.zhonglai.luhui.device.mapper;
import com.zhonglai.luhui.device.domain.IotRole;
import java.util.List;
import com.ruoyi.system.domain.iot.IotRole;
/**
* nullMapper接口
... ...
package com.ruoyi.system.mapper;
package com.zhonglai.luhui.device.mapper;
import com.zhonglai.luhui.device.domain.IotTerminal;
import java.util.List;
import com.ruoyi.system.domain.iot.IotTerminal;
/**
* nullMapper接口
... ...
package com.ruoyi.system.mapper;
package com.zhonglai.luhui.device.mapper;
import com.zhonglai.luhui.device.domain.DistributionCurrencyModel;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import java.util.List;
import com.ruoyi.system.domain.DistributionCurrencyModel;
import com.ruoyi.system.domain.iot.IotThingsModel;
/**
* nullMapper接口
... ...
package com.ruoyi.system.mapper;
package com.zhonglai.luhui.device.mapper;
import com.zhonglai.luhui.device.domain.IotThingsModelTemplate;
import java.util.List;
import com.ruoyi.system.domain.iot.IotThingsModelTemplate;
/**
* 物模型模板Mapper接口
... ...
package com.ruoyi.system.mapper;
package com.zhonglai.luhui.device.mapper;
import java.util.List;
import com.ruoyi.system.domain.user.UserTerminalGroup;
... ...
package com.ruoyi.system.mapper;
package com.zhonglai.luhui.device.mapper;
import java.util.List;
import com.ruoyi.system.domain.user.UserTerminalGroupRelation;
... ...
package com.ruoyi.system.service;
package com.zhonglai.luhui.device.service;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.core.domain.MessageCode;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.iot.IotDevice;
import com.ruoyi.common.core.domain.ApiName;
import com.ruoyi.common.core.domain.DeviceCommandApi;
import com.ruoyi.common.core.domain.DeviceCommandApiParameter;
import com.ruoyi.system.service.iot.IIotDeviceService;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.rocketmq.service.RocketMqService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ...
package com.ruoyi.system.service.iot;
package com.zhonglai.luhui.device.service;
import com.ruoyi.system.domain.iot.IotAlertLog;
import com.zhonglai.luhui.device.domain.IotAlertLog;
import java.util.List;
... ...
package com.ruoyi.system.service.iot;
package com.zhonglai.luhui.device.service;
import com.ruoyi.system.domain.iot.IotAlert;
import com.zhonglai.luhui.device.domain.IotAlert;
import java.util.List;
... ...
package com.ruoyi.system.service.iot;
package com.zhonglai.luhui.device.service;
import com.zhonglai.luhui.device.domain.IotDevice;
import java.util.List;
import com.ruoyi.system.domain.iot.IotDevice;
/**
* nullService接口
... ...
package com.ruoyi.system.service.iot;
package com.zhonglai.luhui.device.service;
import java.util.List;
import com.ruoyi.system.domain.iot.IotPermission;
import com.zhonglai.luhui.device.domain.IotPermission;
/**
* nullService接口
... ...
package com.ruoyi.system.service.iot;
package com.zhonglai.luhui.device.service;
import java.util.List;
import com.ruoyi.system.domain.iot.IotProduct;
import com.zhonglai.luhui.device.domain.IotProduct;
/**
* nullService接口
... ...
package com.ruoyi.system.service.iot;
package com.zhonglai.luhui.device.service;
import java.util.List;
import com.ruoyi.system.domain.iot.IotProductTranslate;
import com.zhonglai.luhui.device.domain.IotProductTranslate;
/**
* 产品指标翻译Service接口
... ...
package com.ruoyi.system.service.iot;
package com.zhonglai.luhui.device.service;
import com.zhonglai.luhui.device.domain.IotRole;
import java.util.List;
import com.ruoyi.system.domain.iot.IotRole;
/**
* nullService接口
... ...
package com.ruoyi.system.service.iot;
package com.zhonglai.luhui.device.service;
import com.zhonglai.luhui.device.domain.IotTerminal;
import java.util.List;
import com.ruoyi.system.domain.iot.IotTerminal;
/**
* nullService接口
... ...
package com.ruoyi.system.service.iot;
package com.zhonglai.luhui.device.service;
import java.util.List;
import com.ruoyi.system.domain.DistributionCurrencyModel;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.zhonglai.luhui.device.domain.DistributionCurrencyModel;
import com.zhonglai.luhui.device.domain.IotThingsModel;
/**
* nullService接口
... ...
package com.ruoyi.system.service.iot;
package com.zhonglai.luhui.device.service;
import java.util.List;
import com.ruoyi.system.domain.iot.IotThingsModelTemplate;
import com.zhonglai.luhui.device.domain.IotThingsModelTemplate;
/**
* 物模型模板Service接口
... ...
package com.ruoyi.system.service.user;
package com.zhonglai.luhui.device.service;
import java.util.List;
import com.ruoyi.system.domain.user.UserTerminalGroupRelation;
... ...
package com.ruoyi.system.service.user;
package com.zhonglai.luhui.device.service;
import java.util.List;
import com.ruoyi.system.domain.user.UserTerminalGroup;
... ...
package com.ruoyi.system.service.impl.iot;
package com.zhonglai.luhui.device.service.impl;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.iot.IotAlertLog;
import com.ruoyi.system.mapper.IotAlertLogMapper;
import com.ruoyi.system.service.iot.IIotAlertLogService;
import com.zhonglai.luhui.device.domain.IotAlertLog;
import com.zhonglai.luhui.device.mapper.IotAlertLogMapper;
import com.zhonglai.luhui.device.service.IIotAlertLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ...
package com.ruoyi.system.service.impl.iot;
package com.zhonglai.luhui.device.service.impl;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.iot.IotAlert;
import com.ruoyi.system.mapper.IotAlertMapper;
import com.ruoyi.system.service.iot.IIotAlertService;
import com.zhonglai.luhui.device.domain.IotAlert;
import com.zhonglai.luhui.device.mapper.IotAlertMapper;
import com.zhonglai.luhui.device.service.IIotAlertService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ...
package com.ruoyi.system.service.impl.iot;
package com.zhonglai.luhui.device.service.impl;
import java.util.HashMap;
import java.util.List;
... ... @@ -8,17 +8,17 @@ import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.iot.IotProduct;
import com.zhonglai.luhui.device.domain.IotProduct;
import com.ruoyi.common.core.domain.ApiName;
import com.ruoyi.common.core.domain.DeviceCommandApi;
import com.ruoyi.common.core.domain.DeviceCommandApiParameter;
import com.ruoyi.system.service.iot.IIotProductService;
import com.zhonglai.luhui.device.service.IIotProductService;
import com.zhonglai.luhui.rocketmq.service.RocketMqService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.IotDeviceMapper;
import com.ruoyi.system.domain.iot.IotDevice;
import com.ruoyi.system.service.iot.IIotDeviceService;
import com.zhonglai.luhui.device.mapper.IotDeviceMapper;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.service.IIotDeviceService;
/**
* nullService业务层处理
... ...
package com.ruoyi.system.service.impl.iot;
package com.zhonglai.luhui.device.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.IotPermissionMapper;
import com.ruoyi.system.domain.iot.IotPermission;
import com.ruoyi.system.service.iot.IIotPermissionService;
import com.zhonglai.luhui.device.mapper.IotPermissionMapper;
import com.zhonglai.luhui.device.domain.IotPermission;
import com.zhonglai.luhui.device.service.IIotPermissionService;
/**
* nullService业务层处理
... ...
package com.ruoyi.system.service.impl.iot;
package com.zhonglai.luhui.device.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.IotProductMapper;
import com.ruoyi.system.domain.iot.IotProduct;
import com.ruoyi.system.service.iot.IIotProductService;
import com.zhonglai.luhui.device.mapper.IotProductMapper;
import com.zhonglai.luhui.device.domain.IotProduct;
import com.zhonglai.luhui.device.service.IIotProductService;
/**
* nullService业务层处理
... ...
package com.ruoyi.system.service.impl.iot;
package com.zhonglai.luhui.device.service.impl;
import java.util.List;
import com.zhonglai.luhui.redis.service.RedisCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.IotProductTranslateMapper;
import com.ruoyi.system.domain.iot.IotProductTranslate;
import com.ruoyi.system.service.iot.IIotProductTranslateService;
import com.zhonglai.luhui.device.mapper.IotProductTranslateMapper;
import com.zhonglai.luhui.device.domain.IotProductTranslate;
import com.zhonglai.luhui.device.service.IIotProductTranslateService;
/**
* 产品指标翻译Service业务层处理
... ...
package com.ruoyi.system.service.impl.iot;
package com.zhonglai.luhui.device.service.impl;
import java.util.List;
import com.zhonglai.luhui.device.domain.IotRole;
import com.zhonglai.luhui.device.mapper.IotRoleMapper;
import com.zhonglai.luhui.device.service.IIotRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.IotRoleMapper;
import com.ruoyi.system.domain.iot.IotRole;
import com.ruoyi.system.service.iot.IIotRoleService;
/**
* nullService业务层处理
... ... @@ -14,7 +15,7 @@ import com.ruoyi.system.service.iot.IIotRoleService;
* @date 2022-08-26
*/
@Service
public class IotRoleServiceImpl implements IIotRoleService
public class IotRoleServiceImpl implements IIotRoleService
{
@Autowired
private IotRoleMapper iotRoleMapper;
... ...
package com.ruoyi.system.service.impl.iot;
package com.zhonglai.luhui.device.service.impl;
import java.util.HashMap;
import java.util.List;
... ... @@ -9,13 +9,13 @@ import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.core.domain.ApiName;
import com.ruoyi.common.core.domain.DeviceCommandApi;
import com.ruoyi.common.core.domain.DeviceCommandApiParameter;
import com.ruoyi.system.service.iot.IIotDeviceService;
import com.zhonglai.luhui.device.service.IIotDeviceService;
import com.zhonglai.luhui.rocketmq.service.RocketMqService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.IotTerminalMapper;
import com.ruoyi.system.domain.iot.IotTerminal;
import com.ruoyi.system.service.iot.IIotTerminalService;
import com.zhonglai.luhui.device.mapper.IotTerminalMapper;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.device.service.IIotTerminalService;
/**
* nullService业务层处理
... ...
package com.ruoyi.system.service.impl.iot;
package com.zhonglai.luhui.device.service.impl;
import java.util.List;
import com.ruoyi.system.domain.DistributionCurrencyModel;
import com.zhonglai.luhui.device.domain.DistributionCurrencyModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.IotThingsModelMapper;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.ruoyi.system.service.iot.IIotThingsModelService;
import com.zhonglai.luhui.device.mapper.IotThingsModelMapper;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.device.service.IIotThingsModelService;
/**
* nullService业务层处理
... ...
package com.ruoyi.system.service.impl.iot;
package com.zhonglai.luhui.device.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.IotThingsModelTemplateMapper;
import com.ruoyi.system.domain.iot.IotThingsModelTemplate;
import com.ruoyi.system.service.iot.IIotThingsModelTemplateService;
import com.zhonglai.luhui.device.mapper.IotThingsModelTemplateMapper;
import com.zhonglai.luhui.device.domain.IotThingsModelTemplate;
import com.zhonglai.luhui.device.service.IIotThingsModelTemplateService;
/**
* 物模型模板Service业务层处理
... ...
package com.ruoyi.system.service.impl.user;
package com.zhonglai.luhui.device.service.impl;
import java.util.ArrayList;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.user.UserTerminalGroup;
import com.ruoyi.system.service.user.IUserTerminalGroupService;
import com.zhonglai.luhui.dao.service.PublicService;
import com.zhonglai.luhui.device.mapper.UserTerminalGroupRelationMapper;
import com.zhonglai.luhui.device.service.IUserTerminalGroupRelationService;
import com.zhonglai.luhui.device.service.IUserTerminalGroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.UserTerminalGroupRelationMapper;
import com.ruoyi.system.domain.user.UserTerminalGroupRelation;
import com.ruoyi.system.service.user.IUserTerminalGroupRelationService;
import org.springframework.transaction.annotation.Transactional;
/**
... ...
package com.ruoyi.system.service.impl.user;
package com.zhonglai.luhui.device.service.impl;
import java.util.List;
import com.zhonglai.luhui.device.mapper.UserTerminalGroupMapper;
import com.zhonglai.luhui.device.service.IUserTerminalGroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.UserTerminalGroupMapper;
import com.ruoyi.system.domain.user.UserTerminalGroup;
import com.ruoyi.system.service.user.IUserTerminalGroupService;
/**
* 终端分组Service业务层处理
... ... @@ -14,7 +15,7 @@ import com.ruoyi.system.service.user.IUserTerminalGroupService;
* @date 2022-11-22
*/
@Service
public class UserTerminalGroupServiceImpl implements IUserTerminalGroupService
public class UserTerminalGroupServiceImpl implements IUserTerminalGroupService
{
@Autowired
private UserTerminalGroupMapper userTerminalGroupMapper;
... ...
... ... @@ -2,9 +2,9 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.IotAlertLogMapper">
<mapper namespace="com.zhonglai.luhui.device.mapper.IotAlertLogMapper">
<resultMap type="com.ruoyi.system.domain.iot.IotAlertLog" id="AlertLogResult">
<resultMap type="com.zhonglai.luhui.device.domain.IotAlertLog" id="AlertLogResult">
<result property="alertLogId" column="alert_log__id" />
<result property="alertName" column="alert_name" />
<result property="alertLevel" column="alert_level" />
... ... @@ -28,7 +28,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select alert_log__id, alert_name, alert_level, status, product_id, product_name, device_id, device_name,user_id, user_name, tenant_id, tenant_name, create_by, create_time, update_by, update_time, remark from iot_alert_log
</sql>
<select id="selectAlertLogList" parameterType="com.ruoyi.system.domain.iot.IotAlertLog" resultMap="AlertLogResult">
<select id="selectAlertLogList" parameterType="com.zhonglai.luhui.device.domain.IotAlertLog" resultMap="AlertLogResult">
<include refid="selectAlertLogVo"/>
<where>
<if test="userId != null and userId != 0"> and user_id = #{userId}</if>
... ... @@ -48,7 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where alert_log__id = #{alertLogId}
</select>
<insert id="insertAlertLog" parameterType="com.ruoyi.system.domain.iot.IotAlertLog" useGeneratedKeys="true" keyProperty="alertLogId">
<insert id="insertAlertLog" parameterType="com.zhonglai.luhui.device.domain.IotAlertLog" useGeneratedKeys="true" keyProperty="alertLogId">
insert into iot_alert_log
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="alertName != null and alertName != ''">alert_name,</if>
... ... @@ -88,7 +88,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim>
</insert>
<update id="updateAlertLog" parameterType="com.ruoyi.system.domain.iot.IotAlertLog">
<update id="updateAlertLog" parameterType="com.zhonglai.luhui.device.domain.IotAlertLog">
update iot_alert_log
<trim prefix="SET" suffixOverrides=",">
<if test="alertName != null and alertName != ''">alert_name = #{alertName},</if>
... ...
... ... @@ -2,9 +2,9 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.IotAlertMapper">
<mapper namespace="com.zhonglai.luhui.device.mapper.IotAlertMapper">
<resultMap type="com.ruoyi.system.domain.iot.IotAlert" id="AlertResult">
<resultMap type="com.zhonglai.luhui.device.domain.IotAlert" id="AlertResult">
<result property="alertId" column="alert_id" />
<result property="alertName" column="alert_name" />
<result property="alertLevel" column="alert_level" />
... ... @@ -24,7 +24,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select alert_id, alert_name, alert_level,status, product_id, product_name, triggers, actions, create_by, create_time, update_by, update_time, remark from iot_alert
</sql>
<select id="selectAlertList" parameterType="com.ruoyi.system.domain.iot.IotAlert" resultMap="AlertResult">
<select id="selectAlertList" parameterType="com.zhonglai.luhui.device.domain.IotAlert" resultMap="AlertResult">
<include refid="selectAlertVo"/>
<where>
<if test="alertName != null and alertName != ''"> and alert_name like concat('%', #{alertName}, '%')</if>
... ... @@ -40,7 +40,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where alert_id = #{alertId}
</select>
<insert id="insertAlert" parameterType="com.ruoyi.system.domain.iot.IotAlert" useGeneratedKeys="true" keyProperty="alertId">
<insert id="insertAlert" parameterType="com.zhonglai.luhui.device.domain.IotAlert" useGeneratedKeys="true" keyProperty="alertId">
insert into iot_alert
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="alertName != null and alertName != ''">alert_name,</if>
... ... @@ -72,7 +72,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim>
</insert>
<update id="updateAlert" parameterType="com.ruoyi.system.domain.iot.IotAlert">
<update id="updateAlert" parameterType="com.zhonglai.luhui.device.domain.IotAlert">
update iot_alert
<trim prefix="SET" suffixOverrides=",">
<if test="alertName != null and alertName != ''">alert_name = #{alertName},</if>
... ...
... ... @@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.IotDeviceMapper">
<mapper namespace="com.zhonglai.luhui.device.mapper.IotDeviceMapper">
<resultMap type="IotDevice" id="IotDeviceResult">
<result property="active_time" column="active_time" />
... ...
... ... @@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.IotPermissionMapper">
<mapper namespace="com.zhonglai.luhui.device.mapper.IotPermissionMapper">
<resultMap type="IotPermission" id="IotPermissionResult">
<result property="activity" column="activity" />
... ...
... ... @@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.IotProductMapper">
<mapper namespace="com.zhonglai.luhui.device.mapper.IotProductMapper">
<resultMap type="IotProduct" id="IotProductResult">
<result property="create_time" column="create_time" />
... ...
... ... @@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.IotProductTranslateMapper">
<mapper namespace="com.zhonglai.luhui.device.mapper.IotProductTranslateMapper">
<resultMap type="IotProductTranslate" id="IotProductTranslateResult">
<result property="create_time" column="create_time" />
... ...
... ... @@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.IotRoleMapper">
<mapper namespace="com.zhonglai.luhui.device.mapper.IotRoleMapper">
<resultMap type="IotRole" id="IotRoleResult">
<result property="create_time" column="create_time" />
... ...
... ... @@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.IotTerminalMapper">
<mapper namespace="com.zhonglai.luhui.device.mapper.IotTerminalMapper">
<resultMap type="IotTerminal" id="IotTerminalResult">
<result property="device_id" column="device_id" />
... ... @@ -14,6 +14,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="product_id" column="product_id" />
<result property="mqtt_username" column="mqtt_username" />
<result property="data_update_time" column="data_update_time" />
<result property="online" column="online" />
<result property="user_info_id" column="user_info_id" />
<result property="create_time" column="create_time" />
<result property="sensor_number" column="sensor_number" />
<association property="userTerminalGroupRelation" column="id" javaType="UserTerminalGroupRelation" resultMap="userTerminalGroupRelationResult" />
<association property="iotDevice" column="device_id" javaType="IotDevice" resultMap="iotDeviceResult" />
</resultMap>
... ...
... ... @@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.IotThingsModelMapper">
<mapper namespace="com.zhonglai.luhui.device.mapper.IotThingsModelMapper">
<resultMap type="IotThingsModel" id="IotThingsModelResult">
<result property="create_by" column="create_by" />
... ...
... ... @@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.IotThingsModelTemplateMapper">
<mapper namespace="com.zhonglai.luhui.device.mapper.IotThingsModelTemplateMapper">
<resultMap type="IotThingsModelTemplate" id="IotThingsModelTemplateResult">
<result property="ascription" column="ascription" />
... ...
... ... @@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.UserTerminalGroupMapper">
<mapper namespace="com.zhonglai.luhui.device.mapper.UserTerminalGroupMapper">
<resultMap type="UserTerminalGroup" id="UserTerminalGroupResult">
<result property="create_time" column="create_time" />
... ...
... ... @@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.UserTerminalGroupRelationMapper">
<mapper namespace="com.zhonglai.luhui.device.mapper.UserTerminalGroupRelationMapper">
<resultMap type="UserTerminalGroupRelation" id="UserTerminalGroupRelationResult">
<result property="create_time" column="create_time" />
... ...
package com.zhonglai.luhui.security.manager;
package com.zhonglai.luhui.sys.manager;
import com.ruoyi.common.utils.Threads;
import com.ruoyi.common.utils.spring.SpringUtils;
... ...
package com.zhonglai.luhui.security.manager;
package com.zhonglai.luhui.sys.manager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ...
package com.zhonglai.luhui.security.manager.factory;
package com.zhonglai.luhui.sys.manager.factory;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.LogUtils;
... ... @@ -25,7 +25,7 @@ import java.util.TimerTask;
*/
public class AsyncFactory
{
private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user");
private static final Logger sys_user_logger = LoggerFactory.getLogger(AsyncFactory.class);
/**
* 记录登录信息
... ...
... ... @@ -10,6 +10,13 @@
</parent>
<artifactId>lh-jar</artifactId>
<modules>
<module>lh-jar-action</module>
<module>lh-jar-chatgpt</module>
<module>lh-jar-device-service</module>
<module>lh-jar-rocketmq</module>
<module>lh-jar-sys-service</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
... ...
... ... @@ -85,6 +85,10 @@
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-action</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-device-service</artifactId>
</dependency>
</dependencies>
<build>
... ...
... ... @@ -14,8 +14,10 @@ import org.springframework.context.annotation.ComponentScan;
"com.zhonglai.luhui.datasource",
"com.zhonglai.luhui.dao",
"com.zhonglai.luhui.sys",
"com.zhonglai.luhui.device",
"com.zhonglai.luhui.redis",
"com.zhonglai.luhui.security",
"com.zhonglai.luhui.rocketmq",
"com.zhonglai.luhui.firewall",
"com.zhonglai.luhui.admin",
"com.zhonglai.luhui.mqtt.comm.service.redis",
... ...
... ... @@ -7,11 +7,11 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.iot.IotAlert;
import com.ruoyi.system.service.iot.IIotAlertService;
import com.zhonglai.luhui.admin.dto.AlarmActionConfig;
import com.zhonglai.luhui.admin.dto.AlarmTriggersConfig;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.device.domain.IotAlert;
import com.zhonglai.luhui.device.service.IIotAlertService;
import com.zhonglai.luhui.sys.utils.ExcelUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
... ...
... ... @@ -4,8 +4,8 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.iot.IotAlertLog;
import com.ruoyi.system.service.iot.IIotAlertLogService;
import com.zhonglai.luhui.device.domain.IotAlertLog;
import com.zhonglai.luhui.device.service.IIotAlertLogService;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.sys.utils.ExcelUtil;
import io.swagger.annotations.Api;
... ...
... ... @@ -3,7 +3,7 @@ package com.zhonglai.luhui.admin.controller.iot;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.service.DeviceControlService;
import com.zhonglai.luhui.device.service.DeviceControlService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
... ...
... ... @@ -22,8 +22,8 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.iot.IotDevice;
import com.ruoyi.system.service.iot.IIotDeviceService;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.service.IIotDeviceService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
... ...
... ... @@ -20,8 +20,8 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.iot.IotPermission;
import com.ruoyi.system.service.iot.IIotPermissionService;
import com.zhonglai.luhui.device.domain.IotPermission;
import com.zhonglai.luhui.device.service.IIotPermissionService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
... ...
... ... @@ -20,8 +20,8 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.iot.IotProduct;
import com.ruoyi.system.service.iot.IIotProductService;
import com.zhonglai.luhui.device.domain.IotProduct;
import com.zhonglai.luhui.device.service.IIotProductService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
... ...
... ... @@ -21,8 +21,8 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.iot.IotProductTranslate;
import com.ruoyi.system.service.iot.IIotProductTranslateService;
import com.zhonglai.luhui.device.domain.IotProductTranslate;
import com.zhonglai.luhui.device.service.IIotProductTranslateService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
... ...
... ... @@ -21,8 +21,8 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.iot.IotRole;
import com.ruoyi.system.service.iot.IIotRoleService;
import com.zhonglai.luhui.device.domain.IotRole;
import com.zhonglai.luhui.device.service.IIotRoleService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
... ...
... ... @@ -21,8 +21,8 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.iot.IotTerminal;
import com.ruoyi.system.service.iot.IIotTerminalService;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.device.service.IIotTerminalService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
... ...
... ... @@ -8,9 +8,9 @@ import com.zhonglai.luhui.security.utils.SecurityUtils;
import com.zhonglai.luhui.sys.utils.ExcelUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.DistributionCurrencyModel;
import com.ruoyi.system.domain.iot.IotProduct;
import com.ruoyi.system.service.iot.IIotProductService;
import com.zhonglai.luhui.device.domain.DistributionCurrencyModel;
import com.zhonglai.luhui.device.domain.IotProduct;
import com.zhonglai.luhui.device.service.IIotProductService;
import com.zhonglai.luhui.admin.dto.IotThingsModelAddApi;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelItemBase;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.specs.*;
... ... @@ -31,8 +31,8 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.ruoyi.system.service.iot.IIotThingsModelService;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.device.service.IIotThingsModelService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
... ...
... ... @@ -5,11 +5,11 @@ import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.device.service.IIotProductService;
import com.zhonglai.luhui.security.utils.SecurityUtils;
import com.zhonglai.luhui.sys.utils.ExcelUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.service.iot.IIotProductService;
import com.zhonglai.luhui.admin.dto.IotThingsModelAddApi;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelItemBase;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.specs.*;
... ... @@ -28,8 +28,8 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.iot.IotThingsModelTemplate;
import com.ruoyi.system.service.iot.IIotThingsModelTemplateService;
import com.zhonglai.luhui.device.domain.IotThingsModelTemplate;
import com.zhonglai.luhui.device.service.IIotThingsModelTemplateService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
... ...
package com.zhonglai.luhui.admin.controller.system;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.entity.SysMenu;
import com.ruoyi.system.domain.entity.SysUser;
import com.zhonglai.luhui.admin.model.LoginBody;
import com.zhonglai.luhui.admin.service.SysPermissionService;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.security.service.LoginService;
import com.zhonglai.luhui.security.service.SecurityService;
import com.zhonglai.luhui.security.utils.SecurityUtils;
import com.zhonglai.luhui.sys.service.ISysMenuService;
... ... @@ -15,8 +12,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
... ... @@ -32,9 +27,6 @@ import java.util.Set;
public class SysLoginController extends BaseController
{
@Autowired
private LoginService loginService;
@Autowired
private ISysMenuService menuService;
@Autowired
... ... @@ -42,17 +34,6 @@ public class SysLoginController extends BaseController
@Autowired
private SecurityService securityService;
@ApiOperation("登录方法")
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody)
{
AjaxResult ajax = AjaxResult.success();
// 生成令牌
String token = loginService.sysUserLogin(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid());
ajax.put(Constants.TOKEN, token);
return ajax;
}
/**
* 获取用户信息
... ...
package com.zhonglai.luhui.admin.controller.system;
import com.zhonglai.luhui.action.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.zhonglai.luhui.admin.model.RegisterBody;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.admin.service.SysLoginService;
import com.zhonglai.luhui.admin.service.SysRegisterService;
import com.zhonglai.luhui.sys.service.ISysConfigService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
/**
... ... @@ -23,25 +13,7 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
public class SysRegisterController extends BaseController
{
@Autowired
private SysRegisterService registerService;
@Autowired
private ISysConfigService configService;
@Autowired
private SysLoginService loginService;
@ApiOperation("注册")
@PostMapping("/register")
public AjaxResult register(@RequestBody RegisterBody user)
{
if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
{
return error("当前系统没有开启注册功能!");
}
String msg = registerService.register(user);
return StringUtils.isEmpty(msg) ? success() : error(msg);
}
}
... ...
... ... @@ -4,6 +4,7 @@ import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.device.service.IUserTerminalGroupService;
import com.zhonglai.luhui.sys.utils.ExcelUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
... ... @@ -21,7 +22,6 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.user.UserTerminalGroup;
import com.ruoyi.system.service.user.IUserTerminalGroupService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
... ...
... ... @@ -4,6 +4,7 @@ import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.device.service.IUserTerminalGroupRelationService;
import com.zhonglai.luhui.sys.utils.ExcelUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
... ... @@ -21,7 +22,6 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.user.UserTerminalGroupRelation;
import com.ruoyi.system.service.user.IUserTerminalGroupRelationService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
... ...
package com.zhonglai.luhui.admin.dto;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
... ...
package com.zhonglai.luhui.admin.dto;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
... ...
package com.zhonglai.luhui.admin.dto;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
... ...
package com.zhonglai.luhui.admin.service;
import com.zhonglai.luhui.security.service.TokenService;
import com.zhonglai.luhui.sys.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 登录校验方法
*
* @author ruoyi
*/
@Component
public class SysLoginService
{
@Autowired
private TokenService tokenService;
@Resource
private AuthenticationManager authenticationManager;
@Autowired
private ISysConfigService configService;
}
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-admin # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain, # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login,/register,/captchaImage,/getCacheObject,/v2/api-docs,/tool/gen/generatorCodeFromDb # NameServer地址 rocketmq: name-server: 47.115.144.179:9876 # 默认的消息组 producer: group: deviceCommand send-message-timeout: 30000 send-topic: lh-mqtt-service-deviceCommand-test send-tags: 1
\ No newline at end of file
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-admin # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain,com.zhonglai.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login,/register,/captchaImage,/getCacheObject,/v2/api-docs,/tool/gen/generatorCodeFromDb # NameServer地址 rocketmq: name-server: 47.115.144.179:9876 # 默认的消息组 producer: group: deviceCommand send-message-timeout: 30000 send-topic: lh-mqtt-service-deviceCommand-test send-tags: 1
\ No newline at end of file
... ...
... ... @@ -50,4 +50,56 @@
</dependency>
</dependencies>
<build>
<finalName>lh-afms</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<!--
生成的jar中,不要包含pom.xml和pom.properties这两个文件
-->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<!--
是否要把第三方jar放到manifest的classpath中
-->
<addClasspath>true</addClasspath>
<!--
生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/
-->
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.zhonglai.luhui.afms.LhAfmsApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- The configuration of maven-assembly-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>${project.parent.parent.basedir}/configs/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui.afms;
import com.zhonglai.luhui.security.config.CustomSpringBootWebSecurityConfiguration;
import com.zhonglai.luhui.security.config.DefaultSecurityConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
@ComponentScan(basePackages = {
"com.ruoyi.common",
... ... @@ -13,8 +16,11 @@ import org.springframework.context.annotation.ComponentScan;
"com.zhonglai.luhui.dao",
"com.zhonglai.luhui.sys",
"com.zhonglai.luhui.redis",
"com.zhonglai.luhui.security",
"com.zhonglai.luhui.afms",
})
}
//,excludeFilters = {@ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE,classes = {CustomSpringBootWebSecurityConfiguration.class})}
)
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class LhAfmsApplication {
public static void main(String[] args) {
... ...
package com.zhonglai.luhui.afms.config;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.tool.SysLogininforType;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.security.config.DefaultSecurityConfig;
import com.zhonglai.luhui.security.dto.BaseLoginUser;
import com.zhonglai.luhui.security.filter.JwtAuthenticationTokenFilter;
import com.zhonglai.luhui.security.handle.LogoutSuccessHandlerImpl;
import com.zhonglai.luhui.security.service.AdminDetailsServiceImpl;
import com.zhonglai.luhui.security.service.SecurityConfigService;
import com.zhonglai.luhui.security.service.TokenService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* app接口安全策略. 没有{@link Order}注解优先级比上面低
*/
@Configuration
@Order(1)
public class AdminConfigurerAdapter extends DefaultSecurityConfig {
private static final Logger log = LoggerFactory.getLogger(AdminConfigurerAdapter.class);
@Autowired
private AdminDetailsServiceImpl adminDetailsService;
@Autowired
private SecurityConfigService securityConfigService;
@Autowired
private TokenService tokenService;
/**
* 退出处理类
*/
@Autowired
private LogoutSuccessHandlerImpl logoutSuccessHandler;
@Override
public UserDetailsService getUserDetailsService() {
return adminDetailsService;
}
@Override
public void configHttpSecurity(HttpSecurity httpSecurity) throws Exception {
httpSecurity.antMatcher("/admin/**");
securityConfigService.configHttpSecurity(httpSecurity);
//添加角色过滤
httpSecurity.addFilterBefore(new Filter() {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
BaseLoginUser loginUser = tokenService.getLoginUser((HttpServletRequest)request);
if(!sysLogininforType().equals(loginUser.getSysLogininforType()))
{
log.info("用户{},权限不足", loginUser.getUser());
response.getOutputStream().write(GsonConstructor.get().toJson(AjaxResult.error("权限不足")).getBytes(StandardCharsets.UTF_8));
return;
// throw new ServiceException("不可以访问");
}
chain.doFilter(request, response);
}
}, JwtAuthenticationTokenFilter.class);
}
@Override
public PasswordEncoder bCryptPasswordEncoder() {
return SpringUtils.getBean("bCryptPasswordEncoder");
}
@Override
public SysLogininforType sysLogininforType() {
return SysLogininforType.lhAdmin;
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.afms.config;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.tool.SysLogininforType;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.security.config.DefaultSecurityConfig;
import com.zhonglai.luhui.security.dto.BaseLoginUser;
import com.zhonglai.luhui.security.filter.JwtAuthenticationTokenFilter;
import com.zhonglai.luhui.security.handle.LogoutSuccessHandlerImpl;
import com.zhonglai.luhui.security.service.ApiDetailsServiceImpl;
import com.zhonglai.luhui.security.service.SecurityConfigService;
import com.zhonglai.luhui.security.service.TokenService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* app接口安全策略. 没有{@link Order}注解优先级比上面低
*/
@Configuration
public class ApiConfigurerAdapter extends DefaultSecurityConfig {
private static final Logger log = LoggerFactory.getLogger(ApiConfigurerAdapter.class);
@Autowired
private ApiDetailsServiceImpl apiDetailsService;
@Autowired
private SecurityConfigService securityConfigService;
@Override
public UserDetailsService getUserDetailsService() {
return apiDetailsService;
}
@Autowired
private TokenService tokenService;
/**
* 退出处理类
*/
@Autowired
private LogoutSuccessHandlerImpl logoutSuccessHandler;
@Override
public void configHttpSecurity(HttpSecurity httpSecurity) throws Exception {
httpSecurity.antMatcher("/api/**");
securityConfigService.configHttpSecurity(httpSecurity);
//添加角色过滤
httpSecurity.addFilterBefore(new Filter() {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
BaseLoginUser loginUser = tokenService.getLoginUser((HttpServletRequest)request);
if(!sysLogininforType().equals(loginUser.getSysLogininforType()))
{
log.info("用户{},权限不足", loginUser);
response.getOutputStream().write(GsonConstructor.get().toJson(AjaxResult.error("权限不足")).getBytes(StandardCharsets.UTF_8));
return;
}
chain.doFilter(request, response);
}
}, JwtAuthenticationTokenFilter.class);
}
@Override
public PasswordEncoder bCryptPasswordEncoder() {
return SpringUtils.getBean("bCryptPasswordEncoder");
}
@Override
public SysLogininforType sysLogininforType() {
return SysLogininforType.lhApi;
}
}
\ No newline at end of file
... ...
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8060 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-afms # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain,com.zhonglai.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /tool/gen/*
\ No newline at end of file
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8060 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: '*' # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain,com.zhonglai.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /register,/captchaImage,/getCacheObject,/v2/api-docs
\ No newline at end of file
... ...
... ... @@ -8,7 +8,6 @@ import org.springframework.context.annotation.FilterType;
@ComponentScan(basePackages = {
"com.ruoyi.common",
"com.ruoyi.system",
"com.ruoyi.framework",
}
// excludeFilters = {@ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE,classes = {LogAspect.class,
... ...
... ... @@ -97,6 +97,14 @@
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-sys-service</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-rocketmq</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-device-service</artifactId>
</dependency>
</dependencies>
<build>
... ...
... ... @@ -9,9 +9,11 @@ import org.springframework.context.annotation.ComponentScan;
"com.ruoyi.common",
"com.ruoyi.system",
"com.ruoyi.framework",
"com.zhonglai.luhui.api.config",
"com.zhonglai.luhui.api.service",
"com.zhonglai.luhui.api.controller",
"com.zhonglai.luhui.datasource",
"com.zhonglai.luhui.dao",
"com.zhonglai.luhui.redis",
"com.zhonglai.luhui.security",
"com.zhonglai.luhui.api",
})
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class LhApiApplication {
... ...
... ... @@ -5,11 +5,11 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.iot.IotTerminal;
import com.ruoyi.system.domain.user.UserTerminalGroupRelation;
import com.ruoyi.system.service.iot.IIotTerminalService;
import com.ruoyi.system.service.user.IUserTerminalGroupRelationService;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.device.service.IIotTerminalService;
import com.zhonglai.luhui.device.service.IUserTerminalGroupRelationService;
import com.zhonglai.luhui.security.utils.SecurityUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
... ...
... ... @@ -4,6 +4,7 @@ import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.device.service.IUserTerminalGroupService;
import com.zhonglai.luhui.security.utils.SecurityUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
... ... @@ -22,7 +23,6 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.user.UserTerminalGroup;
import com.ruoyi.system.service.user.IUserTerminalGroupService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
... ...
... ... @@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>Luhui</artifactId>
<artifactId>lh-modules</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>bin</id>
<!-- 最终打包成一个用于发布的zip文件 -->
<formats>
<format>zip</format>
</formats>
<!-- Adds dependencies to zip package under lib directory -->
<dependencySets>
<dependencySet>
<!--
不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录
-->
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<fileSets>
<!-- 把项目相关的说明文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>README*</include>
<include>LICENSE*</include>
<include>NOTICE*</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,打包进zip文件的config目录 -->
<fileSet>
<directory>${project.basedir}\src\main\resources\configs</directory>
<outputDirectory>../configs</outputDirectory>
<includes>
<include>*.properties</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,提出来 -->
<fileSet>
<directory>${project.basedir}\src\main\resources</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.properties</include>
<include>*.yml</include>
</includes>
</fileSet>
<!-- 把项目的脚本文件目录( src/main/scripts )中的启动脚本文件,打包进zip文件的跟目录 -->
<fileSet>
<directory>${project.basedir}\bin</directory>
<outputDirectory></outputDirectory>
<includes>
<include>start.*</include>
<include>stop.*</include>
</includes>
</fileSet>
<!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-modules</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>lh-login</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 核心模块-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-framework</artifactId>
</dependency>
<!-- 代码生成模块-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-generator</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-sys-service</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-common-swagger</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-common-security</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
</dependencies>
<build>
<finalName>lh-login</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<!--
生成的jar中,不要包含pom.xml和pom.properties这两个文件
-->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<!--
是否要把第三方jar放到manifest的classpath中
-->
<addClasspath>true</addClasspath>
<!--
生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/
-->
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.zhonglai.luhui.login.LhLoginApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- The configuration of maven-assembly-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>${project.parent.parent.basedir}/configs/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui.login;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan(basePackages = {
"com.ruoyi.common",
"com.ruoyi.system",
"com.ruoyi.framework",
"com.zhonglai.luhui.datasource",
"com.zhonglai.luhui.dao",
"com.zhonglai.luhui.sys",
"com.zhonglai.luhui.redis",
"com.zhonglai.luhui.security",
"com.zhonglai.luhui.login",
})
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class LhLoginApplication {
public static void main(String[] args) {
SpringApplication.run(LhLoginApplication.class,args);
System.out.println("启动成功");
}
}
... ...
package com.zhonglai.luhui.login.config;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.tool.SysLogininforType;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.security.config.DefaultSecurityConfig;
import com.zhonglai.luhui.security.dto.BaseLoginUser;
import com.zhonglai.luhui.security.filter.JwtAuthenticationTokenFilter;
import com.zhonglai.luhui.security.service.AdminDetailsServiceImpl;
import com.zhonglai.luhui.security.service.SecurityConfigService;
import com.zhonglai.luhui.security.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* app接口安全策略. 没有{@link Order}注解优先级比上面低
*/
@Configuration
@Order(1)
public class AdminConfigurerAdapter extends DefaultSecurityConfig {
@Autowired
private AdminDetailsServiceImpl adminDetailsService;
@Autowired
private SecurityConfigService securityConfigService;
@Override
public UserDetailsService getUserDetailsService() {
return adminDetailsService;
}
@Override
public void configHttpSecurity(HttpSecurity httpSecurity) throws Exception {
httpSecurity.antMatcher("/sysLogin/**");
securityConfigService.configHttpSecurity(httpSecurity);
}
@Override
public PasswordEncoder bCryptPasswordEncoder() {
return SpringUtils.getBean("bCryptPasswordEncoder");
}
@Override
public SysLogininforType sysLogininforType() {
return SysLogininforType.lhAdmin;
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.login.config;
import com.ruoyi.common.tool.SysLogininforType;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.security.config.DefaultSecurityConfig;
import com.zhonglai.luhui.security.service.ApiDetailsServiceImpl;
import com.zhonglai.luhui.security.service.SecurityConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
/**
* app接口安全策略. 没有{@link Order}注解优先级比上面低
*/
@Configuration
public class ApiConfigurerAdapter extends DefaultSecurityConfig {
@Autowired
private ApiDetailsServiceImpl apiDetailsService;
@Autowired
private SecurityConfigService securityConfigService;
@Override
public UserDetailsService getUserDetailsService() {
return apiDetailsService;
}
@Override
public void configHttpSecurity(HttpSecurity httpSecurity) throws Exception {
httpSecurity.antMatcher("/apiLogin/**");
securityConfigService.configHttpSecurity(httpSecurity);
}
@Override
public PasswordEncoder bCryptPasswordEncoder() {
return SpringUtils.getBean("bCryptPasswordEncoder");
}
@Override
public SysLogininforType sysLogininforType() {
return SysLogininforType.lhApi;
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.login.config;
import com.ruoyi.common.config.RuoYiConfig;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
/** 系统基础配置 */
@Autowired
private RuoYiConfig ruoyiConfig;
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
}
/**
* 添加摘要信息
*/
private ApiInfo apiInfo()
{
// 用ApiInfoBuilder进行定制
return new ApiInfoBuilder()
// 设置标题
.title("标题:登陆服务")
// 描述
.description("描述:各种角色的登陆接口")
// 作者信息
.contact(new Contact(ruoyiConfig.getName(), null, null))
// 版本
.version("版本号:" + ruoyiConfig.getVersion())
.build();
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.api.controller.login;
package com.zhonglai.luhui.login.controller;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.security.service.LoginService;
import com.zhonglai.luhui.login.service.LoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
... ... @@ -15,9 +15,9 @@ import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "登陆")
@Api(tags = "api登陆")
@RestController
@RequestMapping("/login/ApiLogin")
@RequestMapping("/apiLogin")
public class ApiLoginController extends BaseController {
public static String YU2LE_LOGIN_TOKEN_KEY = "loginToken"; //登录令牌键值
@Autowired
... ...
package com.zhonglai.luhui.login.controller;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.login.model.LoginBody;
import com.zhonglai.luhui.login.model.RegisterBody;
import com.zhonglai.luhui.login.service.LoginService;
import com.zhonglai.luhui.login.service.SysRegisterService;
import com.zhonglai.luhui.sys.service.ISysConfigService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 注册验证
*
* @author ruoyi
*/
@Api(tags = "管理员登陆验证")
@RestController
@RequestMapping("/sysLogin")
public class SysLoginController extends BaseController
{
@Autowired
private LoginService loginService;
@Autowired
private SysRegisterService registerService;
@Autowired
private ISysConfigService configService;
@ApiOperation("登录方法")
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody)
{
AjaxResult ajax = AjaxResult.success();
// 生成令牌
String token = loginService.sysUserLogin(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid());
ajax.put(Constants.TOKEN, token);
return ajax;
}
@ApiOperation("注册")
@PostMapping("/register")
public AjaxResult register(@RequestBody RegisterBody user)
{
if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
{
return error("当前系统没有开启注册功能!");
}
String msg = registerService.register(user);
return StringUtils.isEmpty(msg) ? success() : error(msg);
}
}
... ...
package com.zhonglai.luhui.security.service;
package com.zhonglai.luhui.login.service;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.exception.ServiceException;
... ... @@ -10,19 +10,21 @@ import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.system.domain.entity.SysUser;
import com.ruoyi.common.tool.SysLogininforType;
import com.zhonglai.luhui.dao.service.PublicService;
import com.zhonglai.luhui.login.config.AdminConfigurerAdapter;
import com.zhonglai.luhui.login.config.ApiConfigurerAdapter;
import com.zhonglai.luhui.redis.service.RedisCache;
import com.zhonglai.luhui.security.config.DefaultSecurityConfig;
import com.zhonglai.luhui.security.dto.*;
import com.zhonglai.luhui.security.manager.AsyncManager;
import com.zhonglai.luhui.security.manager.factory.AsyncFactory;
import com.zhonglai.luhui.sys.manager.AsyncManager;
import com.zhonglai.luhui.sys.manager.factory.AsyncFactory;
import com.zhonglai.luhui.security.service.TokenService;
import com.zhonglai.luhui.sys.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 登陆业务
*/
... ... @@ -34,12 +36,17 @@ public class LoginService {
@Autowired
private RedisCache redisCache;
@Resource
private AuthenticationManager authenticationManager;
@Autowired
private TokenService tokenService;
@Autowired
private ISysUserService sysUserService;
@Autowired
private AdminConfigurerAdapter adminConfigurerAdapter;
@Autowired
private ApiConfigurerAdapter apiConfigurerAdapter;
/**
* 管理员用户名密码登录验证
*
... ... @@ -51,14 +58,8 @@ public class LoginService {
*/
public String sysUserLogin(String username, String password, String code, String uuid)
{
// boolean captchaOnOff = configService.selectCaptchaOnOff();
// // 验证码开关
// if (captchaOnOff)
// {
// validateCaptcha(username, code, uuid);
// }
// 用户验证
Authentication authentication = userPasswordVerification(username,password,SysLogininforType.lhAdmin);
Authentication authentication = userPasswordVerification(username,password,adminConfigurerAdapter);
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,SysLogininforType.lhAdmin, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
SysLoginUser loginUser = (SysLoginUser) authentication.getPrincipal();
loginUser.setSysLogininforType(SysLogininforType.lhAdmin);
... ... @@ -75,7 +76,7 @@ public class LoginService {
*/
public String apiLoginByPass(String user,String pass) {
// 用户验证
Authentication authentication = userPasswordVerification(user,pass,SysLogininforType.lhApi);
Authentication authentication = userPasswordVerification(user,pass,apiConfigurerAdapter);
AsyncManager.me().execute(AsyncFactory.recordLogininfor(user, SysLogininforType.lhApi, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
ApiLoginUser loginUser = (ApiLoginUser) authentication.getPrincipal();
loginUser.setSysLogininforType(SysLogininforType.lhApi);
... ... @@ -89,7 +90,7 @@ public class LoginService {
public String openaiLoginByPass(String user,String pass) {
// 用户验证
Authentication authentication = userPasswordVerification(user,pass,SysLogininforType.openAi);
Authentication authentication = userPasswordVerification(user,pass,apiConfigurerAdapter);
AsyncManager.me().execute(AsyncFactory.recordLogininfor(user, SysLogininforType.openAi, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
OpenAiLoginUser loginUser = (OpenAiLoginUser) authentication.getPrincipal();
loginUser.setSysLogininforType(SysLogininforType.openAi);
... ... @@ -127,7 +128,7 @@ public class LoginService {
sysUser.setUserId(userId);
sysUser.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
sysUser.setLoginDate(DateUtils.getNowDate());
publicService.updateObject(sysUser,"user_id");
sysUserService.updateUser(sysUser);
}
/**
... ... @@ -155,25 +156,25 @@ public class LoginService {
}
}
private Authentication userPasswordVerification(String username,String password,SysLogininforType type)
private Authentication userPasswordVerification(String username, String password, DefaultSecurityConfig defaultSecurityConfig)
{
Authentication authentication = null;
try
{
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
authentication = authenticationManager
authentication = defaultSecurityConfig.authenticationManagerBean()
.authenticate(new UsernamePasswordAuthenticationToken(username, password));
}
catch (Exception e)
{
if (e instanceof BadCredentialsException)
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,type, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,defaultSecurityConfig.sysLogininforType(), Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
throw new UserPasswordNotMatchException();
}
else
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,type, Constants.LOGIN_FAIL, e.getMessage()));
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,defaultSecurityConfig.sysLogininforType(), Constants.LOGIN_FAIL, e.getMessage()));
throw new ServiceException(e.getMessage());
}
}
... ...
package com.zhonglai.luhui.admin.service;
package com.zhonglai.luhui.login.service;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.system.domain.entity.UserConstants;
import com.ruoyi.system.domain.entity.SysUser;
import com.ruoyi.common.tool.SysLogininforType;
import com.zhonglai.luhui.admin.model.RegisterBody;
import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.CaptchaExpireException;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.login.model.RegisterBody;
import com.zhonglai.luhui.redis.service.RedisCache;
import com.zhonglai.luhui.security.manager.AsyncManager;
import com.zhonglai.luhui.security.manager.factory.AsyncFactory;
import com.zhonglai.luhui.sys.manager.AsyncManager;
import com.zhonglai.luhui.sys.manager.factory.AsyncFactory;
import com.zhonglai.luhui.security.utils.SecurityUtils;
import com.zhonglai.luhui.sys.service.ISysConfigService;
import com.zhonglai.luhui.sys.service.ISysUserService;
... ...
restart.include.json=/com.alibaba.fastjson.*.jar
\ No newline at end of file
... ...
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://rm-wz9740un21f09iokuao.mysql.rds.aliyuncs.com:3306/mqtt_broker?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: luhui
password: Luhui586
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
\ No newline at end of file
... ...
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8061 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-admin # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain, # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /** # NameServer地址 rocketmq: name-server: 47.115.144.179:9876 # 默认的消息组 producer: group: deviceCommand send-message-timeout: 30000 send-topic: lh-mqtt-service-deviceCommand-test send-tags: 1
\ No newline at end of file
... ...
#错误消息
not.null=* 必须填写
user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效
user.not.exists=用户不存在/密码错误
user.password.not.match=用户不存在/密码错误
user.password.retry.limit.count=密码输入错误{0}次
user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定10分钟
user.password.delete=对不起,您的账号已被删除
user.blocked=用户已封禁,请联系管理员
role.blocked=角色已封禁,请联系管理员
user.logout.success=退出成功
length.not.valid=长度必须在{min}到{max}个字符之间
user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头
user.password.not.valid=* 5-50个字符
user.email.not.valid=邮箱格式错误
user.mobile.phone.number.not.valid=手机号格式错误
user.login.success=登录成功
user.register.success=注册成功
user.notfound=请重新登录
user.forcelogout=管理员强制退出,请重新登录
user.unknown.error=未知错误,请重新登录
##文件上传消息
upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB!
upload.filename.exceed.length=上传的文件名最长{0}个字符
##权限
no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]
... ...
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路径 -->
<property name="log.path" value="logs" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.ruoyi" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<root level="info">
<appender-ref ref="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
<!--系统用户操作日志-->
<logger name="sys-user" level="info">
<appender-ref ref="sys-user"/>
</logger>
</configuration>
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局参数 -->
<settings>
<!-- 使全局的映射器启用或禁用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 允许JDBC 支持自动生成主键 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!-- 指定 MyBatis 所用日志的具体实现 -->
<setting name="logImpl" value="SLF4J" />
<!-- 使用驼峰命名法转换字段 -->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
</settings>
</configuration>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>bin</id>
<!-- 最终打包成一个用于发布的zip文件 -->
<formats>
<format>zip</format>
</formats>
<!-- Adds dependencies to zip package under lib directory -->
<dependencySets>
<dependencySet>
<!--
不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录
-->
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<fileSets>
<!-- 把项目相关的说明文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>README*</include>
<include>LICENSE*</include>
<include>NOTICE*</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,打包进zip文件的config目录 -->
<fileSet>
<directory>${project.basedir}\src\main\resources\configs</directory>
<outputDirectory>../configs</outputDirectory>
<includes>
<include>*.properties</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,提出来 -->
<fileSet>
<directory>${project.basedir}\src\main\resources</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.properties</include>
<include>*.yml</include>
</includes>
</fileSet>
<!-- 把项目的脚本文件目录( src/main/scripts )中的启动脚本文件,打包进zip文件的跟目录 -->
<fileSet>
<directory>${project.basedir}\bin</directory>
<outputDirectory></outputDirectory>
<includes>
<include>start.*</include>
<include>stop.*</include>
</includes>
</fileSet>
<!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
\ No newline at end of file
... ...
... ... @@ -171,6 +171,12 @@
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-device-service</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
... ...
package com.zhonglai.luhui.mqtt.comm.dto;
import com.ruoyi.system.domain.iot.IotDevice;
import com.ruoyi.system.domain.iot.IotTerminal;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import java.util.List;
... ...
package com.zhonglai.luhui.mqtt.comm.dto.thingsmodels;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.zhonglai.luhui.device.domain.IotThingsModel;
/**
* 物模型工厂
... ...
package com.zhonglai.luhui.mqtt.comm.dto.thingsmodels;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import lombok.Data;
/**
... ...
package com.zhonglai.luhui.mqtt.comm.service;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.iot.IotDevice;
import com.ruoyi.system.domain.iot.IotTerminal;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.mqtt.comm.config.SysParameter;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
import com.zhonglai.luhui.mqtt.comm.factory.Topic;
... ...
package com.zhonglai.luhui.mqtt.comm.service;
import com.ruoyi.system.domain.iot.IotDevice;
import com.ruoyi.system.domain.iot.IotTerminal;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
import com.zhonglai.luhui.mqtt.comm.factory.Topic;
... ...
... ... @@ -2,7 +2,7 @@ package com.zhonglai.luhui.mqtt.comm.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import com.zhonglai.luhui.mqtt.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
... ...
package com.zhonglai.luhui.mqtt.comm.service;
import com.ruoyi.system.domain.iot.IotDevice;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
import com.zhonglai.luhui.mqtt.comm.dto.business.BusinessDto;
import com.zhonglai.luhui.mqtt.comm.dto.business.BusinessDtoClassNew;
... ...
package com.zhonglai.luhui.mqtt.controller;
import com.ruoyi.system.domain.iot.IotDevice;
import com.ruoyi.system.domain.iot.IotTerminal;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.dto.Message;
import com.zhonglai.luhui.mqtt.dto.MessageCode;
import com.zhonglai.luhui.mqtt.service.db.DeviceService;
... ...
package com.zhonglai.luhui.mqtt.dto;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.iot.IotDevice;
import com.ruoyi.system.domain.iot.IotTerminal;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.mqtt.service.db.DeviceService;
import org.eclipse.paho.client.mqttv3.MqttException;
... ...
package com.zhonglai.luhui.mqtt.service;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.iot.IotDevice;
import com.ruoyi.system.domain.iot.IotTerminal;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.mqtt.comm.config.RedisConfig;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
... ...
package com.zhonglai.luhui.mqtt.service;
import com.ruoyi.system.domain.iot.IotDevice;
import com.ruoyi.system.domain.iot.IotTerminal;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.mqtt.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.mqtt.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
... ...
... ... @@ -3,9 +3,9 @@ package com.zhonglai.luhui.mqtt.service.db;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.iot.IotDevice;
import com.ruoyi.system.domain.iot.IotTerminal;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import com.zhonglai.luhui.mqtt.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelBase;
... ...
package com.zhonglai.luhui.mqtt.service.db.mode;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.service.redis.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ...
package com.zhonglai.luhui.mqtt.service.topic;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.iot.IotDevice;
import com.ruoyi.system.domain.iot.IotTerminal;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
import com.zhonglai.luhui.mqtt.comm.dto.TerminalClientRePlyDto;
... ...
package com.zhonglai.luhui.mqtt.service.topic;
import com.ruoyi.system.domain.iot.IotDevice;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
import com.zhonglai.luhui.mqtt.comm.dto.business.BusinessDto;
import com.zhonglai.luhui.mqtt.comm.factory.BusinessAgreement;
... ...
... ... @@ -2,7 +2,7 @@ package com.zhonglai.luhui.mqtt.service.topic;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.iot.IotThingsModel;
import com.zhonglai.luhui.device.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
import com.zhonglai.luhui.mqtt.comm.dto.business.BusinessDto;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelBase;
... ...
... ... @@ -94,6 +94,10 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-login</artifactId>
</dependency>
</dependencies>
<build>
... ...
... ... @@ -26,6 +26,7 @@ import java.net.URLEncoder;
"com.zhonglai.luhui.redis",
"com.zhonglai.luhui.security",
"com.zhonglai.luhui.chatgpt",
"com.zhonglai.luhui.login",
"com.zhonglai.luhui.openai",
}
)
... ...
package com.zhonglai.luhui.openai.config;
import com.ruoyi.common.tool.SysLogininforType;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.openai.service.ChatgptDetailsServiceImpl;
import com.zhonglai.luhui.security.config.DefaultSecurityConfig;
import com.zhonglai.luhui.security.service.AdminDetailsServiceImpl;
import com.zhonglai.luhui.security.service.SecurityConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
/**
* app接口安全策略. 没有{@link Order}注解优先级比上面低
*/
@Configuration
public class RootConfigurerAdapter extends DefaultSecurityConfig {
@Autowired
private ChatgptDetailsServiceImpl chatgptDetailsService;
@Autowired
private SecurityConfigService securityConfigService;
@Override
public UserDetailsService getUserDetailsService() {
return chatgptDetailsService;
}
@Override
public void configHttpSecurity(HttpSecurity httpSecurity) throws Exception {
securityConfigService.configHttpSecurity(httpSecurity);
}
@Override
public PasswordEncoder bCryptPasswordEncoder() {
return SpringUtils.getBean("bCryptPasswordEncoder");
}
@Override
public SysLogininforType sysLogininforType() {
return SysLogininforType.lhAdmin;
}
}
\ No newline at end of file
... ...
... ... @@ -12,8 +12,8 @@ import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.dao.service.PublicService;
import com.zhonglai.luhui.login.service.LoginService;
import com.zhonglai.luhui.security.dto.OpenAiUserInfo;
import com.zhonglai.luhui.security.service.LoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
... ...
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-modules</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>lh-server-ops</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-sys-service</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-common-swagger</artifactId>
</dependency>
<!-- 核心模块-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-framework</artifactId>
</dependency>
<!-- 核心模块-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-action</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.5</version>
</dependency>
<!-- SpringBoot集成thymeleaf模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.2.RELEASE</version>
<configuration>
<mainClass>com.zhonglai.luhui.serverops.Main</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui.serverops;
import com.ruoyi.framework.config.ResourcesConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.scheduling.annotation.EnableScheduling;
@ComponentScan(basePackages = {
"com.ruoyi.common",
"com.ruoyi.framework",
"com.zhonglai.luhui.datasource",
"com.zhonglai.luhui.dao",
"com.zhonglai.luhui.sys",
"com.zhonglai.luhui.redis",
"com.zhonglai.luhui.serverops",
}
,excludeFilters = {@ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE,classes = {ResourcesConfig.class})}
)
@EnableScheduling
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class,args);
System.out.println("启动成功");
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.serverops.config;
import cn.hutool.extra.mail.MailAccount;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class EmailConfig {
@Bean
public MailAccount sandMailAccount()
{
MailAccount account = new MailAccount();
account.setHost("smtp.qq.com");
account.setPort(587);
account.setAuth(true);
account.setFrom("409188680@qq.com");
account.setUser("409188680@qq.com");
account.setPass("agalemuqiejjbige");
return account;
}
}
... ...
package com.zhonglai.luhui.serverops.config;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 通用配置
*
* @author ruoyi
*/
@Configuration
public class ResourcesConfig implements WebMvcConfigurer
{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
/** 本地文件上传路径 */
registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**")
.addResourceLocations("file:" + RuoYiConfig.getProfile() + "/");
// registry.addResourceHandler(Constants.ROOT )
// .addResourceLocations("classpath:/static/");
/** swagger配置 */
registry.addResourceHandler("/swagger-ui/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
}
/**
* 跨域配置
*/
@Bean
public CorsFilter corsFilter()
{
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 设置访问源地址
config.addAllowedOriginPattern("*");
// 设置访问源请求头
config.addAllowedHeader("*");
// 设置访问源请求方法
config.addAllowedMethod("*");
// 有效期 1800秒
config.setMaxAge(1800L);
// 添加映射路径,拦截一切请求
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
// 返回新的CorsFilter
return new CorsFilter(source);
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.serverops.config;
import com.ruoyi.common.config.RuoYiConfig;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
/** 系统基础配置 */
@Autowired
private RuoYiConfig ruoyiConfig;
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("服务器运维管理")
.apiInfo(
new ApiInfoBuilder().title("标题:服务器运维管理")
.description("服务器运维管理")
.contact(new Contact(ruoyiConfig.getName(), null, null))
.version("版本号:" + ruoyiConfig.getVersion())
.build()
)
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.serverops.controller;
import com.ruoyi.common.core.domain.AjaxResult;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.serverops.domain.OpsHost;
import com.zhonglai.luhui.serverops.dto.DuDiskDto;
import com.zhonglai.luhui.serverops.dto.LinuxTop;
import com.zhonglai.luhui.serverops.service.IOpsHostService;
import com.zhonglai.luhui.serverops.service.LinuxMonitorService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Api(tags = "Linux服务器管理")
@Controller
@RequestMapping("/linuxServiceManage")
public class LinuxServiceManageController extends BaseController {
@Autowired
private LinuxMonitorService linuxMonitorService;
@Autowired
private IOpsHostService opsHostService;
@ApiOperation("根据cpu查询top10")
@GetMapping("/top10ByCpu/{hostid}")
public String top10ByCpu(@PathVariable Integer hostid, ModelMap mmap)
{
OpsHost opsHost = opsHostService.selectOpsHostById(hostid);
List<LinuxTop> list = linuxMonitorService.top10ByCpu(opsHost);
mmap.addAttribute("linuxTopList",list);
return "html/cpu";
}
@ApiOperation("根据内存查询top10")
@GetMapping("/top10ByMem/{hostid}")
public String top10ByMem(@PathVariable Integer hostid, ModelMap mmap)
{
OpsHost opsHost = opsHostService.selectOpsHostById(hostid);
List<LinuxTop> list = linuxMonitorService.top10ByMem(opsHost);
mmap.addAttribute("linuxTopList",list);
return "html/mem";
}
@ApiOperation("查看磁盘大小排名")
@GetMapping("/diskDesc/{hostid}")
public String diskDesc(@PathVariable Integer hostid,String path, ModelMap mmap)
{
if(null == path)
{
path = "/*";
}
if(!path.endsWith("/*"))
{
path = path+"/*";
}
OpsHost opsHost = opsHostService.selectOpsHostById(hostid);
List<DuDiskDto> list = linuxMonitorService.diskDesc(opsHost,path);
mmap.addAttribute("duDiskDtoList",list);
return "html/desc";
}
}
... ...
package com.zhonglai.luhui.serverops.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.zhonglai.luhui.action.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.zhonglai.luhui.serverops.domain.OpsHost;
import com.zhonglai.luhui.serverops.service.IOpsHostService;
import com.zhonglai.luhui.sys.utils.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 主机信息表Controller
*
* @author 钟来
* @date 2023-06-07
*/
@Api(tags = "主机信息表")
@RestController
@RequestMapping("/ops/OpsHost")
public class OpsHostController extends BaseController
{
@Autowired
private IOpsHostService opsHostService;
/**
* 查询主机信息表列表
*/
@ApiOperation("查询主机信息表列表")
@GetMapping("/list")
public TableDataInfo list(OpsHost opsHost)
{
startPage();
List<OpsHost> list = opsHostService.selectOpsHostList(opsHost);
return getDataTable(list);
}
/**
* 导出主机信息表列表
*/
@ApiOperation("导出主机信息表列表")
@Log(title = "主机信息表", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, OpsHost opsHost)
{
List<OpsHost> list = opsHostService.selectOpsHostList(opsHost);
ExcelUtil<OpsHost> util = new ExcelUtil<OpsHost>(OpsHost.class);
util.exportExcel(response, list, "主机信息表数据");
}
/**
* 获取主机信息表详细信息
*/
@ApiOperation("获取主机信息表详细信息")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Integer id)
{
return AjaxResult.success(opsHostService.selectOpsHostById(id));
}
/**
* 新增主机信息表
*/
@ApiOperation("新增主机信息表")
@Log(title = "主机信息表", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody OpsHost opsHost)
{
return toAjax(opsHostService.insertOpsHost(opsHost));
}
/**
* 修改主机信息表
*/
@ApiOperation("修改主机信息表")
@Log(title = "主机信息表", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody OpsHost opsHost)
{
return toAjax(opsHostService.updateOpsHost(opsHost));
}
/**
* 删除主机信息表
*/
@ApiOperation("删除主机信息表")
@Log(title = "主机信息表", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Integer[] ids)
{
return toAjax(opsHostService.deleteOpsHostByIds(ids));
}
}
... ...
package com.zhonglai.luhui.serverops.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.zhonglai.luhui.action.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.zhonglai.luhui.serverops.domain.OpsState;
import com.zhonglai.luhui.serverops.service.IOpsStateService;
import com.zhonglai.luhui.sys.utils.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 采集状态Controller
*
* @author 钟来
* @date 2023-06-07
*/
@Api(tags = "采集状态")
@RestController
@RequestMapping("/ops/OpsState")
public class OpsStateController extends BaseController
{
@Autowired
private IOpsStateService opsStateService;
/**
* 查询采集状态列表
*/
@ApiOperation("查询采集状态列表")
@GetMapping("/list")
public TableDataInfo list(OpsState opsState)
{
startPage();
List<OpsState> list = opsStateService.selectOpsStateList(opsState);
return getDataTable(list);
}
/**
* 导出采集状态列表
*/
@ApiOperation("导出采集状态列表")
@Log(title = "采集状态", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, OpsState opsState)
{
List<OpsState> list = opsStateService.selectOpsStateList(opsState);
ExcelUtil<OpsState> util = new ExcelUtil<OpsState>(OpsState.class);
util.exportExcel(response, list, "采集状态数据");
}
/**
* 获取采集状态详细信息
*/
@ApiOperation("获取采集状态详细信息")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Integer id)
{
return AjaxResult.success(opsStateService.selectOpsStateById(id));
}
}
... ...
package com.zhonglai.luhui.serverops.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.zhonglai.luhui.action.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.zhonglai.luhui.serverops.domain.OpsSysLog;
import com.zhonglai.luhui.serverops.service.IOpsSysLogService;
import com.zhonglai.luhui.sys.utils.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 运行异常记录Controller
*
* @author 钟来
* @date 2023-06-07
*/
@Api(tags = "运行异常记录")
@RestController
@RequestMapping("/ops/OpsSysLog")
public class OpsSysLogController extends BaseController
{
@Autowired
private IOpsSysLogService opsSysLogService;
/**
* 查询运行异常记录列表
*/
@ApiOperation("查询运行异常记录列表")
@GetMapping("/list")
public TableDataInfo list(OpsSysLog opsSysLog)
{
startPage();
List<OpsSysLog> list = opsSysLogService.selectOpsSysLogList(opsSysLog);
return getDataTable(list);
}
/**
* 导出运行异常记录列表
*/
@ApiOperation("导出运行异常记录列表")
@Log(title = "运行异常记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, OpsSysLog opsSysLog)
{
List<OpsSysLog> list = opsSysLogService.selectOpsSysLogList(opsSysLog);
ExcelUtil<OpsSysLog> util = new ExcelUtil<OpsSysLog>(OpsSysLog.class);
util.exportExcel(response, list, "运行异常记录数据");
}
/**
* 获取运行异常记录详细信息
*/
@ApiOperation("获取运行异常记录详细信息")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Integer id)
{
return AjaxResult.success(opsSysLogService.selectOpsSysLogById(id));
}
}
... ...
package com.zhonglai.luhui.serverops.controller;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.ServletUtils;
import com.zhonglai.luhui.serverops.domain.OpsHost;
import com.zhonglai.luhui.serverops.dto.LinuxMarginDto;
import com.zhonglai.luhui.serverops.service.IOpsHostService;
import com.zhonglai.luhui.serverops.service.LinuxMonitorService;
import com.zhonglai.luhui.serverops.service.ResourcesAlarmSerivce;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import java.net.URL;
import java.net.URLClassLoader;
@Api(tags = "root目录")
@Controller
public class RootController {
@Autowired
private IOpsHostService opsHostService;
@Autowired
private ResourcesAlarmSerivce resourcesAlarmSerivce;
@Autowired
private LinuxMonitorService linuxMonitorService;
/**
* 获取运行异常记录详细信息
*/
@ApiOperation("执行资源预警服务")
@ResponseBody
@GetMapping(value = "/exeResourcesAlarmSerivce")
public AjaxResult exeResourcesAlarmSerivce()
{
resourcesAlarmSerivce.run();
return AjaxResult.success();
}
@ApiOperation("测试邮箱")
@GetMapping("/testemail/{hostid}")
public String testemail(@PathVariable Integer hostid, ModelMap mmap)
{
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader) classLoader).getURLs();
for (URL url : urls) {
System.out.println(url.getFile());
}
OpsHost opsHost = opsHostService.selectOpsHostById(hostid);
LinuxMarginDto linuxMarginDto = linuxMonitorService.gather(opsHost);
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("测试服务器");
stringBuffer.append("状态:");
stringBuffer.append("</br>");
stringBuffer.append("主键ip:");
stringBuffer.append(opsHost.getIp());
stringBuffer.append("</br>");
stringBuffer.append("<a href='/linuxServiceManage/top10ByCpu/"+hostid+"'>");
stringBuffer.append("cpu使用率:");
stringBuffer.append(linuxMarginDto.getCpu());
stringBuffer.append("</a>");
stringBuffer.append("</br>");
stringBuffer.append("<a href='/linuxServiceManage/top10ByMem/"+hostid+"'>");
stringBuffer.append("内存使用率:");
stringBuffer.append(linuxMarginDto.getMem());
stringBuffer.append("</a>");
stringBuffer.append("</br>");
stringBuffer.append("<a href='/linuxServiceManage/diskDesc/"+hostid+"'>");
stringBuffer.append("硬盘使用率:");
stringBuffer.append(linuxMarginDto.getDisk());
stringBuffer.append("</a>");
stringBuffer.append("</br>");
stringBuffer.append("会话连接数:");
stringBuffer.append(linuxMarginDto.getSessionNumber());
mmap.addAttribute("html", stringBuffer.toString());
return "html/email";
}
}
... ...
package com.zhonglai.luhui.serverops.domain;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* 主机信息表对象 ops_host
*
* @author 钟来
* @date 2023-06-07
*/
@ApiModel("主机信息表")
public class OpsHost extends BaseEntity
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 主键 */
@ApiModelProperty("主键")
private Integer id;
/** ip */
@ApiModelProperty("ip")
private String ip;
/** 端口 */
@ApiModelProperty("端口")
private Integer port;
/** 登陆名 */
@ApiModelProperty("登陆名")
private String loginname;
/** 登陆密码 */
@ApiModelProperty("登陆密码")
private String loginpass;
/** 私钥 */
@ApiModelProperty("私钥")
private String private_key;
/** 私钥密码 */
@ApiModelProperty("私钥密码")
private String pass_phrase;
/** 系统信息 */
@ApiModelProperty("系统信息")
private String os_info;
/** 创建时间 */
@ApiModelProperty("创建时间")
private Integer create_time;
/** 结束时间 */
@ApiModelProperty("结束时间")
private Integer end_time;
/** 描述名称 */
@ApiModelProperty("描述名称")
private String describe_name;
@ApiModelProperty("状态(1正常,2关闭)")
private Integer state;
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return id;
}
public void setIp(String ip)
{
this.ip = ip;
}
public String getIp()
{
return ip;
}
public void setPort(Integer port)
{
this.port = port;
}
public Integer getPort()
{
return port;
}
public void setLoginname(String loginname)
{
this.loginname = loginname;
}
public String getLoginname()
{
return loginname;
}
public void setLoginpass(String loginpass)
{
this.loginpass = loginpass;
}
public String getLoginpass()
{
return loginpass;
}
public void setPrivate_key(String private_key)
{
this.private_key = private_key;
}
public String getPrivate_key()
{
return private_key;
}
public void setPass_phrase(String pass_phrase)
{
this.pass_phrase = pass_phrase;
}
public String getPass_phrase()
{
return pass_phrase;
}
public void setOs_info(String os_info)
{
this.os_info = os_info;
}
public String getOs_info()
{
return os_info;
}
public void setCreate_time(Integer create_time)
{
this.create_time = create_time;
}
public Integer getCreate_time()
{
return create_time;
}
public void setEnd_time(Integer end_time)
{
this.end_time = end_time;
}
public Integer getEnd_time()
{
return end_time;
}
public void setDescribe_name(String describe_name)
{
this.describe_name = describe_name;
}
public String getDescribe_name()
{
return describe_name;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("ip", getIp())
.append("port", getPort())
.append("loginname", getLoginname())
.append("loginpass", getLoginpass())
.append("private_key", getPrivate_key())
.append("pass_phrase", getPass_phrase())
.append("os_info", getOs_info())
.append("create_time", getCreate_time())
.append("end_time", getEnd_time())
.append("describe_name", getDescribe_name())
.toString();
}
}
... ...
package com.zhonglai.luhui.serverops.domain;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* 【请填写功能名称】对象 ops_state
*
* @author 钟来
* @date 2023-06-07
*/
@ApiModel("运维状态信息")
public class OpsState extends BaseEntity
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 主键 */
@ApiModelProperty("主键")
private Integer id;
/** 主机主键 */
@ApiModelProperty("主机主键")
private Integer host_id;
/** 创建时间 */
@ApiModelProperty("创建时间")
private Integer create_time;
/** cpu使用率% */
@ApiModelProperty("cpu使用率%")
private Double cpu;
/** 内存使用率% */
@ApiModelProperty("内存使用率%")
private Double mem;
/** 连接数 */
@ApiModelProperty("连接数")
private Integer sessionNumber;
/** 硬盘使用率 */
@ApiModelProperty("硬盘使用率")
private Double disk;
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return id;
}
public void setHost_id(Integer host_id)
{
this.host_id = host_id;
}
public Integer getHost_id()
{
return host_id;
}
public void setCreate_time(Integer create_time)
{
this.create_time = create_time;
}
public Integer getCreate_time()
{
return create_time;
}
public void setCpu(Double cpu)
{
this.cpu = cpu;
}
public Double getCpu()
{
return cpu;
}
public void setMem(Double mem)
{
this.mem = mem;
}
public Double getMem()
{
return mem;
}
public void setSessionNumber(Integer sessionNumber)
{
this.sessionNumber = sessionNumber;
}
public Integer getSessionNumber()
{
return sessionNumber;
}
public void setDisk(Double disk)
{
this.disk = disk;
}
public Double getDisk()
{
return disk;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("host_id", getHost_id())
.append("create_time", getCreate_time())
.append("cpu", getCpu())
.append("mem", getMem())
.append("sessionNumber", getSessionNumber())
.append("disk", getDisk())
.toString();
}
}
... ...
package com.zhonglai.luhui.serverops.domain;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* 运行异常记录对象 ops_sys_log
*
* @author 钟来
* @date 2023-06-07
*/
@ApiModel("运行异常记录")
public class OpsSysLog extends BaseEntity
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 主键 */
@ApiModelProperty("主键")
private Integer id;
/** 日志类型 */
@ApiModelProperty("日志类型")
private String log_type;
/** 创建时间 */
@ApiModelProperty("创建时间")
private Integer create_time;
/** 程序异常信息 */
@ApiModelProperty("程序异常信息")
private String exception;
/** 描述 */
@ApiModelProperty("描述")
private String describe;
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return id;
}
public void setLog_type(String log_type)
{
this.log_type = log_type;
}
public String getLog_type()
{
return log_type;
}
public void setCreate_time(Integer create_time)
{
this.create_time = create_time;
}
public Integer getCreate_time()
{
return create_time;
}
public void setException(String exception)
{
this.exception = exception;
}
public String getException()
{
return exception;
}
public void setDescribe(String describe)
{
this.describe = describe;
}
public String getDescribe()
{
return describe;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("log_type", getLog_type())
.append("create_time", getCreate_time())
.append("exception", getException())
.append("describe", getDescribe())
.toString();
}
}
... ...
package com.zhonglai.luhui.serverops.dto;
/**
* du -s 指令返回的内容
*/
public class DuDiskDto {
private Integer size;
private String path;
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
... ...
package com.zhonglai.luhui.serverops.dto;
public class LinuxMarginDto {
private Double cpu; //CPU使用率: 0.0%
private Double mem; //内存使用率: 34.18%
private Integer sessionNumber; //连接数: 175
private Double disk; //磁盘使用率: 26%
public Double getCpu() {
return cpu;
}
public void setCpu(Double cpu) {
this.cpu = cpu;
}
public Double getMem() {
return mem;
}
public void setMem(Double mem) {
this.mem = mem;
}
public Integer getSessionNumber() {
return sessionNumber;
}
public void setSessionNumber(Integer sessionNumber) {
this.sessionNumber = sessionNumber;
}
public Double getDisk() {
return disk;
}
public void setDisk(Double disk) {
this.disk = disk;
}
}
... ...
package com.zhonglai.luhui.serverops.dto;
/**
* Linux的top指令字段
*/
public class LinuxTop {
private Integer pid;
private String user;
private Double cpu;
private Double mem;
private String command;
private String path;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public Double getCpu() {
return cpu;
}
public void setCpu(Double cpu) {
this.cpu = cpu;
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public Double getMem() {
return mem;
}
public void setMem(Double mem) {
this.mem = mem;
}
public String getCommand() {
return command;
}
public void setCommand(String command) {
this.command = command;
}
}
... ...
package com.zhonglai.luhui.serverops.mapper;
import java.util.List;
import com.zhonglai.luhui.serverops.domain.OpsHost;
/**
* 主机信息表Mapper接口
*
* @author 钟来
* @date 2023-06-07
*/
public interface OpsHostMapper
{
/**
* 查询主机信息表
*
* @param id 主机信息表主键
* @return 主机信息表
*/
public OpsHost selectOpsHostById(Integer id);
/**
* 查询主机信息表列表
*
* @param opsHost 主机信息表
* @return 主机信息表集合
*/
public List<OpsHost> selectOpsHostList(OpsHost opsHost);
/**
* 新增主机信息表
*
* @param opsHost 主机信息表
* @return 结果
*/
public int insertOpsHost(OpsHost opsHost);
/**
* 修改主机信息表
*
* @param opsHost 主机信息表
* @return 结果
*/
public int updateOpsHost(OpsHost opsHost);
/**
* 删除主机信息表
*
* @param id 主机信息表主键
* @return 结果
*/
public int deleteOpsHostById(Integer id);
/**
* 批量删除主机信息表
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteOpsHostByIds(Integer[] ids);
}
... ...
package com.zhonglai.luhui.serverops.mapper;
import java.util.List;
import com.zhonglai.luhui.serverops.domain.OpsState;
/**
* 【请填写功能名称】Mapper接口
*
* @author 钟来
* @date 2023-06-07
*/
public interface OpsStateMapper
{
/**
* 查询【请填写功能名称】
*
* @param id 【请填写功能名称】主键
* @return 【请填写功能名称】
*/
public OpsState selectOpsStateById(Integer id);
/**
* 查询【请填写功能名称】列表
*
* @param opsState 【请填写功能名称】
* @return 【请填写功能名称】集合
*/
public List<OpsState> selectOpsStateList(OpsState opsState);
/**
* 新增【请填写功能名称】
*
* @param opsState 【请填写功能名称】
* @return 结果
*/
public int insertOpsState(OpsState opsState);
/**
* 修改【请填写功能名称】
*
* @param opsState 【请填写功能名称】
* @return 结果
*/
public int updateOpsState(OpsState opsState);
/**
* 删除【请填写功能名称】
*
* @param id 【请填写功能名称】主键
* @return 结果
*/
public int deleteOpsStateById(Integer id);
/**
* 批量删除【请填写功能名称】
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteOpsStateByIds(Integer[] ids);
}
... ...
package com.zhonglai.luhui.serverops.mapper;
import java.util.List;
import com.zhonglai.luhui.serverops.domain.OpsSysLog;
/**
* 运行异常记录Mapper接口
*
* @author 钟来
* @date 2023-06-07
*/
public interface OpsSysLogMapper
{
/**
* 查询运行异常记录
*
* @param id 运行异常记录主键
* @return 运行异常记录
*/
public OpsSysLog selectOpsSysLogById(Integer id);
/**
* 查询运行异常记录列表
*
* @param opsSysLog 运行异常记录
* @return 运行异常记录集合
*/
public List<OpsSysLog> selectOpsSysLogList(OpsSysLog opsSysLog);
/**
* 新增运行异常记录
*
* @param opsSysLog 运行异常记录
* @return 结果
*/
public int insertOpsSysLog(OpsSysLog opsSysLog);
/**
* 修改运行异常记录
*
* @param opsSysLog 运行异常记录
* @return 结果
*/
public int updateOpsSysLog(OpsSysLog opsSysLog);
/**
* 删除运行异常记录
*
* @param id 运行异常记录主键
* @return 结果
*/
public int deleteOpsSysLogById(Integer id);
/**
* 批量删除运行异常记录
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteOpsSysLogByIds(Integer[] ids);
}
... ...
package com.zhonglai.luhui.serverops.service;
import java.util.List;
import com.zhonglai.luhui.serverops.domain.OpsHost;
/**
* 主机信息表Service接口
*
* @author 钟来
* @date 2023-06-07
*/
public interface IOpsHostService
{
/**
* 查询主机信息表
*
* @param id 主机信息表主键
* @return 主机信息表
*/
public OpsHost selectOpsHostById(Integer id);
/**
* 查询主机信息表列表
*
* @param opsHost 主机信息表
* @return 主机信息表集合
*/
public List<OpsHost> selectOpsHostList(OpsHost opsHost);
/**
* 新增主机信息表
*
* @param opsHost 主机信息表
* @return 结果
*/
public int insertOpsHost(OpsHost opsHost);
/**
* 修改主机信息表
*
* @param opsHost 主机信息表
* @return 结果
*/
public int updateOpsHost(OpsHost opsHost);
/**
* 批量删除主机信息表
*
* @param ids 需要删除的主机信息表主键集合
* @return 结果
*/
public int deleteOpsHostByIds(Integer[] ids);
/**
* 删除主机信息表信息
*
* @param id 主机信息表主键
* @return 结果
*/
public int deleteOpsHostById(Integer id);
}
... ...
package com.zhonglai.luhui.serverops.service;
import java.util.List;
import com.zhonglai.luhui.serverops.domain.OpsState;
/**
* 【请填写功能名称】Service接口
*
* @author 钟来
* @date 2023-06-07
*/
public interface IOpsStateService
{
/**
* 查询【请填写功能名称】
*
* @param id 【请填写功能名称】主键
* @return 【请填写功能名称】
*/
public OpsState selectOpsStateById(Integer id);
/**
* 查询【请填写功能名称】列表
*
* @param opsState 【请填写功能名称】
* @return 【请填写功能名称】集合
*/
public List<OpsState> selectOpsStateList(OpsState opsState);
/**
* 新增【请填写功能名称】
*
* @param opsState 【请填写功能名称】
* @return 结果
*/
public int insertOpsState(OpsState opsState);
/**
* 修改【请填写功能名称】
*
* @param opsState 【请填写功能名称】
* @return 结果
*/
public int updateOpsState(OpsState opsState);
/**
* 批量删除【请填写功能名称】
*
* @param ids 需要删除的【请填写功能名称】主键集合
* @return 结果
*/
public int deleteOpsStateByIds(Integer[] ids);
/**
* 删除【请填写功能名称】信息
*
* @param id 【请填写功能名称】主键
* @return 结果
*/
public int deleteOpsStateById(Integer id);
}
... ...
package com.zhonglai.luhui.serverops.service;
import java.util.List;
import com.zhonglai.luhui.serverops.domain.OpsSysLog;
/**
* 运行异常记录Service接口
*
* @author 钟来
* @date 2023-06-07
*/
public interface IOpsSysLogService
{
/**
* 查询运行异常记录
*
* @param id 运行异常记录主键
* @return 运行异常记录
*/
public OpsSysLog selectOpsSysLogById(Integer id);
/**
* 查询运行异常记录列表
*
* @param opsSysLog 运行异常记录
* @return 运行异常记录集合
*/
public List<OpsSysLog> selectOpsSysLogList(OpsSysLog opsSysLog);
/**
* 新增运行异常记录
*
* @param opsSysLog 运行异常记录
* @return 结果
*/
public int insertOpsSysLog(OpsSysLog opsSysLog);
/**
* 修改运行异常记录
*
* @param opsSysLog 运行异常记录
* @return 结果
*/
public int updateOpsSysLog(OpsSysLog opsSysLog);
/**
* 批量删除运行异常记录
*
* @param ids 需要删除的运行异常记录主键集合
* @return 结果
*/
public int deleteOpsSysLogByIds(Integer[] ids);
/**
* 删除运行异常记录信息
*
* @param id 运行异常记录主键
* @return 结果
*/
public int deleteOpsSysLogById(Integer id);
}
... ...
package com.zhonglai.luhui.serverops.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;
@Configuration
public class JobService {
@Autowired
private ResourcesAlarmSerivce resourcesAlarmSerivce;
@Scheduled(fixedRate = 3600000)
public void 采集Linux服务器的运行数据并且预警() {
resourcesAlarmSerivce.run();
}
}
... ...
package com.zhonglai.luhui.serverops.service;
import cn.hutool.extra.ssh.JschUtil;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.serverops.domain.OpsHost;
import com.zhonglai.luhui.serverops.dto.DuDiskDto;
import com.zhonglai.luhui.serverops.dto.LinuxMarginDto;
import com.zhonglai.luhui.serverops.dto.LinuxTop;
import org.springframework.stereotype.Service;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import static cn.hutool.extra.ssh.JschUtil.*;
import static cn.hutool.extra.ssh.JschUtil.getSession;
@Service
public class LinuxMonitorService {
/**
* 采集服务器信息(CPU使用率、物理内存使用率、连接数、磁盘使用率)
* @param opsHost
* @return
*/
public LinuxMarginDto gather(OpsHost opsHost)
{
String cmd ="echo -e \"CPU使用率: $(top -bn1 | grep '%Cpu' | awk '{print $2}')\\n物理内存使用率: $(free -m | awk '/Mem/{printf \"%.2f%%\", ($2-$7)*100/$2}')\\n磁盘使用率: $(df -h | awk '$NF==\"/\"{print $5}')\\n连接数: $(netstat -an | grep ESTABLISHED | wc -l)\"";
String[] ss = exeCmd(opsHost,cmd).split("\n");
LinuxMarginDto linuxMarginDto = new LinuxMarginDto();
linuxMarginDto.setCpu(Double.parseDouble(ss[0].replace("CPU使用率: ","").replace("%","")));
linuxMarginDto.setMem(Double.parseDouble(ss[1].replace("物理内存使用率: ","").replace("%","")));
linuxMarginDto.setSessionNumber(Integer.parseInt(ss[3].replace("连接数: ","").replace("%","")));
linuxMarginDto.setDisk(Double.parseDouble(ss[2].replace("磁盘使用率: ","").replace("%","")));
return linuxMarginDto;
}
/**
* 根据cpu查询top10
* @param opsHost
* @return
*/
public List<LinuxTop> top10ByCpu(OpsHost opsHost)
{
String cmd ="top -bn1 | awk 'NR>7 { print $1, $2, $9, $10, $12 }' | sort -k3 -rn | head -n 10 | awk '{ cmd=\"readlink -e /proc/\"$1\"/cwd\"; cmd | getline path; close(cmd); print $1, $2, $3, $4, $5, path }'";
return getLinuxTops(opsHost, cmd);
}
/**
* 根据内存查询top10
* @param opsHost
* @return
*/
public List<LinuxTop> top10ByMem(OpsHost opsHost)
{
String cmd ="top -bn1 | awk 'NR>7 { print $1, $2, $9, $10, $12 }' | sort -k4 -rn | head -n 10 | awk '{ cmd=\"readlink -e /proc/\"$1\"/cwd\"; cmd | getline path; close(cmd); print $1, $2, $3, $4, $5, path }'";
return getLinuxTops(opsHost, cmd);
}
public List<DuDiskDto> diskDesc(OpsHost opsHost,String path)
{
List<DuDiskDto> list = new ArrayList<>();
String cmd ="du -s "+path+" | sort -nr | while read size file; do type=$(if [ -d \"$file\" ]; then echo \"目录\"; else echo \"文件\"; fi); echo -e \"$size\\t$file\\t$type\"; done";
String[] ss = exeCmd(opsHost,cmd).split("\n");
for (String s:ss)
{
String[] top = s.split("\t");
if(top.length==3)
{
DuDiskDto duDiskDto = new DuDiskDto();
duDiskDto.setSize(Integer.parseInt(top[0]));
duDiskDto.setPath(top[1]);
duDiskDto.setType(top[2]);
list.add(duDiskDto);
}
}
return list;
}
private List<LinuxTop> getLinuxTops(OpsHost opsHost, String cmd) {
List<LinuxTop> list = new ArrayList<>();
String[] ss = exeCmd(opsHost,cmd).split("\n");
for (String s:ss)
{
String[] top = s.split(" ");
LinuxTop linuxTop = new LinuxTop();
linuxTop.setPid(Integer.parseInt(top[0]));
linuxTop.setUser(top[1]);
linuxTop.setCpu(Double.parseDouble(top[2]));
linuxTop.setMem(Double.parseDouble(top[3]));
linuxTop.setCommand(top[4]);
linuxTop.setPath(top[5]);
list.add(linuxTop);
}
return list;
}
private String exeCmd(OpsHost opsHost, String cmd)
{
com.jcraft.jsch.Session session = getSession(opsHost.getIp(), opsHost.getPort(), opsHost.getLoginname(),opsHost.getLoginpass());
return exec(session,cmd, Charset.forName("UTF-8"));
}
}
... ...
package com.zhonglai.luhui.serverops.service;
import cn.hutool.extra.mail.MailAccount;
import cn.hutool.extra.mail.MailUtil;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.entity.SysDictData;
import com.zhonglai.luhui.serverops.domain.OpsHost;
import com.zhonglai.luhui.serverops.domain.OpsState;
import com.zhonglai.luhui.serverops.domain.OpsSysLog;
import com.zhonglai.luhui.serverops.dto.LinuxMarginDto;
import com.zhonglai.luhui.serverops.util.ExceptionUtile;
import com.zhonglai.luhui.sys.manager.AsyncManager;
import com.zhonglai.luhui.sys.service.ISysDictTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.TimerTask;
/**
* 资源预警
*/
@Service
public class ResourcesAlarmSerivce {
@Autowired
private IOpsHostService opsHostService;
@Autowired
private IOpsStateService opsStateService;
@Autowired
private IOpsSysLogService opsSysLogService;
@Autowired
private LinuxMonitorService linuxMonitorService;
@Autowired
private MailAccount sandMailAccount;
@Autowired
private ISysDictTypeService sysDictTypeService;
@Value("${sys.domainname}")
private String domainname;
private List<String> email = new ArrayList<>() ;
/**
* cpu使用率
*/
private double cpu = 80;
/**
* 内存使用率
*/
private double mem = 80;
/**
* 磁盘使用率
*/
private double dick = 80;
/**
* 会话链接数
*/
private double session_number = 80;
/**
* 初始化配置
*/
private void initConfig()
{
//通知邮箱
List<SysDictData> sysDictDataList = sysDictTypeService.selectDictDataByType("server_ops_send_email");
if(null != sysDictDataList && sysDictDataList.size() != 0)
{
email = new ArrayList<>();
for(SysDictData sysDictData:sysDictDataList)
{
email.add(sysDictData.getDictValue());
}
}
//告警阈值
List<SysDictData> alarmConfigList = sysDictTypeService.selectDictDataByType("server_ops_alarm_config");
if(null != alarmConfigList && alarmConfigList.size() != 0)
{
for(SysDictData sysDictData:alarmConfigList)
{
switch (sysDictData.getDictLabel())
{
case "server_ops_alarm_cpu":
cpu = Double.parseDouble(sysDictData.getDictValue());
break;
case "server_ops_alarm_mem":
mem = Double.parseDouble(sysDictData.getDictValue());
break;
case "server_ops_alarm_disk":
dick = Double.parseDouble(sysDictData.getDictValue());
break;
case "server_ops_alarm_session":
session_number = Double.parseDouble(sysDictData.getDictValue());
break;
}
}
}
}
public void run()
{
initConfig();
OpsHost opsHost = new OpsHost();
opsHost.setState(1);
List<OpsHost> list = opsHostService.selectOpsHostList(opsHost);
if(null != list && list.size() != 0)
{
for (OpsHost ohost:list)
{
AsyncManager.me().execute(new ResourcesAlarmSerivceRun(ohost));
}
}
}
private void sendAlarmMessage(OpsHost ohost, OpsState opsState,String... toemail)
{
//邮件发送
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(ohost.getDescribe_name());
stringBuffer.append("状态:");
stringBuffer.append("</br>");
stringBuffer.append("主机ip:");
stringBuffer.append(ohost.getIp());
stringBuffer.append("</br>");
stringBuffer.append("<a href='"+domainname+"/linuxServiceManage/top10ByCpu/"+ohost.getId()+"'>");
stringBuffer.append("cpu使用率:");
stringBuffer.append(opsState.getCpu());
stringBuffer.append("</a>");
stringBuffer.append("</br>");
stringBuffer.append("<a href='"+domainname+"/linuxServiceManage/top10ByMem/"+ohost.getId()+"'>");
stringBuffer.append("内存使用率:");
stringBuffer.append(opsState.getMem());
stringBuffer.append("</a>");
stringBuffer.append("</br>");
stringBuffer.append("<a href='"+domainname+"/linuxServiceManage/diskDesc/"+ohost.getId()+"'>");
stringBuffer.append("硬盘使用率:");
stringBuffer.append(opsState.getDisk());
stringBuffer.append("</a>");
stringBuffer.append("</br>");
stringBuffer.append("会话连接数:");
stringBuffer.append(opsState.getSessionNumber());
for(String email:toemail)
{
MailUtil.send(sandMailAccount,email,"鱼儿乐资源预警",stringBuffer.toString(),true);
}
//短信
}
/**
* 检测服务器告警
* @param opsState
* @return
*/
private boolean chekAlarm(OpsState opsState )
{
if(opsState.getCpu()-cpu>0)
{
return true;
}
if(opsState.getMem()-mem>0)
{
return true;
}
if(opsState.getDisk()-dick>0)
{
return true;
}
if(opsState.getSessionNumber()-session_number>0)
{
return true;
}
return false;
}
class ResourcesAlarmSerivceRun extends TimerTask {
private OpsHost ohost;
ResourcesAlarmSerivceRun(OpsHost ohost)
{
this.ohost = ohost;
}
@Override
public void run() {
try {
LinuxMarginDto linuxMarginDto = linuxMonitorService.gather(ohost);
OpsState opsState = new OpsState();
opsState.setCpu(linuxMarginDto.getCpu());
opsState.setDisk(linuxMarginDto.getDisk());
opsState.setMem(linuxMarginDto.getMem());
opsState.setHost_id(ohost.getId());
opsState.setCreate_time(DateUtils.getNowTimeMilly());
opsState.setSessionNumber(linuxMarginDto.getSessionNumber());
opsStateService.insertOpsState(opsState);
if(chekAlarm(opsState))
{
if(null != email && email.size() != 0)
{
sendAlarmMessage(ohost,opsState,email.toArray(new String[email.size()]));
}
}
}catch (Exception e)
{
OpsSysLog opsSysLog = new OpsSysLog();
opsSysLog.setCreate_time(DateUtils.getNowTimeMilly());
opsSysLog.setLog_type("采集Linux服务器的运行数据");
opsSysLog.setDescribe("服务器《"+ohost.getDescribe_name()+"》,ip:"+ohost.getIp()+"运维数据采集异常");
try {
opsSysLog.setException(ExceptionUtile.geterrorinfofromexception(e));
} catch (IOException ex) {
opsSysLog.setException("geterrorinfofromexception");
}
opsSysLogService.insertOpsSysLog(opsSysLog);
}
}
}
}
... ...
package com.zhonglai.luhui.serverops.service.impl;
import java.util.List;
import com.zhonglai.luhui.datasource.enums.DataSource;
import com.zhonglai.luhui.datasource.enums.DataSourceType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zhonglai.luhui.serverops.mapper.OpsHostMapper;
import com.zhonglai.luhui.serverops.domain.OpsHost;
import com.zhonglai.luhui.serverops.service.IOpsHostService;
/**
* 主机信息表Service业务层处理
*
* @author 钟来
* @date 2023-06-07
*/
@Service
public class OpsHostServiceImpl implements IOpsHostService
{
@Autowired
private OpsHostMapper opsHostMapper;
/**
* 查询主机信息表
*
* @param id 主机信息表主键
* @return 主机信息表
*/
@DataSource(DataSourceType.SLAVE)
@Override
public OpsHost selectOpsHostById(Integer id)
{
return opsHostMapper.selectOpsHostById(id);
}
/**
* 查询主机信息表列表
*
* @param opsHost 主机信息表
* @return 主机信息表
*/
@DataSource(DataSourceType.SLAVE)
@Override
public List<OpsHost> selectOpsHostList(OpsHost opsHost)
{
return opsHostMapper.selectOpsHostList(opsHost);
}
/**
* 新增主机信息表
*
* @param opsHost 主机信息表
* @return 结果
*/
@DataSource(DataSourceType.SLAVE)
@Override
public int insertOpsHost(OpsHost opsHost)
{
return opsHostMapper.insertOpsHost(opsHost);
}
/**
* 修改主机信息表
*
* @param opsHost 主机信息表
* @return 结果
*/
@DataSource(DataSourceType.SLAVE)
@Override
public int updateOpsHost(OpsHost opsHost)
{
return opsHostMapper.updateOpsHost(opsHost);
}
/**
* 批量删除主机信息表
*
* @param ids 需要删除的主机信息表主键
* @return 结果
*/
@DataSource(DataSourceType.SLAVE)
@Override
public int deleteOpsHostByIds(Integer[] ids)
{
return opsHostMapper.deleteOpsHostByIds(ids);
}
/**
* 删除主机信息表信息
*
* @param id 主机信息表主键
* @return 结果
*/
@DataSource(DataSourceType.SLAVE)
@Override
public int deleteOpsHostById(Integer id)
{
return opsHostMapper.deleteOpsHostById(id);
}
}
... ...
package com.zhonglai.luhui.serverops.service.impl;
import java.util.List;
import com.zhonglai.luhui.datasource.enums.DataSource;
import com.zhonglai.luhui.datasource.enums.DataSourceType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zhonglai.luhui.serverops.mapper.OpsStateMapper;
import com.zhonglai.luhui.serverops.domain.OpsState;
import com.zhonglai.luhui.serverops.service.IOpsStateService;
/**
* 【请填写功能名称】Service业务层处理
*
* @author 钟来
* @date 2023-06-07
*/
@Service
public class OpsStateServiceImpl implements IOpsStateService
{
@Autowired
private OpsStateMapper opsStateMapper;
/**
* 查询【请填写功能名称】
*
* @param id 【请填写功能名称】主键
* @return 【请填写功能名称】
*/
@DataSource(DataSourceType.SLAVE)
@Override
public OpsState selectOpsStateById(Integer id)
{
return opsStateMapper.selectOpsStateById(id);
}
/**
* 查询【请填写功能名称】列表
*
* @param opsState 【请填写功能名称】
* @return 【请填写功能名称】
*/
@DataSource(DataSourceType.SLAVE)
@Override
public List<OpsState> selectOpsStateList(OpsState opsState)
{
return opsStateMapper.selectOpsStateList(opsState);
}
/**
* 新增【请填写功能名称】
*
* @param opsState 【请填写功能名称】
* @return 结果
*/
@DataSource(DataSourceType.SLAVE)
@Override
public int insertOpsState(OpsState opsState)
{
return opsStateMapper.insertOpsState(opsState);
}
/**
* 修改【请填写功能名称】
*
* @param opsState 【请填写功能名称】
* @return 结果
*/
@DataSource(DataSourceType.SLAVE)
@Override
public int updateOpsState(OpsState opsState)
{
return opsStateMapper.updateOpsState(opsState);
}
/**
* 批量删除【请填写功能名称】
*
* @param ids 需要删除的【请填写功能名称】主键
* @return 结果
*/
@DataSource(DataSourceType.SLAVE)
@Override
public int deleteOpsStateByIds(Integer[] ids)
{
return opsStateMapper.deleteOpsStateByIds(ids);
}
/**
* 删除【请填写功能名称】信息
*
* @param id 【请填写功能名称】主键
* @return 结果
*/
@DataSource(DataSourceType.SLAVE)
@Override
public int deleteOpsStateById(Integer id)
{
return opsStateMapper.deleteOpsStateById(id);
}
}
... ...
package com.zhonglai.luhui.serverops.service.impl;
import java.util.List;
import com.zhonglai.luhui.datasource.enums.DataSource;
import com.zhonglai.luhui.datasource.enums.DataSourceType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zhonglai.luhui.serverops.mapper.OpsSysLogMapper;
import com.zhonglai.luhui.serverops.domain.OpsSysLog;
import com.zhonglai.luhui.serverops.service.IOpsSysLogService;
/**
* 运行异常记录Service业务层处理
*
* @author 钟来
* @date 2023-06-07
*/
@Service
public class OpsSysLogServiceImpl implements IOpsSysLogService
{
@Autowired
private OpsSysLogMapper opsSysLogMapper;
/**
* 查询运行异常记录
*
* @param id 运行异常记录主键
* @return 运行异常记录
*/
@DataSource(DataSourceType.SLAVE)
@Override
public OpsSysLog selectOpsSysLogById(Integer id)
{
return opsSysLogMapper.selectOpsSysLogById(id);
}
/**
* 查询运行异常记录列表
*
* @param opsSysLog 运行异常记录
* @return 运行异常记录
*/
@DataSource(DataSourceType.SLAVE)
@Override
public List<OpsSysLog> selectOpsSysLogList(OpsSysLog opsSysLog)
{
return opsSysLogMapper.selectOpsSysLogList(opsSysLog);
}
/**
* 新增运行异常记录
*
* @param opsSysLog 运行异常记录
* @return 结果
*/
@DataSource(DataSourceType.SLAVE)
@Override
public int insertOpsSysLog(OpsSysLog opsSysLog)
{
return opsSysLogMapper.insertOpsSysLog(opsSysLog);
}
/**
* 修改运行异常记录
*
* @param opsSysLog 运行异常记录
* @return 结果
*/
@DataSource(DataSourceType.SLAVE)
@Override
public int updateOpsSysLog(OpsSysLog opsSysLog)
{
return opsSysLogMapper.updateOpsSysLog(opsSysLog);
}
/**
* 批量删除运行异常记录
*
* @param ids 需要删除的运行异常记录主键
* @return 结果
*/
@DataSource(DataSourceType.SLAVE)
@Override
public int deleteOpsSysLogByIds(Integer[] ids)
{
return opsSysLogMapper.deleteOpsSysLogByIds(ids);
}
/**
* 删除运行异常记录信息
*
* @param id 运行异常记录主键
* @return 结果
*/
@DataSource(DataSourceType.SLAVE)
@Override
public int deleteOpsSysLogById(Integer id)
{
return opsSysLogMapper.deleteOpsSysLogById(id);
}
}
... ...
package com.zhonglai.luhui.serverops.util;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
public class ExceptionUtile {
/**
* 转化异常信息为字符串
* @param e
* @return
* @throws IOException
*/
public static String geterrorinfofromexception(Exception e) throws IOException {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("\r\n");
stringBuffer.append(sw);
stringBuffer.append("\r\n");
sw.close();
pw.close();
return stringBuffer.toString() ;
}
}
... ...
restart.include.json=/com.alibaba.fastjson.*.jar
\ No newline at end of file
... ...
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://rm-wz9740un21f09iokuao.mysql.rds.aliyuncs.com:3306/mqtt_broker?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: luhui
password: Luhui586
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: true
url: jdbc:mysql://119.23.218.181:3306/lh-server-ops?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: luhui
password: Luhui586
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
\ No newline at end of file
... ...
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8062 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 模板引擎 thymeleaf: mode: HTML encoding: utf-8 # 禁用缓存 cache: false prefix: classpath:/static/ suffix: .html # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain,com.zhonglai.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /register,/captchaImage,/getCacheObject,/v2/api-docs domainname: 120.79.198.245:8062
\ No newline at end of file
... ...
#错误消息
not.null=* 必须填写
user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效
user.not.exists=用户不存在/密码错误
user.password.not.match=用户不存在/密码错误
user.password.retry.limit.count=密码输入错误{0}次
user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定10分钟
user.password.delete=对不起,您的账号已被删除
user.blocked=用户已封禁,请联系管理员
role.blocked=角色已封禁,请联系管理员
user.logout.success=退出成功
length.not.valid=长度必须在{min}到{max}个字符之间
user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头
user.password.not.valid=* 5-50个字符
user.email.not.valid=邮箱格式错误
user.mobile.phone.number.not.valid=手机号格式错误
user.login.success=登录成功
user.register.success=注册成功
user.notfound=请重新登录
user.forcelogout=管理员强制退出,请重新登录
user.unknown.error=未知错误,请重新登录
##文件上传消息
upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB!
upload.filename.exceed.length=上传的文件名最长{0}个字符
##权限
no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]
... ...
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhonglai.luhui.serverops.mapper.OpsHostMapper">
<resultMap type="OpsHost" id="OpsHostResult">
<result property="id" column="id" />
<result property="ip" column="ip" />
<result property="port" column="port" />
<result property="loginname" column="loginname" />
<result property="loginpass" column="loginpass" />
<result property="private_key" column="private_key" />
<result property="pass_phrase" column="pass_phrase" />
<result property="os_info" column="os_info" />
<result property="create_time" column="create_time" />
<result property="end_time" column="end_time" />
<result property="describe_name" column="describe_name" />
<result property="state" column="state" />
</resultMap>
<sql id="selectOpsHostVo">
select `id`, `ip`, `port`, `loginname`, `loginpass`, `private_key`, `pass_phrase`, `os_info`, `create_time`, `end_time`, `describe_name`,`state` from ops_host
</sql>
<select id="selectOpsHostList" parameterType="OpsHost" resultMap="OpsHostResult">
<include refid="selectOpsHostVo"/>
<where>
<if test="id != null "> and id = #{id}</if>
<if test="ip != null and ip != ''"> and ip like concat('%', #{ip}, '%')</if>
<if test="port != null "> and port = #{port}</if>
<if test="loginname != null and loginname != ''"> and loginname like concat('%', #{loginname}, '%')</if>
<if test="loginpass != null and loginpass != ''"> and loginpass like concat('%', #{loginpass}, '%')</if>
<if test="os_info != null and os_info != ''"> and os_info like concat('%', #{os_info}, '%')</if>
<if test="params.beginCreate_time != null and params.beginCreate_time != '' and params.endCreate_time != null and params.endCreate_time != ''"> and create_time between #{params.beginCreate_time} and #{params.endCreate_time}</if>
<if test="params.beginEnd_time != null and params.beginEnd_time != '' and params.endEnd_time != null and params.endEnd_time != ''"> and end_time between #{params.beginEnd_time} and #{params.endEnd_time}</if>
<if test="describe_name != null and describe_name != ''"> and describe_name like concat('%', #{describe_name}, '%')</if>
<if test="state != null "> and `state` = #{state}</if>
</where>
</select>
<select id="selectOpsHostById" parameterType="Integer" resultMap="OpsHostResult">
<include refid="selectOpsHostVo"/>
where id = #{id}
</select>
<insert id="insertOpsHost" parameterType="OpsHost" useGeneratedKeys="true" keyProperty="id">
insert into ops_host
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="ip != null and ip != ''">ip,</if>
<if test="port != null">port,</if>
<if test="loginname != null">loginname,</if>
<if test="loginpass != null">loginpass,</if>
<if test="private_key != null">private_key,</if>
<if test="pass_phrase != null">pass_phrase,</if>
<if test="os_info != null">os_info,</if>
<if test="create_time != null">create_time,</if>
<if test="end_time != null">end_time,</if>
<if test="describe_name != null">describe_name,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="ip != null and ip != ''">#{ip},</if>
<if test="port != null">#{port},</if>
<if test="loginname != null">#{loginname},</if>
<if test="loginpass != null">#{loginpass},</if>
<if test="private_key != null">#{private_key},</if>
<if test="pass_phrase != null">#{pass_phrase},</if>
<if test="os_info != null">#{os_info},</if>
<if test="create_time != null">#{create_time},</if>
<if test="end_time != null">#{end_time},</if>
<if test="describe_name != null">#{describe_name},</if>
</trim>
</insert>
<update id="updateOpsHost" parameterType="OpsHost">
update ops_host
<trim prefix="SET" suffixOverrides=",">
<if test="ip != null and ip != ''">ip = #{ip},</if>
<if test="port != null">port = #{port},</if>
<if test="loginname != null">loginname = #{loginname},</if>
<if test="loginpass != null">loginpass = #{loginpass},</if>
<if test="private_key != null">private_key = #{private_key},</if>
<if test="pass_phrase != null">pass_phrase = #{pass_phrase},</if>
<if test="os_info != null">os_info = #{os_info},</if>
<if test="create_time != null">create_time = #{create_time},</if>
<if test="end_time != null">end_time = #{end_time},</if>
<if test="describe_name != null">describe_name = #{describe_name},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteOpsHostById" parameterType="Integer">
delete from ops_host where id = #{id}
</delete>
<delete id="deleteOpsHostByIds" parameterType="String">
delete from ops_host where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhonglai.luhui.serverops.mapper.OpsStateMapper">
<resultMap type="OpsState" id="OpsStateResult">
<result property="id" column="id" />
<result property="host_id" column="host_id" />
<result property="create_time" column="create_time" />
<result property="cpu" column="cpu" />
<result property="mem" column="mem" />
<result property="sessionNumber" column="sessionNumber" />
<result property="disk" column="disk" />
</resultMap>
<sql id="selectOpsStateVo">
select `id`, `host_id`, `create_time`, `cpu`, `mem`, `sessionNumber`, `disk` from ops_state
</sql>
<select id="selectOpsStateList" parameterType="OpsState" resultMap="OpsStateResult">
<include refid="selectOpsStateVo"/>
<where>
<if test="id != null "> and id = #{id}</if>
<if test="host_id != null "> and host_id = #{host_id}</if>
<if test="params.beginCreate_time != null and params.beginCreate_time != '' and params.endCreate_time != null and params.endCreate_time != ''"> and create_time between #{params.beginCreate_time} and #{params.endCreate_time}</if>
<if test="sessionNumber != null "> and sessionNumber = #{sessionNumber}</if>
</where>
</select>
<select id="selectOpsStateById" parameterType="Integer" resultMap="OpsStateResult">
<include refid="selectOpsStateVo"/>
where id = #{id}
</select>
<insert id="insertOpsState" parameterType="OpsState" useGeneratedKeys="true" keyProperty="id">
insert into ops_state
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="host_id != null">host_id,</if>
<if test="create_time != null">create_time,</if>
<if test="cpu != null">cpu,</if>
<if test="mem != null">mem,</if>
<if test="sessionNumber != null">sessionNumber,</if>
<if test="disk != null">disk,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="host_id != null">#{host_id},</if>
<if test="create_time != null">#{create_time},</if>
<if test="cpu != null">#{cpu},</if>
<if test="mem != null">#{mem},</if>
<if test="sessionNumber != null">#{sessionNumber},</if>
<if test="disk != null">#{disk},</if>
</trim>
</insert>
<update id="updateOpsState" parameterType="OpsState">
update ops_state
<trim prefix="SET" suffixOverrides=",">
<if test="host_id != null">host_id = #{host_id},</if>
<if test="create_time != null">create_time = #{create_time},</if>
<if test="cpu != null">cpu = #{cpu},</if>
<if test="mem != null">mem = #{mem},</if>
<if test="sessionNumber != null">sessionNumber = #{sessionNumber},</if>
<if test="disk != null">disk = #{disk},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteOpsStateById" parameterType="Integer">
delete from ops_state where id = #{id}
</delete>
<delete id="deleteOpsStateByIds" parameterType="String">
delete from ops_state where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhonglai.luhui.serverops.mapper.OpsSysLogMapper">
<resultMap type="OpsSysLog" id="OpsSysLogResult">
<result property="id" column="id" />
<result property="log_type" column="log_type" />
<result property="create_time" column="create_time" />
<result property="exception" column="exception" />
<result property="describe" column="describe" />
</resultMap>
<sql id="selectOpsSysLogVo">
select `id`, `log_type`, `create_time`, `exception`, `describe` from ops_sys_log
</sql>
<select id="selectOpsSysLogList" parameterType="OpsSysLog" resultMap="OpsSysLogResult">
<include refid="selectOpsSysLogVo"/>
<where>
<if test="id != null "> and id = #{id}</if>
<if test="log_type != null and log_type != ''"> and log_type like concat('%', #{log_type}, '%')</if>
<if test="params.beginCreate_time != null and params.beginCreate_time != '' and params.endCreate_time != null and params.endCreate_time != ''"> and create_time between #{params.beginCreate_time} and #{params.endCreate_time}</if>
<if test="describe != null and describe != ''"> and `describe` like concat('%', #{describe}, '%')</if>
</where>
</select>
<select id="selectOpsSysLogById" parameterType="Integer" resultMap="OpsSysLogResult">
<include refid="selectOpsSysLogVo"/>
where id = #{id}
</select>
<insert id="insertOpsSysLog" parameterType="OpsSysLog" useGeneratedKeys="true" keyProperty="id">
insert into ops_sys_log
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="log_type != null">log_type,</if>
<if test="create_time != null">create_time,</if>
<if test="exception != null">`exception`,</if>
<if test="describe != null">`describe`,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="log_type != null">#{log_type},</if>
<if test="create_time != null">#{create_time},</if>
<if test="exception != null">#{exception},</if>
<if test="describe != null">#{describe},</if>
</trim>
</insert>
<update id="updateOpsSysLog" parameterType="OpsSysLog">
update ops_sys_log
<trim prefix="SET" suffixOverrides=",">
<if test="log_type != null">log_type = #{log_type},</if>
<if test="create_time != null">create_time = #{create_time},</if>
<if test="exception != null">`exception` = #{exception},</if>
<if test="describe != null">`describe` = #{describe},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteOpsSysLogById" parameterType="Integer">
delete from ops_sys_log where id = #{id}
</delete>
<delete id="deleteOpsSysLogByIds" parameterType="String">
delete from ops_sys_log where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局参数 -->
<settings>
<!-- 使全局的映射器启用或禁用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 允许JDBC 支持自动生成主键 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!-- 指定 MyBatis 所用日志的具体实现 -->
<setting name="logImpl" value="SLF4J" />
<!-- 使用驼峰命名法转换字段 -->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
</settings>
</configuration>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>bin</id>
<!-- 最终打包成一个用于发布的zip文件 -->
<formats>
<format>zip</format>
</formats>
<!-- Adds dependencies to zip package under lib directory -->
<dependencySets>
<dependencySet>
<!--
不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录
-->
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<fileSets>
<!-- 把项目相关的说明文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>README*</include>
<include>LICENSE*</include>
<include>NOTICE*</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,打包进zip文件的config目录 -->
<fileSet>
<directory>${project.basedir}\src\main\resources\configs</directory>
<outputDirectory>../configs</outputDirectory>
<includes>
<include>*.properties</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,提出来 -->
<fileSet>
<directory>${project.basedir}\src\main\resources</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.properties</include>
<include>*.yml</include>
</includes>
</fileSet>
<!-- 把项目的脚本文件目录( src/main/scripts )中的启动脚本文件,打包进zip文件的跟目录 -->
<fileSet>
<directory>${project.basedir}\bin</directory>
<outputDirectory></outputDirectory>
<includes>
<include>start.*</include>
<include>stop.*</include>
</includes>
</fileSet>
<!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
\ No newline at end of file
... ...
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<table>
<tr>
<td>
进程数
</td>
<td>
用户
</td>
<td>
cpu使用率
</td>
<td>
物理内存使用率
</td>
<td>
程序名称
</td>
<td>
程序路径
</td>
</tr>
<tr th:each="linuxTop:${linuxTopList}">
<td th:text="${linuxTop.getPid()}"></td>
<td th:text="${linuxTop.getUser()}"></td>
<td th:text="${linuxTop.getCpu()}"></td>
<td th:text="${linuxTop.getMem()}"></td>
<td th:text="${linuxTop.getCommand()}"></td>
<td th:text="${linuxTop.getPath()}"></td>
</tr>
</table>
</div>
</body>
</html>
\ No newline at end of file
... ...
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<table>
<tr>
<td>
大小(b)
</td>
<td>
路径
</td>
<td>
类型
</td>
</tr>
<tr th:each="duDiskDto:${duDiskDtoList}">
<td th:text="${duDiskDto.getSize()}"></td>
<td>
<a th:if="${duDiskDto.getType() == '目录'}" th:href="@{'/linuxServiceManage/diskDesc/'+${hostid}+'?path=' + ${duDiskDto.getPath()}}" th:text="${duDiskDto.getPath()}"></a>
<span th:unless="${duDiskDto.getType() == '目录'}" th:text="${duDiskDto.getPath()}"></span>
</td>
<td th:text="${duDiskDto.getType()}"></td>
</tr>
</table>
</div>
</body>
</html>
\ No newline at end of file
... ...
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>邮件</title>
</head>
<body>
<div th:utext="${html}"></div>
</body>
</html>
\ No newline at end of file
... ...
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<table>
<tr>
<td>
进程数
</td>
<td>
用户
</td>
<td>
cpu使用率
</td>
<td>
物理内存使用率
</td>
<td>
程序名称
</td>
<td>
程序路径
</td>
</tr>
<tr th:each="linuxTop:${linuxTopList}">
<td th:text="${linuxTop.getPid()}"></td>
<td th:text="${linuxTop.getUser()}"></td>
<td th:text="${linuxTop.getCpu()}"></td>
<td th:text="${linuxTop.getMem()}"></td>
<td th:text="${linuxTop.getCommand()}"></td>
<td th:text="${linuxTop.getPath()}"></td>
</tr>
</table>
</div>
</body>
</html>
\ No newline at end of file
... ...
... ... @@ -20,6 +20,8 @@
<module>lh-log</module>
<module>lh-mqtt-service</module>
<module>lh-openai</module>
<module>lh-login</module>
<module>lh-chatgpt-api</module>
</modules>
<properties>
... ...
... ... @@ -9,7 +9,6 @@
<version>1.0-SNAPSHOT</version>
<modules>
<module>lh-central-control</module>
<module>lh-chatgpt-api</module>
<module>lh-common</module>
<module>lh-common/lh-common-datasource</module>
... ... @@ -21,18 +20,17 @@
<module>lh-common/lh-quartz</module>
<module>lh-common/ruoyi-auth</module>
<module>lh-common/ruoyi-common</module>
<module>lh-common/ruoyi-common-core</module>
<module>lh-common/ruoyi-common-redis</module>
<module>lh-common/ruoyi-common-security</module>
<module>lh-common/ruoyi-framework</module>
<module>lh-common/ruoyi-generator</module>
<module>lh-common/ruoyi-system</module>
<module>lh-jar</module>
<module>lh-jar/lh-jar-action</module>
<module>lh-jar/lh-jar-chatgpt</module>
<module>lh-jar/lh-jar-rocketmq</module>
<module>lh-jar/lh-jar-sys-service</module>
<module>lh-jar/lh-jar-device-service</module>
<module>lh-modules</module>
<module>lh-modules/lh-admin</module>
... ... @@ -43,6 +41,8 @@
<module>lh-modules/lh-log</module>
<module>lh-modules/lh-mqtt-service</module>
<module>lh-modules/lh-openai</module>
<module>lh-modules/lh-chatgpt-api</module>
<module>lh-modules/lh-server-ops</module>
</modules>
<packaging>pom</packaging>
... ... @@ -90,7 +90,6 @@
<scope>import</scope>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
... ... @@ -196,6 +195,29 @@
</dependency>
<!-- 核心包 -->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-common</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 工具包 -->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 模型包 -->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-modules</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 代码生成-->
<dependency>
<groupId>com.ruoyi</groupId>
... ... @@ -216,12 +238,6 @@
<artifactId>lh-mqtt-service</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 系统模块-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-system</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 通用工具-->
<dependency>
... ... @@ -265,7 +281,6 @@
<version>${ruoyi.version}</version>
</dependency>
<!-- 公用dao趁层 -->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
... ... @@ -337,6 +352,19 @@
<version>${ruoyi.version}</version>
</dependency>
<!-- 设备控制 -->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-device-service</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-login</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 支持data -->
<dependency>
<groupId>org.projectlombok</groupId>
... ...