李学强 6 mesiacov pred
rodič
commit
d532e035e1
23 zmenil súbory, kde vykonal 539 pridanie a 48 odobranie
  1. 184 0
      AGENTS.md
  2. 86 0
      docker-compose.yml
  3. 8 0
      lxq-admin/pom.xml
  4. 0 3
      lxq-admin/src/main/java/com/lxq/admin/biz/LxqAdminApplication.java
  5. 31 0
      lxq-admin/src/main/java/com/lxq/admin/biz/config/FilterConfig.java
  6. 75 0
      lxq-admin/src/main/java/com/lxq/admin/biz/controller/ImageCodeController.java
  7. 107 0
      lxq-admin/src/main/java/com/lxq/admin/biz/filter/ImageCodeFilter.java
  8. 1 0
      lxq-admin/src/main/java/com/lxq/admin/biz/security/LxqUserDetailsServiceImpl.java
  9. 2 0
      lxq-admin/src/main/resources/application.yml
  10. 11 11
      lxq-common/lxq-common-core/src/main/java/com/lxq/common/core/constant/CacheConstants.java
  11. 5 5
      lxq-common/lxq-common-mq/src/main/java/com/lxq/common/mq/config/RabbitConfiguration.java
  12. 2 2
      lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/annotation/EnableAuthResourceServer.java
  13. 1 1
      lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/AuthResourceServerConfiguration.java
  14. 2 2
      lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/LxqBearerTokenExtractor.java
  15. 1 1
      lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/LxqClientCredentialsOAuth2AuthenticatedPrincipal.java
  16. 1 1
      lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/LxqCustomOAuth2AccessTokenResponseHttpMessageConverter.java
  17. 2 2
      lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/LxqCustomOpaqueTokenIntrospector.java
  18. 4 4
      lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/LxqResourceServerAutoConfiguration.java
  19. 7 7
      lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/LxqResourceServerConfiguration.java
  20. 2 2
      lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/support/core/LxqDaoAuthenticationProvider.java
  21. 1 1
      lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/support/handler/LxqAuthenticationFailureEventHandler.java
  22. 3 3
      lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/support/handler/LxqAuthenticationSuccessEventHandler.java
  23. 3 3
      lxq-system/src/main/resources/application-dev.yml

+ 184 - 0
AGENTS.md

@@ -0,0 +1,184 @@
+# AGENTS.md - Development Guidelines for LXQ Spring Boot Application
+
+## Project Overview
+Java Spring Boot enterprise application (v3.5.9, Java 21) with microservices architecture. Multi-module Maven project using MyBatis-Plus, Redis, RocketMQ, OAuth2, and Swagger for API documentation.
+
+## Development Environment Setup
+```bash
+# Start required services with Docker Compose
+docker-compose up -d lxq-mysql lxq-redis
+
+# Install Maven if not available (required for build commands)
+# Download from: https://maven.apache.org/download.cgi
+
+# IDE Configuration
+# Install Spring Java Format IntelliJ plugin:
+# https://repo1.maven.org/maven2/io/spring/javaformat/spring-javaformat-intellij-idea-plugin
+```
+
+## Build & Package Commands
+```bash
+# Standard Maven commands (when Maven available)
+mvn clean compile                    # Compile the project
+mvn clean package                   # Package the application
+mvn clean install                   # Install to local repository
+mvn spring-boot:run                 # Run the application
+mvn test                            # Run all tests
+mvn spring-javaformat:apply        # Format code (MANDATORY before commits)
+
+# Environment-specific builds
+mvn clean package -Pdev            # Development build (default)
+mvn clean package -Ptest           # Test environment build
+mvn clean package -Pprod           # Production build
+
+# Run single test (when tests exist)
+mvn test -Dtest=ClassName#methodName
+mvn test -Dtest=ClassName
+
+# Code formatting validation (runs automatically during validate phase)
+mvn validate                        # Check code format
+```
+
+## Code Style & Formatting Guidelines
+- **MANDATORY**: Spring Java Format plugin (v0.0.39) - must run before commits
+- **Package naming**: `com.lxq.*` convention (e.g., `com.lxq.admin.biz.controller`)
+- **Import organization**: Standard Java conventions, no wildcard imports
+- **Class naming**: PascalCase (e.g., `SysUserController`, `UserDTO`)
+- **Method naming**: camelCase (e.g., `getUserById`, `saveUser`)
+- **Constants**: UPPER_SNAKE_CASE (e.g., `COMMON_STATUS`, `DEFAULT_PAGE_SIZE`)
+- **Variables**: camelCase
+- **Lombok usage**: `@Data`, `@AllArgsConstructor`, `@Slf4j` for boilerplate reduction
+- **Line endings**: Use LF (Unix style)
+- **Indentation**: 4 spaces (no tabs)
+- **Max line length**: 120 characters
+
+## Architecture & Layer Patterns
+```
+com.lxq.admin.biz.controller/    # REST endpoints (@RestController)
+com.lxq.system.biz.service/      # Business logic (extends IService<Entity>)
+com.lxq.system.biz.mapper/       # MyBatis data access (extends BaseMapper<Entity>)
+com.lxq.system.biz.model/        # Entity classes (@TableName)
+com.lxq.system.biz.domain.dto/   # Data transfer objects (@Data, @Schema)
+com.lxq.system.biz.domain.vo/    # View objects for API responses
+```
+
+**Layer Structure**: Controller → Service → Mapper → Domain
+- **Controllers**: Use `@RestController`, `@RequestMapping`, `@AllArgsConstructor`
+- **Services**: Extend `IService<Entity>` from MyBatis-Plus
+- **Mappers**: Extend `BaseMapper<Entity>` from MyBatis-Plus
+- **DTOs**: Separate from entities, extend entity when appropriate
+- **VOs**: For API responses, use Lombok `@Data`
+
+## API Documentation Standards
+- **Framework**: Swagger/OpenAPI 3 with Knife4j v4.3.0
+- **Required Annotations**:
+  ```java
+  @Tag(description = "module", name = "description")  // On class
+  @Operation(summary = "action", description = "details")  // On methods
+  @SecurityRequirement(name = HttpHeaders.AUTHORIZATION)  // For secured APIs
+  ```
+- **Parameter Documentation**: Use `@ParameterObject` for query parameters
+- **Response Documentation**: Use `@Schema(description = "...")` on DTOs/VOs
+- **Swagger UI**: Available at `/doc.html` when `swagger.enabled=true`
+- **Example**: See `SysUserController.java` for complete annotation patterns
+
+## Database & ORM Guidelines
+- **ORM**: MyBatis-Plus v3.5.15 with Spring Boot 3 integration
+- **Entity Conventions**:
+  ```java
+  @TableName("sys_user")  // Table mapping
+  @TableId(type = IdType.AUTO)  // Auto ID generation
+  // Logical deletion: del_flag (0=not deleted, 1=deleted)
+  ```
+- **Mapper Patterns**: Extend `BaseMapper<Entity>` from MyBatis-Plus
+- **Service Patterns**: Extend `IService<Entity>` from MyBatis-Plus
+- **Dynamic Datasource**: Use `@DS("datasource_name")` annotation
+- **Query Builder**: Use `Wrappers.<Entity>query().lambda()` for type-safe queries
+- **Join Queries**: Use MyBatis-Plus-Join for complex queries
+- **Logical Deletion**: Automatically handled (del_flag: 0/1)
+
+## Security & Authorization
+- **Framework**: Spring Authorization Server v1.1.2 with OAuth2
+- **Security Annotations**:
+  ```java
+  @PreAuthorize("@pms.hasPermission('permission_key')")  // Method security
+  @Inner  // Internal APIs (bypass OAuth2)
+  @EnableLoginResourceServer / @EnableAuthResourceServer  // Configuration
+  ```
+- **Security Utilities**: `SecurityUtils.getUser()` for current user info
+- **Permission Format**: `module_action` (e.g., `sys_user_add`, `sys_user_del`)
+- **Token Handling**: Automatic via resource server configuration
+- **Public Endpoints**: Configure in `security.oauth2.ignore.urls`
+
+## Testing Guidelines
+- **Framework**: Spring Boot Test (`spring-boot-starter-test`)
+- **Test Structure**: Create `src/test/java` following main package structure
+- **Test Naming**: `*Test.java` for test classes (e.g., `SysUserServiceTest`)
+- **Key Annotations**: `@SpringBootTest`, `@Test`, `@MockBean`, `@ExtendWith`
+- **Single Test Execution**: `mvn test -Dtest=ClassName#methodName`
+- **Integration Tests**: Use `@SpringBootTest` with test configuration
+- **Service Testing**: Mock dependencies with `@MockBean`
+- **Note**: No test directories currently exist - create following package structure
+
+## Error Handling & Logging
+- **Response Wrapper**: Always return `R<T>` from controllers
+  ```java
+  return R.ok(data);           // Success response
+  return R.failed("error");    // Error response
+  return R.failed(errorEnum);  // Error with enum
+  ```
+- **Logging**: Use `@SysLog("operation description")` on service methods
+- **Exception Handling**: Use global exception handler with `@RestControllerAdvice`
+- **Logging Framework**: SLF4J with `@Slf4j` annotation
+- **Audit Trail**: `@SysLog` automatically logs business operations
+
+## Configuration Management
+- **Main Config**: `application.yml` in admin module
+- **Environment Files**: `application-{profile}.yml` (dev/test/prod)
+- **Property Injection**: Use `@ConfigurationProperties`
+- **Profile Activation**: `spring.profiles.active=@profiles.active@`
+- **Database Config**: Dynamic datasource with primary/main setup
+- **Swagger Config**: Customizable via `swagger.*` properties
+- **Server Config**: Port 8080, context path `/v1/admin`
+
+## Common Patterns & Examples
+
+### Controller Method Template
+```java
+@SysLog("操作描述")
+@PostMapping("/action")
+@PreAuthorize("@pms.hasPermission('module_action')")
+@Operation(summary = "操作", description = "详细描述")
+public R<ResultVO> action(@Valid @RequestBody RequestDTO request) {
+    return R.ok(service.action(request));
+}
+```
+
+### DTO Template
+```java
+@Data
+@Schema(description = "对象描述")
+@EqualsAndHashCode(callSuper = true)
+public class EntityDTO extends Entity {
+    @Schema(description = "字段描述")
+    private String field;
+}
+```
+
+### Query Template
+```java
+Entity entity = service.getOne(Wrappers.<Entity>query()
+    .lambda()
+    .eq(Entity::getField, value)
+    .orderByDesc(Entity::getCreateTime));
+```
+
+## Key Requirements Summary
+1. **ALWAYS** run `mvn spring-javaformat:apply` before commits
+2. **ALWAYS** return `R<T>` from controller methods
+3. **ALWAYS** use `@PreAuthorize` for security checks
+4. **ALWAYS** document APIs with Swagger annotations
+5. **FOLLOW** Controller → Service → Mapper pattern
+6. **USE** DTOs for input, VOs for output
+7. **APPLY** `@SysLog` for business operations
+8. **USE** MyBatis-Plus Wrappers for type-safe queries

+ 86 - 0
docker-compose.yml

@@ -0,0 +1,86 @@
+version: '3'
+services:
+
+  lxq-mysql:
+    image: mysql:8.0.32
+    environment:
+      MYSQL_ROOT_HOST: "%"
+      MYSQL_ROOT_PASSWORD: root
+    restart: always
+    container_name: lxq-mysql
+    ports:
+      - 3306:3306
+    volumes:
+      - ./data/mysql/conf/my.cnf:/etc/my.cnf
+      - ./data/mysql/logs:/logs
+      - ./data/mysql/data:/var/lib/mysql
+    networks:
+      - lxq_cloud_network
+
+
+  lxq-redis:
+    image: redis:7.0.6
+    ports:
+      - 6379:6379
+    restart: always
+    container_name: lxq-redis
+    hostname: lxq-redis
+    networks:
+      - lxq_cloud_network
+
+
+  lxq-admin:
+    build:
+      context: ./lxq-admin
+    restart: always
+    container_name: lxq-admin
+    hostname: lxq-admin
+    image: lxq-admin
+    volumes:
+      - ./logs/lxq-admin:/lxq-admin/logs
+    networks:
+      - lxq_cloud_network
+
+
+  lxq-mongo:
+    image: mongo:6.0.3
+    ports:
+      - 27017:27017
+    restart: always
+    container_name: lxq-mongo
+    hostname: lxq-mongo
+    environment:
+      TZ: Asia/Shanghai
+      MONGO_INITDB_ROOT_USERNAME: root
+      MONGO_INITDB_ROOT_PASSWORD: root
+    command: mongod --auth
+    volumes:
+      # 数据目录  挂载出来后,即使删除容器,再用该挂载数据与docker-compose.yml文件启动容器,即可恢复到原来的数据以及用户信息
+      - ./data/mongodb/db:/data/db
+      - ./data/mongodb/log:/var/log/mongodb
+      - ./data/mongodb/config:/etc/mongo
+      - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime       #设置系统时区
+      - /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone  #设置时区
+    networks:
+      - lxq_cloud_network
+
+  lxq-rabbitmq:
+    image: rabbitmq:3.12.8
+    container_name: lxq-rabbitmq
+    restart: always
+    volumes:
+      - "/usr/share/zoneinfo/Asia/Shanghai:/etc/localtime"        #设置系统时区
+      - "/usr/share/zoneinfo/Asia/Shanghai:/etc/timezone"  #设置时区
+    ports:
+      - 5672:5672
+      - 15672:15672
+    environment:
+      - RABBITMQ_DEFAULT_USER=admin
+      - RABBITMQ_DEFAULT_PASS=admin
+    networks:
+      - lxq_cloud_network
+
+
+networks:
+  lxq_cloud_network:
+    name: lxq_cloud_network

+ 8 - 0
lxq-admin/pom.xml

@@ -15,10 +15,18 @@
 
     <dependencies>
 
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-captcha</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.lxq</groupId>
             <artifactId>lxq-system</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat.embed</groupId>
+            <artifactId>tomcat-embed-core</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 0 - 3
lxq-admin/src/main/java/com/lxq/admin/biz/LxqAdminApplication.java

@@ -2,9 +2,7 @@ package com.lxq.admin.biz;
 
 import com.lxq.common.security.annotation.EnableAuthResourceServer;
 import com.lxq.common.security.annotation.EnableLoginResourceServer;
-import com.lxq.common.swagger.annotation.EnablelxqDoc;
 import org.springframework.boot.SpringApplication;
-import org.springframework.boot.WebApplicationType;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.scheduling.annotation.EnableAsync;
 
@@ -17,7 +15,6 @@ import org.springframework.scheduling.annotation.EnableAsync;
 @SpringBootApplication
 @EnableLoginResourceServer
 @EnableAuthResourceServer
-@EnablelxqDoc(value = "admin")
 @EnableAsync
 public class LxqAdminApplication {
 

+ 31 - 0
lxq-admin/src/main/java/com/lxq/admin/biz/config/FilterConfig.java

@@ -0,0 +1,31 @@
+package com.lxq.admin.biz.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.lxq.admin.biz.filter.ImageCodeFilter;
+import com.lxq.common.core.constant.SecurityConstants;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.core.RedisTemplate;
+
+/**
+ * 过滤器配置
+ * @author lixueqiang
+ */
+@Configuration
+public class FilterConfig {
+
+    @Value("${spring.profiles.active}")
+    private String active;
+
+    @Bean
+    public FilterRegistrationBean<ImageCodeFilter> imageCodeFilterRegistration(RedisTemplate<String, Object> redisTemplate, ObjectMapper objectMapper) {
+
+        FilterRegistrationBean<ImageCodeFilter> registration = new FilterRegistrationBean<>();
+        registration.setFilter(new ImageCodeFilter(redisTemplate, objectMapper, active));
+        registration.addUrlPatterns(SecurityConstants.OAUTH_TOKEN_URL);
+        registration.setOrder(Integer.MIN_VALUE);
+        return registration;
+    }
+}

+ 75 - 0
lxq-admin/src/main/java/com/lxq/admin/biz/controller/ImageCodeController.java

@@ -0,0 +1,75 @@
+package com.lxq.admin.biz.controller;
+
+
+import cn.hutool.captcha.CaptchaUtil;
+import cn.hutool.captcha.LineCaptcha;
+import cn.hutool.captcha.generator.RandomGenerator;
+import cn.hutool.core.util.StrUtil;
+import com.lxq.common.core.constant.CacheConstants;
+import com.lxq.common.core.constant.SecurityConstants;
+import com.lxq.common.core.exception.GlobalCustomerException;
+import com.lxq.common.security.annotation.Inner;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.http.MediaType;
+import org.springframework.util.FastByteArrayOutputStream;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 图形验证码
+ * @author lixueqiang
+ */
+@RequiredArgsConstructor
+@RequestMapping("/code")
+@RestController
+public class ImageCodeController {
+
+
+    private final RedisTemplate<String, Object> redisTemplate;
+
+    private static final Integer DEFAULT_IMAGE_WIDTH = 100;
+
+    private static final Integer DEFAULT_IMAGE_HEIGHT = 40;
+
+    /**
+     * 获取验证码
+     * @param randomStr 随机数
+     */
+    @Inner(value = false)
+    @GetMapping()
+    public void getImageCode(@RequestParam("randomStr") String randomStr, HttpServletResponse response) {
+
+        // 生成验证码
+        RandomGenerator randomGenerator = new RandomGenerator("0123456789", 4);
+        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT);
+        lineCaptcha.setGenerator(randomGenerator);
+
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        if(StrUtil.isNotBlank(randomStr)){
+            redisTemplate.opsForValue()
+                    .set(CacheConstants.DEFAULT_CODE_KEY + randomStr, lineCaptcha.getCode(), SecurityConstants.CODE_TIME,
+                            TimeUnit.SECONDS);
+        }
+        try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()) {
+            // 生成图片数据
+            lineCaptcha.write(os);
+
+            // 写入响应流
+            response.getOutputStream().write(os.toByteArray());
+            response.setContentType(MediaType.IMAGE_PNG_VALUE);
+            response.getOutputStream().flush();
+        } catch (IOException e) {
+            throw new GlobalCustomerException("生成验证码失败");
+        }
+    }
+
+
+}

+ 107 - 0
lxq-admin/src/main/java/com/lxq/admin/biz/filter/ImageCodeFilter.java

@@ -0,0 +1,107 @@
+package com.lxq.admin.biz.filter;
+
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.lxq.common.core.constant.CacheConstants;
+import com.lxq.common.core.constant.SecurityConstants;
+import com.lxq.common.core.constant.enums.ErrorTypeEnum;
+import com.lxq.common.core.exception.ValidateCodeException;
+import com.lxq.common.core.util.R;
+import io.netty.util.CharsetUtil;
+import jakarta.servlet.*;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.Header;
+import org.apache.http.entity.ContentType;
+import org.apache.tomcat.util.http.HeaderUtil;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.MediaType;
+
+import java.io.IOException;
+import java.util.Objects;
+
+/**
+ * 验证码过滤器
+ * @author lixueqiang
+ */
+@Slf4j
+@RequiredArgsConstructor
+public class ImageCodeFilter implements Filter {
+
+    private final RedisTemplate<String, Object> redisTemplate;
+
+    private final ObjectMapper objectMapper;
+
+    private final String active;
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+            throws IOException, ServletException {
+        HttpServletRequest httpRequest = (HttpServletRequest) request;
+        HttpServletResponse httpResponse = (HttpServletResponse) response;
+//        if("dev".equals(active) || "test".equals(active)){
+//            chain.doFilter(request, response);
+//            return;
+//        }
+        if (isRefreshTokenRequest(httpRequest)) {
+            chain.doFilter(request, response);
+            return;
+        }
+        try {
+            checkCode(httpRequest);
+        }catch (ValidateCodeException e){
+            handleException(e.getMessage(), httpResponse);
+            return;
+        }
+        chain.doFilter(request, response);
+    }
+
+    /**
+     * 判断是否为刷新令牌请求
+     * @param request HTTP请求
+     * @return 是否为刷新令牌请求
+     */
+    private boolean isRefreshTokenRequest(HttpServletRequest request) {
+        return CharSequenceUtil.equals(SecurityConstants.REFRESH_TOKEN,
+                request.getParameter("grant_type"));
+    }
+
+    /**
+     * 检查验证码
+     *
+     * @param request HTTP请求
+     * @throws ValidateCodeException 验证码异常
+     */
+    @SneakyThrows
+    private void checkCode(HttpServletRequest request) {
+        String code = request.getParameter("code");
+
+        if (CharSequenceUtil.isBlank(code)) {
+            throw new ValidateCodeException(ErrorTypeEnum.VERIFICATION_CODE_IS_EMPTY.getDescription());
+        }
+
+        String randomStr = CharSequenceUtil.blankToDefault(request.getParameter("randomStr"),
+                request.getParameter(SecurityConstants.SMS_PARAMETER_NAME));
+
+        String key = CacheConstants.DEFAULT_CODE_KEY + randomStr;
+
+        Object codeObj = redisTemplate.opsForValue().get(key);
+
+        if (ObjectUtil.isEmpty(codeObj) || !Objects.equals(code, codeObj)) {
+            throw new ValidateCodeException(ErrorTypeEnum.VERIFICATION_CODE_IS_ILLEGAL.getDescription());
+        }
+
+        redisTemplate.delete(key);
+    }
+
+    private void handleException(String ex, HttpServletResponse response) throws IOException {
+
+        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        response.setCharacterEncoding(CharsetUtil.UTF_8.name());
+        response.getWriter().write(objectMapper.writeValueAsString(R.failed(ex)));
+    }
+}

+ 1 - 0
lxq-admin/src/main/java/com/lxq/admin/biz/security/LxqUserDetailsServiceImpl.java

@@ -33,6 +33,7 @@ import java.util.*;
  */
 @Slf4j
 @RequiredArgsConstructor
+@Service
 public class LxqUserDetailsServiceImpl implements LxqUserDetailsService {
 
 	private final SysUserService sysUserService;

+ 2 - 0
lxq-admin/src/main/resources/application.yml

@@ -1,5 +1,7 @@
 server:
   port: 8080
+  servlet:
+    context-path: /v1/admin
 
 spring:
   application:

+ 11 - 11
lxq-common/lxq-common-core/src/main/java/com/lxq/common/core/constant/CacheConstants.java

@@ -22,37 +22,37 @@ public interface CacheConstants {
 	/**
 	 * 菜单信息缓存
 	 */
-	String MENU_DETAILS = "lkb_menu_details";
+	String MENU_DETAILS = "lxq_menu_details";
 
 	/**
 	 * 用户信息缓存
 	 */
-	String USER_DETAILS = "lkb_user_details";
+	String USER_DETAILS = "lxq_user_details";
 
 	/**
 	 * 字典信息缓存
 	 */
-	String DICT_DETAILS = "lkb_dict_details";
+	String DICT_DETAILS = "lxq_dict_details";
 
 	/**
 	 * 商品信息缓存
 	 */
-	String GOODS_DETAILS = "lkb_goods_details";
+	String GOODS_DETAILS = "lxq_goods_details";
 
 	/**
 	 * 角色信息缓存
 	 */
-	String ROLE_DETAILS = "lkb_role_details";
+	String ROLE_DETAILS = "lxq_role_details";
 
 	/**
 	 * 小时订单信息缓存
 	 */
-	String ORDER_HOUR_INFO_CACHE = "lkb_order_hour_info_cache:";
+	String ORDER_HOUR_INFO_CACHE = "lxq_order_hour_info_cache:";
 
 	/**
 	 * 活动信息缓存
 	 */
-	String ACTIVITY_TYPE_INFO = "lkb_activity_type_info:";
+	String ACTIVITY_TYPE_INFO = "lxq_activity_type_info:";
 
 	/**
 	 * oauth 客户端信息
@@ -62,10 +62,10 @@ public interface CacheConstants {
 	/**
 	 * 参数缓存
 	 */
-	String PARAMS_DETAILS = "lkb_params_details";
-	String INTERFACE_DETAILS = "lkb_interface_details";
+	String PARAMS_DETAILS = "lxq_params_details";
+	String INTERFACE_DETAILS = "lxq_interface_details";
 
-	String FILE_DETAILS = "lkb_file_details";
+	String FILE_DETAILS = "lxq_file_details";
 
-	String LKB_RISK_RULES = "lkb_risk_rules";
+	String LKB_RISK_RULES = "lxq_risk_rules";
 }

+ 5 - 5
lxq-common/lxq-common-mq/src/main/java/com/lxq/common/mq/config/RabbitConfiguration.java

@@ -35,27 +35,27 @@ public class RabbitConfiguration {
 	/**
 	 * 普通交换机
 	 */
-	public static final String EXCHANGE_DIRECT_RANCH ="lkb_direct_ranch";
+	public static final String EXCHANGE_DIRECT_RANCH ="lxq_direct_ranch";
 
 	/**
 	 * 死信交换机
 	 */
-	public static final String EXCHANGE_DEAD_RANCH ="lkb_dead_ranch";
+	public static final String EXCHANGE_DEAD_RANCH ="lxq_dead_ranch";
 
 	/**
 	 * 广播交换机
 	 */
-	public static final String EXCHANGE_FANOUT_RANCH ="lkb_fanout_ranch";
+	public static final String EXCHANGE_FANOUT_RANCH ="lxq_fanout_ranch";
 
 	/**
 	 * 路由模式交换机
 	 */
-	public static final String EXCHANGE_TOPIC_RANCH ="lkb_topic_ranch";
+	public static final String EXCHANGE_TOPIC_RANCH ="lxq_topic_ranch";
 
 	/**
 	 * 延时交换机
 	 */
-	public static final String EXCHANGE_DELAY_RANCH="lkb_delay_ranch";
+	public static final String EXCHANGE_DELAY_RANCH="lxq_delay_ranch";
 
 	/** 注入延迟交换机Bean **/
 	@Autowired

+ 2 - 2
lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/annotation/EnableAuthResourceServer.java

@@ -1,7 +1,7 @@
 package com.lxq.common.security.annotation;
 
 import com.lxq.common.security.component.AuthResourceServerConfiguration;
-import com.lxq.common.security.component.SkyResourceServerAutoConfiguration;
+import com.lxq.common.security.component.LxqResourceServerAutoConfiguration;
 import org.springframework.context.annotation.Import;
 
 import java.lang.annotation.*;
@@ -17,7 +17,7 @@ import java.lang.annotation.*;
 @Inherited
 @Target({ ElementType.TYPE })
 @Retention(RetentionPolicy.RUNTIME)
-@Import({ SkyResourceServerAutoConfiguration.class, AuthResourceServerConfiguration.class })
+@Import({ LxqResourceServerAutoConfiguration.class, AuthResourceServerConfiguration.class })
 public @interface EnableAuthResourceServer {
 
 }

+ 1 - 1
lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/AuthResourceServerConfiguration.java

@@ -31,7 +31,7 @@ public class AuthResourceServerConfiguration {
 
 	private final PermitAllUrlProperties permitAllUrl;
 
-	private final SkyBearerTokenExtractor skyBearerTokenExtractor;
+	private final LxqBearerTokenExtractor skyBearerTokenExtractor;
 
 	private final OpaqueTokenIntrospector customOpaqueTokenIntrospector;
 

+ 2 - 2
lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/SkyBearerTokenExtractor.java → lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/LxqBearerTokenExtractor.java

@@ -18,7 +18,7 @@ import java.util.regex.Pattern;
  * @author 没秃顶的码农
  * @date 2023/10/28
  */
-public class SkyBearerTokenExtractor implements BearerTokenResolver {
+public class LxqBearerTokenExtractor implements BearerTokenResolver {
 
 	private static final Pattern authorizationPattern = Pattern.compile("^Bearer (?<token>[a-zA-Z0-9-:._~+/]+=*)$",
 			Pattern.CASE_INSENSITIVE);
@@ -33,7 +33,7 @@ public class SkyBearerTokenExtractor implements BearerTokenResolver {
 
 	private final PermitAllUrlProperties urlProperties;
 
-	public SkyBearerTokenExtractor(PermitAllUrlProperties urlProperties) {
+	public LxqBearerTokenExtractor(PermitAllUrlProperties urlProperties) {
 		this.urlProperties = urlProperties;
 	}
 

+ 1 - 1
lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/SkyClientCredentialsOAuth2AuthenticatedPrincipal.java → lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/LxqClientCredentialsOAuth2AuthenticatedPrincipal.java

@@ -14,7 +14,7 @@ import java.util.Map;
  * credential 支持客户端模式的用户存储
  */
 @RequiredArgsConstructor
-public class SkyClientCredentialsOAuth2AuthenticatedPrincipal implements OAuth2AuthenticatedPrincipal {
+public class LxqClientCredentialsOAuth2AuthenticatedPrincipal implements OAuth2AuthenticatedPrincipal {
 
 	private final Map<String, Object> attributes;
 

+ 1 - 1
lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/SkyCustomOAuth2AccessTokenResponseHttpMessageConverter.java → lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/LxqCustomOAuth2AccessTokenResponseHttpMessageConverter.java

@@ -22,7 +22,7 @@ import java.util.Map;
  * @author 没秃顶的码农
  * @date 2023/6/28
  */
-public class SkyCustomOAuth2AccessTokenResponseHttpMessageConverter
+public class LxqCustomOAuth2AccessTokenResponseHttpMessageConverter
 		extends OAuth2AccessTokenResponseHttpMessageConverter {
 
 	private static final ParameterizedTypeReference<Map<String, Object>> STRING_OBJECT_MAP = new ParameterizedTypeReference<>() {

+ 2 - 2
lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/SkyCustomOpaqueTokenIntrospector.java → lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/LxqCustomOpaqueTokenIntrospector.java

@@ -25,7 +25,7 @@ import java.util.Objects;
  */
 @Slf4j
 @RequiredArgsConstructor
-public class SkyCustomOpaqueTokenIntrospector implements OpaqueTokenIntrospector {
+public class LxqCustomOpaqueTokenIntrospector implements OpaqueTokenIntrospector {
 
 	private final OAuth2AuthorizationService authorizationService;
 
@@ -42,7 +42,7 @@ public class SkyCustomOpaqueTokenIntrospector implements OpaqueTokenIntrospector
 
 		// 客户端模式默认返回
 		if (AuthorizationGrantType.CLIENT_CREDENTIALS.equals(oldAuthorization.getAuthorizationGrantType())) {
-			return new SkyClientCredentialsOAuth2AuthenticatedPrincipal(oldAuthorization.getAttributes(),
+			return new LxqClientCredentialsOAuth2AuthenticatedPrincipal(oldAuthorization.getAttributes(),
 					AuthorityUtils.NO_AUTHORITIES, oldAuthorization.getPrincipalName());
 		}
 

+ 4 - 4
lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/SkyResourceServerAutoConfiguration.java → lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/LxqResourceServerAutoConfiguration.java

@@ -13,7 +13,7 @@ import org.springframework.security.oauth2.server.resource.introspection.OpaqueT
  */
 @RequiredArgsConstructor
 @EnableConfigurationProperties(PermitAllUrlProperties.class)
-public class SkyResourceServerAutoConfiguration {
+public class LxqResourceServerAutoConfiguration {
 
 	/**
 	 * 鉴权具体的实现逻辑
@@ -30,8 +30,8 @@ public class SkyResourceServerAutoConfiguration {
 	 * @return BearerTokenExtractor
 	 */
 	@Bean
-	public SkyBearerTokenExtractor skyBearerTokenExtractor(PermitAllUrlProperties urlProperties) {
-		return new SkyBearerTokenExtractor(urlProperties);
+	public LxqBearerTokenExtractor skyBearerTokenExtractor(PermitAllUrlProperties urlProperties) {
+		return new LxqBearerTokenExtractor(urlProperties);
 	}
 
 	/**
@@ -51,7 +51,7 @@ public class SkyResourceServerAutoConfiguration {
 	 */
 	@Bean
 	public OpaqueTokenIntrospector opaqueTokenIntrospector(OAuth2AuthorizationService authorizationService) {
-		return new SkyCustomOpaqueTokenIntrospector(authorizationService);
+		return new LxqCustomOpaqueTokenIntrospector(authorizationService);
 	}
 
 }

+ 7 - 7
lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/component/LxqResourceServerConfiguration.java

@@ -4,9 +4,9 @@ import com.lxq.common.core.constant.SecurityConstants;
 import com.lxq.common.security.support.CustomeOAuth2AccessTokenGenerator;
 import com.lxq.common.security.support.core.CustomeOAuth2TokenCustomizer;
 import com.lxq.common.security.support.core.FormIdentityLoginConfigurer;
-import com.lxq.common.security.support.core.SkyDaoAuthenticationProvider;
-import com.lxq.common.security.support.handler.SkyAuthenticationFailureEventHandler;
-import com.lxq.common.security.support.handler.SkyAuthenticationSuccessEventHandler;
+import com.lxq.common.security.support.core.LxqDaoAuthenticationProvider;
+import com.lxq.common.security.support.handler.LxqAuthenticationFailureEventHandler;
+import com.lxq.common.security.support.handler.LxqAuthenticationSuccessEventHandler;
 import com.lxq.common.security.support.open.OAuth2ResourceOwnerOpenAuthenticationConverter;
 import com.lxq.common.security.support.open.OAuth2ResourceOwnerOpenAuthenticationProvider;
 import com.lxq.common.security.support.password.OAuth2ResourceOwnerPasswordAuthenticationConverter;
@@ -62,10 +62,10 @@ public class LxqResourceServerConfiguration {
 
 		http.with(authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {  // 个性化认证授权端点
 							tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter()) // 注入自定义的授权认证Converter
-									.accessTokenResponseHandler(new SkyAuthenticationSuccessEventHandler()) // 登录成功处理器
-									.errorResponseHandler(new SkyAuthenticationFailureEventHandler());// 登录失败处理器
+									.accessTokenResponseHandler(new LxqAuthenticationSuccessEventHandler()) // 登录成功处理器
+									.errorResponseHandler(new LxqAuthenticationFailureEventHandler());// 登录失败处理器
 						}).clientAuthentication(oAuth2ClientAuthenticationConfigurer -> // 个性化客户端认证
-								oAuth2ClientAuthenticationConfigurer.errorResponseHandler(new SkyAuthenticationFailureEventHandler()))// 处理客户端认证异常
+								oAuth2ClientAuthenticationConfigurer.errorResponseHandler(new LxqAuthenticationFailureEventHandler()))// 处理客户端认证异常
 						.authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面
 								.consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI)), Customizer.withDefaults())
 				.authorizeHttpRequests(authorizeRequests -> authorizeRequests.anyRequest().authenticated());
@@ -158,7 +158,7 @@ public class LxqResourceServerConfiguration {
 				authenticationManager, authorizationService, oAuth2TokenGenerator());
 
 		// 处理 UsernamePasswordAuthenticationToken
-		http.authenticationProvider(new SkyDaoAuthenticationProvider(active));
+		http.authenticationProvider(new LxqDaoAuthenticationProvider(active));
 		// 处理 OAuth2ResourceOwnerPasswordAuthenticationToken
 		http.authenticationProvider(resourceOwnerPasswordAuthenticationProvider);
 		// 处理 OAuth2ResourceOwnerSmsAuthenticationToken

+ 2 - 2
lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/support/core/SkyDaoAuthenticationProvider.java → lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/support/core/LxqDaoAuthenticationProvider.java

@@ -37,7 +37,7 @@ import java.util.function.Supplier;
  * @author 没秃顶的码农
  * @date 2022-06-04
  */
-public class SkyDaoAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {
+public class LxqDaoAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {
 
 
 	/**
@@ -64,7 +64,7 @@ public class SkyDaoAuthenticationProvider extends AbstractUserDetailsAuthenticat
 
 	private final String active;
 
-	public SkyDaoAuthenticationProvider(String active) {
+	public LxqDaoAuthenticationProvider(String active) {
 		this.active = active;
 		setMessageSource(SpringUtil.getBean("securityMessageSource"));
 		setHideUserNotFoundExceptions(false);

+ 1 - 1
lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/support/handler/SkyAuthenticationFailureEventHandler.java → lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/support/handler/LxqAuthenticationFailureEventHandler.java

@@ -22,7 +22,7 @@ import org.springframework.security.web.authentication.AuthenticationFailureHand
  * @date 2022-06-02
  */
 @Slf4j
-public class SkyAuthenticationFailureEventHandler implements AuthenticationFailureHandler {
+public class LxqAuthenticationFailureEventHandler implements AuthenticationFailureHandler {
 
     private final MappingJackson2HttpMessageConverter errorHttpResponseConverter = new MappingJackson2HttpMessageConverter();
 

+ 3 - 3
lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/support/handler/SkyAuthenticationSuccessEventHandler.java → lxq-common/lxq-common-security/src/main/java/com/lxq/common/security/support/handler/LxqAuthenticationSuccessEventHandler.java

@@ -1,6 +1,6 @@
 package com.lxq.common.security.support.handler;
 
-import com.lxq.common.security.component.SkyCustomOAuth2AccessTokenResponseHttpMessageConverter;
+import com.lxq.common.security.component.LxqCustomOAuth2AccessTokenResponseHttpMessageConverter;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.SneakyThrows;
@@ -24,9 +24,9 @@ import java.util.Map;
  * @date 2022-06-02
  */
 @Slf4j
-public class SkyAuthenticationSuccessEventHandler implements AuthenticationSuccessHandler {
+public class LxqAuthenticationSuccessEventHandler implements AuthenticationSuccessHandler {
 
-	private final HttpMessageConverter<OAuth2AccessTokenResponse> accessTokenHttpResponseConverter = new SkyCustomOAuth2AccessTokenResponseHttpMessageConverter();
+	private final HttpMessageConverter<OAuth2AccessTokenResponse> accessTokenHttpResponseConverter = new LxqCustomOAuth2AccessTokenResponseHttpMessageConverter();
 
 	/**
 	 * Called when a user has been successfully authenticated.

+ 3 - 3
lxq-system/src/main/resources/application-dev.yml

@@ -9,7 +9,7 @@ spring:
           driver-class-name: com.mysql.cj.jdbc.Driver
           username: root
           password: root
-          url: jdbc:mysql://kxs-mysql:3306/lkb_merchant?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
+          url: jdbc:mysql://kxs-mysql:3306/lxq_system?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
     #hikari数据源特性配置
     hikari:
       maximum-pool-size: 10 #最大连接数,默认值10.
@@ -28,7 +28,7 @@ spring:
       port: 27017
       username: root
       password: root
-      database: lkb_cloud
+      database: lxq_cloud
       authentication-database: admin
       maxPoolSize: 100
       minPoolSize: 10
@@ -54,7 +54,7 @@ spring:
 file:
   oss:
     bucket-name: laikeba-uni
-    file-prefix: lkb_uni
+    file-prefix: lxq_uni
     endpoint: oss-cn-chengdu.aliyuncs.com
     accessKey: LTAI5tNpieENPDCywXKfXR7a
     secretKey: jwFgbwFNoJ9yLTetsLMehbVdtr7b04