southnote-mini-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/app.js +22 -0
  2. package/app.json +53 -0
  3. package/app.wxss +15 -0
  4. package/assets/file/badwords.js +63008 -0
  5. package/assets/file/rules.js +38 -0
  6. package/assets/images/emoji/smile001.png +0 -0
  7. package/assets/images/emoji/smile002.png +0 -0
  8. package/assets/images/emoji/smile003.png +0 -0
  9. package/assets/images/emoji/smile004.png +0 -0
  10. package/assets/images/emoji/smile005.png +0 -0
  11. package/assets/images/emoji/smile006.png +0 -0
  12. package/assets/images/emoji/smile007.png +0 -0
  13. package/assets/images/emoji/smile008.png +0 -0
  14. package/assets/images/emoji/smile009.png +0 -0
  15. package/assets/images/emoji/smile010.png +0 -0
  16. package/assets/images/emoji/smile011.png +0 -0
  17. package/assets/images/emoji/smile012.png +0 -0
  18. package/assets/images/emoji/smile013.png +0 -0
  19. package/assets/images/emoji/smile014.png +0 -0
  20. package/assets/images/emoji/smile015.png +0 -0
  21. package/assets/images/emoji/smile016.png +0 -0
  22. package/assets/images/emoji/smile017.png +0 -0
  23. package/assets/images/emoji/smile018.png +0 -0
  24. package/assets/images/emoji/smile019.png +0 -0
  25. package/assets/images/emoji/smile020.png +0 -0
  26. package/assets/images/emoji/smile021.png +0 -0
  27. package/assets/images/emoji/smile022.png +0 -0
  28. package/assets/images/emoji/smile023.png +0 -0
  29. package/assets/images/emoji/smile024.png +0 -0
  30. package/assets/images/emoji/smile025.png +0 -0
  31. package/assets/images/emoji/smile026.png +0 -0
  32. package/assets/images/emoji/smile027.png +0 -0
  33. package/assets/images/emoji/smile028.png +0 -0
  34. package/assets/images/emoji/smile029.png +0 -0
  35. package/assets/images/emoji/smile030.png +0 -0
  36. package/assets/images/emoji/smile031.png +0 -0
  37. package/assets/images/emoji/smile032.png +0 -0
  38. package/assets/images/emoji/smile033.png +0 -0
  39. package/assets/images/emoji/smile034.png +0 -0
  40. package/assets/images/emoji/smile035.png +0 -0
  41. package/assets/images/emoji/smile036.png +0 -0
  42. package/assets/images/emoji/smile037.png +0 -0
  43. package/assets/images/emoji/smile038.png +0 -0
  44. package/assets/images/emoji/smile039.png +0 -0
  45. package/assets/images/emoji/smile040.png +0 -0
  46. package/assets/images/emoji/smile041.png +0 -0
  47. package/assets/images/emoji/smile042.png +0 -0
  48. package/assets/images/emoji/smile043.png +0 -0
  49. package/assets/images/emoji/smile044.png +0 -0
  50. package/assets/images/emoji/smile045.png +0 -0
  51. package/assets/images/emoji/smile046.png +0 -0
  52. package/assets/images/emoji/smile047.png +0 -0
  53. package/assets/images/emoji/smile048.png +0 -0
  54. package/assets/images/emoji/smile049.png +0 -0
  55. package/assets/images/emoji/smile050.png +0 -0
  56. package/assets/images/emoji/smile051.png +0 -0
  57. package/assets/images/emoji/smile052.png +0 -0
  58. package/assets/images/icons/age1.png +0 -0
  59. package/assets/images/icons/age2.png +0 -0
  60. package/assets/images/icons/age3.png +0 -0
  61. package/assets/images/icons/attachment.png +0 -0
  62. package/assets/images/icons/clear.png +0 -0
  63. package/assets/images/icons/edit_input.png +0 -0
  64. package/assets/images/icons/header_placeholder.png +0 -0
  65. package/assets/images/icons/home_collect.png +0 -0
  66. package/assets/images/icons/home_collected.png +0 -0
  67. package/assets/images/icons/home_comment.png +0 -0
  68. package/assets/images/icons/home_like.png +0 -0
  69. package/assets/images/icons/home_liked.png +0 -0
  70. package/assets/images/icons/home_message.png +0 -0
  71. package/assets/images/icons/home_share.png +0 -0
  72. package/assets/images/icons/icon_more.png +0 -0
  73. package/assets/images/icons/input_game.png +0 -0
  74. package/assets/images/icons/logo.png +0 -0
  75. package/assets/images/icons/lv1.png +0 -0
  76. package/assets/images/icons/lv2.png +0 -0
  77. package/assets/images/icons/lv3.png +0 -0
  78. package/assets/images/icons/lv4.png +0 -0
  79. package/assets/images/icons/search.png +0 -0
  80. package/assets/images/icons/sex1.png +0 -0
  81. package/assets/images/icons/sex2.png +0 -0
  82. package/assets/images/icons/sign_empty.png +0 -0
  83. package/assets/images/icons/sign_login.png +0 -0
  84. package/assets/wheel/wheel_bg.png +0 -0
  85. package/assets/wheel/wheel_bg2.png +0 -0
  86. package/assets/wheel/wheel_fore.png +0 -0
  87. package/assets/wheel/wheel_to.png +0 -0
  88. package/components/bottomSheet/bottomSheet.js +473 -0
  89. package/components/bottomSheet/bottomSheet.json +3 -0
  90. package/components/bottomSheet/bottomSheet.wxml +73 -0
  91. package/components/bottomSheet/bottomSheet.wxss +238 -0
  92. package/components/experience-item/experience-item.js +105 -0
  93. package/components/experience-item/experience-item.json +4 -0
  94. package/components/experience-item/experience-item.wxml +39 -0
  95. package/components/experience-item/experience-item.wxss +110 -0
  96. package/components/grid-item/grid-item.js +8 -0
  97. package/components/grid-item/grid-item.json +4 -0
  98. package/components/grid-item/grid-item.wxml +62 -0
  99. package/components/grid-item/grid-item.wxss +191 -0
  100. package/components/post-item/post-item.js +1085 -0
  101. package/components/post-item/post-item.json +4 -0
  102. package/components/post-item/post-item.wxml +427 -0
  103. package/components/post-item/post-item.wxss +525 -0
  104. package/components/wiki-renderer/wiki-renderer.js +636 -0
  105. package/components/wiki-renderer/wiki-renderer.json +12 -0
  106. package/components/wiki-renderer/wiki-renderer.wxml +150 -0
  107. package/components/wiki-renderer/wiki-renderer.wxss +412 -0
  108. package/components/wiki-tabs/wiki-tabs.js +52 -0
  109. package/components/wiki-tabs/wiki-tabs.json +3 -0
  110. package/components/wiki-tabs/wiki-tabs.wxml +28 -0
  111. package/components/wiki-tabs/wiki-tabs.wxss +43 -0
  112. package/index.js +49 -0
  113. package/package.json +35 -0
  114. package/pages/addGame/addGame.js +454 -0
  115. package/pages/addGame/addGame.json +3 -0
  116. package/pages/addGame/addGame.wxml +71 -0
  117. package/pages/addGame/addGame.wxss +110 -0
  118. package/pages/addSubject/addSubject.js +199 -0
  119. package/pages/addSubject/addSubject.json +4 -0
  120. package/pages/addSubject/addSubject.wxml +78 -0
  121. package/pages/addSubject/addSubject.wxss +85 -0
  122. package/pages/commonLogin/commonLogin.js +269 -0
  123. package/pages/commonLogin/commonLogin.json +4 -0
  124. package/pages/commonLogin/commonLogin.wxml +57 -0
  125. package/pages/commonLogin/commonLogin.wxss +177 -0
  126. package/pages/copyOfficial/copyOfficial.js +25 -0
  127. package/pages/copyOfficial/copyOfficial.json +3 -0
  128. package/pages/copyOfficial/copyOfficial.wxml +22 -0
  129. package/pages/copyOfficial/copyOfficial.wxss +49 -0
  130. package/pages/demo/demo.js +23 -0
  131. package/pages/demo/demo.json +3 -0
  132. package/pages/demo/demo.wxml +8 -0
  133. package/pages/demo/demo.wxss +24 -0
  134. package/pages/game/game.js +1254 -0
  135. package/pages/game/game.json +8 -0
  136. package/pages/game/game.wxml +371 -0
  137. package/pages/game/game.wxss +672 -0
  138. package/pages/home/home.js +665 -0
  139. package/pages/home/home.json +10 -0
  140. package/pages/home/home.wxml +115 -0
  141. package/pages/home/home.wxss +231 -0
  142. package/pages/lottery-winners/lottery-winners.js +60 -0
  143. package/pages/lottery-winners/lottery-winners.json +4 -0
  144. package/pages/lottery-winners/lottery-winners.wxml +53 -0
  145. package/pages/lottery-winners/lottery-winners.wxss +127 -0
  146. package/pages/message/messageCommentsAndAt/messageCommentsAndAt.js +178 -0
  147. package/pages/message/messageCommentsAndAt/messageCommentsAndAt.json +5 -0
  148. package/pages/message/messageCommentsAndAt/messageCommentsAndAt.wxml +93 -0
  149. package/pages/message/messageCommentsAndAt/messageCommentsAndAt.wxss +177 -0
  150. package/pages/message/messageEntire/messageEntire.js +112 -0
  151. package/pages/message/messageEntire/messageEntire.json +4 -0
  152. package/pages/message/messageEntire/messageEntire.wxml +44 -0
  153. package/pages/message/messageEntire/messageEntire.wxss +88 -0
  154. package/pages/message/messageLikeAndCollect/messageLikeAndCollect.js +147 -0
  155. package/pages/message/messageLikeAndCollect/messageLikeAndCollect.json +5 -0
  156. package/pages/message/messageLikeAndCollect/messageLikeAndCollect.wxml +84 -0
  157. package/pages/message/messageLikeAndCollect/messageLikeAndCollect.wxss +166 -0
  158. package/pages/message/messageNewFans/messageNewFans.js +139 -0
  159. package/pages/message/messageNewFans/messageNewFans.json +5 -0
  160. package/pages/message/messageNewFans/messageNewFans.wxml +35 -0
  161. package/pages/message/messageNewFans/messageNewFans.wxss +85 -0
  162. package/pages/officialWebview/officialWebview.js +13 -0
  163. package/pages/officialWebview/officialWebview.json +3 -0
  164. package/pages/officialWebview/officialWebview.wxml +2 -0
  165. package/pages/officialWebview/officialWebview.wxss +1 -0
  166. package/pages/post/post.js +1856 -0
  167. package/pages/post/post.json +6 -0
  168. package/pages/post/post.wxml +694 -0
  169. package/pages/post/post.wxss +1003 -0
  170. package/pages/post-editor/post-editor.js +465 -0
  171. package/pages/post-editor/post-editor.json +4 -0
  172. package/pages/post-editor/post-editor.wxml +63 -0
  173. package/pages/post-editor/post-editor.wxss +195 -0
  174. package/pages/postDialog/postDialog.js +560 -0
  175. package/pages/postDialog/postDialog.json +6 -0
  176. package/pages/postDialog/postDialog.wxml +377 -0
  177. package/pages/postDialog/postDialog.wxss +979 -0
  178. package/pages/report-category/report-category.js +29 -0
  179. package/pages/report-category/report-category.json +4 -0
  180. package/pages/report-category/report-category.wxml +14 -0
  181. package/pages/report-category/report-category.wxss +43 -0
  182. package/pages/report-form/report-form.js +65 -0
  183. package/pages/report-form/report-form.json +3 -0
  184. package/pages/report-form/report-form.wxml +11 -0
  185. package/pages/report-form/report-form.wxss +44 -0
  186. package/pages/sevenDaySignDetail/sevenDaySignDetail.js +273 -0
  187. package/pages/sevenDaySignDetail/sevenDaySignDetail.json +3 -0
  188. package/pages/sevenDaySignDetail/sevenDaySignDetail.wxml +82 -0
  189. package/pages/sevenDaySignDetail/sevenDaySignDetail.wxss +173 -0
  190. package/pages/topic/topic.js +266 -0
  191. package/pages/topic/topic.json +6 -0
  192. package/pages/topic/topic.wxml +77 -0
  193. package/pages/topic/topic.wxss +162 -0
  194. package/pages/user/user.js +939 -0
  195. package/pages/user/user.json +5 -0
  196. package/pages/user/user.wxml +179 -0
  197. package/pages/user/user.wxss +340 -0
  198. package/pages/userDatum/userDatum.js +24 -0
  199. package/pages/userDatum/userDatum.json +4 -0
  200. package/pages/userDatum/userDatum.wxml +36 -0
  201. package/pages/userDatum/userDatum.wxss +41 -0
  202. package/pages/userGameLib/userGameLib.js +105 -0
  203. package/pages/userGameLib/userGameLib.json +4 -0
  204. package/pages/userGameLib/userGameLib.wxml +42 -0
  205. package/pages/userGameLib/userGameLib.wxss +119 -0
  206. package/pages/webview/webview.js +25 -0
  207. package/pages/webview/webview.json +3 -0
  208. package/pages/webview/webview.wxml +22 -0
  209. package/pages/webview/webview.wxss +50 -0
  210. package/pages/wheelActivivty/wheelActivivty.js +492 -0
  211. package/pages/wheelActivivty/wheelActivivty.json +8 -0
  212. package/pages/wheelActivivty/wheelActivivty.wxml +131 -0
  213. package/pages/wheelActivivty/wheelActivivty.wxss +459 -0
  214. package/pages/wiki/wiki.js +138 -0
  215. package/pages/wiki/wiki.json +6 -0
  216. package/pages/wiki/wiki.wxml +20 -0
  217. package/pages/wiki/wiki.wxss +44 -0
  218. package/request/JKRequest.js +177 -0
  219. package/services/home.js +603 -0
  220. package/towxml/config.js +291 -0
  221. package/towxml/decode.js +35 -0
  222. package/towxml/decode.json +11 -0
  223. package/towxml/decode.wxml +137 -0
  224. package/towxml/decode.wxss +0 -0
  225. package/towxml/img/img.js +98 -0
  226. package/towxml/img/img.json +3 -0
  227. package/towxml/img/img.wxml +1 -0
  228. package/towxml/img/img.wxss +0 -0
  229. package/towxml/index.js +19 -0
  230. package/towxml/latex/latex.js +53 -0
  231. package/towxml/latex/latex.json +5 -0
  232. package/towxml/latex/latex.wxml +1 -0
  233. package/towxml/latex/latex.wxss +0 -0
  234. package/towxml/parse/highlight/highlight.js +1 -0
  235. package/towxml/parse/highlight/index.js +8 -0
  236. package/towxml/parse/highlight/languages/bash.js +111 -0
  237. package/towxml/parse/highlight/languages/c-like.js +236 -0
  238. package/towxml/parse/highlight/languages/c.js +22 -0
  239. package/towxml/parse/highlight/languages/css.js +132 -0
  240. package/towxml/parse/highlight/languages/dart.js +134 -0
  241. package/towxml/parse/highlight/languages/go.js +63 -0
  242. package/towxml/parse/highlight/languages/htmlbars.js +80 -0
  243. package/towxml/parse/highlight/languages/java.js +125 -0
  244. package/towxml/parse/highlight/languages/javascript.js +265 -0
  245. package/towxml/parse/highlight/languages/json.js +52 -0
  246. package/towxml/parse/highlight/languages/less.js +148 -0
  247. package/towxml/parse/highlight/languages/nginx.js +101 -0
  248. package/towxml/parse/highlight/languages/php.js +161 -0
  249. package/towxml/parse/highlight/languages/python-repl.js +29 -0
  250. package/towxml/parse/highlight/languages/python.js +131 -0
  251. package/towxml/parse/highlight/languages/scss.js +122 -0
  252. package/towxml/parse/highlight/languages/shell.js +22 -0
  253. package/towxml/parse/highlight/languages/typescript.js +215 -0
  254. package/towxml/parse/highlight/languages/xml.js +139 -0
  255. package/towxml/parse/highlight/style/github.wxss +99 -0
  256. package/towxml/parse/highlight/style/monokai.wxss +70 -0
  257. package/towxml/parse/index.js +118 -0
  258. package/towxml/parse/markdown/index.js +67 -0
  259. package/towxml/parse/markdown/markdown.js +4 -0
  260. package/towxml/parse/markdown/plugins/echarts.js +11 -0
  261. package/towxml/parse/markdown/plugins/emoji.js +2 -0
  262. package/towxml/parse/markdown/plugins/ins.js +1 -0
  263. package/towxml/parse/markdown/plugins/latex.js +158 -0
  264. package/towxml/parse/markdown/plugins/mark.js +1 -0
  265. package/towxml/parse/markdown/plugins/sub.js +1 -0
  266. package/towxml/parse/markdown/plugins/sup.js +1 -0
  267. package/towxml/parse/markdown/plugins/todo.js +147 -0
  268. package/towxml/parse/markdown/plugins/yuml.js +20 -0
  269. package/towxml/parse/parse2/Parser.js +492 -0
  270. package/towxml/parse/parse2/Tokenizer.js +903 -0
  271. package/towxml/parse/parse2/domelementtype/index.js +55 -0
  272. package/towxml/parse/parse2/domhandler/index.js +145 -0
  273. package/towxml/parse/parse2/domhandler/node.js +474 -0
  274. package/towxml/parse/parse2/entities/decode.js +179 -0
  275. package/towxml/parse/parse2/entities/decode_codepoint.js +60 -0
  276. package/towxml/parse/parse2/entities/encode.js +77 -0
  277. package/towxml/parse/parse2/entities/escape.js +112 -0
  278. package/towxml/parse/parse2/entities/generated/decode-data-html.js +9 -0
  279. package/towxml/parse/parse2/entities/generated/decode-data-xml.js +9 -0
  280. package/towxml/parse/parse2/entities/generated/encode-html.js +12 -0
  281. package/towxml/parse/parse2/entities/index.js +137 -0
  282. package/towxml/parse/parse2/index.js +8 -0
  283. package/towxml/style/main.wxss +419 -0
  284. package/towxml/style/theme/dark.wxss +73 -0
  285. package/towxml/style/theme/light.wxss +63 -0
  286. package/towxml/table/table.js +11 -0
  287. package/towxml/table/table.json +6 -0
  288. package/towxml/table/table.wxml +24 -0
  289. package/towxml/table/table.wxss +0 -0
  290. package/towxml/todogroup/todogroup.js +20 -0
  291. package/towxml/todogroup/todogroup.json +6 -0
  292. package/towxml/todogroup/todogroup.wxml +12 -0
  293. package/towxml/todogroup/todogroup.wxss +3 -0
  294. package/towxml/towxml.js +22 -0
  295. package/towxml/towxml.json +6 -0
  296. package/towxml/towxml.wxml +5 -0
  297. package/towxml/towxml.wxss +8 -0
  298. package/towxml/yuml/yuml.js +51 -0
  299. package/towxml/yuml/yuml.json +5 -0
  300. package/towxml/yuml/yuml.wxml +5 -0
  301. package/towxml/yuml/yuml.wxss +0 -0
  302. package/utils/auth.js +17 -0
  303. package/utils/base64.js +67 -0
  304. package/utils/compressImage.js +41 -0
  305. package/utils/exp.js +49 -0
  306. package/utils/formatPost.js +18 -0
  307. package/utils/parseContent.js +191 -0
  308. package/utils/query-select.js +9 -0
  309. package/utils/sensitive.js +82 -0
package/index.js ADDED
@@ -0,0 +1,49 @@
1
+ class GameSDK {
2
+ constructor() {
3
+ this.gameId = 100000;
4
+ this.isInitialized = false;
5
+ }
6
+
7
+ init(options = {}) {
8
+ const { gameId } = options;
9
+
10
+ if (!gameId) {
11
+ throw new Error('gameId is required');
12
+ }
13
+
14
+ this.gameId = gameId;
15
+ this.isInitialized = true;
16
+
17
+ return this;
18
+ }
19
+
20
+ navigateToGame(params = {}) {
21
+ this._checkInit();
22
+ wx.navigateTo({
23
+ url: `/miniprogram_npm/southnote-mini-sdk/pages/game/game?gameId=${this.gameId}&${this._buildQuery(params)}`
24
+ });
25
+ }
26
+
27
+ navigateToWiki(params = {}) {
28
+ this._checkInit();
29
+ wx.navigateTo({
30
+ url: `/miniprogram_npm/southnote-mini-sdk/pages/wiki/wiki?gameId=${this.gameId}&${this._buildQuery(params)}`
31
+ });
32
+ }
33
+
34
+ _checkInit() {
35
+ if (!this.isInitialized) {
36
+ throw new Error('SDK not initialized, please call init() first');
37
+ }
38
+ }
39
+
40
+ _buildQuery(params) {
41
+ if (!Object.keys(params).length) return '';
42
+ return Object.keys(params)
43
+ .map(key => `${key}=${encodeURIComponent(params[key])}`)
44
+ .join('&');
45
+ }
46
+ }
47
+
48
+ const sdk = new GameSDK();
49
+ export default sdk;
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "southnote-mini-sdk",
3
+ "version": "1.0.0",
4
+ "description": "小南书SDK",
5
+ "main": "index.js",
6
+ "miniprogram": ".",
7
+ "files": [
8
+ "assets",
9
+ "components",
10
+ "pages",
11
+ "request",
12
+ "services",
13
+ "towxml",
14
+ "utils",
15
+ "app.js",
16
+ "app.json",
17
+ "app.wxss",
18
+ "index.js"
19
+ ],
20
+ "keywords": [
21
+ "wechat",
22
+ "miniprogram",
23
+ "game",
24
+ "community"
25
+ ],
26
+ "author": "你的名字",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "pako": "^2.1.0",
30
+ "underscore": "^1.13.6"
31
+ },
32
+ "peerDependencies": {
33
+ "@vant/weapp": ">=1.0.0"
34
+ }
35
+ }
@@ -0,0 +1,454 @@
1
+ import {
2
+ queryUserGames,
3
+ queryGames,
4
+ search
5
+ } from "../../services/home";
6
+
7
+ Page({
8
+ data: {
9
+ // tabs / categories
10
+ categories: [{
11
+ key: 'recent',
12
+ title: '最近添加'
13
+ }, // 特殊 tab,用 index 管理
14
+ {
15
+ key: 'my',
16
+ title: '我的游戏库'
17
+ }, // 特殊 tab,用 index 管理
18
+ {
19
+ key: 1,
20
+ title: '总榜'
21
+ },
22
+ {
23
+ key: 2,
24
+ title: '期待'
25
+ },
26
+ {
27
+ key: 3,
28
+ title: '新品'
29
+ },
30
+ {
31
+ key: 4,
32
+ title: '策略'
33
+ },
34
+ {
35
+ key: 5,
36
+ title: '动作'
37
+ },
38
+ {
39
+ key: 6,
40
+ title: '角色扮演'
41
+ },
42
+ {
43
+ key: 7,
44
+ title: '竞速'
45
+ },
46
+ {
47
+ key: 8,
48
+ title: '聚会'
49
+ },
50
+ {
51
+ key: 9,
52
+ title: '卡牌'
53
+ },
54
+ {
55
+ key: 10,
56
+ title: '冒险'
57
+ },
58
+ {
59
+ key: 11,
60
+ title: '模拟'
61
+ },
62
+ {
63
+ key: 12,
64
+ title: '体育'
65
+ },
66
+ {
67
+ key: 13,
68
+ title: '文字'
69
+ },
70
+ {
71
+ key: 14,
72
+ title: '问答'
73
+ },
74
+ {
75
+ key: 15,
76
+ title: '休闲'
77
+ },
78
+ {
79
+ key: 16,
80
+ title: '益智解密'
81
+ },
82
+ {
83
+ key: 17,
84
+ title: '音乐'
85
+ },
86
+ {
87
+ key: 18,
88
+ title: '娱乐场'
89
+ },
90
+ {
91
+ key: 19,
92
+ title: '桌游'
93
+ },
94
+ {
95
+ key: 20,
96
+ title: '射击'
97
+ },
98
+ {
99
+ key: 21,
100
+ title: '二次元'
101
+ },
102
+ {
103
+ key: 22,
104
+ title: 'Roguelike'
105
+ },
106
+ {
107
+ key: 23,
108
+ title: '女性向'
109
+ },
110
+ {
111
+ key: 24,
112
+ title: '沙盒'
113
+ },
114
+ {
115
+ key: 25,
116
+ title: '开放世界'
117
+ },
118
+ {
119
+ key: 26,
120
+ title: 'MMORPG'
121
+ },
122
+ {
123
+ key: 27,
124
+ title: '武侠'
125
+ },
126
+ {
127
+ key: 28,
128
+ title: 'MOBA'
129
+ },
130
+ {
131
+ key: 29,
132
+ title: '放置'
133
+ },
134
+ {
135
+ key: 30,
136
+ title: '塔防'
137
+ },
138
+ {
139
+ key: 31,
140
+ title: '影游'
141
+ }
142
+ ],
143
+
144
+
145
+ activeKey: 0,
146
+ games: [],
147
+ loading: false,
148
+ refreshing: false,
149
+ page: 1,
150
+ hasMore: true,
151
+
152
+
153
+ // 我的库分页单独管理
154
+ myPage: 1,
155
+ myHasMore: true,
156
+
157
+
158
+ // 搜索
159
+ searchValue: '',
160
+ showSearchResult: false,
161
+ searchResults: [],
162
+ searchPage: 1, // 当前搜索页码
163
+ searchHasMore: true, // 搜索是否还有更多
164
+ searchLoading: false,
165
+
166
+
167
+ },
168
+
169
+ onLoad() {
170
+ const recentGames = wx.getStorageSync('recentGames') || [];
171
+ // 最近添加属于 categories[0], 如果当前 activeKey 是 0,展示缓存
172
+ if (this.data.activeKey === 0) {
173
+ this.setData({
174
+ games: recentGames
175
+ });
176
+ }
177
+ this.setData({
178
+ recentGames
179
+ });
180
+ },
181
+
182
+
183
+ saveRecentGame(game) {
184
+ let recentGames = wx.getStorageSync('recentGames') || [];
185
+ recentGames = recentGames.filter(item => item.id !== game.id);
186
+ recentGames.unshift(game);
187
+ if (recentGames.length > 10) recentGames = recentGames.slice(0, 10);
188
+ wx.setStorageSync('recentGames', recentGames);
189
+ this.setData({
190
+ recentGames
191
+ });
192
+ },
193
+
194
+ // 放在 Page({ ... }) 内,与其它方法同级
195
+ loadRecentGames() {
196
+ // 最近缓存直接从 storage 里读
197
+ const recentGames = wx.getStorageSync('recentGames') || [];
198
+ this.setData({
199
+ games: recentGames,
200
+ refreshing: false,
201
+ loading: false,
202
+ hasMore: false // 最近列表是缓存,不走分页
203
+ });
204
+ },
205
+
206
+ async loadCategoryGames(reset = false) {
207
+ // 分类页(从 categories 中取 key)用 queryGames(filter, page)
208
+ // 防抖 / 防重入
209
+ if (this.data.loading) return;
210
+ this.setData({
211
+ loading: true
212
+ });
213
+
214
+ // 计算 page(reset 则回到 1)
215
+ let page = reset ? 1 : this.data.page || 1;
216
+
217
+ // 取当前分类 key(注意:activeKey 可能是数字索引)
218
+ const idx = this.data.activeKey;
219
+ const category = this.data.categories && this.data.categories[idx];
220
+ const filter = category ? category.key : ''; // 例如 'total' 'strategy' 等
221
+
222
+ try {
223
+ // 假设 queryGames(filter, page) 返回 { code: 0, data: [...] }
224
+ const res = await queryGames(filter, page);
225
+ if (res && res.code === 0) {
226
+ const list = Array.isArray(res.data) ? res.data : [];
227
+
228
+ // reset 时替换列表;否则追加
229
+ const newGames = reset ? list : [...(this.data.games || []), ...list];
230
+
231
+ // 下一页逻辑:如果本次返回有数据就认为还有更多(简单判断)
232
+ const hasMore = list.length > 0;
233
+
234
+ // 如果有数据并且不是 reset,则 page++
235
+ const nextPage = (reset ? 1 : page) + (list.length > 0 ? 1 : 0);
236
+
237
+ this.setData({
238
+ games: newGames,
239
+ page: nextPage,
240
+ hasMore,
241
+ });
242
+ } else {
243
+ // 请求失败或 code !== 0:保守处理为没有更多
244
+ this.setData({
245
+ hasMore: false
246
+ });
247
+ }
248
+ } catch (err) {
249
+ console.error('加载分类游戏失败:', err);
250
+ this.setData({
251
+ hasMore: false
252
+ });
253
+ } finally {
254
+ this.setData({
255
+ loading: false,
256
+ refreshing: false
257
+ });
258
+ }
259
+ },
260
+
261
+ onSearchReachBottom() {
262
+ if (!this.data.showSearchResult) return;
263
+ this.loadSearchResults(); // 调用搜索接口分页
264
+ },
265
+
266
+
267
+ onSearchInput(e) {
268
+ const value = e.detail.value.trim();
269
+
270
+ this.setData({
271
+ searchValue: value,
272
+ showSearchResult: !!value,
273
+ searchPage: 1,
274
+ searchResults: [],
275
+ searchHasMore: true,
276
+ });
277
+
278
+ if (value) {
279
+ this.loadSearchResults(true);
280
+ } else {
281
+ this.setData({
282
+ searchResults: [],
283
+ searchHasMore: true,
284
+ searchLoading: false,
285
+ });
286
+ }
287
+ },
288
+
289
+ async loadSearchResults(reset = false) {
290
+ if (this.data.searchLoading || !this.data.searchHasMore) return;
291
+
292
+ this.setData({
293
+ searchLoading: true
294
+ });
295
+
296
+ const page = reset ? 1 : this.data.searchPage;
297
+ const input = this.data.searchValue;
298
+
299
+ try {
300
+ const res = await search(input, 3, page); // nType 固定 3
301
+ if (res && res.code === 0) {
302
+ const list = Array.isArray(res.data.games) ? res.data.games : [];
303
+
304
+ const newResults = reset ? list : [...(this.data.searchResults || []), ...list];
305
+
306
+ const hasMore = list.length > 0;
307
+
308
+ this.setData({
309
+ searchResults: newResults,
310
+ searchPage: page + (list.length > 0 ? 1 : 0),
311
+ searchHasMore: hasMore,
312
+ });
313
+ } else {
314
+ this.setData({
315
+ searchHasMore: false,
316
+ });
317
+ }
318
+ } catch (err) {
319
+ console.error('搜索失败', err);
320
+ this.setData({
321
+ searchHasMore: false,
322
+ });
323
+ } finally {
324
+ this.setData({
325
+ searchLoading: false
326
+ });
327
+ }
328
+ },
329
+
330
+
331
+ onChangeTab(e) {
332
+ const key = e.detail;
333
+ this.setData({
334
+ activeKey: key,
335
+ page: 1,
336
+ hasMore: true,
337
+ loading: false
338
+ });
339
+ // 切 tab 时清空右侧列表,避免闪烁数据
340
+ this.setData({
341
+ games: []
342
+ });
343
+ this.loadActiveTab(true);
344
+ },
345
+
346
+
347
+ loadActiveTab(reset = false) {
348
+ const idx = this.data.activeKey;
349
+ // idx 0 -> 最近缓存
350
+ if (idx === 0) {
351
+ this.loadRecentGames();
352
+ this.setData({
353
+ refreshing: false
354
+ });
355
+ return;
356
+ }
357
+
358
+
359
+ // idx 1 -> 我的游戏库 调用 queryUserGames(target_id=当前用户id, page)
360
+ if (idx === 1) {
361
+ this.loadMyGames(reset);
362
+ return;
363
+ }
364
+
365
+
366
+ // idx >=2 -> 从总榜开始使用 queryGames(filter, page)
367
+ this.loadCategoryGames(reset);
368
+ },
369
+
370
+ async loadMyGames(reset = false) {
371
+ const user_id = wx.getStorageSync('appuid')
372
+ const {
373
+ myPage
374
+ } = this.data
375
+ try {
376
+ const res = await queryUserGames(
377
+ user_id,
378
+ myPage
379
+ );
380
+ if (res && res.code === 0) {
381
+ const list = reset ? res.data : [...this.data.games, ...res.data];
382
+ this.setData({
383
+ games: list,
384
+ myPage,
385
+ hasMore: res.data.length > 0
386
+ });
387
+ }
388
+ } catch (err) {
389
+ console.error('加载分类游戏失败:', err);
390
+ } finally {
391
+ this.setData({
392
+ loading: false,
393
+ refreshing: false
394
+ });
395
+ }
396
+ },
397
+
398
+
399
+ onRefresh() {
400
+ this.setData({
401
+ refreshing: true
402
+ });
403
+ const idx = this.data.activeKey;
404
+ if (idx === 0) {
405
+ this.loadRecentGames();
406
+ } else if (idx === 1) {
407
+ this.loadMyGames(true);
408
+ } else {
409
+ this.loadCategoryGames(true);
410
+ }
411
+ },
412
+
413
+
414
+ onReachBottom() {
415
+ const idx = this.data.activeKey;
416
+ if (idx === 0) return; // 最近缓存不分页
417
+ if (idx === 1) {
418
+ this.loadMyGames();
419
+ } else {
420
+ this.loadCategoryGames();
421
+ }
422
+ },
423
+
424
+
425
+ onSelectGame(e) {
426
+ const game = e.currentTarget.dataset.game;
427
+ if (!game) return;
428
+ this.saveRecentGame(game);
429
+
430
+
431
+ const pages = getCurrentPages();
432
+ const prevPage = pages[pages.length - 2];
433
+ if (!prevPage) {
434
+ console.warn('未找到上一个页面');
435
+ wx.navigateBack();
436
+ return;
437
+ }
438
+
439
+
440
+ const bottomSheet = prevPage.selectComponent?.('#bottomSheet');
441
+ if (bottomSheet) {
442
+ setTimeout(() => {
443
+ bottomSheet.setData({
444
+ selectedGame: game
445
+ });
446
+ }, 100);
447
+ } else {
448
+ prevPage.setData({
449
+ selectedGame: game
450
+ });
451
+ }
452
+ wx.navigateBack();
453
+ }
454
+ });
@@ -0,0 +1,3 @@
1
+ {
2
+ "usingComponents": {}
3
+ }
@@ -0,0 +1,71 @@
1
+ <view class="page">
2
+
3
+ <!-- 搜索框 -->
4
+ <view class="search-bar">
5
+ <image class="search-icon" src="/assets/images/icons/search.png"></image>
6
+ <input class="search-input" placeholder="请输入游戏名称或关键字" placeholder-style="color:#ccc" value="{{searchValue}}" bindinput="onSearchInput" />
7
+ </view>
8
+
9
+ <!-- 搜索结果浮层 -->
10
+ <scroll-view wx:if="{{showSearchResult}}" class="search-overlay" scroll-y="true" bindscrolltolower="onSearchReachBottom" lower-threshold="50">
11
+
12
+ <block wx:if="{{searchResults.length}}">
13
+ <block wx:for="{{searchResults}}" wx:key="id">
14
+ <view class="game-item" bindtap="onSelectGame" data-game="{{item}}">
15
+ <image class="game-icon" src="{{item.icon}}" mode="aspectFill"></image>
16
+ <view class="game-info">
17
+ <view class="game-name">{{item.name}}</view>
18
+ <view class="game-meta">
19
+ 玩家:<span style="color: #f5b21d;">{{item.fans_count ? item.fans_count : '0'}}</span>
20
+ <span style="margin-left: 10px;">帖子:<span style="color: #f5b21d;">{{item.posts_count ? item.posts_count:'0'}}</span></span>
21
+
22
+ </view>
23
+ </view>
24
+ </view>
25
+ </block>
26
+ <!-- 加载中 / 没有更多 -->
27
+ <view wx:if="{{searchLoading}}" class="loading">加载中...</view>
28
+ <view wx:if="{{!searchHasMore && !searchLoading}}" class="no-more">没有更多数据</view>
29
+ </block>
30
+
31
+ <view wx:else class="empty">未找到相关游戏</view>
32
+ </scroll-view>
33
+
34
+
35
+
36
+ <!-- 主体区域 -->
37
+ <view class="main" wx:else>
38
+
39
+ <!-- 左侧分类栏(可滚动) -->
40
+ <scroll-view scroll-y="true" class="sidebar">
41
+ <van-sidebar active-key="{{activeKey}}" bind:change="onChangeTab">
42
+ <block wx:for="{{categories}}" wx:key="key" wx:for-item="item">
43
+ <van-sidebar-item title="{{item.title}}" />
44
+ </block>
45
+ </van-sidebar>
46
+ </scroll-view>
47
+
48
+ <!-- 右侧游戏列表(滚动) -->
49
+ <scroll-view scroll-y="true" class="content" refresher-enabled="true" refresher-triggered="{{refreshing}}" bindrefresherrefresh="onRefresh" bindscrolltolower="onReachBottom">
50
+ <block wx:for="{{games}}" wx:key="id">
51
+ <view class="game-item" bindtap="onSelectGame" data-game="{{item}}">
52
+ <image class="game-icon" src="{{item.icon}}" mode="aspectFill"></image>
53
+ <view class="game-info">
54
+ <view class="game-name">{{item.name}}</view>
55
+ <view class="game-meta">
56
+ 玩家:<span style="color: #f5b21d;">{{item.fans_count}}</span>
57
+ <span style="margin-left: 10px;">帖子:<span style="color: #f5b21d;">{{item.posts_count}}</span></span>
58
+
59
+ </view>
60
+ </view>
61
+ </view>
62
+ </block>
63
+
64
+ <view wx:if="{{loading}}" class="loading">加载中...</view>
65
+ <view wx:if="{{!hasMore && !loading}}" class="no-more">没有更多数据</view>
66
+ <view wx:if="{{!games.length && !loading}}" class="empty">暂无游戏</view>
67
+ </scroll-view>
68
+
69
+ </view>
70
+
71
+ </view>
@@ -0,0 +1,110 @@
1
+ /* 页面整体占满屏幕,不允许外层滚动 */
2
+ .page {
3
+ display: flex;
4
+ flex-direction: column;
5
+ height: 100vh;
6
+ overflow: hidden;
7
+ }
8
+
9
+ /* 搜索框 */
10
+ .search-bar {
11
+ position: relative;
12
+ display: flex;
13
+ align-items: center;
14
+ padding: 16rpx 24rpx;
15
+ border-bottom: 1px solid #f2f2f2;
16
+ }
17
+
18
+ .search-input {
19
+ flex: 1;
20
+ /* 核心:用 flex 自动撑满,避免宽度不足触发 iOS 缩放 */
21
+ background-color: #f5f5f5;
22
+ border-radius: 30rpx;
23
+ padding: 10rpx 24rpx;
24
+ padding-left: 60rpx;
25
+ /* 给图标留空间 */
26
+ font-size: 26rpx;
27
+ color: #333;
28
+ }
29
+
30
+ .search-icon {
31
+ width: 15px;
32
+ height: 15px;
33
+ position: absolute;
34
+ top: 18px;
35
+ left: 20px;
36
+ }
37
+
38
+ /* 搜索层:顶部固定、内部可滚动 */
39
+ .search-overlay {
40
+ position: absolute;
41
+ top: 60px;
42
+ left: 0;
43
+ right: 0;
44
+ bottom: 0;
45
+ background: #fff;
46
+ z-index: 99;
47
+ overflow-y: scroll;
48
+ }
49
+
50
+ /* 主区域两列布局 */
51
+ .main {
52
+ flex: 1;
53
+ display: flex;
54
+ overflow: hidden;
55
+ /* 禁止 main 整体滚动 */
56
+ }
57
+
58
+ /* 左侧分类栏 — scroll-view */
59
+ .sidebar {
60
+ width: 80px;
61
+ height: 100%;
62
+ background: #fafafa;
63
+ flex-shrink: 0;
64
+ }
65
+
66
+ /* 右侧列表 — scroll-view */
67
+ .content {
68
+ flex: 1;
69
+ height: 100%;
70
+ background: #fff;
71
+ }
72
+
73
+ /* 游戏 item 样式 */
74
+ .game-item {
75
+ display: flex;
76
+ padding: 10px;
77
+ border-bottom: 1px solid #eee;
78
+ }
79
+
80
+ .game-icon {
81
+ width: 50px;
82
+ height: 50px;
83
+ border-radius: 10px;
84
+ margin-right: 10px;
85
+ }
86
+
87
+ .game-info {
88
+ flex: 1;
89
+ }
90
+
91
+ .game-name {
92
+ font-size: 16px;
93
+ font-weight: bold;
94
+ margin-bottom: 4px;
95
+ }
96
+
97
+ .game-meta {
98
+ margin-top: 5px;
99
+ color: #777777;
100
+ font-size: 13px;
101
+ }
102
+
103
+ /* 状态提示 */
104
+ .loading,
105
+ .no-more,
106
+ .empty {
107
+ text-align: center;
108
+ padding: 15px;
109
+ color: #aaa;
110
+ }