Skip to content

Commit

Permalink
feat: 新增书签功能
Browse files Browse the repository at this point in the history
  • Loading branch information
hectorqin committed Jul 6, 2022
1 parent 0effb13 commit 782af13
Show file tree
Hide file tree
Showing 14 changed files with 968 additions and 18 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ apply(plugin = "kotlin")
apply(plugin = "io.github.fvarrui.javapackager.plugin")

group = "com.htmake"
version = "2.4.0"
version = "2.5.0"

java {
sourceCompatibility = JavaVersion.VERSION_1_8
Expand Down
2 changes: 1 addition & 1 deletion cli.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ apply plugin: 'io.spring.dependency-management'
apply plugin: 'kotlin'

group = 'com.htmake'
version = '2.4.0'
version = '2.5.0'
sourceCompatibility = '1.8'

repositories {
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/com/htmake/reader/api/YueduApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import com.htmake.reader.api.controller.RssSourceController
import com.htmake.reader.api.controller.UserController
import com.htmake.reader.api.controller.WebdavController
import com.htmake.reader.api.controller.ReplaceRuleController
import com.htmake.reader.api.controller.BookmarkController
import com.htmake.reader.utils.error
import com.htmake.reader.utils.success
import com.htmake.reader.utils.getStorage
Expand Down Expand Up @@ -133,6 +134,7 @@ class YueduApi : RestVerticle() {
onHandlerError(ctx, error)
}
val replaceRuleController = ReplaceRuleController(coroutineContext)
val bookmarkController = BookmarkController(coroutineContext)

/** 书源模块 */
router.post("/reader3/saveBookSource").coroutineHandler { bookSourceController.saveBookSource(it) }
Expand Down Expand Up @@ -337,6 +339,12 @@ class YueduApi : RestVerticle() {
router.post("/reader3/deleteReplaceRule").coroutineHandler { replaceRuleController.deleteReplaceRule(it) }
router.post("/reader3/deleteReplaceRules").coroutineHandler { replaceRuleController.deleteReplaceRules(it) }

/** 书签模块 */
router.get("/reader3/getBookmarks").coroutineHandler { bookmarkController.getBookmarks(it) }
router.post("/reader3/saveBookmark").coroutineHandler { bookmarkController.saveBookmark(it) }
router.post("/reader3/saveBookmarks").coroutineHandler { bookmarkController.saveBookmarks(it) }
router.post("/reader3/deleteBookmark").coroutineHandler { bookmarkController.deleteBookmark(it) }
router.post("/reader3/deleteBookmarks").coroutineHandler { bookmarkController.deleteBookmarks(it) }
}

suspend fun setupPort() {
Expand Down
227 changes: 227 additions & 0 deletions src/main/java/com/htmake/reader/api/controller/BookmarkController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
package com.htmake.reader.api.controller

import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter
import io.legado.app.data.entities.SearchBook
import io.legado.app.data.entities.BookGroup
import io.legado.app.data.entities.BookSource
import io.legado.app.data.entities.Bookmark
import io.legado.app.model.webBook.WebBook
import io.vertx.ext.web.Route
import io.vertx.ext.web.Router
import io.vertx.ext.web.RoutingContext
import io.vertx.ext.web.handler.StaticHandler;
import mu.KotlinLogging
import com.htmake.reader.config.AppConfig
import com.htmake.reader.config.BookConfig
import io.legado.app.constant.DeepinkBookSource
import com.htmake.reader.utils.error
import com.htmake.reader.utils.success
import com.htmake.reader.utils.getStorage
import com.htmake.reader.utils.saveStorage
import com.htmake.reader.utils.asJsonArray
import com.htmake.reader.utils.asJsonObject
import com.htmake.reader.utils.toDataClass
import com.htmake.reader.utils.toMap
import com.htmake.reader.utils.fillData
import com.htmake.reader.utils.getWorkDir
import com.htmake.reader.utils.getRandomString
import com.htmake.reader.utils.genEncryptedPassword
import com.htmake.reader.entity.User
import com.htmake.reader.utils.SpringContextUtils
import com.htmake.reader.utils.deleteRecursively
import com.htmake.reader.utils.unzip
import com.htmake.reader.utils.zip
import com.htmake.reader.utils.jsonEncode
import com.htmake.reader.utils.getRelativePath
import com.htmake.reader.verticle.RestVerticle
import com.htmake.reader.SpringEvent
import org.springframework.stereotype.Component
import io.vertx.core.json.JsonObject
import io.vertx.core.json.JsonArray
import io.vertx.core.http.HttpMethod
import com.htmake.reader.api.ReturnData
import io.legado.app.utils.MD5Utils
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.net.URL;
import java.util.UUID;
import io.vertx.ext.web.client.WebClient
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.core.env.Environment
import java.io.File
import java.lang.Runtime
import kotlin.collections.mutableMapOf
import kotlin.system.measureTimeMillis
import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.text.SimpleDateFormat;
import io.legado.app.utils.EncoderUtils
import io.legado.app.model.rss.Rss
import org.springframework.scheduling.annotation.Scheduled
import io.legado.app.model.localBook.LocalBook
import java.nio.file.Paths
import kotlinx.coroutines.withContext
import kotlinx.coroutines.async
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.CoroutineScope

private val logger = KotlinLogging.logger {}

class BookmarkController(coroutineContext: CoroutineContext): BaseController(coroutineContext) {
suspend fun getBookmarks(context: RoutingContext): ReturnData {
val returnData = ReturnData()
if (!checkAuth(context)) {
return returnData.setData("NEED_LOGIN").setErrorMsg("请登录后使用")
}
var userNameSpace = getUserNameSpace(context)
var list: JsonArray? = asJsonArray(getUserStorage(userNameSpace, "bookmark"))
if (list != null) {
return returnData.setData(list.getList())
}
return returnData.setData(arrayListOf<Int>())
}

suspend fun saveBookmark(context: RoutingContext): ReturnData {
val returnData = ReturnData()
if (!checkAuth(context)) {
return returnData.setData("NEED_LOGIN").setErrorMsg("请登录后使用")
}
val bookmark = context.bodyAsJson.mapTo(Bookmark::class.java)
if (bookmark.bookName.isEmpty() && bookmark.bookAuthor.isEmpty()) {
return returnData.setErrorMsg("书籍信息错误")
}

var userNameSpace = getUserNameSpace(context)
var bookmarkList: JsonArray? = asJsonArray(getUserStorage(userNameSpace, "bookmark"))
if (bookmarkList == null) {
bookmarkList = JsonArray()
}
// 遍历判断是否存在
var existIndex: Int = -1
for (i in 0 until bookmarkList.size()) {
var _bookmark = bookmarkList.getJsonObject(i).mapTo(Bookmark::class.java)
if (_bookmark.bookName.equals(bookmark.bookName) && _bookmark.bookAuthor.equals(bookmark.bookAuthor)) {
existIndex = i
break;
}
}
if (existIndex >= 0) {
var list = bookmarkList.getList()
list.set(existIndex, JsonObject.mapFrom(bookmark))
bookmarkList = JsonArray(list)
} else {
// 新增书签
bookmarkList.add(JsonObject.mapFrom(bookmark))
}

// logger.info("bookmarkList: {}", bookmarkList)
saveUserStorage(userNameSpace, "bookmark", bookmarkList)
return returnData.setData("")
}

suspend fun saveBookmarks(context: RoutingContext): ReturnData {
val returnData = ReturnData()
if (!checkAuth(context)) {
return returnData.setData("NEED_LOGIN").setErrorMsg("请登录后使用")
}
val bookmarkJsonArray = context.bodyAsJsonArray
if (bookmarkJsonArray == null) {
return returnData.setErrorMsg("参数错误")
}
var userNameSpace = getUserNameSpace(context)
var bookmarkList: JsonArray? = asJsonArray(getUserStorage(userNameSpace, "bookmark"))
if (bookmarkList == null) {
bookmarkList = JsonArray()
}
for (k in 0 until bookmarkJsonArray.size()) {
var bookmark = bookmarkJsonArray.getJsonObject(k).mapTo(Bookmark::class.java)
if (bookmark.bookName.isEmpty() && bookmark.bookAuthor.isEmpty()) {
continue
}
// 遍历判断是否存在
var existIndex: Int = -1
for (i in 0 until bookmarkList!!.size()) {
var _bookmark = bookmarkList.getJsonObject(i).mapTo(Bookmark::class.java)
if (_bookmark.bookName.equals(bookmark.bookName) && _bookmark.bookAuthor.equals(bookmark.bookAuthor)) {
existIndex = i
break;
}
}
if (existIndex >= 0) {
var list = bookmarkList.getList()
list.set(existIndex, JsonObject.mapFrom(bookmark))
bookmarkList = JsonArray(list)
} else {
// 新增书签
bookmarkList.add(JsonObject.mapFrom(bookmark))
}
}

// logger.info("bookmarkList: {}", bookmarkList)
saveUserStorage(userNameSpace, "bookmark", bookmarkList!!)
return returnData.setData("")
}


suspend fun deleteBookmark(context: RoutingContext): ReturnData {
val returnData = ReturnData()
if (!checkAuth(context)) {
return returnData.setData("NEED_LOGIN").setErrorMsg("请登录后使用")
}
val bookmark = context.bodyAsJson.mapTo(Bookmark::class.java)
var userNameSpace = getUserNameSpace(context)
var bookmarkList: JsonArray? = asJsonArray(getUserStorage(userNameSpace, "bookmark"))
if (bookmarkList == null) {
bookmarkList = JsonArray()
}
// 遍历判断是否存在
var existIndex: Int = -1
for (i in 0 until bookmarkList.size()) {
var _bookmark = bookmarkList.getJsonObject(i).mapTo(Bookmark::class.java)
if (_bookmark.bookName.equals(bookmark.bookName) && _bookmark.bookAuthor.equals(bookmark.bookAuthor)) {
existIndex = i
break;
}
}
if (existIndex >= 0) {
bookmarkList.remove(existIndex)
}
// logger.info("bookmark: {}", bookmark)
saveUserStorage(userNameSpace, "bookmark", bookmarkList)
return returnData.setData("")
}

suspend fun deleteBookmarks(context: RoutingContext): ReturnData {
val returnData = ReturnData()
if (!checkAuth(context)) {
return returnData.setData("NEED_LOGIN").setErrorMsg("请登录后使用")
}
val bookmarkJsonArray = context.bodyAsJsonArray

var userNameSpace = getUserNameSpace(context)
var bookmarkList: JsonArray? = asJsonArray(getUserStorage(userNameSpace, "bookmark"))
if (bookmarkList == null) {
bookmarkList = JsonArray()
}
for (k in 0 until bookmarkJsonArray.size()) {
var bookmark = bookmarkJsonArray.getJsonObject(k).mapTo(Bookmark::class.java)
// 遍历判断书本是否存在
var existIndex: Int = -1
for (i in 0 until bookmarkList.size()) {
var _bookmark = bookmarkList.getJsonObject(i).mapTo(Bookmark::class.java)
if (_bookmark.bookName.equals(bookmark.bookName) && _bookmark.bookAuthor.equals(bookmark.bookAuthor)) {
existIndex = i
break;
}
}
if (existIndex >= 0) {
bookmarkList.remove(existIndex)
}
}
// logger.info("bookmark: {}", bookmark)
saveUserStorage(userNameSpace, "bookmark", bookmarkList)
return returnData.setData("")
}
}
2 changes: 1 addition & 1 deletion web/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "reader",
"version": "2.4.0",
"version": "2.5.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
Expand Down
Loading

0 comments on commit 782af13

Please sign in to comment.