index.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. };
  81. const onKeywordChange = (e) => {
  82. const value = e.detail.value;
  83. keyword.value = value;
  84. console.log("输入关键词:", value);
  85. if (timer) {
  86. clearTimeout(timer);
  87. }
  88. timer = setTimeout(() => {
  89. doSearchSuggestions(value);
  90. }, 500);
  91. };
  92. const doSearchSuggestions = async (kw) => {
  93. if (!kw || !kw.trim()) {
  94. suggestions.value = [];
  95. showDropdown.value = false;
  96. return;
  97. }
  98. try {
  99. const response = await utils_api.getSuggestions(kw.trim());
  100. console.log("模糊查询返回数据:", response);
  101. const list = response.data || [];
  102. suggestions.value = Array.isArray(list) ? list : [];
  103. showDropdown.value = suggestions.value.length > 0;
  104. console.log("下拉框状态:", { showDropdown: showDropdown.value, suggestionsLength: suggestions.value.length });
  105. } catch (err) {
  106. console.error("模糊查询错误:", err);
  107. suggestions.value = [];
  108. showDropdown.value = false;
  109. }
  110. };
  111. const onSelectSuggestion = (item) => {
  112. const searchText = `${item.name} (${item.code})`;
  113. keyword.value = searchText;
  114. suggestions.value = [];
  115. showDropdown.value = false;
  116. doSearch(item.code);
  117. };
  118. const onSearch = () => {
  119. const kw = (keyword.value || "").trim();
  120. if (!kw) {
  121. common_vendor.index.showToast({
  122. title: "请输入股票代码或名称",
  123. icon: "none"
  124. });
  125. return;
  126. }
  127. let searchCode = kw;
  128. const codeMatch = kw.match(/\((\d{6})\)/);
  129. if (codeMatch) {
  130. searchCode = codeMatch[1];
  131. }
  132. doSearch(searchCode);
  133. };
  134. const doSearch = async (queryCode) => {
  135. loading.value = true;
  136. hasSearched.value = true;
  137. errorMsg.value = "";
  138. result.value = null;
  139. suggestions.value = [];
  140. showDropdown.value = false;
  141. try {
  142. const res = await utils_api.searchStocks(queryCode);
  143. if (res.code === 0 && res.data) {
  144. result.value = res.data;
  145. } else {
  146. errorMsg.value = res.message || "未查询到相关股票数据";
  147. }
  148. } catch (err) {
  149. errorMsg.value = "网络请求失败,请检查网络连接";
  150. } finally {
  151. loading.value = false;
  152. }
  153. };
  154. const onInputBlur = () => {
  155. setTimeout(() => {
  156. showDropdown.value = false;
  157. }, 300);
  158. };
  159. return (_ctx, _cache) => {
  160. return common_vendor.e({
  161. a: common_vendor.o([($event) => keyword.value = $event.detail.value, onKeywordChange]),
  162. b: common_vendor.o(handleSearchClick),
  163. c: common_vendor.o(onInputBlur),
  164. d: keyword.value,
  165. e: common_vendor.o(handleSearchClick),
  166. f: showDropdown.value && suggestions.value && suggestions.value.length > 0
  167. }, showDropdown.value && suggestions.value && suggestions.value.length > 0 ? {
  168. g: common_vendor.f(suggestions.value, (item, index, i0) => {
  169. return {
  170. a: common_vendor.t(item.name),
  171. b: common_vendor.t(item.code),
  172. c: index,
  173. d: common_vendor.o(($event) => onSelectSuggestion(item), index)
  174. };
  175. })
  176. } : {}, {
  177. h: common_vendor.t(isLoggedIn.value ? "" : "(需登录)"),
  178. i: hasSearched.value
  179. }, hasSearched.value ? common_vendor.e({
  180. j: loading.value
  181. }, loading.value ? {} : errorMsg.value ? {
  182. l: common_vendor.t(errorMsg.value)
  183. } : result.value ? {
  184. n: common_vendor.t(result.value.stockName),
  185. o: common_vendor.t(result.value.stockCode),
  186. p: common_vendor.t(result.value.score),
  187. q: common_vendor.f(result.value.history, (item, index, i0) => {
  188. return {
  189. a: common_vendor.t(item.date),
  190. b: common_vendor.t(item.score),
  191. c: common_vendor.n(item.score >= 90 ? "tag-danger" : item.score >= 80 ? "tag-success" : "tag-info"),
  192. d: index
  193. };
  194. }),
  195. r: common_vendor.f(result.value.factors, (item, index, i0) => {
  196. return {
  197. a: common_vendor.t(item.name),
  198. b: common_vendor.t(item.value),
  199. c: index
  200. };
  201. })
  202. } : {}, {
  203. k: errorMsg.value,
  204. m: result.value
  205. }) : {}, {
  206. s: showPhoneAuth.value
  207. }, showPhoneAuth.value ? {
  208. t: common_vendor.o(onGetPhoneNumber),
  209. v: common_vendor.o(() => {
  210. }),
  211. w: common_vendor.o(closePhoneAuth)
  212. } : {});
  213. };
  214. }
  215. };
  216. const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__file", "D:/program/gupiao-wx/src/pages/index/index.vue"]]);
  217. wx.createPage(MiniProgramPage);