.gitignore
@@ -22,4 +22,6 @@ .idea/ #忽略所有.iml文件 *.iml #忽略所有日志文件 *.log apache-maven-3.6.3/LICENSE
File was deleted apache-maven-3.6.3/NOTICE
File was deleted apache-maven-3.6.3/README.txt
File was deleted apache-maven-3.6.3/bin/m2.conf
File was deleted apache-maven-3.6.3/bin/mvn
File was deleted apache-maven-3.6.3/bin/mvn.cmd
File was deleted apache-maven-3.6.3/bin/mvnDebug
File was deleted apache-maven-3.6.3/bin/mvnDebug.cmd
File was deleted apache-maven-3.6.3/bin/mvnyjp
File was deleted apache-maven-3.6.3/boot/plexus-classworlds.license
File was deleted apache-maven-3.6.3/conf/logging/simplelogger.properties
File was deleted apache-maven-3.6.3/conf/settings.xml
File was deleted apache-maven-3.6.3/conf/toolchains.xml
File was deleted apache-maven-3.6.3/lib/cdi-api.license
File was deleted apache-maven-3.6.3/lib/commons-cli.license
File was deleted apache-maven-3.6.3/lib/commons-io.license
File was deleted apache-maven-3.6.3/lib/commons-lang3.license
File was deleted apache-maven-3.6.3/lib/ext/README.txt
File was deleted apache-maven-3.6.3/lib/guava.license
File was deleted apache-maven-3.6.3/lib/guice.license
File was deleted apache-maven-3.6.3/lib/jansi-native/README.txt
File was deleted apache-maven-3.6.3/lib/jansi-native/freebsd32/libjansi.soBinary files differ
apache-maven-3.6.3/lib/jansi-native/freebsd64/libjansi.soBinary files differ
apache-maven-3.6.3/lib/jansi-native/linux32/libjansi.soBinary files differ
apache-maven-3.6.3/lib/jansi-native/linux64/libjansi.soBinary files differ
apache-maven-3.6.3/lib/jansi-native/osx/libjansi.jnilibBinary files differ
apache-maven-3.6.3/lib/jansi-native/windows32/jansi.dllBinary files differ
apache-maven-3.6.3/lib/jansi-native/windows64/jansi.dllBinary files differ
apache-maven-3.6.3/lib/jansi.license
File was deleted apache-maven-3.6.3/lib/javax.inject.license
File was deleted apache-maven-3.6.3/lib/jcl-over-slf4j.license
File was deleted apache-maven-3.6.3/lib/jsoup.license
File was deleted apache-maven-3.6.3/lib/jsr250-api.license
File was deleted apache-maven-3.6.3/lib/org.eclipse.sisu.inject.license
File was deleted apache-maven-3.6.3/lib/org.eclipse.sisu.plexus.license
File was deleted apache-maven-3.6.3/lib/plexus-cipher.license
File was deleted apache-maven-3.6.3/lib/plexus-component-annotations.license
File was deleted apache-maven-3.6.3/lib/plexus-interpolation.license
File was deleted apache-maven-3.6.3/lib/plexus-sec-dispatcher.license
File was deleted apache-maven-3.6.3/lib/plexus-utils.license
File was deleted apache-maven-3.6.3/lib/slf4j-api.license
File was deleted apache-maven-3.6.3/settings.xml
File was deleted hangzhoumesParent/common/pom.xml
@@ -48,6 +48,12 @@ </dependency> <dependency> <groupId>com.github.yulichang</groupId> <artifactId>mybatis-plus-join-boot-starter</artifactId> <version>1.4.8</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.3.1</version> hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
New file @@ -0,0 +1,11 @@ package com.mes.common.config; /** * @Author : zhoush * @Date: 2024/4/24 10:33 * @Description: */ public class Const { public static final String DEFULT_PASSWORD = "123456"; public static final Long DEFULT_ROLE = 1L; } hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Swagger2Config.java
@@ -7,13 +7,14 @@ import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.service.Parameter; import springfox.documentation.service.*; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /** @@ -46,46 +47,30 @@ .apis(RequestHandlerSelectors.basePackage("com.mes")) .paths(PathSelectors.any()) .build() .globalOperationParameters(pars); .globalOperationParameters(pars) .securitySchemes(Collections.EMPTY_LIST) .securityContexts(Arrays.asList(securityContext())); } @Bean public Docket adminApiConfig() { List<Parameter> pars = new ArrayList<>(); ParameterBuilder tokenPar = new ParameterBuilder(); tokenPar.name("adminId") .description("用户token") .defaultValue("1") .modelRef(new ModelRef("string")) .parameterType("header") .required(false) private SecurityContext securityContext() { return SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.any()) .build(); pars.add(tokenPar.build()); return new Docket(DocumentationType.SWAGGER_2) .groupName("adminApi") .apiInfo(adminApiInfo()) .select() //只显示admin路径下的页面 .apis(RequestHandlerSelectors.basePackage("com.mes")) .paths(PathSelectors.any()) .build() .globalOperationParameters(pars); } private List<SecurityReference> defaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; return Arrays.asList(new SecurityReference("Authorization", authorizationScopes)); } private ApiInfo webApiInfo() { return new ApiInfoBuilder() .title("网站-API文档") .description("本文档描述了mes网站微服务接口定义") .version("1.0") .contact(new Contact("zhan_py", "", "")) .build(); } private ApiInfo adminApiInfo() { return new ApiInfoBuilder() .title("后台管理系统-API文档") .description("本文档描述了mes后台系统服务接口定义") .version("1.0") .contact(new Contact("zhan_py", "", "")) .build(); hangzhoumesParent/common/servicebase/src/main/java/com/mes/entity/request/GeneralRequest.java
New file @@ -0,0 +1,17 @@ package com.mes.entity.request; import cn.hutool.db.Page; import lombok.Data; /** * @Author : zhoush * @Date: 2024/4/22 11:21 * @Description: */ @Data public class GeneralRequest { private String key; private Page page; } hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/S7control.java
@@ -273,21 +273,18 @@ return result; } //读取字符串 public String readString(String address) { if (s7PLC == null) { return null; } try { byte[] bytes = s7PLC.readByte(address, 14); if (bytes != null) { return new String(bytes, StandardCharsets.UTF_8); } return s7PLC.readString(address); } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); return null; } return null; } @@ -346,6 +343,21 @@ return data; } //读取单个word public Short readWord(String address) { if (s7PLC == null) { return null; } try { // 单个地址 return s7PLC.readInt16(address); } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); } return -1; } //读取时间 public Long readtime(String address) { if (s7PLC == null) { hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java
@@ -2,23 +2,40 @@ import com.mes.common.filter.JwtAuthenticationTokenFilter; import com.mes.common.handler.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; 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.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration //@EnableWebSecurity @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class TokenWebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; @Autowired LoginFailureHandler loginFailureHandler; @Autowired LoginSuccessHandler loginSuccessHandler; @Autowired JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; @Autowired JwtAccessDeniedHandler jwtAccessDeniedHandler; @Autowired JwtLogoutSuccessHandler jwtLogoutSuccessHandler; @Bean public PasswordEncoder passwordEncoder() { @@ -30,19 +47,42 @@ */ @Override protected void configure(HttpSecurity http) throws Exception { http //关闭csrf .csrf().disable() //不通过Session获取SecurityContext .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) http.cors().and().csrf().disable() // 登录配置 .formLogin() .successHandler(loginSuccessHandler) .failureHandler(loginFailureHandler) .and() .logout() .logoutSuccessHandler(jwtLogoutSuccessHandler) // 禁用session .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 配置拦截规则 .and() .authorizeRequests() // 对于登录接口 允许匿名访问 .antMatchers("/userinfo/login").anonymous() .antMatchers("/hello").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().permitAll(); // http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); .antMatchers("/sys/user/login").anonymous() .antMatchers("/swagger-ui.html").permitAll() .antMatchers("/webjars/**").permitAll() .antMatchers("/v2/**").permitAll() .antMatchers("/swagger-resources/**").permitAll() .anyRequest().authenticated() // 异常处理器 .and() .exceptionHandling() .authenticationEntryPoint(jwtAuthenticationEntryPoint) .accessDeniedHandler(jwtAccessDeniedHandler) // 配置自定义的过滤器 .and() .addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); } @Bean hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java
@@ -2,8 +2,9 @@ import com.mes.common.utils.JwtUtil; import com.mes.common.utils.RedisUtil; import com.mes.menu.mapper.SysMenuMapper; import com.mes.common.utils.UserInfoUtils; import com.mes.userinfo.entity.LoginUser; import com.mes.userinfo.service.SysUserService; import io.jsonwebtoken.Claims; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -36,7 +37,7 @@ private RedisUtil redisUtil; @Resource private SysMenuMapper menuMapper; private SysUserService sysUserService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { @@ -60,10 +61,13 @@ String redisKey = "login:" + userid; LoginUser loginUser = redisUtil.getCacheObject(redisKey); if (Objects.isNull(loginUser)) { response.setHeader("token", ""); throw new RuntimeException("用户未登录"); } //将用户信息放入当前线程 UserInfoUtils.set(loginUser.getUser()); //存入SecurityContextHolder,以供后面的过滤器使用 List<String> permissionKeyList = menuMapper.selectPermsByUserId(Long.parseLong(userid)); List<String> permissionKeyList = sysUserService.getUserAuthorityInfo(Long.parseLong(userid)); List<GrantedAuthority> authorities = permissionKeyList.stream(). map(SimpleGrantedAuthority::new) .collect(Collectors.toList()); hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/AccessDeniedHandlerImpl.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/AuthenticationEntryPointImpl.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java
New file @@ -0,0 +1,35 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.utils.Result; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class JwtAccessDeniedHandler implements AccessDeniedHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); response.setStatus(HttpServletResponse.SC_FORBIDDEN); ServletOutputStream outputStream = response.getOutputStream(); Result result = Result.error(HttpStatus.FORBIDDEN.value(), "权限不足"); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java
New file @@ -0,0 +1,33 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.utils.Result; import org.springframework.http.HttpStatus; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); ServletOutputStream outputStream = response.getOutputStream(); Result result = Result.error(HttpStatus.UNAUTHORIZED.value(), "认证失败请重新登录"); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java
New file @@ -0,0 +1,40 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.utils.Result; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class JwtLogoutSuccessHandler implements LogoutSuccessHandler { private static final String header = "Authorization"; @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { if (authentication != null) { new SecurityContextLogoutHandler().logout(request, response, authentication); } response.setContentType("application/json;charset=UTF-8"); ServletOutputStream outputStream = response.getOutputStream(); response.setHeader(header, ""); Result result = Result.success(""); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java
New file @@ -0,0 +1,31 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.utils.Result; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class LoginFailureHandler implements AuthenticationFailureHandler { @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); ServletOutputStream outputStream = response.getOutputStream(); Result result = Result.error("用户名或密码错误"); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java
New file @@ -0,0 +1,38 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.common.utils.JwtUtil; import com.mes.utils.Result; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class LoginSuccessHandler implements AuthenticationSuccessHandler { private static final String header = "Authorization"; @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); ServletOutputStream outputStream = response.getOutputStream(); // 生成jwt,并放置到请求头中 String jwt = JwtUtil.generateToken(authentication.getName()); response.setHeader(header, jwt); Result result = Result.success(""); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/RedisUtil.java
@@ -217,4 +217,19 @@ public Collection<String> keys(final String pattern) { return redisTemplate.keys(pattern); } /** * 判断key是否存在 * * @param key 键 * @return true 存在 false不存在 */ public boolean hasKey(String key) { try { return redisTemplate.hasKey(key); } catch (Exception e) { e.printStackTrace(); return false; } } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java
New file @@ -0,0 +1,26 @@ package com.mes.common.utils; import com.mes.userinfo.entity.SysUser; /** * @Author : zhoush * @Date: 2024/4/25 15:41 * @Description: */ public class UserInfoUtils { private static InheritableThreadLocal<SysUser> tokenPool = new InheritableThreadLocal<SysUser>(); public static SysUser get() { return tokenPool.get(); } public static void set(SysUser user) { tokenPool.set(user); } public static void remove() { if (get() != null) { tokenPool.remove(); } } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/config/TokenWebSecurityConfig.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/entity/SecurityUser.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/entity/User.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/filter/TokenAuthFilter.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/filter/TokenLoginFilter.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java
@@ -1,38 +1,76 @@ package com.mes.menu.controller; import com.mes.entity.request.GeneralRequest; import com.mes.menu.entity.SysMenu; import com.mes.menu.service.SysMenuService; import com.mes.utils.Result; import io.swagger.annotations.ApiModel; 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.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * <p> * 菜单表 * </p> * * @author zhoush * @since 2024-04-11 */ @ApiModel("获取菜单信息") @Api(description = "菜单管理") @RestController @RequestMapping("/menu/sysMenu") @RequestMapping("/sys/menu") public class SysMenuController { @Autowired SysMenuService sysMenuService; private SysMenuService sysMenuService; @ApiOperation("新增菜单") @PostMapping("/save") // @PreAuthorize("hasAuthority('sys:menu:save')") public Result save(@Validated @RequestBody SysMenu sysMenu) { return Result.success(sysMenuService.save(sysMenu)); } @ApiOperation("修改菜单信息") @PostMapping("/updateMenu") // @PreAuthorize("hasAuthority('sys:menu:update')") public Result updateMenu(@Validated @RequestBody SysMenu sysMenu) { sysMenuService.updateMenu(sysMenu); return Result.success(sysMenu); } @ApiOperation("获取用户有权限的所有菜单") @GetMapping("/list") public Result<List<SysMenu>> getMenuTree() { return Result.success(sysMenuService.getMenuTree()); @GetMapping("/getMenuTree") public Result<List<SysMenu>> getMenuTree(GeneralRequest request) { return Result.success(sysMenuService.getMenuTree(request)); } @ApiOperation("获取用户的权限") @GetMapping("/getAuthorityInfo") public Result<List<String>> getAuthorityInfo() { return Result.success(sysMenuService.getAuthorityInfo()); } @ApiOperation("用户当前用户的菜单和权限信息") @GetMapping("/nav") public Result<Map<Object, Object>> nav() { return Result.success(sysMenuService.nav()); } @ApiOperation("删除菜单") @PostMapping("/deleteMenu") // @PreAuthorize("hasAuthority('sys:menu:delete')") public Result<String> deleteMenu(Long menuId) { return Result.success(sysMenuService.deleteMenu(menuId)); } @ApiOperation("批量删除菜单") @PostMapping("/batchDeleteMenu") // @PreAuthorize("hasAuthority('sys:menu:delete')") public Result<String> batchDeleteMenu(@RequestBody List<Long> menuIds) { return Result.success(sysMenuService.batchDeleteMenu(menuIds)); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java
@@ -30,12 +30,12 @@ * 自增id */ @TableId(value = "id", type = IdType.AUTO) private Integer id; private Long id; /** * 父id */ private Integer parentId; private Long parentId; /** * 模块名称 @@ -73,6 +73,11 @@ private Date createTime; /** * 权限 */ private String perms; /** * 子菜单 */ @TableField(exist = false) hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java
@@ -1,6 +1,6 @@ package com.mes.menu.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.yulichang.base.MPJBaseMapper; import com.mes.menu.entity.SysMenu; import org.apache.ibatis.annotations.Mapper; @@ -15,7 +15,7 @@ * @since 2024-04-11 */ @Mapper public interface SysMenuMapper extends BaseMapper<SysMenu> { public interface SysMenuMapper extends MPJBaseMapper<SysMenu> { List<String> selectPermsByUserId(long parseLong); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java
@@ -1,9 +1,11 @@ package com.mes.menu.service; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.entity.request.GeneralRequest; import com.mes.menu.entity.SysMenu; import java.util.List; import java.util.Map; /** * <p> @@ -15,5 +17,50 @@ */ public interface SysMenuService extends IService<SysMenu> { List<SysMenu> getMenuTree(); /** * 更新菜单信息 * * @param menu * @return */ SysMenu updateMenu(SysMenu menu); /** * 获取用户有权限的菜单树 * * @return */ List<SysMenu> getMenuTree(GeneralRequest request); /** * 获取用户的权限 * * @return */ List<String> getAuthorityInfo(); /** * 获取用户菜单及权限信息 * * @return */ Map<Object, Object> nav(); /** * 删除菜单信息 * * @param menuId * @return */ String deleteMenu(Long menuId); /** * 批量删除菜单信息 * * @param menuIds * @return */ String batchDeleteMenu(List<Long> menuIds); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java
@@ -1,14 +1,28 @@ package com.mes.menu.service.impl; import cn.hutool.core.map.MapUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.mes.common.utils.UserInfoUtils; import com.mes.entity.request.GeneralRequest; import com.mes.menu.entity.SysMenu; import com.mes.menu.mapper.SysMenuMapper; import com.mes.menu.service.SysMenuService; import com.mes.role.entity.SysRoleMenu; import com.mes.role.service.SysRoleMenuService; import com.mes.userinfo.entity.SysUser; import com.mes.userinfo.entity.SysUserRole; import com.mes.userinfo.mapper.SysUserRoleMapper; import com.mes.userinfo.service.SysUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** @@ -23,10 +37,78 @@ @Slf4j public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService { @Autowired SysUserService sysUserService; @Autowired SysUserRoleMapper sysUserRoleMapper; @Autowired SysRoleMenuService sysRoleMenuService; @Override public List<SysMenu> getMenuTree() { List<SysMenu> menuList = this.baseMapper.selectList(null); public SysMenu updateMenu(SysMenu menu) { baseMapper.updateById(menu); // 清除所有与该菜单相关的权限缓存 sysUserService.clearUserAuthorityInfoByMenuId(menu.getId()); return menu; } @Override public List<SysMenu> getMenuTree(GeneralRequest request) { //todo:需要先获取用户的角色,角色下的菜单权限,拿到菜单id获取所有菜单 SysUser user = UserInfoUtils.get(); MPJLambdaWrapper<SysUserRole> wrapper = new MPJLambdaWrapper<>(); wrapper.selectAll(SysMenu.class).distinct() .leftJoin(SysUser.class, SysUser::getId, SysUserRole::getUserId) .leftJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysUserRole::getRoleId) .leftJoin(SysMenu.class, SysMenu::getId, SysRoleMenu::getMenuId) .eq(SysUser::getId, user.getId()) .like(StringUtils.isNotBlank(request.getKey()), SysMenu::getMenuName, request.getKey()); List<SysMenu> menuList = sysUserRoleMapper.selectJoinList(SysMenu.class, wrapper); return create(menuList); } @Override public List<String> getAuthorityInfo() { SysUser user = UserInfoUtils.get(); log.info("获取用户信息,用户名为{}", user); // 获取权限信息 // ROLE_admin,ROLE_normal,sys:user:list,.... return sysUserService.getUserAuthorityInfo(user.getId()); } @Override public Map<Object, Object> nav() { List<SysMenu> menuTree = getMenuTree(new GeneralRequest()); List<String> authorityInfo = getAuthorityInfo(); return MapUtil.builder().put("authoritys", authorityInfo) .put("tree", menuTree).map(); } @Override public String deleteMenu(Long menuId) { int count = this.count(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getParentId, menuId)); if (count > 0) { return "无法删除,请先删除子菜单"; } // 清除所有与该菜单相关的权限缓存 sysUserService.clearUserAuthorityInfoByMenuId(menuId); this.removeById(menuId); // 同步删除中间关联表 sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getMenuId, menuId)); return "删除成功"; } @Override public String batchDeleteMenu(List<Long> menuIds) { menuIds.stream().forEach(e -> deleteMenu(e)); return "批量删除成功"; } @@ -56,10 +138,7 @@ private List<SysMenu> getChildren(SysMenu menu, List<SysMenu> menus) { List<SysMenu> res = menus.stream() .filter(item -> item.getParentId().equals(menu.getId())) .map(item -> { item.setChildren(getChildren(item, menus)); return item; }).collect(Collectors.toList()); .collect(Collectors.toList()); log.info("菜单树:{}", JSONUtil.toJsonStr(res)); return res; } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java
@@ -1,20 +1,63 @@ package com.mes.role.controller; import com.mes.entity.request.GeneralRequest; import com.mes.role.entity.SysRole; import com.mes.role.entity.vo.SysRoleVO; import com.mes.role.service.SysRoleService; import com.mes.utils.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; 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; import java.util.List; /** * <p> * 角色表 前端控制器 * </p> * * @author zhoush * @since 2024-04-11 */ @Api(description = "角色管理") @RestController @RequestMapping("/role/sys-role") @RequestMapping("/sys/role") public class SysRoleController { } @Autowired private SysRoleService sysRoleService; @ApiOperation("新增角色及角色下的权限信息") @PostMapping("/saveRole") // @PreAuthorize("hasAuthority('sys:role:save')") public Result<SysRole> saveRole(@Validated @RequestBody SysRoleVO sysRoleVO) { return Result.success(sysRoleService.saveRole(sysRoleVO)); } @ApiOperation("编辑角色及角色下的权限信息") @PostMapping("/updateRole") // @PreAuthorize("hasAuthority('sys:role:save')") public Result<String> updateRole(@Validated @RequestBody SysRoleVO sysRoleVO) { return Result.success(sysRoleService.updateRole(sysRoleVO)); } @ApiOperation("查询角色及角色下的权限信息") @PostMapping("/queryRole") // @PreAuthorize("hasAuthority('sys:role:save')") public Result<List<SysRoleVO>> queryRole(@Validated @RequestBody GeneralRequest request) { return Result.success(sysRoleService.queryRole(request)); } @ApiOperation("删除角色及角色下的权限信息") @PostMapping("/delete") // @PreAuthorize("hasAuthority('sys:role:delete')") @Transactional public Result<String> deleteRole(@RequestBody List<Long> ids) { return Result.success(sysRoleService.deleteRole(ids)); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleMenuController.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java
@@ -24,7 +24,7 @@ /** * 角色ID */ @TableId(value = "role_id", type = IdType.AUTO) @TableId(type = IdType.NONE) private Long roleId; /** hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java
New file @@ -0,0 +1,44 @@ package com.mes.role.entity.vo; import com.mes.menu.entity.SysMenu; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * @Author : zhoush * @Date: 2024/4/26 13:57 * @Description: */ @Api(description = "角色信息") @Data public class SysRoleVO implements Serializable { @ApiModelProperty(hidden = true) private static final long serialVersionUID = 1L; @ApiModelProperty(value = "角色ID", position = 2) private Long id; @ApiModelProperty(value = "角色名称", position = 3) private String name; @ApiModelProperty(value = "角色权限字符串", position = 4) private String roleKey; @ApiModelProperty(value = "角色状态(0正常 1停用)", position = 5) private String status; @ApiModelProperty(value = "删除标志", position = 6) private Integer delFlag; @ApiModelProperty(value = "备注", position = 7) private String remark; @ApiModelProperty(value = "角色菜单信息", position = 8) private List<SysMenu> menuList; } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java
@@ -1,6 +1,6 @@ package com.mes.role.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.yulichang.base.MPJBaseMapper; import com.mes.role.entity.SysRole; import org.apache.ibatis.annotations.Mapper; @@ -13,6 +13,6 @@ * @since 2024-04-11 */ @Mapper public interface SysRoleMapper extends BaseMapper<SysRole> { public interface SysRoleMapper extends MPJBaseMapper<SysRole> { } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java
@@ -1,7 +1,11 @@ package com.mes.role.service; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.entity.request.GeneralRequest; import com.mes.role.entity.SysRole; import com.mes.role.entity.vo.SysRoleVO; import java.util.List; /** * <p> @@ -13,4 +17,35 @@ */ public interface SysRoleService extends IService<SysRole> { /** * 创建角色信息 * * @param sysRoleVO * @return */ SysRole saveRole(SysRoleVO sysRoleVO); /** * 修改角色信息及权限 * * @param sysRoleVO * @return */ String updateRole(SysRoleVO sysRoleVO); /** * 按照角色名查询角色信息 * * @param request * @return */ List<SysRoleVO> queryRole(GeneralRequest request); /** * 查询角色及角色下的权限信息 * * @param ids * @return */ String deleteRole(List<Long> ids); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java
@@ -1,10 +1,28 @@ package com.mes.role.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.mes.entity.request.GeneralRequest; import com.mes.menu.entity.SysMenu; import com.mes.role.entity.SysRole; import com.mes.role.entity.SysRoleMenu; import com.mes.role.entity.vo.SysRoleVO; import com.mes.role.mapper.SysRoleMapper; import com.mes.role.service.SysRoleMenuService; import com.mes.role.service.SysRoleService; import com.mes.userinfo.entity.SysUserRole; import com.mes.userinfo.service.SysUserRoleService; import com.mes.userinfo.service.SysUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.List; import java.util.stream.Collectors; /** * <p> @@ -15,6 +33,91 @@ * @since 2024-04-11 */ @Service @Slf4j public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService { @Autowired SysRoleMenuService sysRoleMenuService; @Autowired SysUserService sysUserService; @Autowired SysUserRoleService sysUserRoleService; @Override @Transactional(rollbackFor = Exception.class) public SysRole saveRole(SysRoleVO sysRoleVO) { log.info("保存角色信息,生成对应的角色id"); SysRole sysRole = new SysRole(); BeanUtils.copyProperties(sysRoleVO, sysRole); this.save(sysRole); //保存角色权限信息 saveRoleMenu(sysRole.getId(), sysRoleVO.getMenuList()); return sysRole; } @Override @Transactional(rollbackFor = Exception.class) public String updateRole(SysRoleVO sysRoleVO) { log.info("保存角色信息,生成对应的角色id"); SysRole sysRole = new SysRole(); BeanUtils.copyProperties(sysRoleVO, sysRole); this.updateById(sysRole); //保存角色权限信息 return saveRoleMenu(sysRole.getId(), sysRoleVO.getMenuList()); } @Override public List<SysRoleVO> queryRole(GeneralRequest request) { MPJLambdaWrapper<SysRole> wrapper = new MPJLambdaWrapper<>(); wrapper.selectAll(SysRole.class) .selectCollection(SysMenu.class, SysRoleVO::getMenuList) .leftJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysRole::getId) .leftJoin(SysMenu.class, SysMenu::getId, SysRoleMenu::getMenuId) .like(StringUtils.hasText(request.getKey()), SysRole::getName, request.getKey()); return baseMapper.selectJoinList(SysRoleVO.class, wrapper); } @Override @Transactional(rollbackFor = Exception.class) public String deleteRole(List<Long> ids) { log.info("删除角色信息"); this.removeByIds(ids); log.info("删除中间表信息"); sysUserRoleService.remove(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getRoleId, ids)); sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().in(SysRoleMenu::getRoleId, ids)); log.info("清空缓存中的权限信息"); ids.stream().forEach(id -> sysUserService.clearUserAuthorityInfoByRoleId(id)); return "success"; } /** * 保存角色权限信息 * * @param roleId * @param menuList * @return */ private String saveRoleMenu(Long roleId, List<SysMenu> menuList) { log.info("配置角色菜单关心"); List<SysRoleMenu> roleMenuList = menuList.stream().map(menu -> { SysRoleMenu roleMenu = new SysRoleMenu(); roleMenu.setRoleId(roleId); roleMenu.setMenuId(menu.getId()); return roleMenu; }).collect(Collectors.toList()); log.info("清空角色权限表中该角色信息"); // 先删除原来的记录,再保存新的 sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, roleId)); sysRoleMenuService.saveBatch(roleMenuList); // 删除缓存 sysUserService.clearUserAuthorityInfoByRoleId(roleId); return "success"; } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/security/DefaultPasswordEncoder.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/security/TokenLogoutHandler.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/security/TokenManager.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/security/UnauthEntryPoint.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/controller/SysUserController.java
@@ -1,11 +1,23 @@ package com.mes.userinfo.controller; import com.mes.entity.request.GeneralRequest; import com.mes.userinfo.entity.SysUser; import com.mes.userinfo.entity.vo.SysUserVO; import com.mes.userinfo.service.SysUserService; import com.mes.utils.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; 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; import java.util.List; import java.util.Map; /** * <p> @@ -15,21 +27,64 @@ * @author zhoush * @since 2024-04-11 */ @Api(description = "用户管理") @RestController @RequestMapping("/userinfo") @RequestMapping("/sys/user") public class SysUserController { @Autowired private SysUserService sysUserService; @ApiOperation("用户登录") @PostMapping("/login") public Result login(@RequestBody SysUser user) { return sysUserService.login(user); public Result<Map<String, String>> login(@RequestBody SysUser user) { return Result.success(sysUserService.login(user)); } @GetMapping("/hello") public Result hello() { return Result.success("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJlZjMyMjQ4NDcyODE0ZWFlYWRlOTBkYmZjYWFlZmNmZSIsInN1YiI6IjEiLCJpc3MiOiJzZyIsImlhdCI6MTcxMjkwMjI0NCwiZXhwIjoxNzEyOTA1ODQ0fQ.DlJkhkiwjZSqprdLzKaTB3yuyxGukerKeF0FbJK_6HY"); @ApiOperation("退出登录") @PostMapping("/logout") // @PreAuthorize("hasRole('ROLE_admin')") @PreAuthorize("hasAuthority('xt:yh')") public Result<String> logout() { return Result.success(sysUserService.logout()); } @ApiOperation("新增用户信息") @PostMapping("/saveUser") // @PreAuthorize("hasAuthority('sys:user:save')") public Result<String> saveUser(@Validated @RequestBody SysUserVO sysUser) { return Result.success(sysUserService.saveUser(sysUser)); } @ApiOperation("更新用户信息") @PostMapping("/updateUser") // @PreAuthorize("hasAuthority('sys:user:update')") public Result<SysUserVO> updateUser(@Validated @RequestBody SysUserVO sysUser) { return Result.success(sysUserService.updateUser(sysUser)); } @ApiOperation("重置密码") @PostMapping("/resetPassword") // @PreAuthorize("hasAuthority('sys:user:resetPassword')") public Result resetPassword(String userId) { return Result.success(sysUserService.resetPassword(Long.parseLong(userId))); } @ApiOperation("获取用户列表") @PostMapping("/listByUserName") // @PreAuthorize("hasAuthority('sys:user:list')") public Result<List<SysUserVO>> listByUserName(@RequestBody GeneralRequest request) { return Result.success(sysUserService.listByUserName(request)); } @ApiOperation("删除用户信息") @PostMapping("/deleteUser") // @PreAuthorize("hasAuthority('sys:user:delete')") public Result<String> deleteUser(@RequestBody List<Long> ids) { return Result.success(sysUserService.deleteUser(ids)); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/controller/SysUserRoleController.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUserRole.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -17,6 +18,7 @@ */ @Data @EqualsAndHashCode(callSuper = false) @AllArgsConstructor public class SysUserRole implements Serializable { private static final long serialVersionUID = 1L; @@ -24,7 +26,7 @@ /** * 用户id */ @TableId(value = "user_id", type = IdType.AUTO) @TableId(type = IdType.NONE) private Long userId; /** hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/vo/SysUserVO.java
New file @@ -0,0 +1,63 @@ package com.mes.userinfo.entity.vo; import com.mes.role.entity.SysRole; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * <p> * 用户表 * </p> * * @author zhoush * @since 2024-04-11 */ @Api(description = "用户信息") @Data public class SysUserVO implements Serializable { @ApiModelProperty(hidden = true) private static final long serialVersionUID = 1L; /** * 主键 */ @ApiModelProperty(value = "主键", position = 2) private Long id; /** * 用户名 */ @ApiModelProperty(value = "用户名", position = 3) private String userName; /** * 昵称 */ @ApiModelProperty(value = "昵称", position = 4) private String nickName; /** * 密码 */ @ApiModelProperty(value = "密码", position = 5) private String password; /** * 头像 */ @ApiModelProperty(value = "头像", position = 6) private String avatar; /** * 用户的角色信息 */ @ApiModelProperty(value = "用户的角色信息", position = 7) private List<SysRole> roleList; } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserMapper.java
@@ -1,6 +1,6 @@ package com.mes.userinfo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.yulichang.base.MPJBaseMapper; import com.mes.userinfo.entity.SysUser; import org.apache.ibatis.annotations.Mapper; @@ -13,6 +13,6 @@ * @since 2024-04-11 */ @Mapper public interface SysUserMapper extends BaseMapper<SysUser> { public interface SysUserMapper extends MPJBaseMapper<SysUser> { } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserRoleMapper.java
@@ -1,6 +1,6 @@ package com.mes.userinfo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.yulichang.base.MPJBaseMapper; import com.mes.userinfo.entity.SysUserRole; import org.apache.ibatis.annotations.Mapper; @@ -13,6 +13,6 @@ * @since 2024-04-11 */ @Mapper public interface SysUserRoleMapper extends BaseMapper<SysUserRole> { public interface SysUserRoleMapper extends MPJBaseMapper<SysUserRole> { } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserRoleService.java
@@ -1,6 +1,6 @@ package com.mes.userinfo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.github.yulichang.base.MPJBaseService; import com.mes.userinfo.entity.SysUserRole; /** @@ -11,6 +11,7 @@ * @author zhoush * @since 2024-04-11 */ public interface SysUserRoleService extends IService<SysUserRole> { public interface SysUserRoleService extends MPJBaseService<SysUserRole> { } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserService.java
@@ -1,8 +1,12 @@ package com.mes.userinfo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.entity.request.GeneralRequest; import com.mes.userinfo.entity.SysUser; import com.mes.utils.Result; import com.mes.userinfo.entity.vo.SysUserVO; import java.util.List; import java.util.Map; /** * <p> @@ -14,7 +18,93 @@ */ public interface SysUserService extends IService<SysUser> { Result login(SysUser user); /** * 用户登录 * * @param user * @return */ Map<String, String> login(SysUser user); Result logout(); /** * 退出登录 * * @return */ String logout(); /** * 新增用户信息 * * @param user * @return */ String saveUser(SysUserVO user); /** * 更新用户信息 * * @param sysUser * @return */ SysUserVO updateUser(SysUserVO sysUser); /** * 重置密码 * * @param userId * @return */ String resetPassword(Long userId); /** * 按名称获取用户信息 * * @param userName * @return */ SysUser queryByUserName(String userName); /** * 按关键字获取用户信息列表 * * @param request * @return */ List<SysUserVO> listByUserName(GeneralRequest request); /** * 删除用户信息 * * @param ids * @return */ String deleteUser(List<Long> ids); /** * 获取用户角色权限信息 * * @param userId * @return */ List<String> getUserAuthorityInfo(Long userId); /** * 清空用户权限信息通过用户信息 */ void clearUserAuthorityInfo(String userName); /** * 清空用户权限信息通过角色id * * @param roleId */ void clearUserAuthorityInfoByRoleId(Long roleId); /** * 清空用户权限信息通过菜单id * * @param menuId */ void clearUserAuthorityInfoByMenuId(Long menuId); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java
@@ -1,29 +1,46 @@ package com.mes.userinfo.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.mes.common.config.Const; import com.mes.common.utils.JwtUtil; import com.mes.common.utils.RedisUtil; import com.mes.common.utils.UserInfoUtils; import com.mes.entity.request.GeneralRequest; import com.mes.menu.mapper.SysMenuMapper; import com.mes.role.entity.SysRole; import com.mes.role.entity.SysRoleMenu; import com.mes.role.service.SysRoleService; import com.mes.userinfo.entity.LoginUser; import com.mes.userinfo.entity.SysUser; import com.mes.userinfo.entity.SysUserRole; import com.mes.userinfo.entity.vo.SysUserVO; import com.mes.userinfo.mapper.SysUserMapper; import com.mes.userinfo.service.SysUserRoleService; import com.mes.userinfo.service.SysUserService; import com.mes.utils.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** * <p> @@ -34,18 +51,29 @@ * @since 2024-04-11 */ @Service @Slf4j public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService, UserDetailsService { @Autowired private AuthenticationManager authenticationManager; @Autowired private RedisUtil redisUtil; @Resource private SysMenuMapper sysMenuMapper; @Resource private SysUserRoleService sysUserRoleService; @Resource private SysRoleService sysRoleService; @Resource BCryptPasswordEncoder passwordEncoder; @Override public Result login(SysUser user) { public Map<String, String> login(SysUser user) { UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserName(), user.getPassword()); Authentication authenticate = authenticationManager.authenticate(authenticationToken); if (Objects.isNull(authenticate)) { @@ -55,23 +83,157 @@ LoginUser loginUser = (LoginUser) authenticate.getPrincipal(); String userId = loginUser.getUser().getId().toString(); String jwt = JwtUtil.generateToken(userId); //查询权限信息 // List<String> perms = sysMenuMapper.selectPermsByUserId(userId); //authenticate存入redis redisUtil.setCacheObject("login:" + userId, loginUser); //把token响应给前端 HashMap<String, String> map = new HashMap<>(); map.put("token", jwt); return Result.success(map); return map; } @Override public Result logout() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); LoginUser loginUser = (LoginUser) authentication.getPrincipal(); Long userid = loginUser.getUser().getId(); redisUtil.deleteObject("login:" + userid); return Result.success("退出成功"); public String logout() { log.info("用户退出"); SysUser user = UserInfoUtils.get(); redisUtil.deleteObject("login:" + user.getId()); return "注销成功"; } @Transactional @Override public String saveUser(SysUserVO user) { log.info("保存用户信息"); // 默认密码 String password = passwordEncoder.encode(Const.DEFULT_PASSWORD); user.setPassword(password); SysUser sysUser = new SysUser(); BeanUtils.copyProperties(user, sysUser); this.save(sysUser); saveUserRole(user.getRoleList(), sysUser.getId()); return "success"; } @Transactional @Override public SysUserVO updateUser(SysUserVO user) { log.info("更新用户信息"); SysUser sysUser = new SysUser(); BeanUtils.copyProperties(user, sysUser); this.updateById(sysUser); log.info("删除用户角色信息"); List<Long> roleIds = user.getRoleList().stream().map(SysRole::getId).collect(Collectors.toList()); sysUserRoleService.remove(new LambdaQueryWrapper<SysUserRole>() .eq(SysUserRole::getUserId, sysUser.getId()).in(CollectionUtil.isNotEmpty(roleIds), SysUserRole::getRoleId, roleIds)); log.info("保存用户角色信息"); saveUserRole(user.getRoleList(), sysUser.getId()); return user; } @Override public String resetPassword(Long userId) { log.info("重置密码为{}", Const.DEFULT_PASSWORD); SysUser sysUser = new SysUser(); sysUser.setId(userId); String password = passwordEncoder.encode(Const.DEFULT_PASSWORD); sysUser.setPassword(password); this.updateById(sysUser); return "success"; } @Override public SysUser queryByUserName(String userName) { return baseMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, userName)); } @Override public List<SysUserVO> listByUserName(GeneralRequest request) { MPJLambdaWrapper<SysUser> wrapper = new MPJLambdaWrapper<>(); wrapper.selectAll(SysUser.class) .selectCollection(SysRole.class, SysUserVO::getRoleList) .leftJoin(SysUserRole.class, SysUserRole::getUserId, SysUser::getId) .leftJoin(SysRole.class, SysRole::getId, SysUserRole::getRoleId) .like(StringUtils.hasText(request.getKey()), SysUser::getUserName, request.getKey()); return baseMapper.selectJoinList(SysUserVO.class, wrapper); } @Transactional @Override public String deleteUser(List<Long> ids) { this.removeByIds(ids); sysUserRoleService.remove(new QueryWrapper<SysUserRole>().in("user_id", ids)); return "success"; } @Override public List<String> getUserAuthorityInfo(Long userId) { SysUser sysUser = baseMapper.selectById(userId); // ROLE_admin,ROLE_normal,sys:user:list,.... String authority = ""; if (redisUtil.hasKey("GrantedAuthority:" + sysUser.getUserName())) { authority = redisUtil.getCacheObject("GrantedAuthority:" + sysUser.getUserName()); } else { // 获取角色编码 List<SysRole> roles = sysRoleService.list(new QueryWrapper<SysRole>() .inSql("id", "select role_id from sys_user_role where user_id = " + userId)); if (roles.size() > 0) { String roleCodes = roles.stream().map(r -> "ROLE_" + r.getRoleKey()).collect(Collectors.joining(",")); authority = roleCodes.concat(","); } // 获取菜单操作编码 List<String> perms = sysMenuMapper.selectPermsByUserId(userId); if (perms.size() > 0) { String menuPerms = String.join(",", perms); authority = authority.concat(menuPerms); } redisUtil.setCacheObject("GrantedAuthority:" + sysUser.getUserName(), authority, 60 * 60, TimeUnit.SECONDS); } return Arrays.stream(authority.split(",")).collect(Collectors.toList()); } @Override public void clearUserAuthorityInfo(String userName) { redisUtil.deleteObject("GrantedAuthority:" + userName); } @Override public void clearUserAuthorityInfoByRoleId(Long roleId) { List<SysUser> sysUsers = this.list(new QueryWrapper<SysUser>() .inSql("id", "select user_id from sys_user_role where role_id = " + roleId)); sysUsers.forEach(u -> { this.clearUserAuthorityInfo(u.getUserName()); }); } @Override public void clearUserAuthorityInfoByMenuId(Long menuId) { MPJLambdaWrapper<SysUserRole> wrapper = new MPJLambdaWrapper<SysUserRole>().selectAll(SysUser.class).distinct() .leftJoin(SysUser.class, SysUser::getId, SysUserRole::getUserId) .leftJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysUserRole::getRoleId) .eq(SysRoleMenu::getMenuId, menuId); List<SysUser> sysUsers = sysUserRoleService.selectJoinList(SysUser.class, wrapper); sysUsers.forEach(u -> { this.clearUserAuthorityInfo(u.getUserName()); }); } /** * 实现UserDetailsService接口,从数据库内获取用户及权限信息 * * @param username * @return * @throws UsernameNotFoundException */ @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { LambdaQueryWrapper<SysUser> lqw = new LambdaQueryWrapper<>(); @@ -86,4 +248,19 @@ return new LoginUser(user, perms); } private void saveUserRole(List<SysRole> roles, Long userId) { log.info("保存用户角色信息"); List<SysUserRole> userRoles = new ArrayList<>(); if (CollectionUtils.isEmpty(roles)) { log.info("保存用户角色信息为空,给默认普通用户角色"); userRoles.add(new SysUserRole(userId, Const.DEFULT_ROLE)); } else { log.info("保存用户角色信息"); userRoles = roles.stream().map(e -> new SysUserRole(userId, e.getId())).collect(Collectors.toList()); } sysUserRoleService.saveBatch(userRoles); } } hangzhoumesParent/common/springsecurity/src/main/resources/application.yml
File was deleted hangzhoumesParent/gateway/pom.xml
@@ -28,5 +28,13 @@ <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/common/PlcHomeEdg.java
@@ -1,7 +1,7 @@ package com.mes.common; import cn.hutool.core.date.DateTime; import cn.hutool.json.JSONObject; import com.github.yulichang.query.MPJLambdaQueryWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.mes.edgstoragecage.entity.EdgStorageCage; import com.mes.edgstoragecage.entity.EdgStorageCageDetails; @@ -11,12 +11,12 @@ import com.mes.glassinfo.entity.GlassInfo; import com.mes.glassinfo.service.GlassInfoService; import com.mes.taskcache.entity.TaskCache; import com.mes.taskcache.mapper.TaskCacheMapper; import com.mes.taskcache.service.TaskCacheService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -27,7 +27,6 @@ public class PlcHomeEdg extends Thread { @Autowired TaskCacheService taskCacheService; @Autowired @@ -36,52 +35,57 @@ EdgStorageCageService edgStorageCageService; @Autowired EdgStorageCageDetailsService edgStorageCageDetailsService; @Autowired @Resource private EdgStorageCageDetailsMapper edgStorageCageDetailsMapper; private Map<String,String> mapParameter=new HashMap<String,String>(); private Map<String,String> mapValue=new HashMap<String,String>(); private Map<String,Object> mapSettings=new HashMap<String,Object>(); private Map<String, String> mapParameter = new HashMap<String, String>(); private Map<String, String> mapValue = new HashMap<String, String>(); private Map<String, String> mapType = new HashMap<String, String>(); private Map<String, Object> mapSettings = new HashMap<String, Object>(); private void initialize(){ mapParameter.put("A06_request_word","DB11.0"); mapParameter.put("A05_scanning_ID","DB11.2"); mapParameter.put("MES_confirmation_word","DB11.40"); mapParameter.put("A09_glass_status","DB11.70"); mapParameter.put("A10_glass_status","DB11.72"); mapParameter.put("A09_prohibit_film_production","DB11.74"); mapParameter.put("A10_prohibit_film_production","DB11.76"); mapSettings.put("territoryPoor",3); private void initialize() { // mapParameter.put("A06_request_word", "DB11.0"); //work // mapParameter.put("A05_scanning_ID", "DB11.2"); // mapParameter.put("MES_confirmation_word", "DB11.40"); // mapParameter.put("A09_glass_status", "DB11.70"); // //mapParameter.put("A10_glass_status", "DB11.72"); // mapParameter.put("A09_prohibit_film_production", "DB11.74"); // mapParameter.put("A10_prohibit_film_production", "DB11.76"); // mapSettings.put("territoryPoor", 3); // mapType.put("A06_request_word", "Word"); // mapType.put("A05_scanning_ID", "String"); // mapType.put("MES_confirmation_word", "Word"); // mapType.put("A09_glass_status", "Word"); // //mapType.put("A10_glass_status", "Word"); // mapType.put("A09_prohibit_film_production", "Word"); // mapType.put("A10_prohibit_film_production", "Word"); mapValue.put("A06_request_word","1");//请求字 mapValue.put("A05_scanning_ID","11111111111");//请求ID mapValue.put("MES_confirmation_word","0");//MES发送字 mapValue.put("A09_glass_status","0");//A09玻璃状态 mapValue.put("A10_glass_status","0");//A09玻璃状态 mapValue.put("A09_prohibit_film_production","0");//A9禁止出片 mapValue.put("A10_prohibit_film_production","0");//A10禁止出片 // mapValue.put("A06_request_word","1");//请求字 // mapValue.put("A05_scanning_ID","7");//请求ID // mapValue.put("MES_confirmation_word","0");//MES发送字 // mapValue.put("A09_glass_status","0");//A09玻璃状态 // mapValue.put("A10_glass_status","0");//A09玻璃状态 // mapValue.put("A09_prohibit_film_production","0");//A9禁止出片 // mapValue.put("A10_prohibit_film_production","0");//A10禁止出片 for (String key:mapParameter.keySet()){ String value=S7object.getinstance().plccontrol.readString(mapParameter.get(key)); mapValue.put(key,value); } } private void inTo(){ List<GlassInfo> glassInfos=glassInfoService.selectId(mapValue.get("A05_scanning_ID")); if(glassInfos.size()<1){ private void inTo() { List<GlassInfo> glassInfos = glassInfoService.selectId(mapValue.get("A05_scanning_ID")); if (glassInfos.size() < 1) { log.info("此玻璃编号不存在"); }else if(glassInfos.size()==1){ } else if (glassInfos.size() == 1) { //添加进片任务 查找空格 log.info("正常"); List<EdgStorageCage> list=edgStorageCageService.selectCacheEmpty(); List<EdgStorageCage> list = edgStorageCageService.selectCacheEmpty(); if(list.size()>1){ EdgStorageCageDetails edgStorageCageDetails=edgStorageCageDetailsMapper.selectOne(new MPJLambdaWrapper<EdgStorageCageDetails>() .eq(EdgStorageCageDetails::getGlassId,glassInfos.get(0).getGlassId())); if (list.size() > 1) { EdgStorageCageDetails edgStorageCageDetails = edgStorageCageDetailsMapper.selectOne(new MPJLambdaWrapper<EdgStorageCageDetails>() .eq(EdgStorageCageDetails::getGlassId, glassInfos.get(0).getGlassId())); edgStorageCageDetails.setState(200); TaskCache taskCache=new TaskCache(); EdgStorageCage edgStorageCage=list.get(0); TaskCache taskCache = new TaskCache(); EdgStorageCage edgStorageCage = list.get(0); taskCache.setGlassId(glassInfos.get(0).getGlassId()); taskCache.setTaskStatus(0); taskCache.setStartCell(0); @@ -90,34 +94,36 @@ taskCache.setCreateTime(new DateTime()); edgStorageCageDetailsMapper.updateById(edgStorageCageDetails); taskCacheService.insertTaskCache(taskCache); }else{ S7object.getinstance().plccontrol.WriteWord(mapParameter.get("MES_confirmation_word"), (short)1); } else { log.info("不存在空格"); } }else{ } else { log.info("此玻璃编号存在多个"); } } private void outTo(int line){ int endcell=0; EdgStorageCageDetails outEdgStorageCageDetails=new EdgStorageCageDetails(); TaskCache taskCacheA09=taskCacheService.selectLastOutCacheInfo(""); TaskCache taskCacheA10=taskCacheService.selectLastOutCacheInfo(""); private void outTo(int line) { int endcell = 0; EdgStorageCageDetails outEdgStorageCageDetails = new EdgStorageCageDetails(); TaskCache taskCacheA09 = taskCacheService.selectLastOutCacheInfo(""); TaskCache taskCacheA10 = taskCacheService.selectLastOutCacheInfo(""); //两线各自要出的玻璃 EdgStorageCageDetails glassInfo09=edgStorageCageDetailsService.selectConformGlass(taskCacheA09.getGlassId(),(int)mapSettings.get("territoryPoor")); EdgStorageCageDetails glassInfo10=edgStorageCageDetailsService.selectConformGlass(taskCacheA10.getGlassId(),(int)mapSettings.get("territoryPoor")); EdgStorageCageDetails glassInfo09 = edgStorageCageDetailsService.selectConformGlass(taskCacheA09.getGlassId(), (int) mapSettings.get("territoryPoor")); EdgStorageCageDetails glassInfo10 = edgStorageCageDetailsService.selectConformGlass(taskCacheA10.getGlassId(), (int) mapSettings.get("territoryPoor")); //决定线路 if(line==1){ endcell=9000; outEdgStorageCageDetails=glassInfo09; }else if(line==2){ endcell=1000; outEdgStorageCageDetails=glassInfo10; }else if(line==3){ endcell=9000;//默认走一号线 优化方向可根据 对比两线速度/两线当前任务情况做 outEdgStorageCageDetails=glassInfo09; if (line == 1) { endcell = 9000; outEdgStorageCageDetails = glassInfo09; } else if (line == 2) { endcell = 1000; outEdgStorageCageDetails = glassInfo10; } else if (line == 3) { endcell = 9000;//默认走一号线 优化方向可根据 对比两线速度/两线当前任务情况做 outEdgStorageCageDetails = glassInfo09; } if(outEdgStorageCageDetails!=null&&endcell>0){ TaskCache taskCache=new TaskCache(); if (outEdgStorageCageDetails != null && endcell > 0) { TaskCache taskCache = new TaskCache(); taskCache.setGlassId(outEdgStorageCageDetails.getGlassId()); taskCache.setTaskStatus(0); taskCache.setStartCell(outEdgStorageCageDetails.getSlot()); @@ -125,86 +131,56 @@ taskCache.setTaskType(2); taskCache.setCreateTime(new DateTime()); taskCacheService.insertTaskCache(taskCache); S7object.getinstance().plccontrol.WriteWord(mapParameter.get("MES_confirmation_word"), (short)1); } } @Override public void run() { boolean start=true; while (this != null&&start) { boolean start = true; initialize(); log.info("当前参数值:{}", mapValue); while (this != null && start) { JSONObject jsonObject = new JSONObject(); for (String key : mapParameter.keySet()) { String value = ""; if ("String".equals(mapType.get(key))) { value = S7object.getinstance().plccontrol.readString(mapParameter.get(key)); } else { value = S7object.getinstance().plccontrol.readWord(mapParameter.get(key)) + ""; } mapValue.put(key, value); } try { Thread.sleep(1000); taskCacheService = WebSocketServer.applicationContext.getBean(TaskCacheService.class); glassInfoService = WebSocketServer.applicationContext.getBean(GlassInfoService.class); edgStorageCageService = WebSocketServer.applicationContext.getBean(EdgStorageCageService.class); edgStorageCageDetailsMapper = WebSocketServer.applicationContext.getBean(EdgStorageCageDetailsMapper.class); initialize();//初始化数据 log.info("当前参数值:{}",mapValue); if("0".equals(mapValue.get("A06_request_word"))){ taskCacheService = WebSocketServer.applicationContext.getBean(TaskCacheService.class); glassInfoService = WebSocketServer.applicationContext.getBean(GlassInfoService.class); edgStorageCageService = WebSocketServer.applicationContext.getBean(EdgStorageCageService.class); edgStorageCageDetailsMapper = WebSocketServer.applicationContext.getBean(EdgStorageCageDetailsMapper.class); // initialize();//初始化数据 if ("0".equals(mapValue.get("A06_request_word"))) { //清除 //S7object.getinstance().plccontrol.WriteWord(mapParameter.get("MES_confirmation_word"),(short) 0); }else if("1".equals(mapValue.get("A06_request_word"))&& "0".equals(mapValue.get("MES_confirmation_word"))) { S7object.getinstance().plccontrol.WriteWord(mapParameter.get("MES_confirmation_word"), (short) 0); } else if ("1".equals(mapValue.get("A06_request_word")) && "0".equals(mapValue.get("MES_confirmation_word"))) { inTo(); }else if("2".equals(mapValue.get("A06_request_word"))&& "0".equals(mapValue.get("MES_confirmation_word"))&& ( "0".equals(mapValue.get("A09_glass_status"))|| "0".equals(mapValue.get("A10_glass_status")) ) ){ } else if ("2".equals(mapValue.get("A06_request_word")) && "0".equals(mapValue.get("MES_confirmation_word")) && !"0".equals(mapValue.get("A09_glass_status"))) { //09空闲 :1 10空闲 :2 都空闲:3 其他0 outTo(Integer.parseInt(mapValue.get("A09_glass_status"))); } else if ("3".equals(mapValue.get("A06_request_word")) && "0".equals(mapValue.get("MES_confirmation_word"))) { outTo(3); }else if("3".equals(mapValue.get("A06_request_word"))&& "0".equals(mapValue.get("MES_confirmation_word"))){ if("0".equals(mapValue.get("A09_glass_status"))||"0".equals(mapValue.get("A10_glass_status"))){ outTo(3); }else{ if ("0".equals(mapValue.get("A09_glass_status")) || "0".equals(mapValue.get("A10_glass_status"))) { outTo(Integer.parseInt(mapValue.get("A09_glass_status"))); } else { inTo(); } } // List<String> address2=new ArrayList<String>(); // address.add(""); // List<String> list2= S7object.getinstance().plccontrol.readStrings(address); // PlcParameterObject plcmes=PLCAutoMes.PlcMesObject; // log.info("plcmes:{}",plcmes); // S7object.getinstance().plccontrol.WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),(short) 1); // taskCacheMapper = WebSocketServer.applicationContext.getBean(TaskCacheMapper.class); // List<TaskCache> list=taskCacheMapper.selectList(null); // log.info("数据{}",list); // 注入mapper // HomeService = WebSocketServer.applicationContext.getBean(HomeService.class); // QueueMapper = WebSocketServer.applicationContext.getBean(QueueMapper.class); // //读取DB105区文件 // PlcParameterObject plcmes=PLCAutoMes.PlcMesObject; // // String PlcRequest=plcmes.getPlcParameter("GaToMES").getValue();//请求 // String MesSend=plcmes.getPlcParameter("MESToGaStatus").getValue();//发送 // double width=Double.valueOf(plcmes.getPlcParameter("width").getValue());//宽 // double height=Double.valueOf(plcmes.getPlcParameter("Height").getValue());//高 //获取测量的长,宽 boolean istest = true; // String PlcRequest = "1"; // String MesSend = "0"; // double width = 516; // double height = 507; //System.out.println(111); // //查询当前订单任务 //List<FlowCard> OrderTask = storageCageService.SelectOrderTask(); //jsonObject.append("OrderTask", OrderTask); } catch (InterruptedException e) { e.printStackTrace(); hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/glassinfo/controller/GlassInfoController.java
@@ -10,10 +10,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.mes.glassinfo.service.impl.GlassInfoServiceImpl; import java.util.List; import java.util.Map; /** * <p> @@ -23,7 +21,7 @@ * @author zhoush * @since 2024-04-07 */ @Api(tags = "玻璃信息小片") @Api(description = "玻璃信息小片") @RestController @RequestMapping("/glassInfo") public class GlassInfoController { hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/controller/TaskCacheController.java
@@ -2,7 +2,6 @@ import com.mes.edgstoragecage.service.EdgStorageCageDetailsService; import com.mes.edgstoragecage.service.EdgStorageCageService; import com.mes.pp.entity.OptimizeDetail; import com.mes.taskcache.entity.TaskCache; import com.mes.taskcache.service.TaskCacheService; import com.mes.utils.Result; @@ -22,7 +21,7 @@ * @author zhoush * @since 2024-04-07 */ @Api(tags = "识别显示") @Api(description = "识别显示") @RestController @RequestMapping("/taskCache") public class TaskCacheController { hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-dev.yml
@@ -14,6 +14,11 @@ username: root password: beibo.123/ driver-class-name: com.mysql.cj.jdbc.Driver salve_hangzhoumes: url: jdbc:sqlserver://127.0.0.1:1433;databasename=hangzhoumes username: sa password: '!QAZ2wsx' driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver cloud: nacos: discovery: hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application.yml
@@ -1,51 +1,12 @@ server: port: 8081 port: 8085 spring: datasource: dynamic: primary: hangzhoumes #设置默认的数据源或者数据源组,默认值即为master strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源. datasource: hangzhoumes: url: jdbc:mysql://localhost:3306/hangzhoumes?serverTimezone=GMT%2b8 username: root password: beibo.123/ driver-class-name: com.mysql.cj.jdbc.Driver pp: #url: jdbc:mysql://10.153.19.150:3306/pp?serverTimezone=GMT%2b8 url: jdbc:mysql://localhost:3306/pp?serverTimezone=GMT%2b8 username: root password: beibo.123/ driver-class-name: com.mysql.cj.jdbc.Driver salve_hangzhoumes: url: jdbc:sqlserver://localhost:1433;databasename=hangzhoumes username: sa password: beibo.123/ driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver # pp: # url: jdbc:mysql://10.153.19.150:3306/pp?serverTimezone=GMT%2b8 # username: root # password: beibo.123/ # driver-class-name: com.mysql.cj.jdbc.Driver # salve_hangzhoumes: # url: jdbc:sqlserver://10.153.19.150:1433;databasename=hangzhoumes # username: sa # password: beibo.123/ # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver cloud: nacos: discovery: server-addr: localhost:8848 profiles: active: dev application: name: cacheGlass redis: database: 0 host: localhost port: 6379 password: 123456 session: store-type: redis name: unLoadGlass mybatis-plus: mapper-locations: classpath*:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-impl: org.apache.ibatis.logging.stdout.StdOutImpl hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/logback-spring.xml
New file @@ -0,0 +1,170 @@ <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds"> <!-- logger上下文名称(根据业务修改) --> <contextName>cacheGlass</contextName> <!-- 定义了一个名为serverName的属性,它的值来自于logging.file.name,如果没有找到该属性默认为MyServerName(根据业务修改) --> <springProperty name="serverName" source="logging.file.name" defaultValue="cacheGlass"/> <springProperty name="logging.path" source="logging.file.path" defaultValue="././logs/"/> <!-- 彩色日志依赖的渲染类 --> <!-- 定义了一个名为clr的转换规则,它使用org.springframework.boot.logging.logback.ColorConverter类进行转换,这个元素通常用于将日志输出中的文本着色,以便更容易地区分不同的日志级别或其他信息 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <!-- WhitespaceThrowableProxyConverter和ExtendedWhitespaceThrowableProxyConverter都是用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示的类。它们之间的区别在于,ExtendedWhitespaceThrowableProxyConverter在输出异常信息时会包含更多的详细信息,例如异常的类名、方法名和行号等 --> <!-- 定义了一个名为wex的转换规则,它使用org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter类进行转换,这个元素通常用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <!-- 定义了一个名为wEx的转换规则,它使用org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter类进行转换,这个元素通常用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- 彩色日志格式 --> <!-- value值是日志输出模板, :-是属性名和其默认值之间的分隔符,作用与:相同 --> <!-- 定义日志输出格式的转换规则,%d{yyyy-MM-dd HH:mm:ss.SSS}表示日期和时间,%clr表示将输出文本着色,{faint}表示使用淡色 --> <!-- %5p表示日志级别输出右对齐,左边以空格填充 --> <!-- ${PID:- }表示进程ID,%clr表示将输出文本着色,{magenta}表示使用洋红色 --> <!-- -表示一个分隔符 --> <!-- %t:显示产生该日志的线程名;%15:若字符长度小于15,则左边用空格填充;%.15:若字符长度超过15,截去多余字符 --> <!-- %-40:若字符长度小于40,则右边用空格填充;%.40:若字符长度超过40,截去多余字符;logger{39}对应的是“logging.WARNING”级别。具体来说,Python的logging模块定义了以下几个级别(从低到高):NOTSET、DEBUG、INFO、WARNING、ERROR、CRITICAL。因此,logger{39}表示的是WARNING级别,即日志记录器会记录所有WARNING级别及以上的日志信息 --> <!-- %m表示日志消息;%n表示换行符;${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}表示异常信息。如果日志输出中包含异常信息,这个规则将会将其转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!--1. 输出到控制台--> <!-- 定义控制台日志输出的appender,class="ch.qos.logback.core.ConsoleAppender"表示使用Logback框架提供的ConsoleAppender类来输出日志到控制台 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <!-- 定义日志输出级别的过滤器,class="ch.qos.logback.classic.filter.ThresholdFilter"表示使用Logback框架提供的ThresholdFilter类来过滤日志输出,<level>debug</level>表示只输出debug级别及以上的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>debug</level> </filter> <encoder> <!-- ${CONSOLE_LOG_PATTERN}表示控制台日志输出格式,UTF-8表示编码格式 --> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender> <!--2. 输出到文档--> <!-- 2.1 level为 DEBUG 日志,时间滚动输出 --> <!-- 定义文件日志输出的appender,class="ch.qos.logback.core.rolling.RollingFileAppender"表示使用Logback框架提供的RollingFileAppender类来输出日志到文件 --> <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_debug.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <!-- 定义日志文件滚动策略的标签,class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"表示使用Logback框架提供的TimeBasedRollingPolicy类来定义日志文件的滚动策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志归档 --> <!-- 定义日志文件名的模式。在这个模式中,${logging.path}表示日志文件的路径,%d{yyyy-MM-dd}表示日期格式,%i表示文件索引 --> <fileNamePattern>${logging.path}/${serverName}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 定义日志文件滚动策略的标签,class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"表示使用Logback框架提供的SizeAndTimeBasedFNATP类来定义日志文件的滚动策略,<maxFileSize>100MB</maxFileSize>表示日志文件的最大大小为100MB。这个滚动策略通常用于按照时间和文件大小滚动日志文件,以便更好地管理日志文件的大小和数量 --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录debug级别的 --> <!-- 定义日志输出级别的过滤器。在这个过滤器中,class="ch.qos.logback.classic.filter.LevelFilter"表示使用Logback框架提供的LevelFilter类来过滤日志输出,<level>debug</level>表示只输出debug级别及以上的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>debug</level> <!-- <onMatch>ACCEPT</onMatch>表示如果日志事件与过滤器匹配,则接受该事件,<onMismatch>DENY</onMismatch>表示如果日志事件与过滤器不匹配,则拒绝该事件 --> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.2 level为 INFO 日志,时间滚动输出 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_info.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 天天日志归档路径以及格式 --> <fileNamePattern>${logging.path}/${serverName}/web-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>info</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.3 level为 WARN 日志,时间滚动输出 --> <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_warn.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logging.path}/${serverName}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录warn级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.4 level为 ERROR 日志,时间滚动输出 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_error.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logging.path}/${serverName}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录ERROR级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 4.1 开发环境:打印控制台--> <!-- 用于在Spring Boot应用程序中配置日志记录的标签。在这个标签中,name="dev"表示这个配置文件只在dev环境中生效,<logger name="com.myClass.controller" level="debug"/>表示为com.myClass.controller(根据业务修改)这个包下的类配置日志输出级别为debug --> <!-- <springProfile name="dev">--> <!-- <logger name="com.myClass.controller" level="debug"/>--> <!-- </springProfile>--> <!-- 用于配置日志输出的标签。在这个标签中,level="info"表示日志输出级别为info,<appender-ref ref="CONSOLE"/>、<appender-ref ref="DEBUG_FILE"/>、<appender-ref ref="INFO_FILE"/>、<appender-ref ref="WARN_FILE"/>、<appender-ref ref="ERROR_FILE"/>表示将日志输出到不同的appender中,分别为控制台、debug文件、info文件、warn文件和error文件 --> <root level="info"> <appender-ref ref="CONSOLE"/> <appender-ref ref="DEBUG_FILE"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="WARN_FILE"/> <appender-ref ref="ERROR_FILE"/> </root> </configuration> hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/CacheVerticalClassModuleApplication.java
@@ -5,6 +5,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.scheduling.annotation.EnableScheduling; import springfox.documentation.swagger2.annotations.EnableSwagger2; /** @@ -17,6 +18,7 @@ @EnableSwagger2 @EnableDiscoveryClient @MapperScan(basePackages = "com.mes.*.mapper") @EnableScheduling public class CacheVerticalClassModuleApplication { public static void main(String[] args) { try { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageController.java
@@ -2,7 +2,7 @@ import com.mes.bigstorage.entity.BigStorageCage; import com.mes.bigstorage.service.BigStorageCageService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -19,7 +19,7 @@ * @author zhoush * @since 2024-03-27 */ @ApiModel("理片笼信息") @Api(description = "理片笼信息") @RestController @RequestMapping("/bigStorageCage") public class BigStorageCageController { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java
@@ -3,10 +3,9 @@ import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.service.BigStorageCageDetailsService; import io.swagger.annotations.ApiModel; 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.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -21,7 +20,7 @@ * @author zhoush * @since 2024-03-27 */ @ApiModel(description = "理片笼详情") @Api(description = "理片笼详情") @RestController @RequestMapping("/bigStorageCageDetails") public class BigStorageCageDetailsController { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCage.java
@@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -19,7 +19,7 @@ * @author zhoush * @since 2024-03-27 */ @ApiModel(description = "<p> 大理片笼 </p>") @Api(description = "大理片笼") @Data @EqualsAndHashCode(callSuper = false) public class BigStorageCage implements Serializable { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCageDetails.java
@@ -2,22 +2,22 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; /** * <p> * * * </p> * * @author zhoush * @since 2024-03-27 */ @ApiModel(description = "<p> 大理片笼详情 </p>") @Api(description = "大理片笼详情") @Data @EqualsAndHashCode(callSuper = false) public class BigStorageCageDetails implements Serializable { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/controller/BigStorageCageFeedTaskController.java
@@ -3,7 +3,7 @@ import com.mes.bigstoragetask.entity.BigStorageCageFeedTask; import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -20,7 +20,7 @@ * @author zhoush * @since 2024-04-16 */ @ApiModel("进片任务信息") @Api(description = "进片任务信息") @RestController @RequestMapping("/big-storage-cage-feed-task") public class BigStorageCageFeedTaskController { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/controller/BigStorageCageOutTaskController.java
@@ -3,7 +3,7 @@ import com.mes.bigstoragetask.entity.BigStorageCageOutTask; import com.mes.bigstoragetask.service.BigStorageCageOutTaskService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -20,7 +20,7 @@ * @author zhoush * @since 2024-04-16 */ @ApiModel("出片任务信息") @Api(description = "出片任务信息") @RestController @RequestMapping("/big-storage-cage-out-task") public class BigStorageCageOutTaskController { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/component/PlcStorageCage.java
File was deleted hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
New file @@ -0,0 +1,122 @@ package com.mes.job; import cn.hutool.json.JSONObject; import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.service.BigStorageCageDetailsService; import com.mes.bigstorage.service.BigStorageCageService; import com.mes.bigstoragetask.entity.BigStorageCageFeedTask; import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService; import com.mes.bigstoragetask.service.BigStorageCageOutTaskService; import com.mes.edgstoragetask.service.TaskCacheService; import com.mes.glassinfo.entity.GlassInfo; import com.mes.glassinfo.service.GlassInfoService; import com.mes.menu.service.SysMenuService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.List; @Component @Slf4j public class PlcStorageCageTask { @Autowired private BigStorageCageService bigStorageCageService; @Autowired private BigStorageCageDetailsService bigStorageCageDetailsService; @Autowired private GlassInfoService glassInfoService; @Autowired private BigStorageCageFeedTaskService bigStorageCageFeedTaskService; @Autowired private BigStorageCageOutTaskService bigStorageCageOutTaskService; @Autowired private TaskCacheService taskCacheService; @Autowired private SysMenuService sysMenuService; /** * fixedRate : 上一个调用开始后再次调用的延时(不用等待上一次调用完成) * fixedDelay : 上一个调用结束后再次调用的延时 */ @Scheduled(fixedDelay = 300) public void plcStorageCageTask() throws InterruptedException { JSONObject jsonObject = new JSONObject(); try { Thread.sleep(300); boolean bigStorageCageFullAlarm = false; String plcD01FeedReq = "0"; String plcD04FeedReq = "0"; String plcFeedGlassid = "111"; String plcFeedReqLine = "0"; if ("1".equals(plcD01FeedReq)) { plcFeedReqLine = "1"; } else { //plc任务发送字0 } if ("1".equals(plcD04FeedReq)) { plcFeedReqLine = "2"; } else { //plc任务发送字0 } if (!("0".equals(plcFeedReqLine))) { log.info("1、Plc进片请求时"); BigStorageCageDetails bigStorageCageDetails = new BigStorageCageDetails(); GlassInfo glassInfo = glassInfoService.getById(plcFeedGlassid); log.info("2、根据玻璃id获取玻璃信息" + glassInfo); BigStorageCageDetails slotInfo = bigStorageCageService.feedGlass(glassInfo, bigStorageCageDetails); if (slotInfo != null) { int taskType = taskCacheService.judgeTasktype(); log.info("3、查询任务表判断当前任务类型为上车等到还是上车启动" + taskType); bigStorageCageFeedTaskService.addFeedTask(slotInfo, Integer.parseInt(plcFeedReqLine), taskType); log.info("4、添加任务到任务表"); //plc任务发送字1 bigStorageCageFullAlarm = false; } else { //理片笼爆笼报警 bigStorageCageFullAlarm = true; } } else { List<BigStorageCageFeedTask> bigStorageCageFeedTaskList = bigStorageCageFeedTaskService.querybigStorageCageFeedTask(1); log.info("5、查询任务表是否有已经完成的进片任务" + bigStorageCageFeedTaskList.size()); for (BigStorageCageFeedTask bigStorageCageFeedTask : bigStorageCageFeedTaskList ) { BigStorageCageDetails bigStorageCageDetails = new BigStorageCageDetails(); bigStorageCageDetails.setId(bigStorageCageFeedTask.getId()); bigStorageCageDetails.setState(1); bigStorageCageDetailsService.updateById(bigStorageCageDetails); log.info("6、修改理片笼详情玻璃状态"); bigStorageCageFeedTaskService.removeById(bigStorageCageFeedTask); log.info("7、删除已经完成的进片任务"); } } //出片请求 String plcOutReq = "0"; boolean result = false; if ("1".equals(plcOutReq)) { result = bigStorageCageService.outGlass(); log.info("8、出片请求时调用出片接口" + result); if (result) { //plc任务发送字1 } } else { bigStorageCageOutTaskService.updateOutTask(); //plc任务发送字0 } //显示剩余空格子 //报警信息 jsonObject.append("bigStorageCageFullAlarm", bigStorageCageFullAlarm); } catch (Exception e) { e.printStackTrace(); } } } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/logback-spring.xml
New file @@ -0,0 +1,170 @@ <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds"> <!-- logger上下文名称(根据业务修改) --> <contextName>cacheVerticalGlass</contextName> <!-- 定义了一个名为serverName的属性,它的值来自于logging.file.name,如果没有找到该属性默认为MyServerName(根据业务修改) --> <springProperty name="serverName" source="logging.file.name" defaultValue="cacheVerticalGlass"/> <springProperty name="logging.path" source="logging.file.path" defaultValue="././logs/"/> <!-- 彩色日志依赖的渲染类 --> <!-- 定义了一个名为clr的转换规则,它使用org.springframework.boot.logging.logback.ColorConverter类进行转换,这个元素通常用于将日志输出中的文本着色,以便更容易地区分不同的日志级别或其他信息 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <!-- WhitespaceThrowableProxyConverter和ExtendedWhitespaceThrowableProxyConverter都是用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示的类。它们之间的区别在于,ExtendedWhitespaceThrowableProxyConverter在输出异常信息时会包含更多的详细信息,例如异常的类名、方法名和行号等 --> <!-- 定义了一个名为wex的转换规则,它使用org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter类进行转换,这个元素通常用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <!-- 定义了一个名为wEx的转换规则,它使用org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter类进行转换,这个元素通常用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- 彩色日志格式 --> <!-- value值是日志输出模板, :-是属性名和其默认值之间的分隔符,作用与:相同 --> <!-- 定义日志输出格式的转换规则,%d{yyyy-MM-dd HH:mm:ss.SSS}表示日期和时间,%clr表示将输出文本着色,{faint}表示使用淡色 --> <!-- %5p表示日志级别输出右对齐,左边以空格填充 --> <!-- ${PID:- }表示进程ID,%clr表示将输出文本着色,{magenta}表示使用洋红色 --> <!-- -表示一个分隔符 --> <!-- %t:显示产生该日志的线程名;%15:若字符长度小于15,则左边用空格填充;%.15:若字符长度超过15,截去多余字符 --> <!-- %-40:若字符长度小于40,则右边用空格填充;%.40:若字符长度超过40,截去多余字符;logger{39}对应的是“logging.WARNING”级别。具体来说,Python的logging模块定义了以下几个级别(从低到高):NOTSET、DEBUG、INFO、WARNING、ERROR、CRITICAL。因此,logger{39}表示的是WARNING级别,即日志记录器会记录所有WARNING级别及以上的日志信息 --> <!-- %m表示日志消息;%n表示换行符;${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}表示异常信息。如果日志输出中包含异常信息,这个规则将会将其转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!--1. 输出到控制台--> <!-- 定义控制台日志输出的appender,class="ch.qos.logback.core.ConsoleAppender"表示使用Logback框架提供的ConsoleAppender类来输出日志到控制台 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <!-- 定义日志输出级别的过滤器,class="ch.qos.logback.classic.filter.ThresholdFilter"表示使用Logback框架提供的ThresholdFilter类来过滤日志输出,<level>debug</level>表示只输出debug级别及以上的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>debug</level> </filter> <encoder> <!-- ${CONSOLE_LOG_PATTERN}表示控制台日志输出格式,UTF-8表示编码格式 --> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender> <!--2. 输出到文档--> <!-- 2.1 level为 DEBUG 日志,时间滚动输出 --> <!-- 定义文件日志输出的appender,class="ch.qos.logback.core.rolling.RollingFileAppender"表示使用Logback框架提供的RollingFileAppender类来输出日志到文件 --> <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_debug.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <!-- 定义日志文件滚动策略的标签,class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"表示使用Logback框架提供的TimeBasedRollingPolicy类来定义日志文件的滚动策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志归档 --> <!-- 定义日志文件名的模式。在这个模式中,${logging.path}表示日志文件的路径,%d{yyyy-MM-dd}表示日期格式,%i表示文件索引 --> <fileNamePattern>${logging.path}/${serverName}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 定义日志文件滚动策略的标签,class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"表示使用Logback框架提供的SizeAndTimeBasedFNATP类来定义日志文件的滚动策略,<maxFileSize>100MB</maxFileSize>表示日志文件的最大大小为100MB。这个滚动策略通常用于按照时间和文件大小滚动日志文件,以便更好地管理日志文件的大小和数量 --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录debug级别的 --> <!-- 定义日志输出级别的过滤器。在这个过滤器中,class="ch.qos.logback.classic.filter.LevelFilter"表示使用Logback框架提供的LevelFilter类来过滤日志输出,<level>debug</level>表示只输出debug级别及以上的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>debug</level> <!-- <onMatch>ACCEPT</onMatch>表示如果日志事件与过滤器匹配,则接受该事件,<onMismatch>DENY</onMismatch>表示如果日志事件与过滤器不匹配,则拒绝该事件 --> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.2 level为 INFO 日志,时间滚动输出 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_info.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 天天日志归档路径以及格式 --> <fileNamePattern>${logging.path}/${serverName}/web-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>info</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.3 level为 WARN 日志,时间滚动输出 --> <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_warn.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logging.path}/${serverName}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录warn级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.4 level为 ERROR 日志,时间滚动输出 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_error.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logging.path}/${serverName}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录ERROR级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 4.1 开发环境:打印控制台--> <!-- 用于在Spring Boot应用程序中配置日志记录的标签。在这个标签中,name="dev"表示这个配置文件只在dev环境中生效,<logger name="com.myClass.controller" level="debug"/>表示为com.myClass.controller(根据业务修改)这个包下的类配置日志输出级别为debug --> <!-- <springProfile name="dev">--> <!-- <logger name="com.myClass.controller" level="debug"/>--> <!-- </springProfile>--> <!-- 用于配置日志输出的标签。在这个标签中,level="info"表示日志输出级别为info,<appender-ref ref="CONSOLE"/>、<appender-ref ref="DEBUG_FILE"/>、<appender-ref ref="INFO_FILE"/>、<appender-ref ref="WARN_FILE"/>、<appender-ref ref="ERROR_FILE"/>表示将日志输出到不同的appender中,分别为控制台、debug文件、info文件、warn文件和error文件 --> <root level="info"> <appender-ref ref="CONSOLE"/> <appender-ref ref="DEBUG_FILE"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="WARN_FILE"/> <appender-ref ref="ERROR_FILE"/> </root> </configuration> hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/logback-spring.xml
New file @@ -0,0 +1,170 @@ <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds"> <!-- logger上下文名称(根据业务修改) --> <contextName>loadGlass</contextName> <!-- 定义了一个名为serverName的属性,它的值来自于logging.file.name,如果没有找到该属性默认为MyServerName(根据业务修改) --> <springProperty name="serverName" source="logging.file.name" defaultValue="loadGlass"/> <springProperty name="logging.path" source="logging.file.path" defaultValue="././logs/"/> <!-- 彩色日志依赖的渲染类 --> <!-- 定义了一个名为clr的转换规则,它使用org.springframework.boot.logging.logback.ColorConverter类进行转换,这个元素通常用于将日志输出中的文本着色,以便更容易地区分不同的日志级别或其他信息 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <!-- WhitespaceThrowableProxyConverter和ExtendedWhitespaceThrowableProxyConverter都是用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示的类。它们之间的区别在于,ExtendedWhitespaceThrowableProxyConverter在输出异常信息时会包含更多的详细信息,例如异常的类名、方法名和行号等 --> <!-- 定义了一个名为wex的转换规则,它使用org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter类进行转换,这个元素通常用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <!-- 定义了一个名为wEx的转换规则,它使用org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter类进行转换,这个元素通常用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- 彩色日志格式 --> <!-- value值是日志输出模板, :-是属性名和其默认值之间的分隔符,作用与:相同 --> <!-- 定义日志输出格式的转换规则,%d{yyyy-MM-dd HH:mm:ss.SSS}表示日期和时间,%clr表示将输出文本着色,{faint}表示使用淡色 --> <!-- %5p表示日志级别输出右对齐,左边以空格填充 --> <!-- ${PID:- }表示进程ID,%clr表示将输出文本着色,{magenta}表示使用洋红色 --> <!-- -表示一个分隔符 --> <!-- %t:显示产生该日志的线程名;%15:若字符长度小于15,则左边用空格填充;%.15:若字符长度超过15,截去多余字符 --> <!-- %-40:若字符长度小于40,则右边用空格填充;%.40:若字符长度超过40,截去多余字符;logger{39}对应的是“logging.WARNING”级别。具体来说,Python的logging模块定义了以下几个级别(从低到高):NOTSET、DEBUG、INFO、WARNING、ERROR、CRITICAL。因此,logger{39}表示的是WARNING级别,即日志记录器会记录所有WARNING级别及以上的日志信息 --> <!-- %m表示日志消息;%n表示换行符;${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}表示异常信息。如果日志输出中包含异常信息,这个规则将会将其转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!--1. 输出到控制台--> <!-- 定义控制台日志输出的appender,class="ch.qos.logback.core.ConsoleAppender"表示使用Logback框架提供的ConsoleAppender类来输出日志到控制台 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <!-- 定义日志输出级别的过滤器,class="ch.qos.logback.classic.filter.ThresholdFilter"表示使用Logback框架提供的ThresholdFilter类来过滤日志输出,<level>debug</level>表示只输出debug级别及以上的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>debug</level> </filter> <encoder> <!-- ${CONSOLE_LOG_PATTERN}表示控制台日志输出格式,UTF-8表示编码格式 --> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender> <!--2. 输出到文档--> <!-- 2.1 level为 DEBUG 日志,时间滚动输出 --> <!-- 定义文件日志输出的appender,class="ch.qos.logback.core.rolling.RollingFileAppender"表示使用Logback框架提供的RollingFileAppender类来输出日志到文件 --> <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_debug.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <!-- 定义日志文件滚动策略的标签,class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"表示使用Logback框架提供的TimeBasedRollingPolicy类来定义日志文件的滚动策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志归档 --> <!-- 定义日志文件名的模式。在这个模式中,${logging.path}表示日志文件的路径,%d{yyyy-MM-dd}表示日期格式,%i表示文件索引 --> <fileNamePattern>${logging.path}/${serverName}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 定义日志文件滚动策略的标签,class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"表示使用Logback框架提供的SizeAndTimeBasedFNATP类来定义日志文件的滚动策略,<maxFileSize>100MB</maxFileSize>表示日志文件的最大大小为100MB。这个滚动策略通常用于按照时间和文件大小滚动日志文件,以便更好地管理日志文件的大小和数量 --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录debug级别的 --> <!-- 定义日志输出级别的过滤器。在这个过滤器中,class="ch.qos.logback.classic.filter.LevelFilter"表示使用Logback框架提供的LevelFilter类来过滤日志输出,<level>debug</level>表示只输出debug级别及以上的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>debug</level> <!-- <onMatch>ACCEPT</onMatch>表示如果日志事件与过滤器匹配,则接受该事件,<onMismatch>DENY</onMismatch>表示如果日志事件与过滤器不匹配,则拒绝该事件 --> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.2 level为 INFO 日志,时间滚动输出 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_info.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 天天日志归档路径以及格式 --> <fileNamePattern>${logging.path}/${serverName}/web-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>info</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.3 level为 WARN 日志,时间滚动输出 --> <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_warn.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logging.path}/${serverName}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录warn级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.4 level为 ERROR 日志,时间滚动输出 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_error.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logging.path}/${serverName}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录ERROR级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 4.1 开发环境:打印控制台--> <!-- 用于在Spring Boot应用程序中配置日志记录的标签。在这个标签中,name="dev"表示这个配置文件只在dev环境中生效,<logger name="com.myClass.controller" level="debug"/>表示为com.myClass.controller(根据业务修改)这个包下的类配置日志输出级别为debug --> <!-- <springProfile name="dev">--> <!-- <logger name="com.myClass.controller" level="debug"/>--> <!-- </springProfile>--> <!-- 用于配置日志输出的标签。在这个标签中,level="info"表示日志输出级别为info,<appender-ref ref="CONSOLE"/>、<appender-ref ref="DEBUG_FILE"/>、<appender-ref ref="INFO_FILE"/>、<appender-ref ref="WARN_FILE"/>、<appender-ref ref="ERROR_FILE"/>表示将日志输出到不同的appender中,分别为控制台、debug文件、info文件、warn文件和error文件 --> <root level="info"> <appender-ref ref="CONSOLE"/> <appender-ref ref="DEBUG_FILE"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="WARN_FILE"/> <appender-ref ref="ERROR_FILE"/> </root> </configuration> hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/logback-spring.xml
New file @@ -0,0 +1,170 @@ <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds"> <!-- logger上下文名称(根据业务修改) --> <contextName>temperingGlass</contextName> <!-- 定义了一个名为serverName的属性,它的值来自于logging.file.name,如果没有找到该属性默认为MyServerName(根据业务修改) --> <springProperty name="serverName" source="logging.file.name" defaultValue="temperingGlass"/> <springProperty name="logging.path" source="logging.file.path" defaultValue="././logs/"/> <!-- 彩色日志依赖的渲染类 --> <!-- 定义了一个名为clr的转换规则,它使用org.springframework.boot.logging.logback.ColorConverter类进行转换,这个元素通常用于将日志输出中的文本着色,以便更容易地区分不同的日志级别或其他信息 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <!-- WhitespaceThrowableProxyConverter和ExtendedWhitespaceThrowableProxyConverter都是用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示的类。它们之间的区别在于,ExtendedWhitespaceThrowableProxyConverter在输出异常信息时会包含更多的详细信息,例如异常的类名、方法名和行号等 --> <!-- 定义了一个名为wex的转换规则,它使用org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter类进行转换,这个元素通常用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <!-- 定义了一个名为wEx的转换规则,它使用org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter类进行转换,这个元素通常用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- 彩色日志格式 --> <!-- value值是日志输出模板, :-是属性名和其默认值之间的分隔符,作用与:相同 --> <!-- 定义日志输出格式的转换规则,%d{yyyy-MM-dd HH:mm:ss.SSS}表示日期和时间,%clr表示将输出文本着色,{faint}表示使用淡色 --> <!-- %5p表示日志级别输出右对齐,左边以空格填充 --> <!-- ${PID:- }表示进程ID,%clr表示将输出文本着色,{magenta}表示使用洋红色 --> <!-- -表示一个分隔符 --> <!-- %t:显示产生该日志的线程名;%15:若字符长度小于15,则左边用空格填充;%.15:若字符长度超过15,截去多余字符 --> <!-- %-40:若字符长度小于40,则右边用空格填充;%.40:若字符长度超过40,截去多余字符;logger{39}对应的是“logging.WARNING”级别。具体来说,Python的logging模块定义了以下几个级别(从低到高):NOTSET、DEBUG、INFO、WARNING、ERROR、CRITICAL。因此,logger{39}表示的是WARNING级别,即日志记录器会记录所有WARNING级别及以上的日志信息 --> <!-- %m表示日志消息;%n表示换行符;${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}表示异常信息。如果日志输出中包含异常信息,这个规则将会将其转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!--1. 输出到控制台--> <!-- 定义控制台日志输出的appender,class="ch.qos.logback.core.ConsoleAppender"表示使用Logback框架提供的ConsoleAppender类来输出日志到控制台 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <!-- 定义日志输出级别的过滤器,class="ch.qos.logback.classic.filter.ThresholdFilter"表示使用Logback框架提供的ThresholdFilter类来过滤日志输出,<level>debug</level>表示只输出debug级别及以上的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>debug</level> </filter> <encoder> <!-- ${CONSOLE_LOG_PATTERN}表示控制台日志输出格式,UTF-8表示编码格式 --> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender> <!--2. 输出到文档--> <!-- 2.1 level为 DEBUG 日志,时间滚动输出 --> <!-- 定义文件日志输出的appender,class="ch.qos.logback.core.rolling.RollingFileAppender"表示使用Logback框架提供的RollingFileAppender类来输出日志到文件 --> <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_debug.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <!-- 定义日志文件滚动策略的标签,class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"表示使用Logback框架提供的TimeBasedRollingPolicy类来定义日志文件的滚动策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志归档 --> <!-- 定义日志文件名的模式。在这个模式中,${logging.path}表示日志文件的路径,%d{yyyy-MM-dd}表示日期格式,%i表示文件索引 --> <fileNamePattern>${logging.path}/${serverName}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 定义日志文件滚动策略的标签,class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"表示使用Logback框架提供的SizeAndTimeBasedFNATP类来定义日志文件的滚动策略,<maxFileSize>100MB</maxFileSize>表示日志文件的最大大小为100MB。这个滚动策略通常用于按照时间和文件大小滚动日志文件,以便更好地管理日志文件的大小和数量 --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录debug级别的 --> <!-- 定义日志输出级别的过滤器。在这个过滤器中,class="ch.qos.logback.classic.filter.LevelFilter"表示使用Logback框架提供的LevelFilter类来过滤日志输出,<level>debug</level>表示只输出debug级别及以上的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>debug</level> <!-- <onMatch>ACCEPT</onMatch>表示如果日志事件与过滤器匹配,则接受该事件,<onMismatch>DENY</onMismatch>表示如果日志事件与过滤器不匹配,则拒绝该事件 --> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.2 level为 INFO 日志,时间滚动输出 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_info.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 天天日志归档路径以及格式 --> <fileNamePattern>${logging.path}/${serverName}/web-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>info</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.3 level为 WARN 日志,时间滚动输出 --> <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_warn.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logging.path}/${serverName}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录warn级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.4 level为 ERROR 日志,时间滚动输出 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_error.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logging.path}/${serverName}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录ERROR级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 4.1 开发环境:打印控制台--> <!-- 用于在Spring Boot应用程序中配置日志记录的标签。在这个标签中,name="dev"表示这个配置文件只在dev环境中生效,<logger name="com.myClass.controller" level="debug"/>表示为com.myClass.controller(根据业务修改)这个包下的类配置日志输出级别为debug --> <!-- <springProfile name="dev">--> <!-- <logger name="com.myClass.controller" level="debug"/>--> <!-- </springProfile>--> <!-- 用于配置日志输出的标签。在这个标签中,level="info"表示日志输出级别为info,<appender-ref ref="CONSOLE"/>、<appender-ref ref="DEBUG_FILE"/>、<appender-ref ref="INFO_FILE"/>、<appender-ref ref="WARN_FILE"/>、<appender-ref ref="ERROR_FILE"/>表示将日志输出到不同的appender中,分别为控制台、debug文件、info文件、warn文件和error文件 --> <root level="info"> <appender-ref ref="CONSOLE"/> <appender-ref ref="DEBUG_FILE"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="WARN_FILE"/> <appender-ref ref="ERROR_FILE"/> </root> </configuration> hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/controller/DownStorageCageDetailsController.java
@@ -12,7 +12,7 @@ import java.util.List; import java.util.Map; @Api(tags = "缓存") @Api(description = "缓存") @RestController @RequestMapping("/downStorage") public class DownStorageCageDetailsController { hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/entity/DownStorageCage.java
@@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -18,7 +18,7 @@ * @author zhoush * @since 2024-03-27 */ @ApiModel(description = "<p> 缓存</p>") @Api(description = "缓存") @Data @EqualsAndHashCode(callSuper = false) public class DownStorageCage implements Serializable { hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/controller/DownWorkstationController.java
@@ -25,7 +25,7 @@ */ @RestController @Api(tags = "工位") @Api(description = "工位") @RequestMapping("/downWorkStation") public class DownWorkstationController { hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/logback-spring.xml
New file @@ -0,0 +1,170 @@ <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds"> <!-- logger上下文名称(根据业务修改) --> <contextName>unLoadGlass</contextName> <!-- 定义了一个名为serverName的属性,它的值来自于logging.file.name,如果没有找到该属性默认为MyServerName(根据业务修改) --> <springProperty name="serverName" source="logging.file.name" defaultValue="unLoadGlass"/> <springProperty name="logging.path" source="logging.file.path" defaultValue="././logs/"/> <!-- 彩色日志依赖的渲染类 --> <!-- 定义了一个名为clr的转换规则,它使用org.springframework.boot.logging.logback.ColorConverter类进行转换,这个元素通常用于将日志输出中的文本着色,以便更容易地区分不同的日志级别或其他信息 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <!-- WhitespaceThrowableProxyConverter和ExtendedWhitespaceThrowableProxyConverter都是用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示的类。它们之间的区别在于,ExtendedWhitespaceThrowableProxyConverter在输出异常信息时会包含更多的详细信息,例如异常的类名、方法名和行号等 --> <!-- 定义了一个名为wex的转换规则,它使用org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter类进行转换,这个元素通常用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <!-- 定义了一个名为wEx的转换规则,它使用org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter类进行转换,这个元素通常用于将异常信息转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- 彩色日志格式 --> <!-- value值是日志输出模板, :-是属性名和其默认值之间的分隔符,作用与:相同 --> <!-- 定义日志输出格式的转换规则,%d{yyyy-MM-dd HH:mm:ss.SSS}表示日期和时间,%clr表示将输出文本着色,{faint}表示使用淡色 --> <!-- %5p表示日志级别输出右对齐,左边以空格填充 --> <!-- ${PID:- }表示进程ID,%clr表示将输出文本着色,{magenta}表示使用洋红色 --> <!-- 表示一个分隔符 --> <!-- %t:显示产生该日志的线程名;%15:若字符长度小于15,则左边用空格填充;%.15:若字符长度超过15,截去多余字符 --> <!-- %-40:若字符长度小于40,则右边用空格填充;%.40:若字符长度超过40,截去多余字符;logger{39}对应的是“logging.WARNING”级别。具体来说,Python的logging模块定义了以下几个级别(从低到高):NOTSET、DEBUG、INFO、WARNING、ERROR、CRITICAL。因此,logger{39}表示的是WARNING级别,即日志记录器会记录所有WARNING级别及以上的日志信息 --> <!-- %m表示日志消息;%n表示换行符;${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}表示异常信息。如果日志输出中包含异常信息,这个规则将会将其转换为字符串,并将其中的换行符替换为空格,以便更容易地在日志输出中显示 --> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!--1. 输出到控制台--> <!-- 定义控制台日志输出的appender,class="ch.qos.logback.core.ConsoleAppender"表示使用Logback框架提供的ConsoleAppender类来输出日志到控制台 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <!-- 定义日志输出级别的过滤器,class="ch.qos.logback.classic.filter.ThresholdFilter"表示使用Logback框架提供的ThresholdFilter类来过滤日志输出,<level>debug</level>表示只输出debug级别及以上的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>debug</level> </filter> <encoder> <!-- ${CONSOLE_LOG_PATTERN}表示控制台日志输出格式,UTF-8表示编码格式 --> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender> <!--2. 输出到文档--> <!-- 2.1 level为 DEBUG 日志,时间滚动输出 --> <!-- 定义文件日志输出的appender,class="ch.qos.logback.core.rolling.RollingFileAppender"表示使用Logback框架提供的RollingFileAppender类来输出日志到文件 --> <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_debug.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <!-- 定义日志文件滚动策略的标签,class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"表示使用Logback框架提供的TimeBasedRollingPolicy类来定义日志文件的滚动策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志归档 --> <!-- 定义日志文件名的模式。在这个模式中,${logging.path}表示日志文件的路径,%d{yyyy-MM-dd}表示日期格式,%i表示文件索引 --> <fileNamePattern>${logging.path}/${serverName}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 定义日志文件滚动策略的标签,class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"表示使用Logback框架提供的SizeAndTimeBasedFNATP类来定义日志文件的滚动策略,<maxFileSize>100MB</maxFileSize>表示日志文件的最大大小为100MB。这个滚动策略通常用于按照时间和文件大小滚动日志文件,以便更好地管理日志文件的大小和数量 --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录debug级别的 --> <!-- 定义日志输出级别的过滤器。在这个过滤器中,class="ch.qos.logback.classic.filter.LevelFilter"表示使用Logback框架提供的LevelFilter类来过滤日志输出,<level>debug</level>表示只输出debug级别及以上的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>debug</level> <!-- <onMatch>ACCEPT</onMatch>表示如果日志事件与过滤器匹配,则接受该事件,<onMismatch>DENY</onMismatch>表示如果日志事件与过滤器不匹配,则拒绝该事件 --> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.2 level为 INFO 日志,时间滚动输出 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_info.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 天天日志归档路径以及格式 --> <fileNamePattern>${logging.path}/${serverName}/web-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>info</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.3 level为 WARN 日志,时间滚动输出 --> <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_warn.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logging.path}/${serverName}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录warn级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 2.4 level为 ERROR 日志,时间滚动输出 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${logging.path}/${serverName}/web_error.log</file> <!--日志文档输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logging.path}/${serverName}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文档只记录ERROR级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 4.1 开发环境:打印控制台--> <!-- 用于在Spring Boot应用程序中配置日志记录的标签。在这个标签中,name="dev"表示这个配置文件只在dev环境中生效,<logger name="com.myClass.controller" level="debug"/>表示为com.myClass.controller(根据业务修改)这个包下的类配置日志输出级别为debug --> <!-- <springProfile name="dev">--> <!-- <logger name="com.myClass.controller" level="debug"/>--> <!-- </springProfile>--> <!-- 用于配置日志输出的标签。在这个标签中,level="info"表示日志输出级别为info,<appender-ref ref="CONSOLE"/>、<appender-ref ref="DEBUG_FILE"/>、<appender-ref ref="INFO_FILE"/>、<appender-ref ref="WARN_FILE"/>、<appender-ref ref="ERROR_FILE"/>表示将日志输出到不同的appender中,分别为控制台、debug文件、info文件、warn文件和error文件 --> <root level="info"> <appender-ref ref="CONSOLE"/> <appender-ref ref="DEBUG_FILE"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="WARN_FILE"/> <appender-ref ref="ERROR_FILE"/> </root> </configuration> hangzhoumesParent/moduleService/pom.xml
@@ -56,11 +56,11 @@ </dependency> <!--开发者工具--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <!-- <dependency>--> <!-- <groupId>org.springframework.boot</groupId>--> <!-- <artifactId>spring-boot-devtools</artifactId>--> <!-- <optional>true</optional>--> <!-- </dependency>--> <dependency> <groupId>org.springframework.boot</groupId>