Explorar el Código

超短池构建

Zhangbw hace 3 meses
padre
commit
aefc5c64f4

+ 0 - 56
app.json

@@ -1,56 +0,0 @@
-{
-  "pages": [
-    "pages/index/index",
-    "pages/logs/logs",
-    "pages/pool/pool",
-    "pages/strong/strong",
-    "pages/rank/rank",
-    "pages/mine/mine"
-  ],
-  "window": {
-    "navigationBarBackgroundColor": "#ffffff",
-    "navigationBarTextStyle": "black",
-    "navigationBarTitleText": "量化选股大师"
-  },
-  "tabBar": {
-    "color": "#999999",
-    "selectedColor": "#5d55e8",
-    "backgroundColor": "#ffffff",
-    "list": [
-      {
-        "pagePath": "pages/index/index",
-        "text": "打分查询",
-        "iconPath": "images/tab_search.png",
-        "selectedIconPath": "images/tab_search_active.png"
-      },
-      {
-        "pagePath": "pages/pool/pool",
-        "text": "超短池",
-        "iconPath": "images/tab_short.png",
-        "selectedIconPath": "images/tab_short_active.png"
-      },
-      {
-        "pagePath": "pages/strong/strong",
-        "text": "强势池",
-        "iconPath": "images/tab_strong.png",
-        "selectedIconPath": "images/tab_strong_active.png"
-      },
-      {
-        "pagePath": "pages/rank/rank",
-        "text": "模拟排名",
-        "iconPath": "images/tab_rank.png",
-        "selectedIconPath": "images/tab_rank_active.png"
-      },
-      {
-        "pagePath": "pages/mine/mine",
-        "text": "个人中心",
-        "iconPath": "images/tab_mine.png",
-        "selectedIconPath": "images/tab_mine_active.png"
-      }
-    ]
-  },
-  "style": "v2",
-  "componentFramework": "glass-easel",
-  "sitemapLocation": "sitemap.json",
-  "lazyCodeLoading": "requiredComponents"
-}

+ 0 - 10
app.wxss

@@ -1,10 +0,0 @@
-/**app.wxss**/
-.container {
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: space-between;
-  padding: 200rpx 0;
-  box-sizing: border-box;
-} 

+ 1 - 1
dist/dev/mp-weixin/app.js

@@ -29,7 +29,7 @@ const _sfc_main = {
     console.log("App Hide");
   }
 };
-const App = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "C:/Users/Avak/WeChatProjects/miniprogram-1/src/App.vue"]]);
+const App = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/program/miniprogram-1/src/App.vue"]]);
 function createApp() {
   const app = common_vendor.createSSRApp(App);
   return {

+ 0 - 12
dist/dev/mp-weixin/common/vendor.js

@@ -6745,13 +6745,7 @@ const createHook = (lifecycle) => (hook, target = getCurrentInstance()) => {
   !isInSSRComponentSetup && injectHook(lifecycle, hook, target);
 };
 const onShow = /* @__PURE__ */ createHook(ON_SHOW);
-const onHide = /* @__PURE__ */ createHook(ON_HIDE);
 const onLoad = /* @__PURE__ */ createHook(ON_LOAD);
-const onReady = /* @__PURE__ */ createHook(ON_READY);
-const onUnload = /* @__PURE__ */ createHook(ON_UNLOAD);
-const onReachBottom = /* @__PURE__ */ createHook(ON_REACH_BOTTOM);
-const onPullDownRefresh = /* @__PURE__ */ createHook(ON_PULL_DOWN_REFRESH);
-const onShareAppMessage = /* @__PURE__ */ createHook(ON_SHARE_APP_MESSAGE);
 exports._export_sfc = _export_sfc;
 exports.createSSRApp = createSSRApp;
 exports.e = e;
@@ -6759,13 +6753,7 @@ exports.f = f;
 exports.index = index;
 exports.n = n;
 exports.o = o;
-exports.onHide = onHide;
 exports.onLoad = onLoad;
-exports.onPullDownRefresh = onPullDownRefresh;
-exports.onReachBottom = onReachBottom;
-exports.onReady = onReady;
-exports.onShareAppMessage = onShareAppMessage;
 exports.onShow = onShow;
-exports.onUnload = onUnload;
 exports.ref = ref;
 exports.t = t;

+ 11 - 14
dist/dev/mp-weixin/pages/index/index.js

@@ -15,6 +15,7 @@ const _sfc_main = {
     const onKeywordChange = (e) => {
       const value = e.detail.value;
       keyword.value = value;
+      console.log("输入关键词:", value);
       if (timer) {
         clearTimeout(timer);
       }
@@ -29,17 +30,13 @@ const _sfc_main = {
         return;
       }
       try {
-        const res = await utils_api.getSuggestions(kw.trim());
-        if (res.code === 0) {
-          const list = res.data || [];
-          suggestions.value = list;
-          showDropdown.value = list.length > 0;
-        } else {
-          suggestions.value = [];
-          showDropdown.value = false;
-        }
+        const list = await utils_api.getSuggestions(kw.trim());
+        console.log("模糊查询返回数据:", list);
+        suggestions.value = Array.isArray(list) ? list : [];
+        showDropdown.value = suggestions.value.length > 0;
+        console.log("下拉框状态:", { showDropdown: showDropdown.value, suggestionsLength: suggestions.value.length });
       } catch (err) {
-        console.error(err);
+        console.error("模糊查询错误:", err);
         suggestions.value = [];
         showDropdown.value = false;
       }
@@ -90,7 +87,7 @@ const _sfc_main = {
     const onInputBlur = () => {
       setTimeout(() => {
         showDropdown.value = false;
-      }, 200);
+      }, 300);
     };
     return (_ctx, _cache) => {
       return common_vendor.e({
@@ -99,8 +96,8 @@ const _sfc_main = {
         c: common_vendor.o(onInputBlur),
         d: keyword.value,
         e: common_vendor.o(onSearch),
-        f: showDropdown.value && suggestions.value.length > 0
-      }, showDropdown.value && suggestions.value.length > 0 ? {
+        f: showDropdown.value && suggestions.value && suggestions.value.length > 0
+      }, showDropdown.value && suggestions.value && suggestions.value.length > 0 ? {
         g: common_vendor.f(suggestions.value, (item, index, i0) => {
           return {
             a: common_vendor.t(item.name),
@@ -141,5 +138,5 @@ const _sfc_main = {
     };
   }
 };
-const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "C:/Users/Avak/WeChatProjects/miniprogram-1/src/pages/index/index.vue"]]);
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/program/miniprogram-1/src/pages/index/index.vue"]]);
 wx.createPage(MiniProgramPage);

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/dev/mp-weixin/pages/index/index.wxml


+ 34 - 17
dist/dev/mp-weixin/pages/index/index.wxss

@@ -1,19 +1,35 @@
 
 /** 首页量化查询界面样式 **/
-.page {
+.page-title-card {
+  background: #ffffff;
+  padding: 30rpx 0;
+  text-align: center;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
+  border-radius: 0;
+}
+.page-title-text {
+  font-size: 36rpx;
+  font-weight: 800;
+  color: #3F51F7;
+  letter-spacing: 2rpx;
+}
+.page-container {
   height: 100vh;
-  box-sizing: border-box;
-  padding: 32rpx 32rpx 48rpx;
+  display: flex;
+  flex-direction: column;
   background: #f5f6fb;
 }
-.page-title {
-  margin-top: 8rpx;
-  margin-bottom: 24rpx;
-  text-align: center;
-  font-size: 32rpx;
-  font-weight: 700;
-  color: #5d55e8;
-  letter-spacing: 4rpx;
+
+/* 移除旧的 custom-header 样式,或者保留也无妨,因为 HTML 中不再使用 */
+.custom-header {
+  display: none;
+}
+.scroll-view {
+  flex: 1;
+  height: 0;
+}
+.content-wrapper {
+  padding: 32rpx 32rpx 48rpx;
 }
 .card {
   background: #ffffff;
@@ -21,11 +37,11 @@
   padding: 32rpx 32rpx 36rpx;
   box-shadow: 0 16rpx 40rpx rgba(37, 52, 94, 0.08);
   margin-bottom: 32rpx;
-  position: relative; /* 确保下拉列表定位参照此元素 */
+  position: relative;
 }
 .search-card {
   margin-top: 16rpx;
-  z-index: 10; /* 确保搜索卡片层级较高 */
+  z-index: 10;
 }
 .card-title {
   display: block;
@@ -91,15 +107,16 @@
 /* 下拉列表样式 */
 .search-dropdown {
   position: absolute;
-  top: 180rpx; /* 根据标题和输入框高度估算 */
-  left: 32rpx;
-  right: 32rpx;
+  top: 100%; /* 相对于父元素定位,在搜索框下方 */
+  left: 0;
+  right: 0;
+  margin-top: 8rpx;
   background: #ffffff;
   border-radius: 16rpx;
   box-shadow: 0 10rpx 30rpx rgba(0, 0, 0, 0.15);
   max-height: 400rpx;
   overflow-y: auto;
-  z-index: 999;
+  z-index: 1000; /* 提高层级,确保在最上层 */
   border: 1rpx solid #f0f0f0;
 }
 .dropdown-item {

+ 1 - 1
dist/dev/mp-weixin/pages/mine/mine.js

@@ -8,5 +8,5 @@ const _sfc_main = {
     };
   }
 };
-const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "C:/Users/Avak/WeChatProjects/miniprogram-1/src/pages/mine/mine.vue"]]);
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/program/miniprogram-1/src/pages/mine/mine.vue"]]);
 wx.createPage(MiniProgramPage);

+ 1 - 1
dist/dev/mp-weixin/pages/mine/mine.wxml

@@ -1 +1 @@
-<view class="page-mine"><text class="title">个人中心</text><text class="sub">这里后续可以展示用户信息和设置</text></view>
+<view class="page-mine"><view class="page-title-card"><text class="page-title-text">量化选股大师</text></view><view class="content-area"><text class="title">个人中心</text><text class="sub">这里后续可以展示用户信息和设置</text></view></view>

+ 18 - 2
dist/dev/mp-weixin/pages/mine/mine.wxss

@@ -1,9 +1,25 @@
 
 .page-mine {
-  padding: 30rpx;
   display: flex;
   flex-direction: column;
-  align-items: center;
+  background: #f5f6fb;
+  min-height: 100vh;
+}
+.page-title-card {
+  background: #ffffff;
+  padding: 30rpx 0;
+  text-align: center;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
+  border-radius: 0;
+}
+.content-area {
+  padding: 32rpx;
+}
+.page-title-text {
+  font-size: 36rpx;
+  font-weight: 800;
+  color: #3F51F7;
+  letter-spacing: 2rpx;
 }
 .title {
   font-size: 36rpx;

+ 90 - 16
dist/dev/mp-weixin/pages/pool/pool.js

@@ -3,27 +3,101 @@ const common_vendor = require("../../common/vendor.js");
 const _sfc_main = {
   __name: "pool",
   setup(__props) {
-    common_vendor.onLoad((options) => {
-    });
-    common_vendor.onReady(() => {
+    const isPurchased = common_vendor.ref(false);
+    const showModal = common_vendor.ref(false);
+    const selectedPlan = common_vendor.ref("daily");
+    const selectedDate = common_vendor.ref("2025年11月20日");
+    const checkPurchaseStatus = () => {
+      try {
+        const purchaseInfo = common_vendor.index.getStorageSync("pool_purchase");
+        if (purchaseInfo) {
+          const now = Date.now();
+          const expireTime = purchaseInfo.expireTime;
+          if (now < expireTime) {
+            isPurchased.value = true;
+          } else {
+            common_vendor.index.removeStorageSync("pool_purchase");
+            isPurchased.value = false;
+          }
+        } else {
+          isPurchased.value = false;
+        }
+      } catch (e) {
+        console.error("检查购买状态失败:", e);
+        isPurchased.value = false;
+      }
+    };
+    const showPurchaseModal = () => {
+      showModal.value = true;
+    };
+    const closePurchaseModal = () => {
+      showModal.value = false;
+    };
+    const handlePurchase = () => {
+      if (!selectedPlan.value) {
+        common_vendor.index.showToast({
+          title: "请选择订阅方案",
+          icon: "none"
+        });
+        return;
+      }
+      const now = Date.now();
+      let expireTime = now;
+      if (selectedPlan.value === "daily") {
+        const today = /* @__PURE__ */ new Date();
+        today.setHours(23, 59, 59, 999);
+        expireTime = today.getTime();
+      } else if (selectedPlan.value === "weekly") {
+        expireTime = now + 7 * 24 * 60 * 60 * 1e3;
+      }
+      const purchaseInfo = {
+        plan: selectedPlan.value,
+        purchaseTime: now,
+        expireTime
+      };
+      common_vendor.index.setStorageSync("pool_purchase", purchaseInfo);
+      isPurchased.value = true;
+      closePurchaseModal();
+      common_vendor.index.showToast({
+        title: "解锁成功",
+        icon: "success"
+      });
+    };
+    const onHistorySearch = () => {
+      common_vendor.index.showToast({
+        title: "历史查询功能开发中",
+        icon: "none"
+      });
+    };
+    common_vendor.onLoad(() => {
+      checkPurchaseStatus();
     });
     common_vendor.onShow(() => {
-    });
-    common_vendor.onHide(() => {
-    });
-    common_vendor.onUnload(() => {
-    });
-    common_vendor.onPullDownRefresh(() => {
-    });
-    common_vendor.onReachBottom(() => {
-    });
-    common_vendor.onShareAppMessage(() => {
+      checkPurchaseStatus();
     });
     return (_ctx, _cache) => {
-      return {};
+      return common_vendor.e({
+        a: !isPurchased.value
+      }, !isPurchased.value ? {
+        b: common_vendor.o(showPurchaseModal)
+      } : {}, {
+        c: selectedDate.value,
+        d: common_vendor.o(($event) => selectedDate.value = $event.detail.value),
+        e: common_vendor.o(onHistorySearch),
+        f: showModal.value
+      }, showModal.value ? {
+        g: common_vendor.o(closePurchaseModal),
+        h: selectedPlan.value === "daily" ? 1 : "",
+        i: common_vendor.o(($event) => selectedPlan.value = "daily"),
+        j: selectedPlan.value === "weekly" ? 1 : "",
+        k: common_vendor.o(($event) => selectedPlan.value = "weekly"),
+        l: common_vendor.o(handlePurchase),
+        m: common_vendor.o(() => {
+        }),
+        n: common_vendor.o(closePurchaseModal)
+      } : {});
     };
   }
 };
-const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "C:/Users/Avak/WeChatProjects/miniprogram-1/src/pages/pool/pool.vue"]]);
-_sfc_main.__runtimeHooks = 2;
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/program/miniprogram-1/src/pages/pool/pool.vue"]]);
 wx.createPage(MiniProgramPage);

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 1
dist/dev/mp-weixin/pages/pool/pool.wxml


+ 304 - 1
dist/dev/mp-weixin/pages/pool/pool.wxss

@@ -1,2 +1,305 @@
 
-/* pages/pool/pool.wxss */
+.page-container {
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+  background: #f5f6fb;
+}
+.scroll-view {
+  flex: 1;
+  height: 0;
+}
+.content-wrapper {
+  padding: 32rpx;
+  background: #f5f6fb;
+  min-height: 100%;
+}
+.page-title-card {
+  background: #ffffff;
+  padding: 30rpx 0;
+  text-align: center;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
+  border-radius: 0;
+}
+.page-title-text {
+  font-size: 36rpx;
+  font-weight: 800;
+  color: #3F51F7;
+  letter-spacing: 2rpx;
+}
+.card {
+  background: #ffffff;
+  border-radius: 24rpx;
+  padding: 32rpx;
+  box-shadow: 0 16rpx 40rpx rgba(37, 52, 94, 0.08);
+  margin-bottom: 32rpx;
+}
+
+/* 性能指标卡片 */
+.performance-card {
+  display: flex;
+  justify-content: space-around;
+  align-items: center;
+  background: #f7f8fc;
+  padding: 32rpx 24rpx;
+}
+.performance-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+.performance-label {
+  font-size: 24rpx;
+  color: #666a7f;
+  margin-bottom: 12rpx;
+}
+.performance-value {
+  font-size: 32rpx;
+  font-weight: 700;
+  color: #222222;
+}
+.performance-value.success {
+  color: #3abf81;
+}
+.performance-value.profit {
+  color: #f16565;
+}
+
+/* 超短精选池卡片 */
+.pool-card {
+  padding: 40rpx 32rpx;
+}
+.pool-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 16rpx;
+}
+.pool-icon {
+  font-size: 32rpx;
+  margin-right: 12rpx;
+}
+.pool-title {
+  font-size: 32rpx;
+  font-weight: 600;
+  color: #222222;
+}
+.pool-desc {
+  font-size: 26rpx;
+  color: #666a7f;
+  margin-bottom: 32rpx;
+}
+
+/* 锁定内容 */
+.locked-content {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  padding: 60rpx 0 40rpx;
+}
+.lock-icon-wrapper {
+  margin-bottom: 32rpx;
+}
+.lock-icon {
+  font-size: 80rpx;
+}
+.lock-text {
+  font-size: 28rpx;
+  color: #222222;
+  margin-bottom: 16rpx;
+  text-align: center;
+}
+.lock-desc {
+  font-size: 24rpx;
+  color: #9ca2b5;
+  margin-bottom: 48rpx;
+  text-align: center;
+  line-height: 1.6;
+}
+.unlock-button {
+  width: 100%;
+  background: linear-gradient(135deg, #5d55e8, #7568ff);
+  border-radius: 16rpx;
+  padding: 28rpx 0;
+  text-align: center;
+  box-shadow: 0 12rpx 24rpx rgba(93, 85, 232, 0.4);
+}
+.unlock-button-text {
+  font-size: 30rpx;
+  font-weight: 600;
+  color: #ffffff;
+}
+
+/* 已解锁内容 */
+.unlocked-content {
+  margin-top: 32rpx;
+}
+.unlocked-tip {
+  font-size: 26rpx;
+  color: #3abf81;
+  margin-bottom: 24rpx;
+  display: block;
+}
+.stock-list-placeholder {
+  padding: 60rpx 0;
+  text-align: center;
+  background: #f7f8fc;
+  border-radius: 16rpx;
+}
+.placeholder-text {
+  font-size: 26rpx;
+  color: #9ca2b5;
+}
+
+/* 历史股票池回顾 */
+.history-card {
+  padding: 32rpx;
+}
+.history-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 24rpx;
+}
+.history-icon {
+  font-size: 28rpx;
+  margin-right: 12rpx;
+}
+.history-title {
+  font-size: 30rpx;
+  font-weight: 600;
+  color: #222222;
+}
+.history-search-row {
+  display: flex;
+  align-items: center;
+  margin-bottom: 16rpx;
+}
+.history-date-input {
+  flex: 1;
+  background: #f7f8fc;
+  border-radius: 12rpx;
+  padding: 24rpx 24rpx;
+  font-size: 26rpx;
+  color: #222222;
+}
+.history-search-button {
+  width: 80rpx;
+  height: 80rpx;
+  background: #5d55e8;
+  border-radius: 12rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-left: 16rpx;
+}
+.search-icon {
+  font-size: 32rpx;
+  color: #ffffff;
+}
+.history-tip {
+  font-size: 24rpx;
+  color: #9ca2b5;
+  line-height: 1.6;
+}
+
+/* 购买弹窗 */
+.modal-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: rgba(0, 0, 0, 0.5);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  z-index: 1000;
+}
+.modal-content {
+  width: 640rpx;
+  background: #ffffff;
+  border-radius: 24rpx;
+  padding: 40rpx 32rpx 32rpx;
+  box-sizing: border-box;
+}
+.modal-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 32rpx;
+}
+.modal-title {
+  font-size: 32rpx;
+  font-weight: 600;
+  color: #222222;
+}
+.modal-close {
+  font-size: 48rpx;
+  color: #9ca2b5;
+  line-height: 1;
+  width: 48rpx;
+  height: 48rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.subscription-options {
+  margin-bottom: 32rpx;
+}
+.subscription-option {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 32rpx 24rpx;
+  border: 2rpx solid #e5e7eb;
+  border-radius: 16rpx;
+  margin-bottom: 20rpx;
+  transition: all 0.3s;
+}
+.subscription-option.active {
+  border-color: #5d55e8;
+  background: #f7f8fc;
+}
+.option-info {
+  display: flex;
+  flex-direction: column;
+}
+.option-title {
+  font-size: 28rpx;
+  font-weight: 600;
+  color: #222222;
+  margin-bottom: 8rpx;
+}
+.option-desc {
+  font-size: 24rpx;
+  color: #9ca2b5;
+}
+.option-price {
+  font-size: 36rpx;
+  font-weight: 700;
+  color: #f16565;
+}
+.modal-footer {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+.pay-button {
+  width: 100%;
+  background: #f16565;
+  border-radius: 16rpx;
+  padding: 28rpx 0;
+  text-align: center;
+  margin-bottom: 24rpx;
+}
+.pay-button-text {
+  font-size: 30rpx;
+  font-weight: 600;
+  color: #ffffff;
+}
+.agreement-text {
+  font-size: 22rpx;
+  color: #9ca2b5;
+}
+.bottom-safe-area {
+  height: 80rpx;
+}

+ 1 - 1
dist/dev/mp-weixin/pages/rank/rank.js

@@ -8,5 +8,5 @@ const _sfc_main = {
     };
   }
 };
-const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "C:/Users/Avak/WeChatProjects/miniprogram-1/src/pages/rank/rank.vue"]]);
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/program/miniprogram-1/src/pages/rank/rank.vue"]]);
 wx.createPage(MiniProgramPage);

+ 1 - 1
dist/dev/mp-weixin/pages/rank/rank.wxml

@@ -1 +1 @@
-<view class="page-rank"><text class="title">模拟排名</text><text class="sub">这里后续可以展示策略或股票排名</text></view>
+<view class="page-rank"><view class="page-title-card"><text class="page-title-text">量化选股大师</text></view><view class="content-area"><text class="title">模拟排名</text><text class="sub">这里后续可以展示策略或股票排名</text></view></view>

+ 18 - 2
dist/dev/mp-weixin/pages/rank/rank.wxss

@@ -1,9 +1,25 @@
 
 .page-rank {
-  padding: 30rpx;
   display: flex;
   flex-direction: column;
-  align-items: center;
+  background: #f5f6fb;
+  min-height: 100vh;
+}
+.page-title-card {
+  background: #ffffff;
+  padding: 30rpx 0;
+  text-align: center;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
+  border-radius: 0;
+}
+.content-area {
+  padding: 32rpx;
+}
+.page-title-text {
+  font-size: 36rpx;
+  font-weight: 800;
+  color: #3F51F7;
+  letter-spacing: 2rpx;
 }
 .title {
   font-size: 36rpx;

+ 1 - 1
dist/dev/mp-weixin/pages/strong/strong.js

@@ -8,5 +8,5 @@ const _sfc_main = {
     };
   }
 };
-const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "C:/Users/Avak/WeChatProjects/miniprogram-1/src/pages/strong/strong.vue"]]);
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/program/miniprogram-1/src/pages/strong/strong.vue"]]);
 wx.createPage(MiniProgramPage);

+ 1 - 1
dist/dev/mp-weixin/pages/strong/strong.wxml

@@ -1 +1 @@
-<view class="page-strong"><text class="title">强势池</text><text class="sub">这里后续可以展示强势股票列表</text></view>
+<view class="page-strong"><view class="page-title-card"><text class="page-title-text">量化选股大师</text></view><view class="content-area"><text class="title">强势池</text><text class="sub">这里后续可以展示强势股票列表</text></view></view>

+ 18 - 2
dist/dev/mp-weixin/pages/strong/strong.wxss

@@ -1,9 +1,25 @@
 
 .page-strong {
-  padding: 30rpx;
   display: flex;
   flex-direction: column;
-  align-items: center;
+  background: #f5f6fb;
+  min-height: 100vh;
+}
+.page-title-card {
+  background: #ffffff;
+  padding: 30rpx 0;
+  text-align: center;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
+  border-radius: 0;
+}
+.content-area {
+  padding: 32rpx;
+}
+.page-title-text {
+  font-size: 36rpx;
+  font-weight: 800;
+  color: #3F51F7;
+  letter-spacing: 2rpx;
 }
 .title {
   font-size: 36rpx;

+ 0 - 4
pages/index/index.json

@@ -1,4 +0,0 @@
-{
-  "usingComponents": {
-  }
-}

+ 0 - 258
pages/index/index.wxss

@@ -1,258 +0,0 @@
-/** 首页量化查询界面样式 **/
-
-.page {
-  height: 100vh;
-  box-sizing: border-box;
-  padding: 32rpx 32rpx 48rpx;
-  background: #f5f6fb;
-}
-
-.page-title {
-  margin-top: 8rpx;
-  margin-bottom: 24rpx;
-  text-align: center;
-  font-size: 32rpx;
-  font-weight: 700;
-  color: #5d55e8;
-  letter-spacing: 4rpx;
-}
-
-.card {
-  background: #ffffff;
-  border-radius: 24rpx;
-  padding: 32rpx 32rpx 36rpx;
-  box-shadow: 0 16rpx 40rpx rgba(37, 52, 94, 0.08);
-  margin-bottom: 32rpx;
-}
-
-.search-card {
-  margin-top: 16rpx;
-}
-
-.card-title {
-  display: block;
-  font-size: 32rpx;
-  font-weight: 600;
-  color: #222222;
-  margin-bottom: 32rpx;
-}
-
-.search-row {
-  display: flex;
-  align-items: center;
-  background: #f7f8fc;
-  border-radius: 999rpx;
-  padding: 0 8rpx 0 32rpx;
-  height: 96rpx;
-  box-sizing: border-box;
-}
-
-.search-input {
-  flex: 1;
-  font-size: 28rpx;
-  color: #222222;
-}
-
-.search-placeholder {
-  color: #b4b8c6;
-}
-
-.search-button {
-  width: 96rpx;
-  height: 80rpx;
-  margin-left: 12rpx;
-  border-radius: 999rpx;
-  background: linear-gradient(135deg, #5d55e8, #7568ff);
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  box-shadow: 0 12rpx 24rpx rgba(93, 85, 232, 0.4);
-}
-
-.icon-search {
-  width: 0;
-  height: 0;
-  border-radius: 50%;
-  border: 10rpx solid #ffffff;
-  border-color: #ffffff transparent transparent transparent;
-  position: relative;
-}
-
-.icon-search::after {
-  content: '';
-  position: absolute;
-  width: 24rpx;
-  height: 4rpx;
-  border-radius: 999rpx;
-  background: #ffffff;
-  transform: rotate(45deg);
-  right: -20rpx;
-  bottom: -6rpx;
-}
-
-.search-tip {
-  display: block;
-  margin-top: 20rpx;
-  font-size: 24rpx;
-  color: #9ca2b5;
-}
-
-.result-card {
-  margin-top: 8rpx;
-}
-
-.result-loading {
-  font-size: 26rpx;
-  color: #666a7f;
-}
-
-.result-error {
-  font-size: 26rpx;
-  color: #ff5b5b;
-}
-
-.result-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 16rpx;
-}
-
-.result-name-line {
-  display: flex;
-  flex-direction: column;
-}
-
-.result-name {
-  font-size: 32rpx;
-  font-weight: 600;
-  color: #222222;
-}
-
-.result-code {
-  margin-top: 6rpx;
-  font-size: 24rpx;
-  color: #8187a0;
-}
-
-.result-market {
-  margin-top: 2rpx;
-  font-size: 22rpx;
-  color: #b0b4c5;
-}
-
-.result-score-block {
-  min-width: 140rpx;
-  padding: 12rpx 20rpx;
-  border-radius: 20rpx;
-  background: linear-gradient(135deg, #5d55e8, #7568ff);
-  text-align: right;
-  color: #ffffff;
-}
-
-.result-score {
-  font-size: 40rpx;
-  font-weight: 700;
-}
-
-.result-score-label {
-  display: block;
-  margin-top: 4rpx;
-  font-size: 20rpx;
-  opacity: 0.9;
-}
-
-.result-meta {
-  margin-top: 10rpx;
-}
-
-.meta-item {
-  font-size: 24rpx;
-  color: #666a7f;
-}
-
-.meta-change {
-  margin-left: 10rpx;
-}
-
-.meta-change.up {
-  color: #e53935;
-}
-
-.meta-change.down {
-  color: #1a9b4a;
-}
-
-.card-header {
-  display: flex;
-  align-items: center;
-  margin-bottom: 24rpx;
-}
-
-.card-header-title {
-  font-size: 30rpx;
-  font-weight: 600;
-  color: #222222;
-}
-
-.icon-circle {
-  width: 40rpx;
-  height: 40rpx;
-  border-radius: 50%;
-  background: #e7f7ef;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  margin-right: 16rpx;
-}
-
-.icon-check {
-  font-size: 24rpx;
-  color: #28a745;
-}
-
-.advantage-item {
-  margin-bottom: 12rpx;
-  font-size: 26rpx;
-  line-height: 1.6;
-  color: #4a4f63;
-}
-
-.advantage-label {
-  font-weight: 600;
-}
-
-.advantage-desc {
-  font-weight: 400;
-}
-
-.risk-card {
-  margin-bottom: 24rpx;
-}
-
-.icon-warning {
-  width: 40rpx;
-  height: 40rpx;
-  border-radius: 50%;
-  background: #ffecef;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  margin-right: 16rpx;
-}
-
-.icon-warning-text {
-  font-size: 26rpx;
-  color: #ff5b5b;
-}
-
-.risk-text {
-  display: block;
-  font-size: 24rpx;
-  line-height: 1.8;
-  color: #666a7f;
-}
-
-.bottom-safe-area {
-  height: 80rpx;
-}

+ 0 - 16
pages/logs/logs.wxss

@@ -1,16 +0,0 @@
-page {
-  height: 100vh;
-  display: flex;
-  flex-direction: column;
-}
-.scrollarea {
-  flex: 1;
-  overflow-y: hidden;
-}
-.log-item {
-  margin-top: 20rpx;
-  text-align: center;
-}
-.log-item:last-child {
-  padding-bottom: env(safe-area-inset-bottom);
-}

+ 0 - 3
pages/mine/mine.json

@@ -1,3 +0,0 @@
-{
-  "navigationBarTitleText": "个人中心"
-}

+ 0 - 3
pages/pool/pool.json

@@ -1,3 +0,0 @@
-{
-  "usingComponents": {}
-}

+ 0 - 1
pages/pool/pool.wxss

@@ -1 +0,0 @@
-/* pages/pool/pool.wxss */

+ 0 - 3
pages/rank/rank.json

@@ -1,3 +0,0 @@
-{
-  "navigationBarTitleText": "模拟排名"
-}

+ 0 - 4
pages/strong/strong.json

@@ -1,4 +0,0 @@
-{
-  "navigationBarTitleText": "强势池"
-}
-

+ 163 - 142
src/pages/index/index.vue

@@ -1,124 +1,130 @@
 <template>
-  <scroll-view class="page" scroll-y>
-    <!-- 顶部标题(量化选股大师) -->
-    <view class="page-title">量化选股大师</view>
-
-    <!-- 顶部查询卡片 -->
-    <view class="card search-card" style="position: relative; z-index: 100;">
-      <text class="card-title">量化分数实时查询 & 历史数据</text>
-
-      <view class="search-row">
-        <input
-          class="search-input"
-          type="text"
-          placeholder="请输入股票代码/名称 (如: 600030)"
-          placeholder-class="search-placeholder"
-          confirm-type="search"
-          v-model="keyword"
-          @input="onKeywordChange"
-          @confirm="onSearch"
-          @blur="onInputBlur"
-        />
-        <view class="search-button" @click="onSearch">
-          <text class="icon-search"></text>
-        </view>
-      </view>
-
-      <!-- 模糊搜索下拉列表 -->
-      <view class="search-dropdown" v-if="showDropdown && suggestions.length > 0">
-        <view 
-          v-for="(item, index) in suggestions" 
-          :key="index"
-          class="dropdown-item" 
-          hover-class="dropdown-item-hover" 
-          @click.stop="onSelectSuggestion(item)"
-        >
-          <text class="item-name">{{item.name}}</text>
-          <text class="item-code">{{item.code}}</text>
-        </view>
-      </view>
-
-      <text class="search-tip">支持A股代码或名称模糊查询</text>
+  <view class="page-container">
+    <!-- 顶部标题卡片 -->
+    <view class="page-title-card">
+      <text class="page-title-text">量化选股大师</text>
     </view>
-
-    <!-- 查询结果 -->
-    <view v-if="hasSearched" class="card result-card">
-      <view v-if="loading">
-        <text class="result-loading">正在查询,请稍候...</text>
-      </view>
-      <view v-else-if="errorMsg">
-        <text class="result-error">{{errorMsg}}</text>
-      </view>
-      <view v-else-if="result">
-        <!-- 头部:名称 / 代码 / 分数徽章 -->
-        <view class="detail-header">
-          <view>
-            <view class="detail-name">{{result.stockName}}({{result.stockCode}})</view>
-            <view class="detail-sub">最新量化系统评分</view>
+    <scroll-view class="scroll-view" scroll-y>
+      <view class="content-wrapper">
+
+        <!-- 顶部查询卡片 -->
+        <view class="card search-card" style="position: relative; z-index: 100;">
+          <text class="card-title">量化分数实时查询 & 历史数据</text>
+
+          <view class="search-row">
+            <input
+              class="search-input"
+              type="text"
+              placeholder="请输入股票代码/名称 (如: 600030)"
+              placeholder-class="search-placeholder"
+              confirm-type="search"
+              v-model="keyword"
+              @input="onKeywordChange"
+              @confirm="onSearch"
+              @blur="onInputBlur"
+            />
+            <view class="search-button" @click="onSearch">
+              <text class="icon-search"></text>
+            </view>
           </view>
-          <view class="score-badge">{{result.score}}</view>
+          
+          <!-- 模糊搜索下拉列表 -->
+          <view class="search-dropdown" v-if="showDropdown && suggestions && suggestions.length > 0">
+            <view 
+              v-for="(item, index) in suggestions" 
+              :key="index"
+              class="dropdown-item" 
+              hover-class="dropdown-item-hover" 
+              @tap.stop="onSelectSuggestion(item)"
+            >
+              <text class="item-name">{{item.name}}</text>
+              <text class="item-code">{{item.code}}</text>
+            </view>
+          </view>
+
+          <text class="search-tip">支持A股代码或名称模糊查询</text>
         </view>
 
-        <!-- 历史评分趋势 -->
-        <view class="section">
-          <view class="section-title">历史评分趋势</view>
-          <view class="history-row" v-for="(item, index) in result.history" :key="index">
-            <text class="history-date">{{item.date}} 的量化评分:</text>
-            <text :class="['history-score', item.score >= 90 ? 'tag-danger' : (item.score >= 80 ? 'tag-success' : 'tag-info')]">
-              {{item.score}}
-            </text>
+        <!-- 查询结果 -->
+        <view v-if="hasSearched" class="card result-card">
+          <view v-if="loading">
+            <text class="result-loading">正在查询,请稍候...</text>
+          </view>
+          <view v-else-if="errorMsg">
+            <text class="result-error">{{errorMsg}}</text>
+          </view>
+          <view v-else-if="result">
+            <!-- 头部:名称 / 代码 / 分数徽章 -->
+            <view class="detail-header">
+              <view>
+                <view class="detail-name">{{result.stockName}}({{result.stockCode}})</view>
+                <view class="detail-sub">最新量化系统评分</view>
+              </view>
+              <view class="score-badge">{{result.score}}</view>
+            </view>
+
+            <!-- 历史评分趋势 -->
+            <view class="section">
+              <view class="section-title">历史评分趋势</view>
+              <view class="history-row" v-for="(item, index) in result.history" :key="index">
+                <text class="history-date">{{item.date}} 的量化评分:</text>
+                <text :class="['history-score', item.score >= 90 ? 'tag-danger' : (item.score >= 80 ? 'tag-success' : 'tag-info')]">
+                  {{item.score}}
+                </text>
+              </view>
+              <text class="history-note">(注意:此为模拟历史数据,仅供展示。)</text>
+            </view>
+
+            <!-- 评分因子构成 -->
+            <view class="section">
+              <view class="section-title">评分因子构成</view>
+              <view class="factor-row" v-for="(item, index) in result.factors" :key="index">
+                <text class="factor-name">{{item.name}}</text>
+                <text class="factor-score">{{item.value}}</text>
+              </view>
+            </view>
           </view>
-          <text class="history-note">(注意:此为模拟历史数据,仅供展示。)</text>
         </view>
 
-        <!-- 评分因子构成 -->
-        <view class="section">
-          <view class="section-title">评分因子构成</view>
-          <view class="factor-row" v-for="(item, index) in result.factors" :key="index">
-            <text class="factor-name">{{item.name}}</text>
-            <text class="factor-score">{{item.value}}</text>
+        <!-- 量化投资的优势 -->
+        <view class="card advantage-card">
+          <view class="card-header">
+            <view class="icon-circle">
+              <text class="icon-check">✓</text>
+            </view>
+            <text class="card-header-title">量化投资的优势</text>
           </view>
-        </view>
-      </view>
-    </view>
 
-    <!-- 量化投资的优势 -->
-    <view class="card advantage-card">
-      <view class="card-header">
-        <view class="icon-circle">
-          <text class="icon-check">✓</text>
+          <view class="advantage-item">
+            <text class="advantage-label">客观纪律性:</text>
+            <text class="advantage-desc">排除情绪干扰,严格执行预设的交易信号。</text>
+          </view>
+          <view class="advantage-item">
+            <text class="advantage-label">高效覆盖广度:</text>
+            <text class="advantage-desc">能同时分析数千只股票,人工无法企及。</text>
+          </view>
         </view>
-        <text class="card-header-title">量化投资的优势</text>
-      </view>
 
-      <view class="advantage-item">
-        <text class="advantage-label">客观纪律性:</text>
-        <text class="advantage-desc">排除情绪干扰,严格执行预设的交易信号。</text>
-      </view>
-      <view class="advantage-item">
-        <text class="advantage-label">高效覆盖广度:</text>
-        <text class="advantage-desc">能同时分析数千只股票,人工无法企及。</text>
-      </view>
-    </view>
+        <!-- 风险提示(免责声明) -->
+        <view class="card risk-card">
+          <view class="card-header">
+            <view class="icon-warning">
+              <text class="icon-warning-text">!</text>
+            </view>
+            <text class="card-header-title">风险提示(免责声明)</text>
+          </view>
 
-    <!-- 风险提示(免责声明) -->
-    <view class="card risk-card">
-      <view class="card-header">
-        <view class="icon-warning">
-          <text class="icon-warning-text">!</text>
+          <text class="risk-text">
+            本系统的量化分数和股票池信息均基于历史数据和特定模型计算,并非对未来市场的保证或预测。市场环境瞬息万变,
+            量化模型可能存在失效或回撤风险。请勿将本系统数据作为投资决策的唯一依据,请您充分理解股票投资风险,并独立做出投资判断。
+          </text>
         </view>
-        <text class="card-header-title">风险提示(免责声明)</text>
-      </view>
 
-      <text class="risk-text">
-        本系统的量化分数和股票池信息均基于历史数据和特定模型计算,并非对未来市场的保证或预测。市场环境瞬息万变,
-        量化模型可能存在失效或回撤风险。请勿将本系统数据作为投资决策的唯一依据,请您充分理解股票投资风险,并独立做出投资判断。
-      </text>
-    </view>
-
-    <!-- 预留底部空间,避免被 tabBar 遮挡 -->
-    <view class="bottom-safe-area"></view>
-  </scroll-view>
+        <!-- 预留底部空间,避免被 tabBar 遮挡 -->
+        <view class="bottom-safe-area"></view>
+      </view>
+    </scroll-view>
+  </view>
 </template>
 
 <script setup>
@@ -137,6 +143,7 @@ let timer = null
 const onKeywordChange = (e) => {
   const value = e.detail.value
   keyword.value = value
+  console.log('输入关键词:', value)
   
   if (timer) {
     clearTimeout(timer)
@@ -155,17 +162,14 @@ const doSearchSuggestions = async (kw) => {
   }
 
   try {
-    const res = await getSuggestions(kw.trim())
-    if (res.code === 0) {
-      const list = res.data || []
-      suggestions.value = list
-      showDropdown.value = list.length > 0
-    } else {
-      suggestions.value = []
-      showDropdown.value = false
-    }
+    // getSuggestions 已经通过 request 函数处理,返回的是 data 部分(数组)
+    const list = await getSuggestions(kw.trim())
+    console.log('模糊查询返回数据:', list)
+    suggestions.value = Array.isArray(list) ? list : []
+    showDropdown.value = suggestions.value.length > 0
+    console.log('下拉框状态:', { showDropdown: showDropdown.value, suggestionsLength: suggestions.value.length })
   } catch (err) {
-    console.error(err)
+    console.error('模糊查询错误:', err)
     suggestions.value = []
     showDropdown.value = false
   }
@@ -190,16 +194,13 @@ const onSearch = () => {
     return
   }
 
-  // 如果输入格式是 "股票名称 (股票代码)",提取股票代码
+  let searchCode = kw
   const codeMatch = kw.match(/\((\d{6})\)/)
   if (codeMatch) {
-    // 从建议项点击的情况,使用提取的代码
-    doSearch(codeMatch[1])
-  } else {
-    // 用户直接输入股票代码或股票名称,直接传递给后端
-    // 后端会智能识别是代码还是名称
-    doSearch(kw)
+    searchCode = codeMatch[1]
   }
+
+  doSearch(searchCode)
 }
 
 const doSearch = async (queryCode) => {
@@ -225,30 +226,50 @@ const doSearch = async (queryCode) => {
 }
 
 const onInputBlur = () => {
+  // 延迟关闭,给点击下拉项留出时间
   setTimeout(() => {
     showDropdown.value = false
-  }, 200)
+  }, 300)
 }
 </script>
 
 <style>
 /** 首页量化查询界面样式 **/
 
-.page {
+.page-title-card {
+  background: #ffffff;
+  padding: 30rpx 0;
+  text-align: center;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
+  border-radius: 0;
+}
+
+.page-title-text {
+  font-size: 36rpx;
+  font-weight: 800;
+  color: #3F51F7;
+  letter-spacing: 2rpx;
+}
+
+.page-container {
   height: 100vh;
-  box-sizing: border-box;
-  padding: 32rpx 32rpx 48rpx;
+  display: flex;
+  flex-direction: column;
   background: #f5f6fb;
 }
 
-.page-title {
-  margin-top: 8rpx;
-  margin-bottom: 24rpx;
-  text-align: center;
-  font-size: 32rpx;
-  font-weight: 700;
-  color: #5d55e8;
-  letter-spacing: 4rpx;
+/* 移除旧的 custom-header 样式,或者保留也无妨,因为 HTML 中不再使用 */
+.custom-header {
+  display: none; 
+}
+
+.scroll-view {
+  flex: 1;
+  height: 0;
+}
+
+.content-wrapper {
+  padding: 32rpx 32rpx 48rpx;
 }
 
 .card {
@@ -257,12 +278,12 @@ const onInputBlur = () => {
   padding: 32rpx 32rpx 36rpx;
   box-shadow: 0 16rpx 40rpx rgba(37, 52, 94, 0.08);
   margin-bottom: 32rpx;
-  position: relative; /* 确保下拉列表定位参照此元素 */
+  position: relative;
 }
 
 .search-card {
   margin-top: 16rpx;
-  z-index: 10; /* 确保搜索卡片层级较高 */
+  z-index: 10;
 }
 
 .card-title {
@@ -336,15 +357,16 @@ const onInputBlur = () => {
 /* 下拉列表样式 */
 .search-dropdown {
   position: absolute;
-  top: 180rpx; /* 根据标题和输入框高度估算 */
-  left: 32rpx;
-  right: 32rpx;
+  top: 100%; /* 相对于父元素定位,在搜索框下方 */
+  left: 0;
+  right: 0;
+  margin-top: 8rpx;
   background: #ffffff;
   border-radius: 16rpx;
   box-shadow: 0 10rpx 30rpx rgba(0, 0, 0, 0.15);
   max-height: 400rpx;
   overflow-y: auto;
-  z-index: 999;
+  z-index: 1000; /* 提高层级,确保在最上层 */
   border: 1rpx solid #f0f0f0;
 }
 
@@ -374,7 +396,6 @@ const onInputBlur = () => {
   color: #999;
 }
 
-
 .result-card {
   margin-top: 8rpx;
 }

+ 30 - 4
src/pages/mine/mine.vue

@@ -1,7 +1,13 @@
 <template>
   <view class="page-mine">
-    <text class="title">个人中心</text>
-    <text class="sub">这里后续可以展示用户信息和设置</text>
+    <!-- 顶部标题卡片 -->
+    <view class="page-title-card">
+      <text class="page-title-text">量化选股大师</text>
+    </view>
+    <view class="content-area">
+      <text class="title">个人中心</text>
+      <text class="sub">这里后续可以展示用户信息和设置</text>
+    </view>
   </view>
 </template>
 
@@ -11,11 +17,31 @@
 
 <style>
 .page-mine {
-  padding: 30rpx;
   display: flex;
   flex-direction: column;
-  align-items: center;
+  background: #f5f6fb;
+  min-height: 100vh;
 }
+
+.page-title-card {
+  background: #ffffff;
+  padding: 30rpx 0;
+  text-align: center;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
+  border-radius: 0;
+}
+
+.content-area {
+  padding: 32rpx;
+}
+
+.page-title-text {
+  font-size: 36rpx;
+  font-weight: 800;
+  color: #3F51F7;
+  letter-spacing: 2rpx;
+}
+
 .title {
   font-size: 36rpx;
   font-weight: bold;

+ 565 - 26
src/pages/pool/pool.vue

@@ -1,45 +1,584 @@
 <template>
-  <view>
-    <text>pages/pool/pool.wxml</text>
+  <view class="page-container">
+    <!-- 顶部标题卡片 -->
+    <view class="page-title-card">
+      <text class="page-title-text">量化选股大师</text>
+    </view>
+    <scroll-view class="scroll-view" scroll-y>
+      <view class="content-wrapper">
+        <!-- 性能指标卡片 -->
+        <view class="card performance-card">
+          <view class="performance-item">
+            <text class="performance-label">历史成功率</text>
+            <text class="performance-value success">75%</text>
+          </view>
+          <view class="performance-item">
+            <text class="performance-label">平均收益率</text>
+            <text class="performance-value profit">+3.2%</text>
+          </view>
+          <view class="performance-item">
+            <text class="performance-label">总交易次数</text>
+            <text class="performance-value">120</text>
+          </view>
+        </view>
+
+        <!-- 超短精选池区域 -->
+        <view class="card pool-card">
+          <view class="pool-header">
+            <text class="pool-icon">⚡</text>
+            <text class="pool-title">超短精选池</text>
+          </view>
+          <text class="pool-desc">今日更新,高频捕捉短期爆发机会</text>
+          
+          <!-- 未购买时显示锁定状态 -->
+          <view v-if="!isPurchased" class="locked-content">
+            <view class="lock-icon-wrapper">
+              <text class="lock-icon">🔒</text>
+            </view>
+            <text class="lock-text">权限锁定: 查看 超短精选池 需付费</text>
+            <text class="lock-desc">超短池为每日实时更新,捕捉短期爆发机会。</text>
+            <view class="unlock-button" @click="showPurchaseModal">
+              <text class="unlock-button-text">立即解锁 日 精选 (¥18/日)</text>
+            </view>
+          </view>
+
+          <!-- 已购买时显示内容 -->
+          <view v-else class="unlocked-content">
+            <text class="unlocked-tip">您已解锁,可以查看超短精选池内容</text>
+            <!-- 这里可以显示实际的股票池内容 -->
+            <view class="stock-list-placeholder">
+              <text class="placeholder-text">股票池内容将在此显示</text>
+            </view>
+          </view>
+        </view>
+
+        <!-- 历史股票池回顾 -->
+        <view class="card history-card">
+          <view class="history-header">
+            <text class="history-icon">📅</text>
+            <text class="history-title">历史股票池回顾</text>
+          </view>
+          <view class="history-search-row">
+            <input 
+              class="history-date-input" 
+              type="text" 
+              placeholder="2025年11月20日"
+              v-model="selectedDate"
+              disabled
+            />
+            <view class="history-search-button" @click="onHistorySearch">
+              <text class="search-icon">🔍</text>
+            </view>
+          </view>
+          <text class="history-tip">请选择一个历史日期,查询当日入池股及次日表现。</text>
+        </view>
+
+        <!-- 预留底部空间 -->
+        <view class="bottom-safe-area"></view>
+      </view>
+    </scroll-view>
+
+    <!-- 购买弹窗 -->
+    <view v-if="showModal" class="modal-overlay" @click="closePurchaseModal">
+      <view class="modal-content" @click.stop>
+        <view class="modal-header">
+          <text class="modal-title">超短池(日/周)订阅服务</text>
+          <text class="modal-close" @click="closePurchaseModal">×</text>
+        </view>
+        
+        <view class="subscription-options">
+          <view 
+            class="subscription-option" 
+            :class="{ active: selectedPlan === 'daily' }"
+            @click="selectedPlan = 'daily'"
+          >
+            <view class="option-info">
+              <text class="option-title">日订阅</text>
+              <text class="option-desc">当日有效</text>
+            </view>
+            <text class="option-price">¥18</text>
+          </view>
+          
+          <view 
+            class="subscription-option" 
+            :class="{ active: selectedPlan === 'weekly' }"
+            @click="selectedPlan = 'weekly'"
+          >
+            <view class="option-info">
+              <text class="option-title">周套餐</text>
+              <text class="option-desc">7天连续查看</text>
+            </view>
+            <text class="option-price">¥98</text>
+          </view>
+        </view>
+
+        <view class="modal-footer">
+          <view class="pay-button" @click="handlePurchase">
+            <text class="pay-button-text">确认支付并解锁</text>
+          </view>
+          <text class="agreement-text">点击即表示同意《用户订阅协议》</text>
+        </view>
+      </view>
+    </view>
   </view>
 </template>
 
 <script setup>
-import { onLoad, onReady, onShow, onHide, onUnload, onPullDownRefresh, onReachBottom, onShareAppMessage } from '@dcloudio/uni-app'
+import { ref } from 'vue'
+import { onLoad, onShow } from '@dcloudio/uni-app'
 
-onLoad((options) => {
-  // 页面加载
-})
+const isPurchased = ref(false)
+const showModal = ref(false)
+const selectedPlan = ref('daily')
+const selectedDate = ref('2025年11月20日')
 
-onReady(() => {
-  // 页面初次渲染完成
-})
+// 检查购买状态
+const checkPurchaseStatus = () => {
+  try {
+    const purchaseInfo = uni.getStorageSync('pool_purchase')
+    if (purchaseInfo) {
+      const now = Date.now()
+      const expireTime = purchaseInfo.expireTime
+      if (now < expireTime) {
+        isPurchased.value = true
+      } else {
+        // 已过期,清除购买信息
+        uni.removeStorageSync('pool_purchase')
+        isPurchased.value = false
+      }
+    } else {
+      isPurchased.value = false
+    }
+  } catch (e) {
+    console.error('检查购买状态失败:', e)
+    isPurchased.value = false
+  }
+}
 
-onShow(() => {
-  // 页面显示
-})
+// 显示购买弹窗
+const showPurchaseModal = () => {
+  showModal.value = true
+}
 
-onHide(() => {
-  // 页面隐藏
-})
+// 关闭购买弹窗
+const closePurchaseModal = () => {
+  showModal.value = false
+}
 
-onUnload(() => {
-  // 页面卸载
-})
+// 处理购买
+const handlePurchase = () => {
+  if (!selectedPlan.value) {
+    uni.showToast({
+      title: '请选择订阅方案',
+      icon: 'none'
+    })
+    return
+  }
 
-onPullDownRefresh(() => {
-  // 下拉刷新
-})
+  // 计算过期时间
+  const now = Date.now()
+  let expireTime = now
+  
+  if (selectedPlan.value === 'daily') {
+    // 日订阅:当天23:59:59过期
+    const today = new Date()
+    today.setHours(23, 59, 59, 999)
+    expireTime = today.getTime()
+  } else if (selectedPlan.value === 'weekly') {
+    // 周套餐:7天后过期
+    expireTime = now + 7 * 24 * 60 * 60 * 1000
+  }
+
+  // 保存购买信息
+  const purchaseInfo = {
+    plan: selectedPlan.value,
+    purchaseTime: now,
+    expireTime: expireTime
+  }
+  uni.setStorageSync('pool_purchase', purchaseInfo)
+
+  // 更新购买状态
+  isPurchased.value = true
+
+  // 关闭弹窗
+  closePurchaseModal()
+
+  // 显示成功提示
+  uni.showToast({
+    title: '解锁成功',
+    icon: 'success'
+  })
+}
+
+// 历史查询
+const onHistorySearch = () => {
+  uni.showToast({
+    title: '历史查询功能开发中',
+    icon: 'none'
+  })
+}
 
-onReachBottom(() => {
-  // 上拉触底
+// 使用uni-app生命周期钩子
+onLoad(() => {
+  checkPurchaseStatus()
 })
 
-onShareAppMessage(() => {
-  // 分享
+onShow(() => {
+  // 每次页面显示时都检查一次购买状态
+  checkPurchaseStatus()
 })
 </script>
 
 <style>
-/* pages/pool/pool.wxss */
+.page-container {
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+  background: #f5f6fb;
+}
+
+.scroll-view {
+  flex: 1;
+  height: 0;
+}
+
+.content-wrapper {
+  padding: 32rpx;
+  background: #f5f6fb;
+  min-height: 100%;
+}
+
+.page-title-card {
+  background: #ffffff;
+  padding: 30rpx 0;
+  text-align: center;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
+  border-radius: 0;
+}
+
+.page-title-text {
+  font-size: 36rpx;
+  font-weight: 800;
+  color: #3F51F7;
+  letter-spacing: 2rpx;
+}
+
+.card {
+  background: #ffffff;
+  border-radius: 24rpx;
+  padding: 32rpx;
+  box-shadow: 0 16rpx 40rpx rgba(37, 52, 94, 0.08);
+  margin-bottom: 32rpx;
+}
+
+/* 性能指标卡片 */
+.performance-card {
+  display: flex;
+  justify-content: space-around;
+  align-items: center;
+  background: #f7f8fc;
+  padding: 32rpx 24rpx;
+}
+
+.performance-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.performance-label {
+  font-size: 24rpx;
+  color: #666a7f;
+  margin-bottom: 12rpx;
+}
+
+.performance-value {
+  font-size: 32rpx;
+  font-weight: 700;
+  color: #222222;
+}
+
+.performance-value.success {
+  color: #3abf81;
+}
+
+.performance-value.profit {
+  color: #f16565;
+}
+
+/* 超短精选池卡片 */
+.pool-card {
+  padding: 40rpx 32rpx;
+}
+
+.pool-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 16rpx;
+}
+
+.pool-icon {
+  font-size: 32rpx;
+  margin-right: 12rpx;
+}
+
+.pool-title {
+  font-size: 32rpx;
+  font-weight: 600;
+  color: #222222;
+}
+
+.pool-desc {
+  font-size: 26rpx;
+  color: #666a7f;
+  margin-bottom: 32rpx;
+}
+
+/* 锁定内容 */
+.locked-content {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  padding: 60rpx 0 40rpx;
+}
+
+.lock-icon-wrapper {
+  margin-bottom: 32rpx;
+}
+
+.lock-icon {
+  font-size: 80rpx;
+}
+
+.lock-text {
+  font-size: 28rpx;
+  color: #222222;
+  margin-bottom: 16rpx;
+  text-align: center;
+}
+
+.lock-desc {
+  font-size: 24rpx;
+  color: #9ca2b5;
+  margin-bottom: 48rpx;
+  text-align: center;
+  line-height: 1.6;
+}
+
+.unlock-button {
+  width: 100%;
+  background: linear-gradient(135deg, #5d55e8, #7568ff);
+  border-radius: 16rpx;
+  padding: 28rpx 0;
+  text-align: center;
+  box-shadow: 0 12rpx 24rpx rgba(93, 85, 232, 0.4);
+}
+
+.unlock-button-text {
+  font-size: 30rpx;
+  font-weight: 600;
+  color: #ffffff;
+}
+
+/* 已解锁内容 */
+.unlocked-content {
+  margin-top: 32rpx;
+}
+
+.unlocked-tip {
+  font-size: 26rpx;
+  color: #3abf81;
+  margin-bottom: 24rpx;
+  display: block;
+}
+
+.stock-list-placeholder {
+  padding: 60rpx 0;
+  text-align: center;
+  background: #f7f8fc;
+  border-radius: 16rpx;
+}
+
+.placeholder-text {
+  font-size: 26rpx;
+  color: #9ca2b5;
+}
+
+/* 历史股票池回顾 */
+.history-card {
+  padding: 32rpx;
+}
+
+.history-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 24rpx;
+}
+
+.history-icon {
+  font-size: 28rpx;
+  margin-right: 12rpx;
+}
+
+.history-title {
+  font-size: 30rpx;
+  font-weight: 600;
+  color: #222222;
+}
+
+.history-search-row {
+  display: flex;
+  align-items: center;
+  margin-bottom: 16rpx;
+}
+
+.history-date-input {
+  flex: 1;
+  background: #f7f8fc;
+  border-radius: 12rpx;
+  padding: 24rpx 24rpx;
+  font-size: 26rpx;
+  color: #222222;
+}
+
+.history-search-button {
+  width: 80rpx;
+  height: 80rpx;
+  background: #5d55e8;
+  border-radius: 12rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-left: 16rpx;
+}
+
+.search-icon {
+  font-size: 32rpx;
+  color: #ffffff;
+}
+
+.history-tip {
+  font-size: 24rpx;
+  color: #9ca2b5;
+  line-height: 1.6;
+}
+
+/* 购买弹窗 */
+.modal-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: rgba(0, 0, 0, 0.5);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  z-index: 1000;
+}
+
+.modal-content {
+  width: 640rpx;
+  background: #ffffff;
+  border-radius: 24rpx;
+  padding: 40rpx 32rpx 32rpx;
+  box-sizing: border-box;
+}
+
+.modal-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 32rpx;
+}
+
+.modal-title {
+  font-size: 32rpx;
+  font-weight: 600;
+  color: #222222;
+}
+
+.modal-close {
+  font-size: 48rpx;
+  color: #9ca2b5;
+  line-height: 1;
+  width: 48rpx;
+  height: 48rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.subscription-options {
+  margin-bottom: 32rpx;
+}
+
+.subscription-option {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 32rpx 24rpx;
+  border: 2rpx solid #e5e7eb;
+  border-radius: 16rpx;
+  margin-bottom: 20rpx;
+  transition: all 0.3s;
+}
+
+.subscription-option.active {
+  border-color: #5d55e8;
+  background: #f7f8fc;
+}
+
+.option-info {
+  display: flex;
+  flex-direction: column;
+}
+
+.option-title {
+  font-size: 28rpx;
+  font-weight: 600;
+  color: #222222;
+  margin-bottom: 8rpx;
+}
+
+.option-desc {
+  font-size: 24rpx;
+  color: #9ca2b5;
+}
+
+.option-price {
+  font-size: 36rpx;
+  font-weight: 700;
+  color: #f16565;
+}
+
+.modal-footer {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.pay-button {
+  width: 100%;
+  background: #f16565;
+  border-radius: 16rpx;
+  padding: 28rpx 0;
+  text-align: center;
+  margin-bottom: 24rpx;
+}
+
+.pay-button-text {
+  font-size: 30rpx;
+  font-weight: 600;
+  color: #ffffff;
+}
+
+.agreement-text {
+  font-size: 22rpx;
+  color: #9ca2b5;
+}
+
+.bottom-safe-area {
+  height: 80rpx;
+}
 </style>

+ 30 - 4
src/pages/rank/rank.vue

@@ -1,7 +1,13 @@
 <template>
   <view class="page-rank">
-    <text class="title">模拟排名</text>
-    <text class="sub">这里后续可以展示策略或股票排名</text>
+    <!-- 顶部标题卡片 -->
+    <view class="page-title-card">
+      <text class="page-title-text">量化选股大师</text>
+    </view>
+    <view class="content-area">
+      <text class="title">模拟排名</text>
+      <text class="sub">这里后续可以展示策略或股票排名</text>
+    </view>
   </view>
 </template>
 
@@ -11,11 +17,31 @@
 
 <style>
 .page-rank {
-  padding: 30rpx;
   display: flex;
   flex-direction: column;
-  align-items: center;
+  background: #f5f6fb;
+  min-height: 100vh;
 }
+
+.page-title-card {
+  background: #ffffff;
+  padding: 30rpx 0;
+  text-align: center;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
+  border-radius: 0;
+}
+
+.content-area {
+  padding: 32rpx;
+}
+
+.page-title-text {
+  font-size: 36rpx;
+  font-weight: 800;
+  color: #3F51F7;
+  letter-spacing: 2rpx;
+}
+
 .title {
   font-size: 36rpx;
   font-weight: bold;

+ 30 - 4
src/pages/strong/strong.vue

@@ -1,7 +1,13 @@
 <template>
   <view class="page-strong">
-    <text class="title">强势池</text>
-    <text class="sub">这里后续可以展示强势股票列表</text>
+    <!-- 顶部标题卡片 -->
+    <view class="page-title-card">
+      <text class="page-title-text">量化选股大师</text>
+    </view>
+    <view class="content-area">
+      <text class="title">强势池</text>
+      <text class="sub">这里后续可以展示强势股票列表</text>
+    </view>
   </view>
 </template>
 
@@ -11,11 +17,31 @@
 
 <style>
 .page-strong {
-  padding: 30rpx;
   display: flex;
   flex-direction: column;
-  align-items: center;
+  background: #f5f6fb;
+  min-height: 100vh;
 }
+
+.page-title-card {
+  background: #ffffff;
+  padding: 30rpx 0;
+  text-align: center;
+  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
+  border-radius: 0;
+}
+
+.content-area {
+  padding: 32rpx;
+}
+
+.page-title-text {
+  font-size: 36rpx;
+  font-weight: 800;
+  color: #3F51F7;
+  letter-spacing: 2rpx;
+}
+
 .title {
   font-size: 36rpx;
   font-weight: bold;

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio