/** * 第 10 章配套代码 · 笔记 API 封装(HttpModule 包装层) * * 文件位置:shared/src/commonMain/kotlin/com/example/xhs/api/NoteApi.kt * * 演示如何把 HttpModule 调用封装成业务友好的 API。 * 真实工程会走 Ktor + 协程,这里用 Kuikly 内置 HttpModule 演示。 */ package com.example.xhs.api import com.example.xhs.pages.Comment import com.example.xhs.pages.Note import com.tencent.kuikly.core.module.HttpModule import com.tencent.kuikly.core.nvi.serialization.json.JSONObject import com.tencent.kuikly.core.pager.PagerManager import kotlin.random.Random object NoteApi { private const val BASE_URL = "https://api.example.com" private fun http(): HttpModule { return PagerManager.getCurrentPager() .acquireModule(HttpModule.MODULE_NAME) } /** * 拉取笔记列表(瀑布流) */ fun fetchNotes(page: Int, callback: (List) -> Unit) { // 真实场景: // http().request( // url = "$BASE_URL/notes", // method = "GET", // params = JSONObject().apply { put("page", page); put("size", 20) } // ) { result -> ... } // 演示:mock 数据(避免依赖真实后端) val mocked = mockNotes(page = page, count = 20) callback(mocked) } /** * 拉取单条笔记详情 */ fun fetchNote(id: String, callback: (Note?) -> Unit) { // mock val n = mockNotes(page = 1, count = 1).first().copy(id = id) callback(n) } /** * 拉取笔记的评论 */ fun fetchComments(noteId: String, callback: (List) -> Unit) { val list = (1..5).map { i -> Comment( id = "c-$i", author = "用户$i", avatar = "https://example.com/avatar/$i.png", content = listOf( "好棒!", "学到了 👍", "求出处", "我也想去", "已收藏", )[i - 1], ) } callback(list) } /** * 点赞 / 取消点赞 */ fun toggleLike(noteId: String, liked: Boolean, callback: (Boolean) -> Unit) { // 真实场景调 POST /notes/{id}/like callback(true) } /** * 发布新笔记 */ fun publishNote( title: String, content: String, coverUrl: String, callback: (success: Boolean, noteId: String?) -> Unit, ) { // 真实场景调 POST /notes callback(true, "note-${System.currentTimeMillis()}") } // ─── Mock 数据生成 ─────────────────────── private fun mockNotes(page: Int, count: Int): List { val titles = listOf( "周末爬山日记 ⛰️", "今日穿搭分享", "巨好吃的拉面店推荐", "iPad 学习方法 📱", "家居改造 / 不到 2k 的收纳", "健身记录 day 30", "云南旅行攻略", "宝藏咖啡馆探店", "新手化妆教程", "读书笔记《人月神话》", ) val authors = listOf("Tom", "李四", "Pinky", "小明", "Anna", "Jack", "Lisa") return (1..count).map { i -> val realId = (page - 1) * count + i Note( id = "note-$realId", coverUrl = "https://example.com/cover/$realId.jpg", coverHeight = (160..280).random().toFloat(), title = titles.random() + " #$realId", authorAvatar = "https://example.com/avatar/${authors.random()}.png", authorName = authors.random(), likes = Random.nextInt(20, 9999), liked = false, ) } } }