瀏覽代碼

积分管理

Zhangbw 3 月之前
父節點
當前提交
4c6db5daa1

+ 3 - 3
src/main/java/com/yingpai/gupiao/controller/StockSearchController.java

@@ -1,7 +1,7 @@
 package com.yingpai.gupiao.controller;
 
 import com.yingpai.gupiao.domain.dto.StockSearchRequest;
-import com.yingpai.gupiao.domain.dto.StockSuggestionDto;
+import com.yingpai.gupiao.domain.dto.StockSuggestionDTO;
 import com.yingpai.gupiao.domain.vo.ApiResponse;
 import com.yingpai.gupiao.domain.vo.StockDetailResponse;
 import com.yingpai.gupiao.service.StockSearchService;
@@ -39,8 +39,8 @@ public class StockSearchController {
      * GET /v1/stock/suggestion
      */
     @GetMapping("/suggestion")
-    public ApiResponse<List<StockSuggestionDto>> suggestion(@RequestParam String keyword) {
-        List<StockSuggestionDto> list = stockSearchService.getSuggestion(keyword);
+    public ApiResponse<List<StockSuggestionDTO>> suggestion(@RequestParam String keyword) {
+        List<StockSuggestionDTO> list = stockSearchService.getSuggestion(keyword);
         return new ApiResponse<>(0, "success", list);
     }
 }

+ 5 - 5
src/main/java/com/yingpai/gupiao/controller/UserPointsController.java

@@ -6,11 +6,11 @@ import com.yingpai.gupiao.domain.vo.Result;
 import com.yingpai.gupiao.domain.vo.UserPointsVO;
 import com.yingpai.gupiao.service.DictService;
 import com.yingpai.gupiao.service.UserPointsService;
+import com.yingpai.gupiao.util.UserContext;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
-import jakarta.servlet.http.HttpServletRequest;
 import java.time.ZoneId;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -31,8 +31,8 @@ public class UserPointsController {
      * 获取用户积分
      */
     @GetMapping("/balance")
-    public Result<UserPointsVO> getBalance(HttpServletRequest request) {
-        Long userId = (Long) request.getAttribute("userId");
+    public Result<UserPointsVO> getBalance() {
+        Long userId = UserContext.getUserId();
         if (userId == null) {
             return Result.error("用户未登录");
         }
@@ -48,8 +48,8 @@ public class UserPointsController {
      * 获取积分记录
      */
     @GetMapping("/records")
-    public Result<List<PointsRecordVO>> getRecords(HttpServletRequest request) {
-        Long userId = (Long) request.getAttribute("userId");
+    public Result<List<PointsRecordVO>> getRecords() {
+        Long userId = UserContext.getUserId();
         if (userId == null) {
             return Result.error("用户未登录");
         }

+ 0 - 41
src/main/java/com/yingpai/gupiao/domain/dto/LoginDTO.java

@@ -1,41 +0,0 @@
-package com.yingpai.gupiao.domain.dto;
-
-import lombok.Data;
-
-/**
- * 登录请求DTO
- * 用于接收前端登录请求参数
- */
-@Data
-public class LoginDTO {
-    
-    /**
-     * 微信登录code(微信登录时使用)
-     */
-    private String code;
-    
-    /**
-     * 用户昵称(微信登录时使用)
-     */
-    private String nickname;
-    
-    /**
-     * 用户头像URL(微信登录时使用)
-     */
-    private String avatar;
-    
-    /**
-     * 手机号授权code(微信手机号授权时使用)
-     */
-    private String phoneCode;
-    
-    /**
-     * 手机号(手机号登录时使用)
-     */
-    private String phone;
-    
-    /**
-     * 验证码(手机号登录时使用)
-     */
-    private String verifyCode;
-}

+ 3 - 24
src/main/java/com/yingpai/gupiao/domain/dto/StockSearchRequest.java

@@ -1,8 +1,11 @@
 package com.yingpai.gupiao.domain.dto;
 
+import lombok.Data;
+
 /**
  * 前端搜索股票请求体
  */
+@Data
 public class StockSearchRequest {
 
     /**
@@ -19,30 +22,6 @@ public class StockSearchRequest {
      * 每页大小,可选,默认 20,最大 50
      */
     private Integer pageSize;
-
-    public String getKeyword() {
-        return keyword;
-    }
-
-    public void setKeyword(String keyword) {
-        this.keyword = keyword;
-    }
-
-    public Integer getPage() {
-        return page;
-    }
-
-    public void setPage(Integer page) {
-        this.page = page;
-    }
-
-    public Integer getPageSize() {
-        return pageSize;
-    }
-
-    public void setPageSize(Integer pageSize) {
-        this.pageSize = pageSize;
-    }
 }
 
 

+ 14 - 0
src/main/java/com/yingpai/gupiao/domain/dto/StockSuggestionDTO.java

@@ -0,0 +1,14 @@
+package com.yingpai.gupiao.domain.dto;
+
+import lombok.Data;
+
+/**
+ * 股票建议DTO
+ */
+@Data
+public class StockSuggestionDTO {
+
+    private String name;
+    private String code;
+    private String market;
+}

+ 0 - 32
src/main/java/com/yingpai/gupiao/domain/dto/StockSuggestionDto.java

@@ -1,32 +0,0 @@
-package com.yingpai.gupiao.domain.dto;
-
-public class StockSuggestionDto {
-
-    private String name;
-    private String code;
-    private String market;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-
-    public String getMarket() {
-        return market;
-    }
-
-    public void setMarket(String market) {
-        this.market = market;
-    }
-}

+ 0 - 73
src/main/java/com/yingpai/gupiao/domain/dto/WxPhoneResponse.java

@@ -1,73 +0,0 @@
-package com.yingpai.gupiao.domain.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-/**
- * 微信手机号响应DTO
- * 对应微信API返回的手机号数据结构
- */
-@Data
-public class WxPhoneResponse {
-    
-    /**
-     * 错误码
-     */
-    private Integer errcode;
-    
-    /**
-     * 错误信息
-     */
-    private String errmsg;
-    
-    /**
-     * 手机号信息
-     */
-    @JsonProperty("phone_info")
-    private PhoneInfo phoneInfo;
-    
-    /**
-     * 手机号信息内部类
-     */
-    @Data
-    public static class PhoneInfo {
-        /**
-         * 用户绑定的手机号(国外手机号会有区号)
-         */
-        @JsonProperty("phoneNumber")
-        private String phoneNumber;
-        
-        /**
-         * 没有区号的手机号
-         */
-        @JsonProperty("purePhoneNumber")
-        private String purePhoneNumber;
-        
-        /**
-         * 区号
-         */
-        @JsonProperty("countryCode")
-        private String countryCode;
-        
-        /**
-         * 数据水印
-         */
-        private Watermark watermark;
-    }
-    
-    /**
-     * 数据水印内部类
-     */
-    @Data
-    public static class Watermark {
-        /**
-         * 小程序appid
-         */
-        private String appid;
-        
-        /**
-         * 时间戳
-         */
-        private Long timestamp;
-    }
-}

+ 2 - 176
src/main/java/com/yingpai/gupiao/domain/po/StockInfo.java

@@ -3,6 +3,7 @@ package com.yingpai.gupiao.domain.po;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -11,6 +12,7 @@ import java.time.OffsetDateTime;
 /**
  * 对应 MySQL 表 stock_info
  */
+@Data
 @TableName("stock_info")
 public class StockInfo {
 
@@ -60,182 +62,6 @@ public class StockInfo {
     private OffsetDateTime createdAt;
 
     private OffsetDateTime updatedAt;
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public String getStockCode() {
-        return stockCode;
-    }
-
-    public void setStockCode(String stockCode) {
-        this.stockCode = stockCode;
-    }
-
-    public String getStockName() {
-        return stockName;
-    }
-
-    public void setStockName(String stockName) {
-        this.stockName = stockName;
-    }
-
-    public String getMarket() {
-        return market;
-    }
-
-    public void setMarket(String market) {
-        this.market = market;
-    }
-
-    public Integer getStrengthScore() {
-        return strengthScore;
-    }
-
-    public void setStrengthScore(Integer strengthScore) {
-        this.strengthScore = strengthScore;
-    }
-
-    public String getShortName() {
-        return shortName;
-    }
-
-    public void setShortName(String shortName) {
-        this.shortName = shortName;
-    }
-
-    public String getPinyin() {
-        return pinyin;
-    }
-
-    public void setPinyin(String pinyin) {
-        this.pinyin = pinyin;
-    }
-
-    public String getAbbr() {
-        return abbr;
-    }
-
-    public void setAbbr(String abbr) {
-        this.abbr = abbr;
-    }
-
-    public LocalDate getTradeDate() {
-        return tradeDate;
-    }
-
-    public void setTradeDate(LocalDate tradeDate) {
-        this.tradeDate = tradeDate;
-    }
-
-    public BigDecimal getChangePct() {
-        return changePct;
-    }
-
-    public void setChangePct(BigDecimal changePct) {
-        this.changePct = changePct;
-    }
-
-    public BigDecimal getClosePrice() {
-        return closePrice;
-    }
-
-    public void setClosePrice(BigDecimal closePrice) {
-        this.closePrice = closePrice;
-    }
-
-    public BigDecimal getTotalAmount() {
-        return totalAmount;
-    }
-
-    public void setTotalAmount(BigDecimal totalAmount) {
-        this.totalAmount = totalAmount;
-    }
-
-    public BigDecimal getCirculationValue() {
-        return circulationValue;
-    }
-
-    public void setCirculationValue(BigDecimal circulationValue) {
-        this.circulationValue = circulationValue;
-    }
-
-    public Integer getMainCycle() {
-        return mainCycle;
-    }
-
-    public void setMainCycle(Integer mainCycle) {
-        this.mainCycle = mainCycle;
-    }
-
-    public BigDecimal getRecentTurnover() {
-        return recentTurnover;
-    }
-
-    public void setRecentTurnover(BigDecimal recentTurnover) {
-        this.recentTurnover = recentTurnover;
-    }
-
-    public Integer getRecentLimitUp() {
-        return recentLimitUp;
-    }
-
-    public void setRecentLimitUp(Integer recentLimitUp) {
-        this.recentLimitUp = recentLimitUp;
-    }
-
-    public BigDecimal getHighPrice() {
-        return highPrice;
-    }
-
-    public void setHighPrice(BigDecimal highPrice) {
-        this.highPrice = highPrice;
-    }
-
-    public BigDecimal getLowPrice() {
-        return lowPrice;
-    }
-
-    public void setLowPrice(BigDecimal lowPrice) {
-        this.lowPrice = lowPrice;
-    }
-
-    public BigDecimal getAvgPrice() {
-        return avgPrice;
-    }
-
-    public void setAvgPrice(BigDecimal avgPrice) {
-        this.avgPrice = avgPrice;
-    }
-
-    public BigDecimal getLastClosePrice() {
-        return lastClosePrice;
-    }
-
-    public void setLastClosePrice(BigDecimal lastClosePrice) {
-        this.lastClosePrice = lastClosePrice;
-    }
-
-    public OffsetDateTime getCreatedAt() {
-        return createdAt;
-    }
-
-    public void setCreatedAt(OffsetDateTime createdAt) {
-        this.createdAt = createdAt;
-    }
-
-    public OffsetDateTime getUpdatedAt() {
-        return updatedAt;
-    }
-
-    public void setUpdatedAt(OffsetDateTime updatedAt) {
-        this.updatedAt = updatedAt;
-    }
 }
 
 

+ 7 - 33
src/main/java/com/yingpai/gupiao/domain/vo/ApiResponse.java

@@ -1,5 +1,9 @@
 package com.yingpai.gupiao.domain.vo;
 
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
 /**
  * 统一返回结构
  *
@@ -9,21 +13,15 @@ package com.yingpai.gupiao.domain.vo;
  *   "data": {...}
  * }
  */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
 public class ApiResponse<T> {
 
     private int code;
     private String message;
     private T data;
 
-    public ApiResponse() {
-    }
-
-    public ApiResponse(int code, String message, T data) {
-        this.code = code;
-        this.message = message;
-        this.data = data;
-    }
-
     public static <T> ApiResponse<T> success(T data) {
         return new ApiResponse<>(0, "success", data);
     }
@@ -31,30 +29,6 @@ public class ApiResponse<T> {
     public static <T> ApiResponse<T> error(int code, String message) {
         return new ApiResponse<>(code, message, null);
     }
-
-    public int getCode() {
-        return code;
-    }
-
-    public void setCode(int code) {
-        this.code = code;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    public T getData() {
-        return data;
-    }
-
-    public void setData(T data) {
-        this.data = data;
-    }
 }
 
 

+ 11 - 96
src/main/java/com/yingpai/gupiao/domain/vo/StockDetailResponse.java

@@ -1,7 +1,12 @@
 package com.yingpai.gupiao.domain.vo;
 
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
 import java.util.List;
 
+@Data
 public class StockDetailResponse {
 
     private String stockCode;
@@ -11,109 +16,19 @@ public class StockDetailResponse {
     private List<HistoryScore> history;
     private List<Factor> factors;
 
-    public String getStockCode() {
-        return stockCode;
-    }
-
-    public void setStockCode(String stockCode) {
-        this.stockCode = stockCode;
-    }
-
-    public String getStockName() {
-        return stockName;
-    }
-
-    public void setStockName(String stockName) {
-        this.stockName = stockName;
-    }
-
-    public String getMarket() {
-        return market;
-    }
-
-    public void setMarket(String market) {
-        this.market = market;
-    }
-
-    public Double getScore() {
-        return score;
-    }
-
-    public void setScore(Double score) {
-        this.score = score;
-    }
-
-    public List<HistoryScore> getHistory() {
-        return history;
-    }
-
-    public void setHistory(List<HistoryScore> history) {
-        this.history = history;
-    }
-
-    public List<Factor> getFactors() {
-        return factors;
-    }
-
-    public void setFactors(List<Factor> factors) {
-        this.factors = factors;
-    }
-
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
     public static class HistoryScore {
         private String date;
         private Double score;
-
-        public HistoryScore() {
-        }
-
-        public HistoryScore(String date, Double score) {
-            this.date = date;
-            this.score = score;
-        }
-
-        public String getDate() {
-            return date;
-        }
-
-        public void setDate(String date) {
-            this.date = date;
-        }
-
-        public Double getScore() {
-            return score;
-        }
-
-        public void setScore(Double score) {
-            this.score = score;
-        }
     }
 
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
     public static class Factor {
         private String name;
         private Double value;
-
-        public Factor() {
-        }
-
-        public Factor(String name, Double value) {
-            this.name = name;
-            this.value = value;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public void setName(String name) {
-            this.name = name;
-        }
-
-        public Double getValue() {
-            return value;
-        }
-
-        public void setValue(Double value) {
-            this.value = value;
-        }
     }
 }

+ 0 - 73
src/main/java/com/yingpai/gupiao/domain/vo/StockSearchResponseItem.java

@@ -1,73 +0,0 @@
-package com.yingpai.gupiao.domain.vo;
-
-/**
- * 搜索结果中单只股票的信息
- */
-public class StockSearchResponseItem {
-
-    private String stockCode;
-    private String stockName;
-    private String market;
-    private String shortName;
-    private String pinyin;
-    private Integer score;
-    private String scoreDate;
-
-    public String getStockCode() {
-        return stockCode;
-    }
-
-    public void setStockCode(String stockCode) {
-        this.stockCode = stockCode;
-    }
-
-    public String getStockName() {
-        return stockName;
-    }
-
-    public void setStockName(String stockName) {
-        this.stockName = stockName;
-    }
-
-    public String getMarket() {
-        return market;
-    }
-
-    public void setMarket(String market) {
-        this.market = market;
-    }
-
-    public String getShortName() {
-        return shortName;
-    }
-
-    public void setShortName(String shortName) {
-        this.shortName = shortName;
-    }
-
-    public String getPinyin() {
-        return pinyin;
-    }
-
-    public void setPinyin(String pinyin) {
-        this.pinyin = pinyin;
-    }
-
-    public Integer getScore() {
-        return score;
-    }
-
-    public void setScore(Integer score) {
-        this.score = score;
-    }
-
-    public String getScoreDate() {
-        return scoreDate;
-    }
-
-    public void setScoreDate(String scoreDate) {
-        this.scoreDate = scoreDate;
-    }
-}
-
-

+ 11 - 6
src/main/java/com/yingpai/gupiao/interceptor/AuthInterceptor.java

@@ -1,6 +1,7 @@
 package com.yingpai.gupiao.interceptor;
 
 import com.yingpai.gupiao.util.JwtUtil;
+import com.yingpai.gupiao.util.UserContext;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
@@ -21,10 +22,6 @@ public class AuthInterceptor implements HandlerInterceptor {
     
     /**
      * 请求处理前的拦截
-     * @param request HTTP请求
-     * @param response HTTP响应
-     * @param handler 处理器
-     * @return true-继续处理,false-拦截请求
      */
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
@@ -54,10 +51,10 @@ public class AuthInterceptor implements HandlerInterceptor {
             return false;
         }
         
-        // 从token中获取用户ID,存入request属性中,供后续使用
+        // 从token中获取用户ID,存入ThreadLocal
         try {
             Long userId = jwtUtil.getUserIdFromToken(token);
-            request.setAttribute("userId", userId);
+            UserContext.setUserId(userId);
             log.debug("用户认证成功,userId: {}, URI: {}", userId, request.getRequestURI());
         } catch (Exception e) {
             log.error("解析token失败", e);
@@ -69,4 +66,12 @@ public class AuthInterceptor implements HandlerInterceptor {
         
         return true;
     }
+
+    /**
+     * 请求完成后清理ThreadLocal,防止内存泄漏
+     */
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
+        UserContext.clear();
+    }
 }

+ 2 - 2
src/main/java/com/yingpai/gupiao/service/StockSearchService.java

@@ -1,7 +1,7 @@
 package com.yingpai.gupiao.service;
 
 import com.yingpai.gupiao.domain.dto.StockSearchRequest;
-import com.yingpai.gupiao.domain.dto.StockSuggestionDto;
+import com.yingpai.gupiao.domain.dto.StockSuggestionDTO;
 import com.yingpai.gupiao.domain.vo.StockDetailResponse;
 
 import java.util.List;
@@ -10,7 +10,7 @@ public interface StockSearchService {
 
     StockDetailResponse search(StockSearchRequest request);
 
-    List<StockSuggestionDto> getSuggestion(String keyword);
+    List<StockSuggestionDTO> getSuggestion(String keyword);
 
     StockDetailResponse getStockDetail(String stockCode);
 }

+ 3 - 3
src/main/java/com/yingpai/gupiao/service/impl/StockSearchServiceImpl.java

@@ -2,7 +2,7 @@ package com.yingpai.gupiao.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.yingpai.gupiao.domain.dto.StockSearchRequest;
-import com.yingpai.gupiao.domain.dto.StockSuggestionDto;
+import com.yingpai.gupiao.domain.dto.StockSuggestionDTO;
 import com.yingpai.gupiao.domain.po.StockInfo;
 import com.yingpai.gupiao.domain.vo.StockDetailResponse;
 import com.yingpai.gupiao.mapper.StockInfoMapper;
@@ -31,7 +31,7 @@ public class StockSearchServiceImpl implements StockSearchService {
     }
 
     @Override
-    public List<StockSuggestionDto> getSuggestion(String keyword) {
+    public List<StockSuggestionDTO> getSuggestion(String keyword) {
         if (!StringUtils.hasText(keyword)) {
             return List.of();
         }
@@ -65,7 +65,7 @@ public class StockSearchServiceImpl implements StockSearchService {
         List<StockInfo> list = stockInfoMapper.selectList(wrapper);
 
         return list.stream().map(info -> {
-            StockSuggestionDto dto = new StockSuggestionDto();
+            StockSuggestionDTO dto = new StockSuggestionDTO();
             dto.setName(info.getStockName());
             dto.setCode(info.getStockCode());
             dto.setMarket(info.getMarket());

+ 31 - 0
src/main/java/com/yingpai/gupiao/util/UserContext.java

@@ -0,0 +1,31 @@
+package com.yingpai.gupiao.util;
+
+/**
+ * 用户上下文工具类
+ * 使用 ThreadLocal 存储当前请求的用户ID
+ */
+public class UserContext {
+
+    private static final ThreadLocal<Long> USER_ID = new ThreadLocal<>();
+
+    /**
+     * 设置当前用户ID
+     */
+    public static void setUserId(Long userId) {
+        USER_ID.set(userId);
+    }
+
+    /**
+     * 获取当前用户ID
+     */
+    public static Long getUserId() {
+        return USER_ID.get();
+    }
+
+    /**
+     * 清除当前用户ID(请求结束时调用,防止内存泄漏)
+     */
+    public static void clear() {
+        USER_ID.remove();
+    }
+}