Sfoglia il codice sorgente

我的股票修改

Zhangbw 3 mesi fa
parent
commit
dc8be09d43

+ 29 - 19
dist/dev/mp-weixin/components/StockListItem.js

@@ -82,13 +82,9 @@ const _sfc_main = {
       return value !== 0 && !isNaN(value);
     };
     const drawTrendChart = (instance) => {
-      console.log("[趋势图] 开始绘制:", props.stock.code, canvasId.value);
       let trendData = props.stock.trendData;
       if (!trendData || !Array.isArray(trendData) || trendData.length === 0) {
-        console.log("[趋势图] 使用模拟数据");
         trendData = generateMockTrendData();
-      } else {
-        console.log("[趋势图] 使用真实数据,数据点数:", trendData.length);
       }
       const ctx = common_vendor.index.createCanvasContext(canvasId.value, instance);
       const width = 100;
@@ -96,13 +92,35 @@ const _sfc_main = {
       const padding = 2;
       const maxValue = Math.max(...trendData);
       const minValue = Math.min(...trendData);
-      const range = maxValue - minValue || 1;
-      console.log("[趋势图] 数据范围:", { min: minValue, max: maxValue, range });
+      const dataRange = maxValue - minValue;
+      const avgValue = (maxValue + minValue) / 2;
+      const minRange = avgValue * 0.03 || 1;
+      const range = Math.max(dataRange, minRange);
+      const baseValue = trendData[0];
+      const baseY = height - padding - (baseValue - minValue) / range * (height - padding * 2);
       const changePercent = parseFloat(String(props.stock.changePercent || "0").replace("%", "").replace("+", ""));
       const isUp = changePercent >= 0;
       const lineColor = isUp ? "#FF3B30" : "#34C759";
-      const fillColor = isUp ? "rgba(255, 59, 48, 0.1)" : "rgba(52, 199, 89, 0.1)";
-      console.log("[趋势图] 颜色:", { isUp, lineColor, changePercent });
+      const fillColor = isUp ? "rgba(255, 59, 48, 0.15)" : "rgba(52, 199, 89, 0.15)";
+      ctx.beginPath();
+      ctx.setStrokeStyle("#e0e0e0");
+      ctx.setLineWidth(0.5);
+      ctx.setLineDash([2, 2], 0);
+      ctx.moveTo(padding, baseY);
+      ctx.lineTo(width - padding, baseY);
+      ctx.stroke();
+      ctx.setLineDash([], 0);
+      ctx.beginPath();
+      ctx.moveTo(padding, baseY);
+      trendData.forEach((value, index) => {
+        const x = padding + index / (trendData.length - 1) * (width - padding * 2);
+        const y = height - padding - (value - minValue) / range * (height - padding * 2);
+        ctx.lineTo(x, y);
+      });
+      ctx.lineTo(width - padding, baseY);
+      ctx.closePath();
+      ctx.setFillStyle(fillColor);
+      ctx.fill();
       ctx.beginPath();
       trendData.forEach((value, index) => {
         const x = padding + index / (trendData.length - 1) * (width - padding * 2);
@@ -114,24 +132,18 @@ const _sfc_main = {
         }
       });
       ctx.setStrokeStyle(lineColor);
-      ctx.setLineWidth(1);
+      ctx.setLineWidth(1.5);
       ctx.stroke();
-      ctx.lineTo(width - padding, height - padding);
-      ctx.lineTo(padding, height - padding);
-      ctx.closePath();
-      ctx.setFillStyle(fillColor);
-      ctx.fill();
       ctx.draw();
-      console.log("[趋势图] 绘制完成");
     };
     const generateMockTrendData = () => {
       const changePercent = parseFloat(String(props.stock.changePercent || "0").replace("%", "").replace("+", ""));
-      const points = 30;
+      const points = 15;
       const data = [];
       let baseValue = 100;
       const trend = changePercent / 100;
       for (let i = 0; i < points; i++) {
-        const randomChange = (Math.random() - 0.5) * 2;
+        const randomChange = (Math.random() - 0.5) * 6;
         const trendChange = i / points * trend * 100;
         baseValue = baseValue + randomChange + trendChange / points;
         data.push(baseValue);
@@ -162,7 +174,6 @@ const _sfc_main = {
       emit("delete");
     };
     common_vendor.onMounted(() => {
-      console.log("[趋势图] 组件挂载:", props.stock.code);
       componentInstance = common_vendor.getCurrentInstance();
       common_vendor.nextTick$1(() => {
         setTimeout(() => {
@@ -172,7 +183,6 @@ const _sfc_main = {
     });
     common_vendor.watch(() => props.stock.trendData, (newData) => {
       if (newData && componentInstance) {
-        console.log("[趋势图] 数据更新,重新绘制:", props.stock.code);
         common_vendor.nextTick$1(() => {
           drawTrendChart(componentInstance);
         });

+ 52 - 16
dist/dev/mp-weixin/pages/rank/rank.js

@@ -12,8 +12,8 @@ const _sfc_main = {
     const isLoggedIn = common_vendor.ref(false);
     const myStocks = common_vendor.ref([]);
     const viewMode = common_vendor.ref("list");
-    const toggleViewMode = () => {
-      viewMode.value = viewMode.value === "list" ? "table" : "list";
+    const setViewMode = (mode) => {
+      viewMode.value = mode;
     };
     const indexData = common_vendor.ref({
       stockCode: "000001",
@@ -84,14 +84,18 @@ const _sfc_main = {
       return "market-sh";
     };
     const loadMyStocks = async () => {
+      console.log("[我的股票] loadMyStocks 开始执行, isLoggedIn=", isLoggedIn.value);
       if (!isLoggedIn.value) {
         myStocks.value = [];
         stopAutoRefresh();
         return;
       }
       try {
+        common_vendor.index.showLoading({ title: "加载中..." });
+        console.log("[我的股票] 调用 getUserStocks 接口");
         const res = await utils_api.getUserStocks();
         console.log("[我的股票] 服务器返回:", JSON.stringify(res));
+        common_vendor.index.hideLoading();
         if (res.code === 200 && res.data) {
           myStocks.value = res.data.map((item) => ({
             code: item.stockCode,
@@ -104,8 +108,10 @@ const _sfc_main = {
             changePercent: item.changePercent,
             trendData: item.trendData
           }));
+          console.log("[我的股票] 加载完成, 股票数量:", myStocks.value.length);
         } else {
           myStocks.value = [];
+          console.log("[我的股票] 返回数据为空");
         }
         await fetchIndexData();
         if (myStocks.value.length > 0) {
@@ -113,7 +119,8 @@ const _sfc_main = {
         }
         startAutoRefresh();
       } catch (e) {
-        console.error("加载股票列表失败:", e);
+        common_vendor.index.hideLoading();
+        console.error("[我的股票] 加载失败:", e);
         myStocks.value = [];
         startAutoRefresh();
       }
@@ -174,8 +181,32 @@ const _sfc_main = {
     const goToLogin = () => {
       common_vendor.index.navigateTo({ url: "/pages/login/login" });
     };
-    const handleStockClick = (stockItem, idx) => {
+    const handleStockClick = async (stockItem, idx) => {
       console.log("点击股票:", stockItem.name, idx);
+      try {
+        const quoteRes = await utils_api.getStockQuotes(stockItem.code);
+        if (quoteRes.code === 200 && quoteRes.data && quoteRes.data.length > 0) {
+          const quoteData = quoteRes.data[0];
+          const stock = myStocks.value[idx];
+          if (stock) {
+            stock.priceChange = quoteData.priceChange;
+            stock.changePercent = quoteData.changePercent;
+            stock.currentPrice = quoteData.currentPrice;
+            stock.name = quoteData.stockName || stock.name;
+            stock.trendData = quoteData.trendData || null;
+            if (stock.addPrice && quoteData.currentPrice) {
+              const addPrice = parseFloat(stock.addPrice);
+              const currentPrice = parseFloat(quoteData.currentPrice);
+              if (addPrice > 0) {
+                const profit = ((currentPrice - addPrice) / addPrice * 100).toFixed(2);
+                stock.profitPercent = profit >= 0 ? `+${profit}%` : `${profit}%`;
+              }
+            }
+          }
+        }
+      } catch (e) {
+        console.error("刷新股票行情失败:", e);
+      }
       common_vendor.index.showToast({ title: "股票详情功能开发中", icon: "none" });
     };
     const removeStock = async (idx) => {
@@ -203,10 +234,12 @@ const _sfc_main = {
       });
     };
     common_vendor.onLoad(() => {
+      console.log("[我的股票] onLoad 触发");
       isLoggedIn.value = utils_auth.isLoggedIn();
       loadMyStocks();
     });
     common_vendor.onShow(() => {
+      console.log("[我的股票] onShow 触发");
       isLoggedIn.value = utils_auth.isLoggedIn();
       loadMyStocks();
       common_vendor.index.setNavigationBarTitle({ title: "量化交易大师" });
@@ -226,9 +259,12 @@ const _sfc_main = {
         e: common_vendor.t(indexData.value.stockName || "上证指数"),
         f: common_vendor.t(indexData.value.changePercent || "--"),
         g: common_vendor.n(getIndexChangeClass(indexData.value.changePercent)),
-        h: common_vendor.t(viewMode.value === "list" ? "📊" : "📋"),
-        i: common_vendor.o(toggleViewMode),
-        j: common_vendor.f(myStocks.value, (stock, index, i0) => {
+        h: viewMode.value === "table" ? 1 : "",
+        i: viewMode.value === "list" ? 1 : "",
+        j: common_vendor.o(($event) => setViewMode("list")),
+        k: viewMode.value === "table" ? 1 : "",
+        l: common_vendor.o(($event) => setViewMode("table")),
+        m: common_vendor.f(myStocks.value, (stock, index, i0) => {
           return {
             a: stock.code,
             b: common_vendor.o(($event) => removeStock(index), stock.code),
@@ -240,9 +276,9 @@ const _sfc_main = {
             })
           };
         }),
-        k: viewMode.value === "list",
-        l: myStocks.value.length === 0 ? 1 : "",
-        m: common_vendor.f(myStocks.value, (stock, index, i0) => {
+        n: viewMode.value === "list",
+        o: myStocks.value.length === 0 ? 1 : "",
+        p: common_vendor.f(myStocks.value, (stock, index, i0) => {
           return {
             a: common_vendor.t(stock.name),
             b: common_vendor.t(getMarketTag(stock.code)),
@@ -256,14 +292,14 @@ const _sfc_main = {
             j: common_vendor.o(($event) => handleStockClick(stock, index), stock.code)
           };
         }),
-        n: viewMode.value === "table",
-        o: myStocks.value.length === 0 ? 1 : "",
-        p: myStocks.value.length === 0
+        q: viewMode.value === "table",
+        r: myStocks.value.length === 0 ? 1 : "",
+        s: myStocks.value.length === 0
       }, myStocks.value.length === 0 ? {} : {}, {
-        q: !isLoggedIn.value ? 1 : "",
-        r: !isLoggedIn.value
+        t: !isLoggedIn.value ? 1 : "",
+        v: !isLoggedIn.value
       }, !isLoggedIn.value ? {
-        s: common_vendor.o(goToLogin)
+        w: common_vendor.o(goToLogin)
       } : {});
     };
   }

File diff suppressed because it is too large
+ 0 - 0
dist/dev/mp-weixin/pages/rank/rank.wxml


+ 43 - 13
dist/dev/mp-weixin/pages/rank/rank.wxss

@@ -63,27 +63,57 @@
   color: #34C759;
 }
 
-/* 切换按钮 */
-.view-switch {
+/* 分段控制器 */
+.segment-control {
   display: flex;
-  justify-content: flex-end;
-  margin-bottom: 16rpx;
-}
-.switch-btn {
-  width: 64rpx;
+  align-items: center;
+  background: #F5F7FA;
+  border-radius: 32rpx;
+  padding: 6rpx;
+  margin-bottom: 24rpx;
+  position: relative;
   height: 64rpx;
+  box-sizing: border-box;
+}
+.segment-slider {
+  position: absolute;
+  left: 6rpx;
+  top: 6rpx;
+  width: calc(50% - 6rpx);
+  height: calc(100% - 12rpx);
   background: #ffffff;
-  border-radius: 12rpx;
+  border-radius: 26rpx;
+  box-shadow: 0 4rpx 8rpx rgba(0, 0, 0, 0.05);
+  transition: transform 0.3s ease;
+  z-index: 0;
+}
+.segment-slider.slider-right {
+  transform: translateX(100%);
+}
+.segment-item {
+  flex: 1;
   display: flex;
   align-items: center;
   justify-content: center;
-  box-shadow: 0 4rpx 12rpx rgba(37, 52, 94, 0.08);
+  height: 100%;
+  z-index: 1;
+  transition: color 0.3s ease;
 }
-.switch-btn:active {
-  background: #f5f6fb;
+.segment-icon {
+  font-size: 24rpx;
+  margin-right: 8rpx;
+  color: #999999;
+  transition: color 0.3s ease;
 }
-.switch-icon {
-  font-size: 28rpx;
+.segment-text {
+  font-size: 26rpx;
+  color: #999999;
+  font-weight: 500;
+  transition: color 0.3s ease;
+}
+.segment-active .segment-icon,
+.segment-active .segment-text {
+  color: #E53935;
 }
 
 /* 隐藏空列表 */

+ 14 - 6
dist/dev/mp-weixin/pages/strong/strong.js

@@ -10,12 +10,12 @@ const _sfc_main = {
     common_vendor.ref("yearly");
     const stockList = common_vendor.ref([
       {
-        name: "航天发展",
-        code: "000547"
+        name: "信维通信",
+        code: "300136"
       },
       {
-        name: "贵州茅台",
-        code: "600519"
+        name: "中国卫星",
+        code: "600118"
       }
     ]);
     const startMonth = common_vendor.ref("2025-01");
@@ -131,10 +131,11 @@ const _sfc_main = {
         return;
       }
       try {
-        common_vendor.index.showLoading({ title: "获取行情..." });
+        common_vendor.index.showLoading({ title: "添加中..." });
         let currentPrice = null;
         try {
           const quoteRes = await utils_api.getStockQuotes(stock.code);
+          console.log("[添加股票] 行情数据:", JSON.stringify(quoteRes));
           if (quoteRes.code === 200 && quoteRes.data && quoteRes.data.length > 0) {
             const quoteData = quoteRes.data[0];
             currentPrice = quoteData.currentPrice;
@@ -142,17 +143,24 @@ const _sfc_main = {
         } catch (e) {
           console.error("获取行情数据失败:", e);
         }
+        console.log("[添加股票] 请求参数:", { stockCode: stock.code, stockName: stock.name, currentPrice });
         const addRes = await utils_api.addUserStock({
           stockCode: stock.code,
           stockName: stock.name,
           currentPrice
         });
+        console.log("[添加股票] 服务器返回:", JSON.stringify(addRes));
         common_vendor.index.hideLoading();
-        if (addRes.code === 200) {
+        if (addRes.code === 200 && addRes.data === true) {
           common_vendor.index.showToast({
             title: "添加成功",
             icon: "success"
           });
+        } else if (addRes.code === 200 && addRes.data === false) {
+          common_vendor.index.showToast({
+            title: "股票已存在",
+            icon: "none"
+          });
         } else {
           common_vendor.index.showToast({
             title: addRes.message || "添加失败",

+ 38 - 26
src/components/StockListItem.vue

@@ -147,24 +147,19 @@ const hasValidChange = (changePercent) => {
 
 // 绘制趋势图
 const drawTrendChart = (instance) => {
-  console.log('[趋势图] 开始绘制:', props.stock.code, canvasId.value)
-  
   // 获取趋势数据
   let trendData = props.stock.trendData
   
   // 如果没有趋势数据,生成模拟数据
   if (!trendData || !Array.isArray(trendData) || trendData.length === 0) {
-    console.log('[趋势图] 使用模拟数据')
     trendData = generateMockTrendData()
-  } else {
-    console.log('[趋势图] 使用真实数据,数据点数:', trendData.length)
   }
   
   // 使用 uni.createCanvasContext 创建画布上下文
   // 在 setup 中需要传入组件实例
   const ctx = uni.createCanvasContext(canvasId.value, instance)
   
-  // 画布尺寸(rpx)
+  // 画布尺寸
   const width = 100  // 实际像素
   const height = 30  // 实际像素
   const padding = 2
@@ -172,17 +167,46 @@ const drawTrendChart = (instance) => {
   // 计算数据范围
   const maxValue = Math.max(...trendData)
   const minValue = Math.min(...trendData)
-  const range = maxValue - minValue || 1
+  const dataRange = maxValue - minValue
+  // 设置最小范围为数据均值的3%,确保图表有明显起伏
+  const avgValue = (maxValue + minValue) / 2
+  const minRange = avgValue * 0.03 || 1
+  const range = Math.max(dataRange, minRange)
   
-  console.log('[趋势图] 数据范围:', { min: minValue, max: maxValue, range })
+  // 基准线位置(第一个数据点的值作为基准)
+  const baseValue = trendData[0]
+  const baseY = height - padding - ((baseValue - minValue) / range) * (height - padding * 2)
   
   // 判断涨跌颜色
   const changePercent = parseFloat(String(props.stock.changePercent || '0').replace('%', '').replace('+', ''))
   const isUp = changePercent >= 0
   const lineColor = isUp ? '#FF3B30' : '#34C759'  // 红涨绿跌
-  const fillColor = isUp ? 'rgba(255, 59, 48, 0.1)' : 'rgba(52, 199, 89, 0.1)'
+  const fillColor = isUp ? 'rgba(255, 59, 48, 0.15)' : 'rgba(52, 199, 89, 0.15)'
+  
+  // 先绘制基准虚线
+  ctx.beginPath()
+  ctx.setStrokeStyle('#e0e0e0')
+  ctx.setLineWidth(0.5)
+  ctx.setLineDash([2, 2], 0)
+  ctx.moveTo(padding, baseY)
+  ctx.lineTo(width - padding, baseY)
+  ctx.stroke()
+  ctx.setLineDash([], 0)  // 重置虚线
   
-  console.log('[趋势图] 颜色:', { isUp, lineColor, changePercent })
+  // 绘制填充区域(从基准线到折线)
+  ctx.beginPath()
+  ctx.moveTo(padding, baseY)
+  
+  trendData.forEach((value, index) => {
+    const x = padding + (index / (trendData.length - 1)) * (width - padding * 2)
+    const y = height - padding - ((value - minValue) / range) * (height - padding * 2)
+    ctx.lineTo(x, y)
+  })
+  
+  ctx.lineTo(width - padding, baseY)
+  ctx.closePath()
+  ctx.setFillStyle(fillColor)
+  ctx.fill()
   
   // 绘制折线
   ctx.beginPath()
@@ -198,28 +222,18 @@ const drawTrendChart = (instance) => {
     }
   })
   
-  // 绘制折线
   ctx.setStrokeStyle(lineColor)
-  ctx.setLineWidth(1)
+  ctx.setLineWidth(1.5)
   ctx.stroke()
   
-  // 绘制填充区域
-  ctx.lineTo(width - padding, height - padding)
-  ctx.lineTo(padding, height - padding)
-  ctx.closePath()
-  ctx.setFillStyle(fillColor)
-  ctx.fill()
-  
   // 绘制到画布
   ctx.draw()
-  
-  console.log('[趋势图] 绘制完成')
 }
 
 // 生成模拟趋势数据
 const generateMockTrendData = () => {
   const changePercent = parseFloat(String(props.stock.changePercent || '0').replace('%', '').replace('+', ''))
-  const points = 30  // 30个数据点
+  const points = 15  // 数据点数
   const data = []
   
   // 基于涨跌幅生成趋势数据
@@ -227,8 +241,8 @@ const generateMockTrendData = () => {
   const trend = changePercent / 100  // 总体趋势
   
   for (let i = 0; i < points; i++) {
-    // 添加随机波动
-    const randomChange = (Math.random() - 0.5) * 2
+    // 增大随机波动幅度,让图表更直观
+    const randomChange = (Math.random() - 0.5) * 6
     const trendChange = (i / points) * trend * 100
     baseValue = baseValue + randomChange + trendChange / points
     data.push(baseValue)
@@ -272,7 +286,6 @@ const handleDelete = () => {
 
 // 组件挂载后绘制图表
 onMounted(() => {
-  console.log('[趋势图] 组件挂载:', props.stock.code)
   componentInstance = getCurrentInstance()
   nextTick(() => {
     // 延迟绘制,确保 canvas 已渲染
@@ -285,7 +298,6 @@ onMounted(() => {
 // 监听股票数据变化,重新绘制趋势图
 watch(() => props.stock.trendData, (newData) => {
   if (newData && componentInstance) {
-    console.log('[趋势图] 数据更新,重新绘制:', props.stock.code)
     nextTick(() => {
       drawTrendChart(componentInstance)
     })

+ 111 - 20
src/pages/rank/rank.vue

@@ -22,10 +22,22 @@
           </view>
         </view>
 
-        <!-- 切换按钮 -->
-        <view class="view-switch">
-          <view class="switch-btn" @click="toggleViewMode">
-            <text class="switch-icon">{{ viewMode === 'list' ? '📊' : '📋' }}</text>
+        <!-- 分段控制器 -->
+        <view class="segment-control">
+          <view class="segment-slider" :class="{ 'slider-right': viewMode === 'table' }"></view>
+          <view 
+            class="segment-item" 
+            :class="{ 'segment-active': viewMode === 'list' }"
+            @click="setViewMode('list')"
+          >
+            <text class="segment-text">热力图</text>
+          </view>
+          <view 
+            class="segment-item" 
+            :class="{ 'segment-active': viewMode === 'table' }"
+            @click="setViewMode('table')"
+          >
+            <text class="segment-text">详情</text>
           </view>
         </view>
 
@@ -114,6 +126,11 @@ const toggleViewMode = () => {
   viewMode.value = viewMode.value === 'list' ? 'table' : 'list'
 }
 
+// 设置视图模式(只切换显示,不重新加载数据)
+const setViewMode = (mode) => {
+  viewMode.value = mode
+}
+
 const indexData = ref({
   stockCode: '000001',
   stockName: '上证指数',
@@ -184,6 +201,8 @@ const getMarketClass = (code) => {
 
 // 加载我的股票列表(从服务器数据库查询)
 const loadMyStocks = async () => {
+  console.log('[我的股票] loadMyStocks 开始执行, isLoggedIn=', isLoggedIn.value)
+  
   if (!isLoggedIn.value) {
     myStocks.value = []
     stopAutoRefresh()
@@ -191,10 +210,16 @@ const loadMyStocks = async () => {
   }
   
   try {
-    // 从服务器获取用户自选股票
+    // 显示加载提示
+    uni.showLoading({ title: '加载中...' })
+    
+    // 从服务器获取用户自选股票(每次都从数据库查询)
+    console.log('[我的股票] 调用 getUserStocks 接口')
     const res = await getUserStocks()
     console.log('[我的股票] 服务器返回:', JSON.stringify(res))
     
+    uni.hideLoading()
+    
     if (res.code === 200 && res.data) {
       // 转换数据格式
       myStocks.value = res.data.map(item => ({
@@ -208,8 +233,10 @@ const loadMyStocks = async () => {
         changePercent: item.changePercent,
         trendData: item.trendData
       }))
+      console.log('[我的股票] 加载完成, 股票数量:', myStocks.value.length)
     } else {
       myStocks.value = []
+      console.log('[我的股票] 返回数据为空')
     }
     
     // 获取上证指数
@@ -223,7 +250,8 @@ const loadMyStocks = async () => {
     // 登录后启动定时刷新
     startAutoRefresh()
   } catch (e) {
-    console.error('加载股票列表失败:', e)
+    uni.hideLoading()
+    console.error('[我的股票] 加载失败:', e)
     myStocks.value = []
     startAutoRefresh()
   }
@@ -298,8 +326,35 @@ const goToLogin = () => {
 }
 
 // 点击股票项
-const handleStockClick = (stockItem, idx) => {
+const handleStockClick = async (stockItem, idx) => {
   console.log('点击股票:', stockItem.name, idx)
+  // 刷新该股票的最新行情
+  try {
+    const quoteRes = await getStockQuotes(stockItem.code)
+    if (quoteRes.code === 200 && quoteRes.data && quoteRes.data.length > 0) {
+      const quoteData = quoteRes.data[0]
+      const stock = myStocks.value[idx]
+      if (stock) {
+        stock.priceChange = quoteData.priceChange
+        stock.changePercent = quoteData.changePercent
+        stock.currentPrice = quoteData.currentPrice
+        stock.name = quoteData.stockName || stock.name
+        stock.trendData = quoteData.trendData || null
+        
+        // 计算自选收益
+        if (stock.addPrice && quoteData.currentPrice) {
+          const addPrice = parseFloat(stock.addPrice)
+          const currentPrice = parseFloat(quoteData.currentPrice)
+          if (addPrice > 0) {
+            const profit = ((currentPrice - addPrice) / addPrice * 100).toFixed(2)
+            stock.profitPercent = profit >= 0 ? `+${profit}%` : `${profit}%`
+          }
+        }
+      }
+    }
+  } catch (e) {
+    console.error('刷新股票行情失败:', e)
+  }
   uni.showToast({ title: '股票详情功能开发中', icon: 'none' })
 }
 
@@ -333,12 +388,15 @@ const removeStock = async (idx) => {
 }
 
 onLoad(() => {
+  console.log('[我的股票] onLoad 触发')
   isLoggedIn.value = checkLoginStatus()
   loadMyStocks()
 })
 
 onShow(() => {
+  console.log('[我的股票] onShow 触发')
   isLoggedIn.value = checkLoginStatus()
+  // 每次页面显示时都从数据库重新加载
   loadMyStocks()
   uni.setNavigationBarTitle({ title: '量化交易大师' })
 })
@@ -428,30 +486,63 @@ onUnload(() => {
   color: #34C759;
 }
 
-/* 切换按钮 */
-.view-switch {
+/* 分段控制器 */
+.segment-control {
   display: flex;
-  justify-content: flex-end;
-  margin-bottom: 16rpx;
+  align-items: center;
+  background: #F5F7FA;
+  border-radius: 32rpx;
+  padding: 6rpx;
+  margin-bottom: 24rpx;
+  position: relative;
+  height: 64rpx;
+  box-sizing: border-box;
 }
 
-.switch-btn {
-  width: 64rpx;
-  height: 64rpx;
+.segment-slider {
+  position: absolute;
+  left: 6rpx;
+  top: 6rpx;
+  width: calc(50% - 6rpx);
+  height: calc(100% - 12rpx);
   background: #ffffff;
-  border-radius: 12rpx;
+  border-radius: 26rpx;
+  box-shadow: 0 4rpx 8rpx rgba(0, 0, 0, 0.05);
+  transition: transform 0.3s ease;
+  z-index: 0;
+}
+
+.segment-slider.slider-right {
+  transform: translateX(100%);
+}
+
+.segment-item {
+  flex: 1;
   display: flex;
   align-items: center;
   justify-content: center;
-  box-shadow: 0 4rpx 12rpx rgba(37, 52, 94, 0.08);
+  height: 100%;
+  z-index: 1;
+  transition: color 0.3s ease;
 }
 
-.switch-btn:active {
-  background: #f5f6fb;
+.segment-icon {
+  font-size: 24rpx;
+  margin-right: 8rpx;
+  color: #999999;
+  transition: color 0.3s ease;
 }
 
-.switch-icon {
-  font-size: 28rpx;
+.segment-text {
+  font-size: 26rpx;
+  color: #999999;
+  font-weight: 500;
+  transition: color 0.3s ease;
+}
+
+.segment-active .segment-icon,
+.segment-active .segment-text {
+  color: #E53935;
 }
 
 /* 隐藏空列表 */

+ 14 - 6
src/pages/strong/strong.vue

@@ -158,12 +158,12 @@ const selectedPlan = ref('yearly')
 // 股票列表数据
 const stockList = ref([
   {
-    name: '航天发展',
-    code: '000547',
+    name: '信维通信',
+    code: '300136',
   },
   {
-    name: '贵州茅台',
-    code: '600519',
+    name: '中国卫星',
+    code: '600118',
   }
 ])
 
@@ -326,12 +326,13 @@ const addToMyStocks = async (stock) => {
   
   try {
     // 显示加载提示
-    uni.showLoading({ title: '获取行情...' })
+    uni.showLoading({ title: '添加中...' })
     
     // 获取股票实时行情数据
     let currentPrice = null
     try {
       const quoteRes = await getStockQuotes(stock.code)
+      console.log('[添加股票] 行情数据:', JSON.stringify(quoteRes))
       if (quoteRes.code === 200 && quoteRes.data && quoteRes.data.length > 0) {
         const quoteData = quoteRes.data[0]
         currentPrice = quoteData.currentPrice
@@ -341,19 +342,26 @@ const addToMyStocks = async (stock) => {
     }
     
     // 调用后端接口保存到数据库
+    console.log('[添加股票] 请求参数:', { stockCode: stock.code, stockName: stock.name, currentPrice })
     const addRes = await addUserStock({
       stockCode: stock.code,
       stockName: stock.name,
       currentPrice: currentPrice
     })
+    console.log('[添加股票] 服务器返回:', JSON.stringify(addRes))
     
     uni.hideLoading()
     
-    if (addRes.code === 200) {
+    if (addRes.code === 200 && addRes.data === true) {
       uni.showToast({
         title: '添加成功',
         icon: 'success'
       })
+    } else if (addRes.code === 200 && addRes.data === false) {
+      uni.showToast({
+        title: '股票已存在',
+        icon: 'none'
+      })
     } else {
       uni.showToast({
         title: addRes.message || '添加失败',

Some files were not shown because too many files changed in this diff