Parcourir la source

我的股票功能更新

Zhangbw il y a 3 mois
Parent
commit
5ce206ba32

+ 18 - 8
dist/dev/mp-weixin/components/StockListItem.js

@@ -59,6 +59,13 @@ const _sfc_main = {
         return "--";
       return parseFloat(price).toFixed(2);
     };
+    const hasValidChange = (changePercent) => {
+      if (!changePercent)
+        return false;
+      const str = String(changePercent).replace("%", "").replace("+", "");
+      const value = parseFloat(str);
+      return value !== 0 && !isNaN(value);
+    };
     const drawTrendChart = (instance) => {
       console.log("[趋势图] 开始绘制:", props.stock.code, canvasId.value);
       let trendData = props.stock.trendData;
@@ -164,16 +171,19 @@ const _sfc_main = {
         d: common_vendor.t(__props.stock.code),
         e: canvasId.value,
         f: canvasId.value,
-        g: common_vendor.t(formatChangePercent(__props.stock.changePercent)),
-        h: common_vendor.n(getChangeClass(__props.stock.changePercent)),
-        i: common_vendor.t(formatPrice(__props.stock.currentPrice)),
-        j: __props.showDelete
+        g: hasValidChange(__props.stock.changePercent)
+      }, hasValidChange(__props.stock.changePercent) ? {
+        h: common_vendor.t(formatChangePercent(__props.stock.changePercent)),
+        i: common_vendor.n(getChangeClass(__props.stock.changePercent))
+      } : {}, {
+        j: common_vendor.t(formatPrice(__props.stock.currentPrice)),
+        k: __props.showDelete
       }, __props.showDelete ? {
-        k: common_vendor.o(handleDelete)
+        l: common_vendor.o(handleDelete)
       } : {}, {
-        l: moveX.value,
-        m: common_vendor.o(handleMoveChange),
-        n: common_vendor.o(handleMoveEnd)
+        m: moveX.value,
+        n: common_vendor.o(handleMoveChange),
+        o: common_vendor.o(handleMoveEnd)
       });
     };
   }

+ 1 - 1
dist/dev/mp-weixin/components/StockListItem.wxml

@@ -1 +1 @@
-<view class="stock-item-wrapper data-v-29af7fd7"><movable-area class="movable-area data-v-29af7fd7"><movable-view class="movable-view data-v-29af7fd7" direction="horizontal" x="{{l}}" damping="{{40}}" friction="{{5}}" out-of-bounds="{{false}}" bindchange="{{m}}" bindtouchend="{{n}}"><view class="stock-list-item data-v-29af7fd7"><view class="stock-left data-v-29af7fd7"><view class="stock-name-row data-v-29af7fd7"><text class="stock-name data-v-29af7fd7">{{a}}</text><text class="{{['data-v-29af7fd7', 'stock-tag', c]}}">{{b}}</text></view><text class="stock-code data-v-29af7fd7">{{d}}</text></view><view class="stock-chart data-v-29af7fd7"><block wx:if="{{r0}}"><canvas canvas-id="{{e}}" id="{{f}}" class="trend-canvas data-v-29af7fd7"></canvas></block></view><view class="stock-right data-v-29af7fd7"><view class="{{['data-v-29af7fd7', 'change-percent', h]}}">{{g}}</view><text class="stock-price data-v-29af7fd7">{{i}}</text></view><view wx:if="{{j}}" class="delete-action data-v-29af7fd7" catchtap="{{k}}"><view class="delete-icon-wrapper data-v-29af7fd7"><text class="delete-icon data-v-29af7fd7">✕</text></view></view></view></movable-view></movable-area></view>
+<view class="stock-item-wrapper data-v-29af7fd7"><movable-area class="movable-area data-v-29af7fd7"><movable-view class="movable-view data-v-29af7fd7" direction="horizontal" x="{{m}}" damping="{{40}}" friction="{{5}}" out-of-bounds="{{false}}" bindchange="{{n}}" bindtouchend="{{o}}"><view class="stock-list-item data-v-29af7fd7"><view class="stock-left data-v-29af7fd7"><view class="stock-name-row data-v-29af7fd7"><text class="stock-name data-v-29af7fd7">{{a}}</text><text class="{{['data-v-29af7fd7', 'stock-tag', c]}}">{{b}}</text></view><text class="stock-code data-v-29af7fd7">{{d}}</text></view><view class="stock-chart data-v-29af7fd7"><block wx:if="{{r0}}"><canvas canvas-id="{{e}}" id="{{f}}" class="trend-canvas data-v-29af7fd7"></canvas></block></view><view class="stock-right data-v-29af7fd7"><view wx:if="{{g}}" class="{{['data-v-29af7fd7', 'change-percent', i]}}">{{h}}</view><text class="stock-price data-v-29af7fd7">{{j}}</text></view><view wx:if="{{k}}" class="delete-action data-v-29af7fd7" catchtap="{{l}}"><view class="delete-icon-wrapper data-v-29af7fd7"><text class="delete-icon data-v-29af7fd7">✕</text></view></view></view></movable-view></movable-area></view>

+ 19 - 24
dist/dev/mp-weixin/pages/rank/rank.js

@@ -105,8 +105,7 @@ const _sfc_main = {
             trendData: item.trendData
           }));
         } else {
-          const localStocks = common_vendor.index.getStorageSync("my_stocks") || [];
-          myStocks.value = localStocks;
+          myStocks.value = [];
         }
         await fetchIndexData();
         if (myStocks.value.length > 0) {
@@ -115,8 +114,7 @@ const _sfc_main = {
         startAutoRefresh();
       } catch (e) {
         console.error("加载股票列表失败:", e);
-        const localStocks = common_vendor.index.getStorageSync("my_stocks") || [];
-        myStocks.value = localStocks;
+        myStocks.value = [];
         startAutoRefresh();
       }
     };
@@ -146,7 +144,6 @@ const _sfc_main = {
               }
             }
           });
-          common_vendor.index.setStorageSync("my_stocks", myStocks.value);
         }
       } catch (e) {
         console.error("[我的股票] 刷新异常:", e.message);
@@ -192,14 +189,14 @@ const _sfc_main = {
           if (res.confirm) {
             try {
               await utils_api.deleteUserStock(stock.code);
+              myStocks.value.splice(idx, 1);
+              common_vendor.index.showToast({ title: "删除成功", icon: "success" });
+              if (myStocks.value.length === 0) {
+                stopAutoRefresh();
+              }
             } catch (e) {
               console.error("删除失败:", e);
-            }
-            myStocks.value.splice(idx, 1);
-            common_vendor.index.setStorageSync("my_stocks", myStocks.value);
-            common_vendor.index.showToast({ title: "删除成功", icon: "success" });
-            if (myStocks.value.length === 0) {
-              stopAutoRefresh();
+              common_vendor.index.showToast({ title: "删除失败", icon: "none" });
             }
           }
         }
@@ -231,9 +228,7 @@ const _sfc_main = {
         g: common_vendor.n(getIndexChangeClass(indexData.value.changePercent)),
         h: common_vendor.t(viewMode.value === "list" ? "📊" : "📋"),
         i: common_vendor.o(toggleViewMode),
-        j: viewMode.value === "list" && myStocks.value.length > 0
-      }, viewMode.value === "list" && myStocks.value.length > 0 ? {
-        k: common_vendor.f(myStocks.value, (stock, index, i0) => {
+        j: common_vendor.f(myStocks.value, (stock, index, i0) => {
           return {
             a: stock.code,
             b: common_vendor.o(($event) => removeStock(index), stock.code),
@@ -244,10 +239,9 @@ const _sfc_main = {
               ["show-delete"]: true
             })
           };
-        })
-      } : {}, {
-        l: viewMode.value === "table" && myStocks.value.length > 0
-      }, viewMode.value === "table" && myStocks.value.length > 0 ? {
+        }),
+        k: viewMode.value === "list",
+        l: myStocks.value.length === 0 ? 1 : "",
         m: common_vendor.f(myStocks.value, (stock, index, i0) => {
           return {
             a: common_vendor.t(stock.name),
@@ -261,14 +255,15 @@ const _sfc_main = {
             i: stock.code,
             j: common_vendor.o(($event) => handleStockClick(stock, index), stock.code)
           };
-        })
-      } : {}, {
-        n: myStocks.value.length === 0
+        }),
+        n: viewMode.value === "table",
+        o: myStocks.value.length === 0 ? 1 : "",
+        p: myStocks.value.length === 0
       }, myStocks.value.length === 0 ? {} : {}, {
-        o: !isLoggedIn.value ? 1 : "",
-        p: !isLoggedIn.value
+        q: !isLoggedIn.value ? 1 : "",
+        r: !isLoggedIn.value
       }, !isLoggedIn.value ? {
-        q: common_vendor.o(goToLogin)
+        s: common_vendor.o(goToLogin)
       } : {});
     };
   }

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
dist/dev/mp-weixin/pages/rank/rank.wxml


+ 5 - 0
dist/dev/mp-weixin/pages/rank/rank.wxss

@@ -86,6 +86,11 @@
   font-size: 28rpx;
 }
 
+/* 隐藏空列表 */
+.hidden-list {
+  display: none !important;
+}
+
 /* 股票列表 */
 .stock-list {
   display: flex;

+ 12 - 1
src/components/StockListItem.vue

@@ -33,7 +33,10 @@
 
           <!-- 右侧:涨跌幅和价格 -->
           <view class="stock-right">
-            <view :class="['change-percent', getChangeClass(stock.changePercent)]">
+            <view 
+              v-if="hasValidChange(stock.changePercent)" 
+              :class="['change-percent', getChangeClass(stock.changePercent)]"
+            >
               {{ formatChangePercent(stock.changePercent) }}
             </view>
             <text class="stock-price">{{ formatPrice(stock.currentPrice) }}</text>
@@ -115,6 +118,14 @@ const formatPrice = (price) => {
   return parseFloat(price).toFixed(2)
 }
 
+// 判断是否有有效的涨跌幅(非0、非空)
+const hasValidChange = (changePercent) => {
+  if (!changePercent) return false
+  const str = String(changePercent).replace('%', '').replace('+', '')
+  const value = parseFloat(str)
+  return value !== 0 && !isNaN(value)
+}
+
 // 绘制趋势图
 const drawTrendChart = (instance) => {
   console.log('[趋势图] 开始绘制:', props.stock.code, canvasId.value)

+ 18 - 21
src/pages/rank/rank.vue

@@ -30,7 +30,7 @@
         </view>
 
         <!-- 列表视图 -->
-        <view v-if="viewMode === 'list' && myStocks.length > 0" class="stock-list">
+        <view v-show="viewMode === 'list'" class="stock-list" :class="{ 'hidden-list': myStocks.length === 0 }">
           <stock-list-item 
             v-for="(stock, index) in myStocks" 
             :key="stock.code"
@@ -42,7 +42,7 @@
         </view>
 
         <!-- 表格视图 -->
-        <view v-if="viewMode === 'table' && myStocks.length > 0" class="stock-table">
+        <view v-show="viewMode === 'table'" class="stock-table" :class="{ 'hidden-list': myStocks.length === 0 }">
           <!-- 表头 -->
           <view class="table-header">
             <text class="th-name">股票</text>
@@ -182,7 +182,7 @@ const getMarketClass = (code) => {
   return 'market-sh'
 }
 
-// 加载我的股票列表(从服务器)
+// 加载我的股票列表(从服务器数据库查询
 const loadMyStocks = async () => {
   if (!isLoggedIn.value) {
     myStocks.value = []
@@ -209,9 +209,7 @@ const loadMyStocks = async () => {
         trendData: item.trendData
       }))
     } else {
-      // 如果服务器没有数据,尝试从本地存储加载
-      const localStocks = uni.getStorageSync('my_stocks') || []
-      myStocks.value = localStocks
+      myStocks.value = []
     }
     
     // 获取上证指数
@@ -226,9 +224,7 @@ const loadMyStocks = async () => {
     startAutoRefresh()
   } catch (e) {
     console.error('加载股票列表失败:', e)
-    // 失败时从本地存储加载
-    const localStocks = uni.getStorageSync('my_stocks') || []
-    myStocks.value = localStocks
+    myStocks.value = []
     startAutoRefresh()
   }
 }
@@ -263,9 +259,6 @@ const refreshAllQuotes = async () => {
           }
         }
       })
-      
-      // 同步到本地存储
-      uni.setStorageSync('my_stocks', myStocks.value)
     }
   } catch (e) {
     console.error('[我的股票] 刷新异常:', e.message)
@@ -323,17 +316,16 @@ const removeStock = async (idx) => {
         try {
           // 调用服务器删除接口
           await deleteUserStock(stock.code)
+          // 从本地列表删除
+          myStocks.value.splice(idx, 1)
+          uni.showToast({ title: '删除成功', icon: 'success' })
+          
+          if (myStocks.value.length === 0) {
+            stopAutoRefresh()
+          }
         } catch (e) {
           console.error('删除失败:', e)
-        }
-        
-        // 从本地列表删除
-        myStocks.value.splice(idx, 1)
-        uni.setStorageSync('my_stocks', myStocks.value)
-        uni.showToast({ title: '删除成功', icon: 'success' })
-        
-        if (myStocks.value.length === 0) {
-          stopAutoRefresh()
+          uni.showToast({ title: '删除失败', icon: 'none' })
         }
       }
     }
@@ -462,6 +454,11 @@ onUnload(() => {
   font-size: 28rpx;
 }
 
+/* 隐藏空列表 */
+.hidden-list {
+  display: none !important;
+}
+
 /* 股票列表 */
 .stock-list {
   display: flex;

+ 1 - 0
src/utils/api.js

@@ -7,6 +7,7 @@
 // 例如:const DEV_BASE_URL = 'http://192.168.1.3:8080'
 // 可以通过命令 ipconfig (Windows) 或 ifconfig (Mac/Linux) 查看IP地址
 // const DEV_BASE_URL = 'http://192.168.1.3:8080'
+// const DEV_BASE_URL = 'http://192.168.1.3:8081'
 const DEV_BASE_URL = 'http://localhost:8081'
 
 // 生产环境配置(部署后的服务器地址)

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff