index.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. "use strict";
  2. const common_vendor = require("../../common/vendor.js");
  3. const utils_api = require("../../utils/api.js");
  4. const utils_auth = require("../../utils/auth.js");
  5. const _sfc_main = {
  6. __name: "index",
  7. setup(__props) {
  8. const keyword = common_vendor.ref("");
  9. const loading = common_vendor.ref(false);
  10. const hasSearched = common_vendor.ref(false);
  11. const errorMsg = common_vendor.ref("");
  12. const result = common_vendor.ref(null);
  13. const suggestions = common_vendor.ref([]);
  14. const showDropdown = common_vendor.ref(false);
  15. const isLoggedIn = common_vendor.ref(false);
  16. const showPhoneAuth = common_vendor.ref(false);
  17. let timer = null;
  18. common_vendor.onMounted(() => {
  19. isLoggedIn.value = utils_auth.isLoggedIn();
  20. console.log("[首页] 登录状态:", isLoggedIn.value);
  21. console.log("[首页] Token:", common_vendor.index.getStorageSync("user_token"));
  22. });
  23. common_vendor.onShow(() => {
  24. isLoggedIn.value = utils_auth.isLoggedIn();
  25. console.log("[首页] 登录状态:", isLoggedIn.value);
  26. });
  27. const handleSearchClick = async () => {
  28. console.log("=== 点击搜索按钮 ===");
  29. console.log("当前登录状态:", isLoggedIn.value);
  30. if (!isLoggedIn.value) {
  31. console.log("未登录,直接调用微信授权");
  32. handleLogin();
  33. return;
  34. }
  35. console.log("已登录,执行搜索");
  36. onSearch();
  37. };
  38. const handleLogin = () => {
  39. console.log("[首页] 显示手机号授权弹窗");
  40. showPhoneAuth.value = true;
  41. };
  42. const onGetPhoneNumber = async (e) => {
  43. console.log("[首页] 获取手机号回调:", e.detail);
  44. if (e.detail.errMsg === "getPhoneNumber:ok") {
  45. const phoneCode = e.detail.code;
  46. console.log("[首页] phoneCode:", phoneCode);
  47. common_vendor.index.showLoading({
  48. title: "登录中...",
  49. mask: true
  50. });
  51. try {
  52. const loginRes = await common_vendor.index.login();
  53. console.log("[首页] uni.login完整响应:", loginRes);
  54. console.log("[首页] 微信登录code:", loginRes.code);
  55. if (!loginRes.code) {
  56. throw new Error("获取微信登录code失败");
  57. }
  58. const result2 = await utils_auth.wxAuthLogin(loginRes.code, phoneCode);
  59. common_vendor.index.hideLoading();
  60. if (result2) {
  61. showPhoneAuth.value = false;
  62. isLoggedIn.value = utils_auth.isLoggedIn();
  63. onSearch();
  64. }
  65. } catch (error) {
  66. common_vendor.index.hideLoading();
  67. console.error("[首页] 登录失败:", error);
  68. }
  69. } else {
  70. showPhoneAuth.value = false;
  71. common_vendor.index.showToast({
  72. title: "需要授权手机号才能完成登录",
  73. icon: "none",
  74. duration: 2e3
  75. });
  76. }
  77. };
  78. const closePhoneAuth = () => {
  79. showPhoneAuth.value = false;
  80. tempUserInfo.value = null;
  81. };
  82. const onKeywordChange = (e) => {
  83. const value = e.detail.value;
  84. keyword.value = value;
  85. console.log("输入关键词:", value);
  86. if (timer) {
  87. clearTimeout(timer);
  88. }
  89. timer = setTimeout(() => {
  90. doSearchSuggestions(value);
  91. }, 500);
  92. };
  93. const doSearchSuggestions = async (kw) => {
  94. if (!kw || !kw.trim()) {
  95. suggestions.value = [];
  96. showDropdown.value = false;
  97. return;
  98. }
  99. try {
  100. const response = await utils_api.getSuggestions(kw.trim());
  101. console.log("模糊查询返回数据:", response);
  102. const list = response.data || [];
  103. suggestions.value = Array.isArray(list) ? list : [];
  104. showDropdown.value = suggestions.value.length > 0;
  105. console.log("下拉框状态:", { showDropdown: showDropdown.value, suggestionsLength: suggestions.value.length });
  106. } catch (err) {
  107. console.error("模糊查询错误:", err);
  108. suggestions.value = [];
  109. showDropdown.value = false;
  110. }
  111. };
  112. const onSelectSuggestion = (item) => {
  113. const searchText = `${item.name} (${item.code})`;
  114. keyword.value = searchText;
  115. suggestions.value = [];
  116. showDropdown.value = false;
  117. doSearch(item.code);
  118. };
  119. const onSearch = () => {
  120. const kw = (keyword.value || "").trim();
  121. if (!kw) {
  122. common_vendor.index.showToast({
  123. title: "请输入股票代码或名称",
  124. icon: "none"
  125. });
  126. return;
  127. }
  128. let searchCode = kw;
  129. const codeMatch = kw.match(/\((\d{6})\)/);
  130. if (codeMatch) {
  131. searchCode = codeMatch[1];
  132. }
  133. doSearch(searchCode);
  134. };
  135. const doSearch = async (queryCode) => {
  136. loading.value = true;
  137. hasSearched.value = true;
  138. errorMsg.value = "";
  139. result.value = null;
  140. suggestions.value = [];
  141. showDropdown.value = false;
  142. try {
  143. const res = await utils_api.searchStocks(queryCode);
  144. if (res.code === 0 && res.data) {
  145. result.value = res.data;
  146. } else {
  147. errorMsg.value = res.message || "未查询到相关股票数据";
  148. }
  149. } catch (err) {
  150. errorMsg.value = "网络请求失败,请检查网络连接";
  151. } finally {
  152. loading.value = false;
  153. }
  154. };
  155. const onInputBlur = () => {
  156. setTimeout(() => {
  157. showDropdown.value = false;
  158. }, 300);
  159. };
  160. return (_ctx, _cache) => {
  161. return common_vendor.e({
  162. a: common_vendor.o([($event) => keyword.value = $event.detail.value, onKeywordChange]),
  163. b: common_vendor.o(handleSearchClick),
  164. c: common_vendor.o(onInputBlur),
  165. d: keyword.value,
  166. e: common_vendor.o(handleSearchClick),
  167. f: showDropdown.value && suggestions.value && suggestions.value.length > 0
  168. }, showDropdown.value && suggestions.value && suggestions.value.length > 0 ? {
  169. g: common_vendor.f(suggestions.value, (item, index, i0) => {
  170. return {
  171. a: common_vendor.t(item.name),
  172. b: common_vendor.t(item.code),
  173. c: index,
  174. d: common_vendor.o(($event) => onSelectSuggestion(item), index)
  175. };
  176. })
  177. } : {}, {
  178. h: common_vendor.t(isLoggedIn.value ? "" : "(需登录)"),
  179. i: hasSearched.value
  180. }, hasSearched.value ? common_vendor.e({
  181. j: loading.value
  182. }, loading.value ? {} : errorMsg.value ? {
  183. l: common_vendor.t(errorMsg.value)
  184. } : result.value ? {
  185. n: common_vendor.t(result.value.stockName),
  186. o: common_vendor.t(result.value.stockCode),
  187. p: common_vendor.t(result.value.score),
  188. q: common_vendor.f(result.value.history, (item, index, i0) => {
  189. return {
  190. a: common_vendor.t(item.date),
  191. b: common_vendor.t(item.score),
  192. c: common_vendor.n(item.score >= 90 ? "tag-danger" : item.score >= 80 ? "tag-success" : "tag-info"),
  193. d: index
  194. };
  195. }),
  196. r: common_vendor.f(result.value.factors, (item, index, i0) => {
  197. return {
  198. a: common_vendor.t(item.name),
  199. b: common_vendor.t(item.value),
  200. c: index
  201. };
  202. })
  203. } : {}, {
  204. k: errorMsg.value,
  205. m: result.value
  206. }) : {}, {
  207. s: showPhoneAuth.value
  208. }, showPhoneAuth.value ? {
  209. t: common_vendor.o(onGetPhoneNumber),
  210. v: common_vendor.o(() => {
  211. }),
  212. w: common_vendor.o(closePhoneAuth)
  213. } : {});
  214. };
  215. }
  216. };
  217. const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/program/gupiao-wx/src/pages/index/index.vue"]]);
  218. wx.createPage(MiniProgramPage);